当前位置:   article > 正文

通义千问Qwen-14B模型在360AI平台的微调实践之自我认知

qwen4b 上下文

一、引言

随着ChatGPT的爆火,大语言模型层出不穷,像openai的gpt系列、meta的llama系列,还有国内阿里的通义千问、百度的文心一言等数不胜数。尝试使用了常见的几款模型后,效果还是很惊艳的,但是对于特定场景的问题,他们的回答就过于宽泛。于是乎便想是否能通过微调模型,让它更能满足特定场景下的问题。

二、什么是微调

微调是指在已经预训练好的深度学习模型基础上,通过进一步训练来适应特定任务或数据集。这种方法允许我们在具有大规模通用知识的模型基础上,更好地适应特定领域或任务。

通俗点讲,就是用通用模型作为基础,配合上特定场景的数据做进一步训练,得到适合特定场景的模型。

三、为什么微调

微调有以下几个主要原因:

  1. 迁移学习: 利用在大规模数据上预训练好的模型,可以获得通用的语言理解能力,从而在特定任务上表现更好。

  2. 数据稀缺: 当我们的任务数据相对较少时,微调允许我们在有限的数据上进行有效的训练,避免从头开始训练模型。

  3. 节省计算资源: 预训练的模型通常需要大量的计算资源,微调可以在这个基础上节省训练资源。

四、微调的主要步骤

  1. 准备数据:收集和准备与目标任务相关的数据,并对数据进行清洗和预处理,以满足训练的要求。

  2. 选择基础模型:根据目标任务和数据集特定选择合适的基础模型。

  3. 设置微调参数:设置微调中的超参,如迭代次数、学习率、序列长度等。这些参数会影响微调效果和收敛速度。

  4. 进行微调训练:使用准备好的模型,对基础模型进行微调,过程中,根据微调参数,逐渐调整模型参数来降低loss。

  5. 评估模型效果:在微调完成后,使用测试集对最终的微调模型进行评估,以获得最终的性能指标。这有助于评估模型在实际应用中的表现。

  6. 部署模型:将微调后的模型部署为服务,或加载至应用中,以满足实际业务需求。

大模型的微调步骤大体如此,但具体的步骤和细节可能会因为模型、数据、需求不同而有所变化。

五、微调自我认知

今天就以微调Qwen-14B(通义千问)的自我认知为切入口,简单介绍下微调的全流程。

先看下微调前后的效果对比:

微调前:

975649ef6073fbd3f6298c21b6446ed9.png

微调后:

02b51d27c4fabf2bfeea5466579a571c.png

1. 环境配置

使用nvidia-smi命令查看GPU配置,本文使用了4张A100作为开发测试。

062d2db946be82d2c5e6c2f4de6d76a1.png

2. 框架和模型

微调的模型:Qwen-14B

微调框架:360AI平台

提供openai兼容的RESTful API框架: FastChat

3. 微调过程

1. 准备数据

训练数据为jsonl格式,每一行的数据格式如下,其中conversations字段是必需的,可以根据实际需求添加或删除其他字段,样例如下。(标红字段“小智”、“360智汇云”可随意更改为你自己希望的名字,以实现自定义的模型自我认知)

  1. [
  2. {
  3. "id": "112720",
  4. "source": "cot",
  5. "conversations": [
  6. {
  7. "from": "user",
  8. "value": "你好"
  9. },
  10. {
  11. "from": "assistant",
  12. "value": "您好,我是小智,一个由360智汇云开发的 AI 助手,很高兴认识您。请问我能为您做些什么?"
  13. }
  14. ]
  15. },
  16. {
  17. "id": "55381",
  18. "source": "grad_1_6",
  19. "conversations": [
  20. {
  21. "from": "user",
  22. "value": "你好"
  23. },
  24. {
  25. "from": "assistant",
  26. "value": "您好,我是小智,一个由360智汇云打造的人工智能助手,请问有什么可以帮助您的吗?"
  27. }
  28. ]
  29. }
  30. ]
  1. 选择基础模型

    这里我们选用了通义千问Qwen-14B模型,你可以通过 **huggingface** 或 魔塔 进行下载

  2. 进行微调训练

    微调的数据和模型准备好之后,就可以开始执行微调了,使用如下的命令:

  1. # $DATA为数据路径
  2. # $MODEL为模型路径
  3. deepspeed finetune_merge.py \
  4. --report_to "none" \
  5. --data_path $DATA \
  6. --lazy_preprocess False \
  7. --model_name_or_path $MODEL \
  8. --output_dir /hboxdir/output \
  9. --model_max_length 2048 \
  10. --num_train_epochs 24 \
  11. --per_device_train_batch_size 1 \
  12. --gradient_accumulation_steps 1 \
  13. --save_strategy epoch \
  14. --save_total_limit 2 \
  15. --learning_rate 1e-5 \
  16. --lr_scheduler_type "cosine" \
  17. --adam_beta1 0.9 \
  18. --adam_beta2 0.95 \
  19. --adam_epsilon 1e-8 \
  20. --max_grad_norm 1.0 \
  21. --weight_decay 0.1 \
  22. --warmup_ratio 0.01 \
  23. --logging_steps 1 \
  24. --gradient_checkpointing True \
  25. --deepspeed "ds_config_zero3.json" \
  26. --bf16 True \
  27. --tf32 True

以下是针对deepspeed的参数说明,可根据具体情况进行相应参数的修改:

与数据相关的参数:

  1. data_path : 数据路径,huggingface数据库, 比如:Dahoas/rm-static
  2. data_split : 数据的拆分方式,比如 2,4,4 是为step1,2,3分配的数据比例
  3. max_seq_len : 最大序列长度(超过长度会被截掉)
  4. data_output_path : 相关数据的存储地址(local storage,不能是shared storage)

与模型相关的参数:

  1. model_name_or_path : 模型名称或路径,huggingface模型,比如:facebook/opt-1.3b
  2. lora_dim : 如果大于0,则使用LoRA优化
  3. lora_module_name : 设置LoRA的范围,比如可以只针对 decoder.layers
  4. only_optimize_lora : 是否只优化LoRA的参数

与训练相关的参数:

  1. per_device_train_batch_size : 训练时的 Batch size (per device:每个GPU的Size)
  2. per_device_eval_batch_size : 评价时的 Batch size (per device)
  3. learning_rate : 学习率
  4. weight_decay : 权重衰减,防止模型过拟合的技术。
  5. num_train_epochs : 训练 epoch 数
  6. gradient_accumulation_steps : 累积多少个 mini-batch 的梯度后再进行一次参数更新。
  7. lr_scheduler_type : learning rate的调整策略,比如 linear, cosine

deepspeed:

  1. zero_stage : 这个对应者DeepSpeed工具中的zero方式,分别是0,1,2,3
  2. offload : ZeRO-Offload 通过利用主机CPU上的计算和内存资源来执行优化器,从而减少此类模型的GPU计算和内存需求。
  3. local_rank : 分布式训练时的一个变量,用于标识当前 GPU 设备的本地排名(本机排名,与global-rank不同)
  4. gradient_checkpointing : 降低深度学习模型训练过程中内存消耗的技术

其他:

seed        : 随机排序是的seedoutput_dir  : 模型的存储目录
  1. 测试模型效果

    可以使用官方提供的测试代码

  1. from transformers import AutoModelForCausalLM, AutoTokenizer
  2. from transformers.generation import GenerationConfig
  3. # 模型路径
  4. model_dir="/models/qwen-14b"
  5. # Note: The default behavior now has injection attack prevention off.
  6. tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True)
  7. model = AutoModelForCausalLM.from_pretrained(model_dir, device_map="auto", trust_remote_code=True).eval()
  8. inputs = tokenizer('你好啊,介绍下你自己', return_tensors='pt')
  9. inputs = inputs.to(model.device)
  10. pred = model.generate(**inputs)
  11. print(tokenizer.decode(pred.cpu()[0], skip_special_tokens=True))
  12. # 您好,我是小智,很高兴为您服务。有什么我可以帮您解决的问题或者需要我提供的帮助吗?
  1. 部署模型(fastchat)

    1. 启动controller

python -m fastchat.serve.controller --host 0.0.0.0 --port 21001

b. 启动模型服务

  1. # /models/qwen-14b 为模型路径
  2. python -m fastchat.serve.model_worker --model-path /models/qwen-14b/ --host 0.0.0.0

c.启动RESTful API 服务

python -m fastchat.serve.openai_api_server --host 0.0.0.0 --port 8000

d. 使用openai官方sdk测试效果

  1. import openai
  2. openai.api_key = "EMPTY"
  3. openai.api_base = "http://localhost:8000/v1"
  4. # 这里指定微调的模型名字,也就是保存模型文件的文件夹名称
  5. model = "qwen-14b"
  6. # create a chat completion
  7. completion = openai.ChatCompletion.create(
  8. model=model,
  9. messages=[{"role": "user", "content": "你是谁"}]
  10. )
  11. # print the completion
  12. print(completion.choices[0].message.content)
  13. # 您好,我是小智,很高兴为您服务。有什么我可以帮您解决的问题或者需要我提供的帮助吗?

六、360AI平台使用

1. 数据准备

  1. 数据格式说明:参考上述微调过程的数据。

  2. 数据上传 将任务相关的数据上传到训练环境,以便模型可以访问并学习特定任务的信息。

55a9cda3b403035f8c69fb4ae4855a94.png

2. 设置微调参数

  1. 设计基础信息并选择基础模型

    a4ffd23026dc8bb4789fd0575a300d0e.png

  2. 设置微调超参

    微调时需要注意的参数包括:

    1. 学习率: 调整学习率以确保在微调中不会过度调整模型参数。

    2. 批量大小: 确定每次输入模型的数据批量大小,影响训练速度和模型性能。

    3. 迭代次数: 确定微调的迭代次数,平衡模型性能和训练时间。

3b95e8a061d0266b52f4c763a6158d23.png

3.选择数据与微调资源

e31c781662571bdbd6912156b135099b.png

  1. 提交任务等待微调完成

    根据日志查看微调进度

2b225b148e02bdfa3643b303716d172e.png

3. 部署模型

a.选择模型并设置部署信息

2ce706c6e2da2e6d42642c95eb488c5f.png

b. 设置部署资源

762c4145bec0981fab20c0447a3fa590.png

c. 通过curl调用服务

curl http://{{HOST}}:8000/v1/chat/completions \  -H "Content-Type: application/json" \  -d '{    "model": "qwen-14b",    "messages": [{"role": "user", "content": "你是谁"}]  }'# {"id":"chatcmpl-awAuE7ywqEkyeftHiiuoDk","object":"chat.completion","created":1707131390,"model":"output","choices":[{"index":0,"message":{"role":"assistant","content":"您好,我是小智,一个由360智汇云开发的人工智能助手。我可以回答各种问题、提供信息、解决问题、提供建议等。然而,我并不是一个真正的人,而是一个由计算机程序生成的虚拟实体。我可以回答各种问题,提供有针对性的回答,帮助用户完成各种任务。我的目标是为尽可能多的人提供知识与帮助,让更多人受益于人工智能技术。\n"},"finish_reason":"length"}],"usage":{"prompt_tokens":449,"total_tokens":2046,"completion_tokens":1597}}

参考文章:

  1. 微调Llama2自我认知

  2. 通义千问微调

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号