---
frameworks:
- Pytorch
license: MIT License
tasks:
- text-generation

#model-type:
##如 gpt、phi、llama、chatglm、baichuan 等
#- gpt

domain:
- nlp

#language:
##语言代码列表 https://help.aliyun.com/document_detail/215387.html?spm=a2c4g.11186623.0.0.9f8d7467kni6Aa
#- cn 

#metrics:
##如 CIDEr、Blue、ROUGE 等
#- CIDEr

tags:
##各种自定义，包括 pretrained、fine-tuned、instruction-tuned、RL-tuned 等训练方法和其他
- fine-tuned

#tools:
##如 vllm、fastchat、llamacpp、AdaSeq 等
#- vllm
---
## 模型推理结果文件

见`吃早饭_TouInd_12271627.jsonl`

## 训练和推理代码

### 训练脚本

```bash
# Experimental environment: V100, A10, 3090
CUDA_VISIBLE_DEVICES=0 \
    swift sft \
    --model_id_or_path Qwen/Qwen2.5-7B-Instruct \
    --sft_type lora \
    --use_dora True \
    --tuner_backend peft \
    --template_type AUTO \
    --dtype AUTO \
    --output_dir output \
    --dataset qa_dataset_final3.jsonl sft_dataset_train_processed_rewritev2_with_example.jsonl \
    --num_train_epochs 3 \
    --max_length 2600 \
    --check_dataset_strategy warning \
    --lora_rank 8 \
    --lora_alpha 32 \
    --lora_dropout_p 0.05 \
    --lora_target_modules ALL \
    --gradient_checkpointing true \
    --batch_size 1 \
    --weight_decay 0.1 \
    --learning_rate 5e-5 \
    --gradient_accumulation_steps 16 \
    --max_grad_norm 0.5 \
    --warmup_ratio 0.03 \
    --eval_steps 50 \
    --save_steps 50 \
    --save_total_limit 2 \
    --logging_steps 10 
```

### 推理代码

```python
import os

os.environ['CUDA_VISIBLE_DEVICES'] = '0'
import gc
import hashlib
import json

import jsonlines
import torch
from swift.llm import (
    ModelType,
    get_default_template_type,
    get_model_tokenizer,
    get_template,
    get_vllm_engine,
    inference,
    inference_vllm,
)
from swift.tuners import Swift
from swift.utils import seed_everything
from tqdm import tqdm


def generate_unique_code(input_string):
    sha256_hash = hashlib.sha256()
    sha256_hash.update(input_string.encode('utf-8'))
    unique_code = sha256_hash.hexdigest()
    return unique_code

def convert_config_to_dict(config_dict):
    """Convert generation config to JSON serializable format"""
    serializable_dict = {}
    for key, value in config_dict.items():
        if isinstance(value, set):
            serializable_dict[key] = list(value)
        elif key == 'compile_config':
            # Convert CompileConfig object to dict
            serializable_dict[key] = {
                'fullgraph': value.fullgraph,
                'dynamic': value.dynamic,
                'backend': value.backend,
                'mode': value.mode,
                'options': value.options
            }
        else:
            serializable_dict[key] = value
    return serializable_dict

seed_everything(42)

file_jsonl_path = "eval_only_query.jsonl"
out_path = "吃早饭_TouInd_12271627.jsonl"
log_file = "run_log.jsonl" # 推理日志


# for objective questions
model_type = ModelType.qwen2_5_7b_instruct
template_type = get_default_template_type(model_type)
model_id_or_path = None
llm_engine = get_vllm_engine(model_type,max_model_len=10000)
llm_engine.generation_config.max_new_tokens = 1024
llm_engine.generation_config.temperature = 0
llm_engine.generation_config.do_sample = False

template = get_template(template_type, llm_engine.hf_tokenizer)

reason_data = []
with open(file_jsonl_path, "rb") as file:
    for line in jsonlines.Reader(file):
        if line["query_type"]=="objective":
            reason_data.append(
                {
                    "query": line["query"] + "\n\nAnswer this multiple-choice question step by step. First, analyze each option carefully, explain why each is correct or incorrect, and then conclude with the best answer.\n",
                    "origin": line
                }
            )
resp_list = inference_vllm(llm_engine, template, reason_data, use_tqdm=True,max_batch_size=8,)

# Add run logging for first inference
for query_data, resp in zip(reason_data, resp_list):
    run_info = {
        "unique_id": generate_unique_code(query_data["query"]),
        "model_inp": query_data["query"],
        "gen_parm": convert_config_to_dict(llm_engine.generation_config.__dict__),
        "answer": resp["response"]
    }
    with open(log_file, "a") as fw:
        fw.write(json.dumps(run_info, ensure_ascii=False)+"\n")

final_data = []
for line in resp_list:
    final_data.append(
        {
            "query": f"You are a good summarizer. Please summarize Answer and output the choise(s) like `A` or `AB` or `ACD` only.\n\n \n\nAnswer:{line['response']}\n\n",
        }
    )
# 修改max_new_tokens
resp_list = inference_vllm(llm_engine, template, final_data, use_tqdm=True,max_batch_size=8,)

# Add run logging for summarization inference
for data, resp in zip(final_data, resp_list):
    run_info = {
        "unique_id": generate_unique_code(data["query"]),
        "model_inp": data["query"],
        "gen_parm": convert_config_to_dict(llm_engine.generation_config.__dict__),
        "answer": resp["response"]
    }
    with open(log_file, "a") as fw:
        fw.write(json.dumps(run_info, ensure_ascii=False)+"\n")

with jsonlines.open(out_path, mode="a") as file_jsonl:
    for origin,resp in zip(reason_data,resp_list):
        file_jsonl.write({"query": origin["origin"]["query"], "query_type":origin["origin"]["query_type"],"answer": resp["response"]})
del llm_engine.model_executor
del llm_engine
gc.collect()
torch.cuda.empty_cache()
torch.distributed.destroy_process_group()
import ray

ray.shutdown()

# for subjective questions
ckpt_dir = "BAAI_Industry_Competition_tourism_dev/eatbreakfast_TouInd"
model_type = ModelType.qwen2_5_7b_instruct
template_type = get_default_template_type(model_type)
model_id_or_path = None
model, tokenizer = get_model_tokenizer(model_type, model_id_or_path=ckpt_dir,
                                       model_kwargs={'device_map': 'auto',"load_in_4bit":True})
# model = Swift.from_pretrained(model, ckpt_dir, inference_mode=True)

# 修改max_new_tokens
model.generation_config.max_new_tokens = 1024
model.generation_config.temperature = 0
model.generation_config.do_sample = False
template = get_template(template_type, tokenizer)

with open(file_jsonl_path,"rb") as file:
    for i,line in tqdm(enumerate(jsonlines.Reader(file))):
        if line["query_type"]=="subjective":
            query = line['query']
            response, history = inference(model, template, query)
            
            # Add run logging for subjective questions
            run_info = {
                "unique_id": generate_unique_code(query),
                "model_inp": query,
                "gen_parm": convert_config_to_dict(model.generation_config.__dict__),
                "answer": response
            }
            with open(log_file, "a") as fw:
                fw.write(json.dumps(run_info, ensure_ascii=False)+"\n")
            
            data = {"query":line["query"],"query_type":line["query_type"],"answer":response}
            with jsonlines.open(out_path,mode="a") as file_jsonl:
                file_jsonl.write(data)
```



