商品评论之情感标签分类-显存24G内大模型finetune进阶版实战(Qwen2-7B/internlm2_5-7b-chat/glm-4-9b-chat)

前言

用LLM大模型来finetune处理传统的文本分类任务。分类任务当作生成式任务来做, 有点大炮打蚊子。但还是非常想尝试下,该文记录算法工程师做整个任务的过程。

第一步:base基座模型选择。

大概就三个: Qwen2-7B/internlm2_5-7b-chat/glm-4-9b-chat.

我们拿出50个case对三个模型进行zero-shot测试, 测之前我是对Qwen2-7B非常期待的, 但测出来glm-4-9b-chat效果最好。因此,我们选择glm4-9B为我们的基准模型。

第二步: 熟悉finetune方法(卡限制只考虑PEFT)

Lora/Ada-Lora/Prefix-tuning等等。

第三步: 数据集准备

两个情感标签数据集:

  1. 大众点评评价数据: http://www.modelscope.cn/datasets/DAMO_NLP/yf_dianping.git
  2. 京东商品评论数据集: https://modelscope.cn/models/iic/nlp_structbert_sentiment-classification_chinese-large

我们要转为生成数据集的格式:
大概就是: system(交代背景)
Usr: 评论
Assistant: AI给出回答
在这里插入图片描述

def question_reprocess(sentence, label):
    global reprocess_data 
    sys_prom = f'''你是情感判断专家。我们将给出一段对于商品的文本评论, 你需要判断该评论是: "积极评论。",还是: "消极评论。"。如果该评论是对商品满意, 请回答: "积极评论。"。如果该评论是对商品不满意, 请回答: "消极评论。"。以下,我将给出一个商品的评论:'''
    usr_prom = f'''{sentence}'''
    if label == 0:
        answer_prom = f'''消极评论。'''
    else:
        answer_prom = f'''积极评论。'''
    messages_e_json = dict()
    messages_e_json['messages']= [
        {
            "role": "system",
            "content": sys_prom,
        },
        {
            "role": "user",
            "content": usr_prom
        },
        {
            "role": "assistant",
            "content": answer_prom
        }
    ]
    reprocess_data.append(messages_e_json)

第四步: 跑出baseline,再提升。

  • 傻瓜式的Baseline

目前finetune的框架太多, 很多只需要你用命令行就可以训练。基本上只用调超参数就行。

但这样的方式有几个缺陷:

  • 几乎没法加自己的训练策略,有点low, 体现不了工作量,被质疑"你干了个啥?"
  • metrics也很难评测

为此,我们用源码训练。
同样的:

  1. 定义训练格式 json解码
  2. 增加metrics评测,因为是情感标签 我们采用简单的ACC
  3. Baseline 我们采用Lora
  • 增加点自己东西, training with COT data, 由基准模型生成COT数据
def question_reprocess_cot(sentence, label, cot_json):
    global reprocess_data 
    cot = eval(cot_json)['cot']
    sys_prom = f'''你是情感判断专家。我们将给出一段对于商品的文本评论, 你需要判断该评论是: "积极评论。",还是: "消极评论。"。如果该评论是对商品满意, 请回答: "积极评论。"。如果该评论是对商品不满意, 请回答: "消极评论。"。以下,我将给出一个商品的评论,你回答情感标签并给出推理过程。'''
    usr_prom = f'''{sentence}'''
    if label == 0:
        answer_prom = f'''消极评论。{cot}'''
    else:
        answer_prom = f'''积极评论。{cot}'''
    messages_e_json = dict()
    messages_e_json['messages']= [
        {
            "role": "system",
            "content": sys_prom,
        },
        {
            "role": "user",
            "content": usr_prom
        },
        {
            "role": "assistant",
            "content": answer_prom
        }
    ]
    #print(messages_e_json)
    reprocess_data.append(messages_e_json)

再来点工作量, 本质上是个分类任务, 我们对标签评论上loss。

  • cl_loss (分类loss)
  • kl_loss (kl约束分布)

Todo:

  • 蒸馏我觉得应该很有效
    *DPO or RL 等,可能有效
  • prompt应该可以再修改提升

总结:

感觉大模型还是能再提升的,比起专门structBERT我们只在本数据集下能够达到差不多的水准。

在这里插入图片描述

第五步: 用openai-api部署训练好的server。

if __name__ == "__main__":
    tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH, trust_remote_code=True)
    engine_args = AsyncEngineArgs(
        model=MODEL_PATH,
        tokenizer=MODEL_PATH,
        enable_lora=True,
        tensor_parallel_size=1,
        dtype="bfloat16",
        trust_remote_code=True,
        gpu_memory_utilization=0.9,
        enforce_eager=True,
        worker_use_ray=True,
        engine_use_ray=False,
        disable_log_requests=True,
        max_model_len=MAX_MODEL_LENGTH,
    )
    engine = AsyncLLMEngine.from_engine_args(engine_args)
    uvicorn.run(app, host='0.0.0.0', port=8080, workers=1)

先添加基准模型,再添加LoRARequest。

### Qwen2-7b 模型微调教程 使用 LLaMA-Factory 对 Qwen2-7b 模型进行微调是一个复杂但可行的任务。以下是关于如何使用 LLaMA-Factory 微调 Qwen2-7b 模型的详细说明,包括环境准备、依赖安装以及具体操作步骤。 #### 1. 环境准备 为了确保模型能够正常运行和微调,需要准备一个合适的 Python 环境,并安装必要的依赖项。根据引用[^2]中的内容,可以按照以下方式设置环境: ```bash conda create --name llama_factory python=3.10 conda activate llama_factory cd /data/service/LLaMA-Factory-main pip install -e ".[torch,metrics]" -i https://pypi.tuna.tsinghua.edu.cn/simple pip install flash-attn==2.6.3 -i https://pypi.tuna.tsinghua.edu.cn/simple pip install bitsandbytes==0.43.1 -i https://pypi.tuna.tsinghua.edu.cn/simple pip install deepspeed==0.14.4 -i https://pypi.tuna.tsinghua.edu.cn/simple ``` 这些依赖项对于加速训练过程(如 `flash-attn` 和 `deepspeed`)以及支持低精度训练(如 `bitsandbytes`)至关重要。 #### 2. 数据准备 在开始微调之前,需要准备好用于训练的数据集。数据集通常以 JSONL 格式存储,每行表示一个样本,包含输入和目标输出。例如: ```jsonl {"input": "问题:世界上最高的山是什么?", "output": "珠穆朗玛峰"} {"input": "问题:光速是多少?", "output": "光速约为299,792,458米/秒"} ``` 将数据集保存为文件(如 `train_data.jsonl`),并确保路径正确。 #### 3. 微调命令 LLaMA-Factory 提供了灵活的接口来支持模型微调。以下是一个典型的微调命令示例,适用于 Qwen2-7b 模型: ```bash CUDA_VISIBLE_DEVICES=0 llamafactory-cli finetune \ --model_name_or_path /home/xxx/Qwen2-VL-7B-Instruct \ --template qwen2_vl \ --infer_backend huggingface \ --trust_remote_code true \ --train_file /path/to/train_data.jsonl \ --output_dir /path/to/output_dir \ --per_device_train_batch_size 2 \ --gradient_accumulation_steps 4 \ --learning_rate 2e-5 \ --num_train_epochs 3 \ --logging_steps 10 \ --save_steps 100 \ --fp16 true ``` 上述命令中: - `--model_name_or_path` 指定 Qwen2-7b 模型的路径。 - `--train_file` 指定训练数据集的路径。 - `--output_dir` 指定微调后模型保存的目录。 - `--per_device_train_batch_size` 和 `--gradient_accumulation_steps` 控制批量大小。 - `--learning_rate` 和 `--num_train_epochs` 设置学习率和训练轮数。 - `--fp16 true` 启用混合精度训练以节省显存。 #### 4. 后端服务启动 微调完成后,可以使用 LLaMA-Factory 启动后端服务以测试微调后的模型性能。参考引用[^1]中的命令: ```bash CUDA_VISIBLE_DEVICES=0 API_PORT=8000 llamafactory-cli api \ --model_name_or_path /path/to/output_dir \ --template qwen2_vl \ --infer_backend huggingface \ --trust_remote_code true ``` 该命令将在端口 8000 上启动一个 API 服务,允许通过 HTTP 请求与模型交互。 #### 5. Web 界面启动 除了后端服务,还可以启动 LLaMA-Factory 的 Web 界面以更直观地测试模型: ```bash nohup llamafactory-cli webchat \ --model_name_or_path /path/to/output_dir \ --template qwen2_vl \ --infer_backend huggingface \ --trust_remote_code true & ``` Web 界面提供了一个图形化的用户界面,方便进行交互式测试。 --- ### 注意事项 - 确保 GPU 显存足够大以支持模型加载和训练。如果显存不足,可以尝试减少批量大小或启用梯度检查点[^2]。 - 如果使用 LoRA 方法进行微调,可以在命令中添加 `--lora_r` 和 `--lora_alpha` 参数以控制 LoRA 的秩和缩放因子。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热血小蚂蚁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值