通义千问 Qwen-14B 模型微调实战案例及经验总结

节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学,针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。


汇总合集

《大模型面试宝典》(2024版) 发布!


一、引言

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

二、什么是微调

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

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

三、为什么微调

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

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

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

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

四、微调的主要步骤

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

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

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

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

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

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

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

技术交流

前沿技术资讯、算法交流、求职内推、算法竞赛、面试交流(校招、社招、实习)等、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企开发者互动交流~

我们建了算法岗面试与技术交流群, 想要进交流群、需要源码&资料、提升技术的同学,可以直接加微信号:mlc2040。加的时候备注一下:研究方向 +学校/公司+CSDN,即可。然后就可以拉你进群了。

方式①、微信搜索公众号:机器学习社区,后台回复:技术交流
方式②、添加微信号:mlc2040,备注:技术交流+CSDN

用通俗易懂的方式讲解系列

  • 重磅来袭!《大模型面试宝典》(2024版) 发布!

  • 重磅来袭!《大模型实战宝典》(2024版) 发布!

  • 用通俗易懂的方式讲解:不用再找了,这是大模型最全的面试题库

  • 用通俗易懂的方式讲解:这是我见过的最适合大模型小白的 PyTorch 中文课程

  • 用通俗易懂的方式讲解:一文讲透最热的大模型开发框架 LangChain

  • 用通俗易懂的方式讲解:基于 LangChain + ChatGLM搭建知识本地库

  • 用通俗易懂的方式讲解:基于大模型的知识问答系统全面总结

  • 用通俗易懂的方式讲解:ChatGLM3 基础模型多轮对话微调

  • 用通俗易懂的方式讲解:最火的大模型训练框架 DeepSpeed 详解来了

  • 用通俗易懂的方式讲解:这应该是最全的大模型训练与微调关键技术梳理

  • 用通俗易懂的方式讲解:Stable Diffusion 微调及推理优化实践指南

  • 用通俗易懂的方式讲解:大模型训练过程概述

  • 用通俗易懂的方式讲解:专补大模型短板的RAG

  • 用通俗易懂的方式讲解:大模型LLM Agent在 Text2SQL 应用上的实践

  • 用通俗易懂的方式讲解:大模型 LLM RAG在 Text2SQL 上的应用实践

  • 用通俗易懂的方式讲解:大模型微调方法总结

  • 用通俗易懂的方式讲解:涨知识了,这篇大模型 LangChain 框架与使用示例太棒了

  • 用通俗易懂的方式讲解:掌握大模型这些优化技术,优雅地进行大模型的训练和推理!

  • 用通俗易懂的方式讲解:九大最热门的开源大模型 Agent 框架来了

五、微调自我认知

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

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

微调前:

图片

微调后:

图片

1. 环境配置

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

图片

2. 框架和模型

微调的模型: Qwen-14B

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

3. 微调过程

1. 准备数据

训练数据为jsonl格式,每一行的数据格式如下,其中conversations字段是必需的,可以根据实际需求添加或删除其他字段,样例如下。

[{
"id": "112720",
"source": "cot",
"conversations": [{
"from": "user",
"value": "你好"},{
"from": "assistant",
"value": "您好,我是小智,一个由360智汇云开发的 AI 助手,很高兴认识您。请问我能为您做些什么?"}]},{
"id": "55381",
"source": "grad_1_6",
"conversations": [{
"from": "user",
"value": "你好"},{
"from": "assistant",
"value": "您好,我是小智,一个由360智汇云打造的人工智能助手,请问有什么可以帮助您的吗?"}]}
]
  1. 选择基础模型

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

  2. 进行微调训练

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

# $DATA为数据路径
# $MODEL为模型路径
deepspeed finetune_merge.py  \--report_to "none" \--data_path $DATA \--lazy_preprocess False \--model_name_or_path $MODEL \--output_dir /hboxdir/output \--model_max_length 2048 \--num_train_epochs 24 \--per_device_train_batch_size 1 \--gradient_accumulation_steps 1 \--save_strategy epoch \--save_total_limit 2 \--learning_rate 1e-5 \--lr_scheduler_type "cosine" \--adam_beta1 0.9 \--adam_beta2 0.95 \--adam_epsilon 1e-8 \--max_grad_norm 1.0 \--weight_decay 0.1 \--warmup_ratio 0.01 \--logging_steps 1 \--gradient_checkpointing True \--deepspeed "ds_config_zero3.json" \--bf16 True \--tf32 True

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

与数据相关的参数:

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

与模型相关的参数:

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

与训练相关的参数:

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

deepspeed:

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

其他:

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

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

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

  2. 启动controller

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

b. 启动模型服务

# /models/qwen-14b 为模型路径
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测试效果

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

六、平台使用

1. 数据准备

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

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

2. 设置微调参数

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

    图片

  2. 设置微调超参

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

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

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

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

图片

3.选择数据与微调资源

图片

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

    根据日志查看微调进度

图片

3. 部署模型

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

图片

b. 设置部署资源

图片

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}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/635945.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全产品---数据库防火墙/审计

数据库防火墙 防火墙的类型繁多,即使下一代防火墙或者说AI防火墙集成功能再多,我觉得waf与数据库防火墙也有其无法被替代的理由,以此记录我对数据库防火墙的理解 what 数据库防火墙是基于数据库协议分析与访问行为控制的数据库安全防护产品…

安居水站:独立审慎的批判思考-审辩式思维

正文共:2492字 15张图 预计阅读时间:5分钟 在设计这个教案时,我们的目标是培养出具有独立思考、逻辑思维和批判性分析能力的学生。这些技能是当今社会日益重视的,也是当前教育体系中学生所普遍缺乏的。为此,我们的教案将通过一系列的活…

在PostgreSQL中如何进行全文搜索,以及如何优化全文搜索性能?

文章目录 如何进行全文搜索1. 创建全文搜索向量2. 执行全文搜索查询 如何优化全文搜索性能1. 使用GIN索引2. 限制搜索范围3. 优化文本处理4. 使用并发搜索5. 监控和调整配置 在PostgreSQL中,全文搜索通常通过使用tsvector和tsquery类型,以及to_tsvector和…

分类预测 | Matlab实现SCSO-SVM沙猫群优化算法优化支持向量机多特征分类预测

分类预测 | Matlab实现SCSO-SVM沙猫群优化算法优化支持向量机多特征分类预测 目录 分类预测 | Matlab实现SCSO-SVM沙猫群优化算法优化支持向量机多特征分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现SCSO-SVM沙猫群优化算法优化支持向量机多特征分类…

嵌入式学习55-ARM4(ADC和I²C)

1、什么是ADC,模拟量和数字量有什么特点? ADC: …

部署轻量级Gitea替代GitLab进行版本控制(一)

Gitea 是一款使用 Golang 编写的可自运营的代码管理工具。 Gitea Official Website gitea: Gitea的首要目标是创建一个极易安装,运行非常快速,安装和使用体验良好的自建 Git 服务。我们采用Go作为后端语言,这使我们只要生成一个可执行程序即…

启动 UE4编辑器报 加载 Plugin 失败

启动 UE4编辑器报 加载 Plugin 失败,报如下错误: Plugin ‘SteamVR’ failer to load because module ‘SteamVR’ could not be found. Please ensure the plugin is properly installed, otherwise consider disabling the plugin for this project. …

vscode设置conda默认python环境,简单有效

本地conda 可能安装了各种环境,默认的vscode总是base环境,这时你想要在vscode调试python代码,使用默认的环境没有安装对应的包就会遇到报错解决这个问题的方法很简单ctrlshiftp 调出命令面板 再输入 select interpreter , 选择 python 选择解…

第 2 章:FFmpeg简介

2.1 历史 历史 一些相关术语介绍: 容器(Container)格式:一种文件封装格式,里边主要包含了流,一般会使用一个特定的后缀名标识,例如.mov、.avi、.wav等。流 (Stream)&am…

C语言学习/复习25---函数指针/函数指针数组/函数指针数组指针的判断、快排中的函数指针和回调函数实现任意数据类型比较的案例

一、函数指针数组 1.什么是函数指针数组 2.函数指针数组的定义 案例1:函数指针与函数指针数组 注意事项:( )>[ ]>*,先与[ ] 结合就是数组,先与*结合就是指针 二、指向函数指针数组的指针 注意事项1:( )>[ ]>*,先与[ ]…

在PostgreSQL中,如何创建一个触发器并在特定事件发生时执行自定义操作?

文章目录 解决方案示例代码1. 创建自定义函数2. 创建触发器 解释 在PostgreSQL中,触发器(trigger)是一种数据库对象,它能在特定的事件(如INSERT、UPDATE或DELETE)发生时自动执行一系列的操作。这些操作可以…

【网站项目】高校毕业论文管理系统小程序

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…