一、引言
随着ChatGPT的爆火,大语言模型层出不穷,像openai的gpt系列、meta的llama系列,还有国内阿里的通义千问、百度的文心一言等数不胜数。尝试使用了常见的几款模型后,效果还是很惊艳的,但是对于特定场景的问题,他们的回答就过于宽泛。于是乎便想是否能通过微调模型,让它更能满足特定场景下的问题。
二、什么是微调
微调是指在已经预训练好的深度学习模型基础上,通过进一步训练来适应特定任务或数据集。这种方法允许我们在具有大规模通用知识的模型基础上,更好地适应特定领域或任务。
通俗点讲,就是用通用模型作为基础,配合上特定场景的数据做进一步训练,得到适合特定场景的模型。
三、为什么微调
微调有以下几个主要原因:
-
迁移学习: 利用在大规模数据上预训练好的模型,可以获得通用的语言理解能力,从而在特定任务上表现更好。
-
数据稀缺: 当我们的任务数据相对较少时,微调允许我们在有限的数据上进行有效的训练,避免从头开始训练模型。
-
节省计算资源: 预训练的模型通常需要大量的计算资源,微调可以在这个基础上节省训练资源。
四、微调的主要步骤
-
准备数据:收集和准备与目标任务相关的数据,并对数据进行清洗和预处理,以满足训练的要求。
-
选择基础模型:根据目标任务和数据集特定选择合适的基础模型。
-
设置微调参数:设置微调中的超参,如迭代次数、学习率、序列长度等。这些参数会影响微调效果和收敛速度。
-
进行微调训练:使用准备好的模型,对基础模型进行微调,过程中,根据微调参数,逐渐调整模型参数来降低loss。
-
评估模型效果:在微调完成后,使用测试集对最终的微调模型进行评估,以获得最终的性能指标。这有助于评估模型在实际应用中的表现。
-
部署模型:将微调后的模型部署为服务,或加载至应用中,以满足实际业务需求。
大模型的微调步骤大体如此,但具体的步骤和细节可能会因为模型、数据、需求不同而有所变化。
五、微调自我认知
今天就以微调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智汇云打造的人工智能助手,请问有什么可以帮助您的吗?"
}
]
}
]
-
选择基础模型
这里我们选用了通义千问Qwen-14B模型,你可以通过 **huggingface** 或 魔塔 进行下载
-
进行微调训练
微调的数据和模型准备好之后,就可以开始执行微调了,使用如下的命令:
# $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 : 模型的存储目录
-
测试模型效果
可以使用官方提供的测试代码
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))
# 您好,我是小智,很高兴为您服务。有什么我可以帮您解决的问题或者需要我提供的帮助吗?
-
部署模型(fastchat)
-
启动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. 数据准备
-
数据格式说明:参考上述微调过程的数据。
-
数据上传 将任务相关的数据上传到训练环境,以便模型可以访问并学习特定任务的信息。
2. 设置微调参数
-
设计基础信息并选择基础模型
-
设置微调超参
微调时需要注意的参数包括:
-
学习率: 调整学习率以确保在微调中不会过度调整模型参数。
-
批量大小: 确定每次输入模型的数据批量大小,影响训练速度和模型性能。
-
迭代次数: 确定微调的迭代次数,平衡模型性能和训练时间。
3.选择数据与微调资源
-
提交任务等待微调完成
根据日志查看微调进度
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}}
大模型岗位需求
大模型时代,企业对人才的需求变了,AIGC相关岗位人才难求,薪资持续走高,AI运营薪资平均值约18457元,AI工程师薪资平均值约37336元,大模型算法薪资平均值约39607元。
掌握大模型技术你还能拥有更多可能性:
• 成为一名全栈大模型工程师,包括Prompt,LangChain,LoRA等技术开发、运营、产品等方向全栈工程;
• 能够拥有模型二次训练和微调能力,带领大家完成智能对话、文生图等热门应用;
• 薪资上浮10%-20%,覆盖更多高薪岗位,这是一个高需求、高待遇的热门方向和领域;
• 更优质的项目可以为未来创新创业提供基石。
可能大家都想学习AI大模型技术,也想通过这项技能真正达到升职加薪,就业或是副业的目的,但是不知道该如何开始学习,因为网上的资料太多太杂乱了,如果不能系统的学习就相当于是白学。为了让大家少走弯路,少碰壁,这里我直接把全套AI技术和大模型入门资料、操作变现玩法都打包整理好,希望能够真正帮助到大家。
-END-
👉AI大模型学习路线汇总👈
大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)
第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
👉大模型实战案例👈
光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
👉大模型视频和PDF合集👈
观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费
】🆓