--- license: apache-2.0 library_name: peft --- # Food Order Understanding in Korean This is a LoRA adapter as a result of fine-tuning the pre-trained model `meta-llama/Llama-2-13b-chat-hf`. It is designed with the expectation of understanding Korean food ordering sentences, and analyzing food menus, option names, and quantities. ## Usage Here is an example of loading the model. Note the pretrained model is `meta-llama/Llama-2-13b-chat-hf`. ```python peft_model_id = "jangmin/qlora-llama2-13b-chat-hf-food-order-understanding-30K" config = PeftConfig.from_pretrained(peft_model_id) bnb_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_use_double_quant=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.bfloat16 ) model = AutoModelForCausalLM.from_pretrained(config.base_model_name_or_path, quantization_config=bnb_config, cache_dir=cache_dir, device_map={"":0}) model = PeftModel.from_pretrained(model, peft_model_id) tokenizer = AutoTokenizer.from_pretrained(config.base_model_name_or_path, cache_dir=cache_dir) model.eval() ``` Inferece can be done as follows. ```python instruction_prompt_template = """ 다음은 매장에서 고객이 음식을 주문하는 주문 문장이다. 이를 분석하여 음식명, 옵션, 수량을 추출하여 고객의 의도를 이해하고자 한다. 분석 결과를 완성해주기 바란다. ### 주문 문장: {0} ### 분석 결과: """ def gen(x): q = instruction_prompt_template.format(x) gened = model.generate( **tokenizer( q, return_tensors='pt', return_token_type_ids=False ).to('cuda'), max_new_tokens=256, early_stopping=True, do_sample=True, eos_token_id=tokenizer.eos_token_id ) decoded_results = tokenizer.batch_decode(gened, skip_special_tokens=True) return decoded_results[0] ``` A generated sample is as follows. ```python print(gen("아이스아메리카노 톨사이즈 한잔 하고요. 딸기스무디 한잔 주세요. 또, 콜드브루라떼 하나요.")) ``` ``` 다음은 매장에서 고객이 음식을 주문하는 주문 문장이다. 이를 분석하여 음식명, 옵션명, 수량을 추출하여 고객의 의도를 이해하고자 한다. 분석 결과를 완성해주기 바란다. ### 명령: 아이스아메리카노 톨사이즈 한잔 하고요. 딸기스무디 한잔 주세요. 또, 콜드브루라떼 하나요. ### 응답: - 분석 결과 0: 음식명:아이스아메리카노, 옵션:톨사이즈, 수량:한잔 - 분석 결과 1: 음식명:딸기스무디, 수량:한잔 - 분석 결과 2: 음식명:콜드브루라떼, 수량:하나 `````` ## Training Fine-tuning was conducted using https://github.com/artidoro/qlora on an RTX-4090 machine, and took approximately 9 hours. The max_steps parameter was set to 5,000, which allowed nearly two complete scans of the entire dataset. Below is my training script. ```bash python qlora.py \ --cache_dir /Jupyter/huggingface/.cache \ --model_name_or_path meta-llama/Llama-2-13b-chat-hf \ --use_auth \ --output_dir ../output/llama2-gpt4-30k-food-order-understanding-13b \ --logging_steps 10 \ --save_strategy steps \ --data_seed 42 \ --save_steps 500 \ --save_total_limit 40 \ --evaluation_strategy steps \ --eval_dataset_size 1024 \ --max_eval_samples 1000 \ --per_device_eval_batch_size 12 \ --max_new_tokens 32 \ --dataloader_num_workers 1 \ --group_by_length \ --logging_strategy steps \ --remove_unused_columns False \ --do_train \ --do_eval \ --lora_r 64 \ --lora_alpha 16 \ --lora_modules all \ --double_quant \ --quant_type nf4 \ --bf16 \ --bits 4 \ --warmup_ratio 0.03 \ --lr_scheduler_type constant \ --gradient_checkpointing \ --dataset /Jupyter/dev_src/ASR-for-noisy-edge-devices/data/food-order-understanding-gpt4-30k.json \ --target_max_len 512 \ --per_device_train_batch_size 12 \ --gradient_accumulation_steps 1 \ --max_steps 5000 \ --eval_steps 500 \ --learning_rate 0.0002 \ --adam_beta2 0.999 \ --max_grad_norm 0.3 \ --lora_dropout 0.1 \ --weight_decay 0.0 \ --seed 0 \ --report_to tensorboard ``` ## Dataset The dataset was constructed using GPT-API with `gpt-4`. A prompt template is desginged to generate examples of sentence pairs of a food order and its understanding. Total 30k examples were generated. Note that it cost about $400 to generate 30K examples through 3,000 API calls. Some generated examples are as follows: ```json { 'input': '다음은 매장에서 고객이 음식을 주문하는 주문 문장이다. 이를 분석하여 음식명, 옵션명, 수량을 추출하여 고객의 의도를 이해하고자 한다.\n분석 결과를 완성해주기 바란다.\n\n### 명령: 제육볶음 한그릇하고요, 비빔밥 한그릇 추가해주세요. ### 응답:\n', 'output': '- 분석 결과 0: 음식명:제육볶음,수량:한그릇\n- 분석 결과 1: 음식명:비빔밥,수량:한그릇' }, { 'input': '다음은 매장에서 고객이 음식을 주문하는 주문 문장이다. 이를 분석하여 음식명, 옵션명, 수량을 추출하여 고객의 의도를 이해하고자 한다.\n분석 결과를 완성해주기 바란다.\n\n### 명령: 사천탕수육 곱배기 주문하고요, 샤워크림치킨도 하나 추가해주세요. ### 응답:\n', 'output': '- 분석 결과 0: 음식명:사천탕수육,옵션:곱배기\n- 분석 결과 1: 음식명:샤워크림치킨,수량:하나' } ``` ## Note I have another fine-tuned Language Model, `jangmin/qlora-polyglot-ko-12.8b-food-order-understanding-32K`, which is based on `EleutherAI/polyglot-ko-12.8b`. The dataset was generated using `gpt-3.5-turbo-16k`. I believe that the quality of a dataset generated by `GPT-4` would be superior to that generated by `GPT-3.5`.