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.

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.

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.

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.

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:

{
  '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.