大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。
图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG
我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。
展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索“展菲”,即可纵览我在各大平台的知识足迹。
📣 公众号“Swift社区”,每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
💬 微信端添加好友“fzhanfei”,与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。
📅 最新动态:2025 年 3 月 17 日
快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!
文章目录
摘要
训练一个大语言模型从零开始?那简直是“开天辟地”级别的工作,不但费电、费钱,还容易效果拉垮。幸运的是,我们完全可以站在“巨人”的肩膀上,通过微调(Fine-tuning)技术,快速让一个大模型“学会”我们想要它干的事,比如写情书、聊电影、答客户、做医疗问诊等等。这篇文章就带你从最初的传统训练方法聊起,一步步进入深度学习,再到预训练-微调范式的“降维打击”方式,并结合具体的代码配置和实践,告诉你怎么把一个通用大模型变成你专属的“AI小助手”。
描述
我们从最早的传统模型训练聊起,再进入深度学习的发展,最终落脚到现代最火的预训练-微调(Pretrain-Finetune)路线。文章中我们不只讲原理,还会结合具体代码配置、训练过程、数据格式、踩过的坑和实战经验来展开,确保你不只是“知道”微调,而是能“动手做微调”。
题解答案
大模型微调,其实就是两句话的事:
- 用别人已经训练好的大模型当“起点”。
- 用你自己的数据再“练”几轮,让它贴近你的任务。
比如你有一个聊天机器人项目,目标是做客服问答。你就可以拿一个像 Qwen、ChatGLM、LLaMA2 这样的模型,再用你自己整理的客服对话记录去训练它几百轮。这时候你不需要什么 GPU 集群、几十亿条语料,只要准备好格式化数据、写好配置文件,一块 A100 或者 T4 显卡也能搞起来。
题解代码分析
下面我们从一个完整的微调配置入手,看看微调过程中都需要准备哪些内容,并逐个讲清楚它们的作用。
模型配置
# 使用 Qwen2.5-0.5B 模型
model_name_or_path: openMind-ecosystem/Qwen2.5-0.5B
这句意思是:不要去用 OpenMind 内置的模型,而是从 Hugging Face 或本地加载一个预训练模型。这里我们用的是 Qwen2.5-0.5B,一个轻量级的语言模型,适合本地机器或者资源不太豪的实验室。
微调阶段与训练参数
stage: sft
do_train: true
finetuning_type: full
stage: sft
:代表我们现在处于“监督微调”阶段(Supervised Fine-Tuning)。finetuning_type: full
:说明我们是全参数微调,而不是像 LoRA 那种轻量型微调方式。
当然,如果你想节省显存,也可以选择 lora
微调方式,只更新少量参数,精度也不错。
DeepSpeed 配置(可选)
deepspeed: /home/openmind/openmind/examples/deepspeed/ds_z2_config.json
DeepSpeed 是微软开发的加速训练工具。如果你是用 A100 或者多卡训练,建议配置上。如果你只是用小模型单卡跑,完全可以注释掉这行。
模板配置
template: qwen
这是一个新加入的字段,用于告诉框架:我们使用的模型结构是 Qwen 类型的。这会影响到模型如何处理输入的 prompt 和标签。
数据集与格式化配置
dataset: conversations
custom_dataset_info: /home/openmind/identity/custom_dataset_info.json
cutoff_len: 1024
max_length: 1024
重点是 custom_dataset_info.json
,我们自定义了一个 JSON 配置,告诉系统数据在哪、长啥样、怎么读:
custom_dataset_info.json 内容:
{
"conversations": {
"local_path": "/home/openmind/identity",
"file_name": "conversations.jsonl",
"formatting": "sharegpt",
"tags": {
"role_tag": "from",
"content _tag": "value",
"user_tag": "human",
"assistant_tag": "assistant",
"observation _tag": "observation",
"function_tag": "function_call",
"system_tag": "system"
}
}
}
注意几个字段:
formatting: sharegpt
:指的是我们数据用的是类似 ShareGPT 的结构,数据是按角色分段存储的。"role_tag": "from"
:在数据中,角色是写在from
字段里的。"content _tag": "value"
:模型要学的内容写在value
字段里。
(注意content _tag
中间多了空格,是个 Bug,应该改成"content_tag": "value"
)
模型输出目录与训练控制
output_dir: saves/qwen2.5_0.5b_full2
logging_steps: 1
save_steps: 20000
overwrite_output_dir: true
output_dir
:训练好的模型会保存在这个路径里。logging_steps: 1
:每一步都打印训练日志,方便调试。save_steps
:每 20000 步保存一次模型。
训练参数
per_device_train_batch_size: 2
gradient_accumulation_steps: 2
learning_rate: 1.0e-5
lr_scheduler_type: cosine
warmup_ratio: 0.1
bf16: true
max_steps: 500
seed: 1234
这些参数控制了训练的细节:
batch_size * grad_accumulation = 4
:等效每轮喂 4 条样本,节省显存。learning_rate: 1e-5
:对大模型来说算比较稳妥的起步。cosine
学习率调度器:一开始升温(warmup),然后慢慢下降。bf16: true
:启用半精度训练,兼顾速度与精度。max_steps: 500
:训练 500 步,可以看效果,觉得不够可以加。
示例测试及结果
我们用一个自定义的数据集 conversations.jsonl
,每条记录长这样:
[
{"from": "human", "value": "请用一句话介绍自己"},
{"from": "assistant", "value": "我是一个基于Qwen微调的聊天机器人,可以帮你解答各种问题。"}
]
训练完成后,我们可以用下面的命令来测试:
python3 openmind-cli.py chat \
--model_path saves/qwen2.5_0.5b_full2 \
--template qwen
你可以和模型自由对话,它会用你提供的语料风格和习惯来回复,比如你训练的数据里用了“我司产品”“非常抱歉”,它就会模仿这种企业客服的语言风格。
总结
整篇文章讲了这么多,其实想传达一个最简单的结论就是:
“别再从零开始训练模型了,真的不划算!”
现在这个时代,预训练模型这么多、开源社区这么活跃,我们完全可以用微调这招,把一个通用大模型训练成自己任务的“定制工具”。而且用到的代码和配置都不复杂,跑一晚上,就能让模型从“什么都懂但不太专业”,变成“专业+懂你”的助手。
最后再提醒一下几个要点:
- 选个合适的基础模型(越轻越快,越大越准)。
- 数据格式要整理清楚,字段别拼错。
- 配置文件要用 YAML 写清楚,避免路径错误。
- 如果资源不够,可以选用
lora
轻微调,效果也不错。 - 微调是个反复试验的过程,调参、换数据、看结果。
只要你掌握了这套流程,大模型微调就再也不是难题了!