本文档以通义千问模型的微调操作为例进行说明,使用命令行(Shell)和 API (HTTP)两种方式,帮助您使用百炼提供的模型微调功能。
前提条件
您已经完整阅读了模型调优简介,熟悉如何在百炼平台进行模型微调的基本步骤,并掌握了微调数据集构建技巧。
已开通服务并获得API-KEY, 请参考获取API Key。
已导入 API-KEY,请参考配置API Key到环境变量。
(可选,仅 Shell 需要)已安装 DashScope SDK,请参考DashScope SDK。
上传训练文件
准备训练文件
SFT 训练集
SFT ChatML(Chat Markup Language)格式训练数据,支持多轮对话和多种角色设置,一行训练数据展开后结构如下:
{"messages": [
{"role": "system", "content": "<系统输入1>"},
{"role": "user", "content": "<用户输入1>"},
{"role": "assistant", "content": "<模型期望输出1>"},
{"role": "user", "content": "<用户输入2>"},
{"role": "assistant", "content": "<模型期望输出2>"}
...
...
...
]
}
system/user/assistant 区别请参见消息类型。
不支持OpenAI 的name
、weight
参数,所有的 assistant 输出都会被训练。
训练数据集样例:
SFT 图像理解训练集
SFT图像理解 ChatML 格式训练数据(图片文件会与文本训练数据在同一目录下一起打包成 zip),一行训练数据展开后结构如下:
{"messages":[
{"role":"user",
"content":[
{"text":"<用户输入1>"},
{"image":"<图像文件名1>"}]},
{"role":"assistant",
"content":[
{"text":"<模型期望输出1>"}]},
{"role":"user",
"content":[
{"text":"<用户输入2>"}]},
{"role":"assistant",
"content":[
{"text":"<模型期望输出2>"}]},
...
...
...
]}
system/user/assistant 区别请参见消息类型。
不支持OpenAI 的name
、weight
参数,所有的 assistant 输出都会被训练。
训练数据集样例:
DPO 数据集
DPO ChatML 格式训练数据,一行训练数据展开后结构如下:
{"messages":[
{"role":"system","content":"<系统输入>"},
{"role":"user","content":"<用户输入1>"},
{"role":"assistant","content":"<模型输出1>"},
{"role":"user","content":"<用户输入2>"},
{"role":"assistant","content":"<模型输出2>"},
{"role":"user","content":"<用户输入3>"}],
"chosen":
{"role":"assistant","content":"<赞同的模型期望输出3>"},
"rejected":
{"role":"assistant","content":"<反对的模型期望输出3>"}}
模型将 messages 内的所有内容均作为输入,DPO 用于训练模型对"<用户输入3>"的正负反馈。
system/user/assistant 区别请参见消息类型。
训练数据集样例:
您也可以前往百炼控制台下载数据模板。
将训练文件上传至百炼
Shell
一次调用只能上传一个文件
dashscope files.upload -f '<替换为训练数据集的本地文件路径>' -p fine_tune -d 'training dataset'
SFT、DPO 数据集支持 .jsonl 文件;SFT图像理解训练集支持 .zip 压缩包。
使用限制:
单个文件大小最大为300MB
有效文件(未删除)总使用空间配额为5GB
有效文件(未删除)总数量配额为100个
返回结果:
Upload success, file id: 976bd01a-f30b-4414-86fd-50c54486e3ef
HTTP
Windows CMD 请将${DASHSCOPE_API_KEY}
替换为%DASHSCOPE_API_KEY%
,PowerShell 请替换为$env:DASHSCOPE_API_KEY
curl --location --request POST \
'https://dashscope.aliyuncs.com/api/v1/files' \
--header 'Authorization: Bearer '${DASHSCOPE_API_KEY} \
--form 'files=@"./qwen-fine-tune-sample.jsonl"' \
--form 'descriptions="a sample fine-tune data file for qwen"'
使用限制:
单个文件大小最大为300MB
所有有效文件(未删除)总使用空间配额为5GB
所有有效文件(未删除)总数量配额为100个
更多详细信息请参见模型微调文件管理服务
返回结果
{
"request_id":"xx",
"data":{
"uploaded_files":[{
"file_id":"976bd01a-f30b-4414-86fd-50c54486e3ef",
"name":"qwen-fine-tune-sample.jsonl"}],
"failed_uploads":[]}
}
模型微调
创建微调任务
Shell
dashscope fine_tunes.call -m qwen-turbo -t '<替换为训练数据集的file_id1>' '<替换为训练数据集的file_id2>' \
--mode sft -b 16 -e 1 -l 1.6e-5 \
--hyper_parameters split=0.9 warmup_ratio=0.0 eval_steps=1
微调指令进程将持续监控输出模型微调的日志
微调指令进程即使在微调结束后也不会自动关闭,可以随时终止微调指令进程,不会影响百炼平台上的模型微调任务。
您可以使用后续介绍的命令或前往控制台查看当前任务状态并获取微调任务日志。
HTTP
Windows CMD 请将${DASHSCOPE_API_KEY}
替换为%DASHSCOPE_API_KEY%
,PowerShell 请替换为$env:DASHSCOPE_API_KEY
curl --location 'https://dashscope.aliyuncs.com/api/v1/fine-tunes' \
--header 'Authorization: Bearer '${DASHSCOPE_API_KEY} \
--header 'Content-Type: application/json' \
--data '{
"model":"qwen-turbo",
"training_file_ids":[
"<替换为训练数据集的file_id1>",
"<替换为训练数据集的file_id2>"
],
"hyper_parameters":{
"n_epochs":1,
"batch_size":16,
"learning_rate":"1.6e-5",
"split":0.9,
"warmup_ratio":0.0,
"eval_steps":1
},
"training_type":"sft"
}'
字段 | 必选 | 类型 | 传参方式 | 描述 |
training_file_ids | 是 | Array | Body | 训练集文件列表。 |
validation_file_ids | 否 | Array | Body | 验证集文件列表。 |
model | 是 | String | Body | 用于微调的基础模型 ID,或其他微调任务产出的模型 ID。 |
hypter_parameters | 否 | Map | Body | 用于微调模型的超参数,缺失该参数时系统会使用默认值进行微调。 |
training_type | 否 | String | Body | 训练方法,可选值为:
|
返回结果
{
"request_id":"8ee17797-028c-43f6-b444-0598d6bfb0f9",
"output":{
"job_id":"ft-202410121111-a590",
"job_name":"ft-202410121111-a590",
"status":"PENDING",
"model":"qwen-turbo",
"base_model":"qwen-turbo",
"training_file_ids":[
"976bd01a-f30b-4414-86fd-50c54486e3ef"],
"validation_file_ids":[],
"hyper_parameters":{
"n_epochs":1,
"batch_size":16,
"learning_rate":"1.6e-5",
"split":0.9,
"warmup_ratio":0.0,
"eval_steps":1},
"training_type":"sft",
"create_time":"2024-10-12 11:55:45",
"user_identity":"1396993924585947",
"modifier":"1396993924585947",
"creator":"1396993924585947",
"group":"llm"
}
}
-m/--model/"model"
(必选)支持的基础模型 ID 列表与--mode/"training_type"
(可选)支持情况:
--mode
默认值为sft
,如果未声明--model
且模型不支持sft
方法,微调任务将会失败。
模型名称 | 模型代码 | SFT全参训练 (sft) | SFT高效训练 (efficient_sft) | DPO全参训练 (dpo_full) | DPO高效训练 (dpo_lora) |
通义千问2.5-开源版-72B | qwen2.5-72b-instruct | ||||
通义千问2.5-开源版-32B | qwen2.5-32b-instruct | ||||
通义千问2.5-开源版-14B | qwen2.5-14b-instruct | ||||
通义千问2-开源版-72B | qwen2-72b-instruct | ||||
通义千问2-开源版-7B | qwen2-7b-instruct | ||||
通义千问1.5-开源版-72B | qwen1.5-72b-chat | ||||
通义千问1.5-开源版-14B | qwen1.5-14b-chat | ||||
通义千问1.5-开源版-7B | qwen1.5-7b-chat | ||||
通义千问-开源版-72B | qwen-72b-chat | ||||
通义千问-开源版-14B | qwen-14b-chat | ||||
通义千问-开源版-7B | qwen-7b-chat | ||||
通义千问-Turbo(通义商业版) | qwen-turbo | ||||
通义千问-Turbo-0624(通义商业版) | qwen-turbo-0624 | ||||
通义千问-Plus-0723(通义商业版) | qwen-plus-0723 | ||||
通义千问VL-Max-0201 | qwen-vl-max-0201 | ||||
通义千问VL-Plus | qwen-vl-plus | ||||
百川2-7B(开源) | baichuan2-7b-chat-v1 | ||||
Llama2-13B | llama2-13b-chat-v2 | ||||
Llama2-7B | llama2-7b-chat-v2 | ||||
ChatGLM2-6B | chatglm-6b-v2 |
常用超参:
超参名称 | 默认设置 | 推荐设置 | 超参作用 |
循环次数
| 1 | 数据量 < 10,000, 循环 3~5次 数据量 > 10,000, 循环 1~2次 具体需要结合实验效果进行判断 | 模型遍历训练的次数,请根据模型调优实际使用经验进行调整。 模型训练循环次数越多,训练时间越长,训练费用越高。 |
学习率
|
具体数值随模型选择变化。 | 使用默认值 | 控制模型修正权重的强度。 如果学习率设置得太高,模型参数会剧烈变化,导致微调后的模型表现不一定更好,甚至变差; 如果学习率太低,微调后的模型表现不会有太大变化。 |
批次大小
| 具体数值随模型选择变化。模型越大,默认 batch_size 越小。 | 使用默认值 | 一次性送入模型进行训练的数据条数,参数过小会显著延长训练时间,推荐使用默认值。 |
| NA | NA | NA |
--hyper_parameters
可接受参数(全部微调类型):
超参名称 | 默认设置 | 推荐设置 | 超参作用 |
(训练集在训练文件中占比) | 0.8 | 使用默认值 | 当不设置 |
(验证集数据最大数量) | 1000 | 使用默认值 | 当不设置 |
(学习率调整策略) | cosine | 推荐“linear”或“Inverse_sqrt” | 在模型训练中动态调整学习率的策略。 各策略详情请参考学习率调整策略介绍。 |
| 50 | 根据需求调整 | 训练阶段针对模型的验证间隔步长,用于阶段性评估模型训练准确率、训练损失。 该参数影响模型调优进行时的 Validation Loss 和 Validation Token Accuracy 的显示频率。 |
| 2048 | 8192 | 指的是单条训练数据 token 支持的最大长度。如果单条数据 token 长度超过设定值,微调会直接丢弃该条数据,不进行训练。 字符与 token 之间的关系请参考Token和字符串之间怎么换算 |
| 0.05 | 使用默认值 | 学习率预热占用总的训练过程的比例。学习率预热是指学习率在训练开始后由一个较小值线性递增至学习率设定值。 该参数主要是限制模型参数在训练初始阶段的变化幅度,从而帮助模型更稳定地进行训练。 比例过大效果与过低的学习率相同,会导致微调后的模型表现不会有太大变化。 比例过小效果与过高的学习率相同,可能导致微调后的模型表现不一定更好,甚至变差。 该参数仅对学习率调整策略“Constant”无效。 |
| 0.1 | 使用默认值 | L2正则化强度。L2正则化能在一定程度上保持模型的通用能力。数值过大会导致模型微调效果不明显。 |
| 1 | 使用默认值 | 梯度裁剪的最大值,用于防止参数微调时剧烈变化导致的微调失败。数值过大可能会导致微调失败,数值过小会导致模型微调效果不明显。 |
| 5 | 根据需求调整 | 微调日志打印的步数。 |
--hyper_parameters
可接受参数(仅efficient_sft/dpo_lora
生效):
超参名称 | 默认设置 | 推荐设置 | 超参作用 |
| 8 | 64 | LoRA训练中的低秩矩阵的秩大小。秩越大调优效果会更好一点,但训练会略慢。 |
| 32 | 使用默认值 | 用于控制原模型权重与LoRA的低秩修正项之间的结合缩放系数。 较大的Alpha值会给予LoRA修正项更多权重,使得模型更加依赖于微调任务的特定信息; 而较小的Alpha值则会让模型更倾向于保留原始预训练模型的知识。 |
| 0.1 | 使用默认值 | LoRA训练中的低秩矩阵值的丢弃率。 使用推荐数值能增强模型通用化能力。 数值过大会导致模型微调效果不明显。 |
| AUTO | 推荐设置为 ALL | 选择模型的全部或特定模块层进行微调优化。 ALL是对所有的参数都加上 LoRA 训练; AUTO是指对模型的关键参数加上 LoRA 训练。 |
获取微调后模型 ID &查看微调任务状态
在上一步的response中获取到的job_id
字段,为本次模型微调任务的ID,您可以使用该ID来查询此模型微调任务的状态。
Shell
dashscope fine_tunes.get -j <替换为您的微调任务 id>
任务状态 | 含义 |
PENDING | 训练待开始。 |
QUEUING | 训练正在排队(同时只有一个训练任务可以进行) |
RUNNING | 训练正在进行中。 |
CANCELING | 训练正在取消中。 |
success | 训练成功。 |
failed | 训练失败。 |
canceled | 训练已经取消。 |
训练成功返回结果:
Fine-tune task success, fine-tuned model : qwen-turbo-ft-202410121111-a590
qwen-turbo-ft-202410121111-a590
为微调成功后的模型 ID。
如果训练失败,请使用下述“查看微调的日志”命令获取错误日志。
HTTP
curl --location 'https://dashscope.aliyuncs.com/api/v1/fine-tunes/<替换为您的微调任务 id>' \
--header 'Authorization: Bearer '${DASHSCOPE_API_KEY} \
--header 'Content-Type: application/json'
任务状态 | 含义 |
PENDING | 训练待开始。 |
QUEUING | 训练正在排队(同时只有一个训练任务可以进行) |
RUNNING | 训练正在进行中。 |
CANCELING | 训练正在取消中。 |
SUCCEEDED | 训练成功。 |
FAILED | 训练失败。 |
CANCELED | 训练已经取消。 |
训练成功返回结果:
{
"request_id":"c8b1d650-498e-432b-9346-c591e34e9622",
"output":{
"job_id":"ft-202410121111-a590",
"job_name":"ft-202410121111-a590",
"status":"SUCCEEDED",
"finetuned_output":"qwen-turbo-ft-202410121111-a590",
"model":"qwen-turbo",
"base_model":"qwen-turbo",
"training_file_ids":[
"976bd01a-f30b-4414-86fd-50c54486e3ef"],
"validation_file_ids":[],
"hyper_parameters":{
"n_epochs":1,
"batch_size":16,
"learning_rate":"1.6e-5",
"split":0.9,
"warmup_ratio":0.0,
"eval_steps":1},
"training_type":"sft",
"create_time":"2024-10-12 11:43:09",
"user_identity":"1396993924585947",
"modifier":"1396993924585947",
"creator":"1396993924585947",
"end_time":"2024-10-12 13:20:33",
"group":"llm",
"usage":3518670
}
}
训练成功后,"finetuned_output"
指的是微调成功后的模型 ID。
查看微调的日志
Shell
dashscope fine_tunes.stream -j <替换为您的微调任务 id>
如果微调未完成,指令进程将持续监控输出模型微调的日志。
如果微调已完成,将全量输出模型微调的日志。
HTTP
curl --location 'https://dashscope.aliyuncs.com/api/v1/fine-tunes/<替换为您的微调任务 id>/logs?offset=0&line=1000' \
--header 'Authorization: Bearer '${DASHSCOPE_API_KEY} \
--header 'Content-Type: application/json'
训练成功返回结果:
{
"request_id":"1100d073-4673-47df-aed8-c35b3108e968",
"output":{
"total":57,
"logs":[
"<输出微调日志1>",
"<输出微调日志2>",
...
...
...
]
}
}
模型微调的更多操作(可选)
列举微调任务列表
dashscope fine_tunes.list
curl --location 'https://dashscope.aliyuncs.com/api/v1/fine-tunes' \
--header 'Authorization: Bearer '${DASHSCOPE_API_KEY} \
--header 'Content-Type: application/json'
中止微调任务
智能终止正在训练中的微调任务
dashscope fine_tunes.cancel -j <替换为您的微调任务 id>
curl --location --request POST 'https://dashscope.aliyuncs.com/api/v1/fine-tunes/<替换为您的微调任务 id>/cancel' \
--header 'Authorization: Bearer '${DASHSCOPE_API_KEY} \
--header 'Content-Type: application/json'
删除微调任务
无法删除正在训练中的微调任务
dashscope fine_tunes.delete -j <替换为您的微调任务 id>
curl --location --request DELETE 'https://dashscope.aliyuncs.com/api/v1/fine-tunes/<替换为您的微调任务 id>' \
--header 'Authorization: Bearer '${DASHSCOPE_API_KEY} \
--header 'Content-Type: application/json'
API 参考
DashScope 命令行调用参考已包含在本篇内容中,API 调用请参考API详情。
模型部署&调用
模型部署
将微调任务成功后的模型 ID 作为创建模型服务的model_name
参数。
更多模型部署的相关信息等请参考:模型部署-快速开始。
Shell
dashscope deployments.call -c 2 -m <替换为微调任务成功后的模型 ID>
部署指令进程将持续监控输出模型部署的日志
部署指令进程即使在微调结束后也不会自动关闭,可以随时终止部署指令进程,这不会影响百炼平台上的模型部署任务。
红框内为部署的模型实例 ID。
您可以使用后续介绍的命令或前往控制台查看当前部署任务状态。
HTTP
Windows CMD 请替换为%DASHSCOPE_API_KEY%
,PowerShell 请替换为$env:DASHSCOPE_API_KEY
curl --location 'https://dashscope.aliyuncs.com/api/v1/deployments' \
--header 'Authorization: Bearer '${DASHSCOPE_API_KEY} \
--header 'Content-Type: application/json' \
--data '{ "model_name": "<替换为微调任务成功后的模型 ID>", "capacity":2}'
返回结果:
{
"request_id":"865d7bd0-3f8f-4937-ad40-66361e6bc617",
"output":{
"deployed_model":"qwen-turbo-ft-202410121142-b631",
"gmt_create":"2024-10-12T15:59:55.494",
"gmt_modified":"2024-10-12T15:59:55.494",
"status":"PENDING",
"model_name":"qwen-turbo-ft-202410121142-b631",
"base_model":"qwen-turbo",
"base_capacity":2,
"capacity":2,
"ready_capacity":0,
"workspace_id":"llm-3z7uw7fwz0ve65pt",
"charge_type":"post_paid",
"creator":"1396993924585947",
"modifier":"1396993924585947"
}
}
其中"deployed_model"
为部署的模型实例 ID。
查询模型部署的状态
当部署状态为RUNNING
时,表示该模型当前可供调用。
dashscope deployments.get -d <替换为部署任务成功后的模型实例 ID>
curl --location 'https://dashscope.aliyuncs.com/api/v1/deployments/<替换为部署任务成功后的模型实例 ID>' \
--header 'Authorization: Bearer '${DASHSCOPE_API_KEY} \
--header 'Content-Type: application/json'
更多模型部署相关的操作,如扩缩容、下线等请参考:模型部署-API详情。
模型调用
当模型部署状态为RUNNING
时,您可以像调用其他模型一样使用微调后的模型。
更多使用方法和参数设置请前往DashScope API 参考。
dashscope generation.call -m <替换为部署任务成功后的模型实例 ID> -p '你是谁?'
curl --location 'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation' \
--header 'Authorization: Bearer '${DASHSCOPE_API_KEY} \
--header 'Content-Type: application/json' \
--data '{
"model": "<替换为部署任务成功后的模型实例 ID>",
"input":{
"messages":[
{
"role": "user",
"content": "你是谁?"
}
]
},
"parameters": {
"result_format": "message"
}
}'