本文将详细介绍如何在控制台进行模型调优任务,并帮助您选择正确的调优方式与参数。
模型调优流程
步骤一:选择调优方式
前往模型调优页面,点击“训练新模型”按钮。
SFT 与 DPO 如何选择
SFT(有监督微调,Supervised Fine-Tuning)目的是通过针对性的数据集和训练,提升模型在特定场景/业务中的表现,适合基于大量数据为您的应用进行模型定制,训练数据集数据只提供正样本。
DPO(直接偏好优化,Direct Preference Optimization)训练数据集数据同时提供正负样本,目的是引入负反馈,降低幻觉,使得模型输出对齐人类的价值观或偏好,适合基于用户反馈,在应用上线后快速迭代优化模型表现。
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 区别请参见消息类型。
训练数据集样例:
两种训练方式的数据量要求请参见数据集的规模要求。
百炼推荐您以先 SFT 后 DPO 的顺序使用模型调优:
在应用上线前,先收集足够多(1000+)的特定场景/业务的正样本,即收集场景/业务输入+模型期望输出,进行SFT 训练。
您的应用试运行/上线后,收集足够多(100+)的用户反馈(如:点赞、点踩、反馈)或者 bad case,将这些数据制作成 DPO 训练集,进行 DPO 训练。
模型选择
如果您是第一次进行模型调优,请选择您期望的预置模型。
如果您是因为模型训练效果不好需要再次训练某个模型,请选择自定义模型 > 您需要二次训练的模型。
支持的预置模型:
模型名称 | 模型代码 | 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 |
全参训练与高效训练
全参训练通过全量更新模型参数的方式进行学习。
高效训练采用低秩适应(Low-Rank Adaptation,LoRA)的方式,通过矩阵分解的方法,更新分解后的低秩部分参数。
由于两种训练方式的费用相同,百炼推荐您如果模型支持全参训练,请优先选择全参训练,因为全参训练效果比高效训练效果要好,性价比更高。
步骤二:选择训练数据
数据集构建技巧请参考数据集构建技巧。上传微调数据集请前往模型数据页面。
选择验证数据 > 自动切分 的比例为训练集 : 验证集 = 8 : 2。 如果您希望改变这个比例,您可以手动从完整数据集中切分出验证集单独上传, 然后 选择验证数据 > 选择验证集 > 选择您手动切分上传的验证集。
步骤三(可选):添加混合训练数据
百炼提供添加混合训练数据功能,您可以将您的训练数据与千问通用多领域、多行业、多场景数据混合训练,从而提高训练效果避免模型基础能力的遗失。
百炼推荐根据您的实际业务或场景添加合适的混合训练数据类目和比例,比如自定义场景数据:“中文-对话”场景 = 1 :1,您就可以把“中文-对话”场景倍率设为 1.0 倍。
步骤四:配置超参
如果您没有微调经验,百炼推荐您尽量不要调整“更多配置”内的参数设置。
超参介绍:(并不是所有模型都支持所有参数的调节,请以控制台显示为准)
超参名称 | 推荐设置 | 超参作用 | |
循环次数 | 数据量 < 10,000, 循环 3~5次 数据量 > 10,000, 循环 1~2次 具体需要结合实验效果进行判断 | 模型遍历训练的次数,请根据模型调优实际使用经验进行调整。 模型训练循环次数越多,训练时间越长,训练费用越高。 | |
学习率 | 高效训练:1e-4量级 全参训练:1e-5量级 | 控制模型修正权重的强度。 如果学习率设置得太高,模型参数会剧烈变化,导致微调后的模型表现不一定更好,甚至变差; 如果学习率太低,微调后的模型表现不会有太大变化。 | |
批次大小 | 使用默认值 | 一次性送入模型进行训练的数据条数,参数过小会显著延长训练时间,推荐使用默认值。 | |
学习率调整策略 | 推荐选择“linear”或“Inverse_sqrt”。 | 在模型训练中动态调整学习率的策略。 各策略详情请参考学习率调整策略介绍。 | |
验证步数 | 使用默认值 | 训练阶段针对模型的验证间隔步长,用于阶段性评估模型训练准确率、训练损失。 该参数影响模型调优进行时的 Validation Loss 和 Validation Token Accuracy 的显示频率。 | |
序列长度 | 设置为模型支持的最大值 | 指的是单条训练数据 token 支持的最大长度。如果单条数据 token 长度超过设定值: SFT 微调会直接丢弃该条数据,不进行训练; DPO 微调则会自动截断超出配置长度的后续 token,截短后的数据仍会被训练。 字符与 token 之间的关系请参考 Token和字符串之间怎么换算 | |
学习率预热比例 | 使用默认值 | 学习率预热占用总的训练过程的比例。学习率预热是指学习率在训练开始后由一个较小值线性递增至学习率设定值。 该参数主要是限制模型参数在训练初始阶段的变化幅度,从而帮助模型更稳定地进行训练。 比例过大效果与过低的学习率相同,会导致微调后的模型表现不会有太大变化。 比例过小效果与过高的学习率相同,可能导致微调后的模型表现不一定更好,甚至变差。
| |
权重衰减 | 使用默认值 | L2正则化强度。L2正则化能在一定程度上保持模型的通用能力。数值过大会导致模型微调效果不明显。 | |
LoRA秩值 | 设置为模型支持的最大值 | LoRA训练中的低秩矩阵的秩大小。秩越大调优效果会更好一点,但训练会略慢。 | |
LoRA阿尔法 | 使用默认值 | 用于控制原模型权重与LoRA的低秩修正项之间的结合缩放系数。 较大的Alpha值会给予LoRA修正项更多权重,使得模型更加依赖于微调任务的特定信息; 而较小的Alpha值则会让模型更倾向于保留原始预训练模型的知识。 | |
LoRA丢弃率 | 使用默认值 | LoRA训练中的低秩矩阵值的丢弃率。 使用推荐数值能增强模型通用化能力。 数值过大会导致模型微调效果不明显。 | |
LoRA目标模块 | 推荐设置为 ALL | 选择模型的全部或特定模块层进行微调优化。 ALL是对所有的参数都加上 LoRA 训练; AUTO是指模型的关键参数加上 LoRA 训练。 |
学习率调整策略介绍
“学习率调整策略” 是在 超参配置 > 更多配置 下的第一个配置,配置包含8种不同的策略。
策略详情请参见:
Linear:学习率线性递减。 使用场景:适合训练过程较短的任务。 | Polynomial:学习率按照一个预定义的多项式函数随训练迭代次数或周期数逐渐减少。 使用场景:Polynomial 可以更精细控制学习率减少速度,适用于任务比较复杂的场景。 但内置多项式系数为1,效果同 Linear,不推荐使用。 |
Cosine:学习率变化符合余弦函数曲线。 使用场景:适合需要进行精细调整、训练过程较长的任务。 | Cosine_with_restarts:学习率按照余弦函数的形状周期性地减少至某个最小值,而且在每个周期结束时,学习率会“重启”成预设值,然后开启下一周期。 使用场景:适用于需要模型从局部最优解中跳出来,尝试寻找更好全局解的情况。 但经过实测,学习率并不会在函数曲线底部“重启”成预设值,不推荐使用。 |
Constant:学习率不变, “学习率预热比例”参数无效。 使用场景:适合初步探索模型性能。 | Constant_with_warmup:学习率不变,但“学习率预热比例”参数有效。 使用场景:适合初步探索模型性能。 |
Inverse_sqrt:学习率逐渐减小,减小量与迭代次数的平方根的倒数正相关。 使用场景:适合于 SFT 微调,能较好地平衡学习效率与模型收敛。 | reduce_lr_on_plateau:当监控的指标(验证损失或验证准确率)在连续多个epoch内没有显著改进时,自动降低学习率。 使用场景:当模型很难进一步提高性能时,reduce_lr_on_plateau 可以帮助模型继续优化和提升。 |
图中学习率下限梯度、最小值均为示意,实际学习率下限梯度、最小值以实际使用为准。
步骤六:训练模型
点击“开始训练” > 确认“模型调优计费提醒” > 模型开始训练
特定模型训练时点击“查看”按钮可以查询模型训练详情,包括:训练损失(Training Loss)、验证损失(Validation Loss)、验证准确率(Validation Token Accuracy)、模型训练过程中实时产生的日志。
训练完成后,请确认训练损失(Training Loss)与验证损失(Validation Loss)的差异变化趋势。
如果训练损失逐渐减小而验证损失逐渐增大,说明模型已经过拟合训练数据,训练可能失败,训练效果可能不佳。建议按照以下推荐方法(推荐程度有先后顺序)进行优化,重新训练,提升训练效果:
使用数据增强,增加训练数据多样性和数据量。
收集更多训练数据,增加训练数据多样性和数据量。
调整超参,包括:减少“训练次数”、减小“学习率”、减小“批次大小”、增大“权重衰减”、提高“LoRA丢弃率”、提高“学习率预热比例”。
如果训练损失没有明显变化或逐渐增大(不常见),说明模型欠拟合训练数据,训练失败。建议按照以下推荐方法(推荐程度有先后顺序)进行优化,继续训练:
检查数据质量,确保数据清洗充分。
调整超参,包括:增大“训练次数”、增大“学习率”、增大“批次大小”、减小“权重衰减”、降低“LoRA丢弃率”、降低“学习率预热比例”。
如果没有上述情况请继续后续步骤。
步骤七:部署模型
使用百炼的模型部署功能部署训练好的自定义模型,部署好后就可以对微调好的模型进行评测。模型部署相关信息请参见帮助中心:模型部署。
步骤八:评测模型
如果您有多个业务场景或者添加了混合训练数据,在模型评测时,建议您根据场景拆分评测集,分别评测各个场景在微调后的表现是否满足您的需求。
使用百炼模型评测功能评估自定义模型的训练效果,相关信息请参见帮助中心:模型评测简介。
评测方式
百炼支持以下三种评测方式:人工评测、自动评测和基线评测。
人工评测:由您本人或您邀请的业务专家参与,基于选定的评测维度,对待测模型的输出效果进行人工评价。这种方式的优势在于业务专家能够通过实际操作产品等方式,来验证输出内容中的每个细节及步骤的正确性。但局限性也很明显,即评测成本较高、效率低,并且多人评测时可能会受到主观因素的干扰。
自动评测:全过程无需人工参与,百炼将基于内置的深度学习指标和AI评测器,自动对模型的输出效果进行评分。这种方式的优势在于高效率以及评测的公正性。局限性在于AI评测器的评测效果高度依赖于人为初始设定的评分维度、步骤和标准,并且它无法像人工评测那样验证输出内容中每个细节和步骤的正确性。
基线评测:基于预置基线评测集(包括C-Eval/CMMLU等主流榜单评测集)对待测模型的各项基础通用能力进行自动评测,适用于对已微调模型的基本效果进行回归评测(虽然微调有可能提升模型在特定任务上的效果,但有时也会降低模型的通用能力),避免模型通用能力的下降和丢失。
通常最佳实践是将上述三种评测方式结合起来。一个可能的场景是:先通过初始的人工评测确定一套评测维度,并形成配套可自动化执行的评分步骤和标准。再将这一整套评分体系应用于自动评测中,让百炼按照设定进行自动评测,快速从多个候选模型中选出最优者。最后通过人工评测仔细对比模型输出在结构组织、伦理合规等方面的细微差异。如果针对特定领域进行了模型微调,同时希望确保模型的通用能力没有明显下降,则可以进行基线评测。
常见问题
什么时候可以使用模型调优功能?
如果您并不是需要对文本生成模型进行调优,请直接前往以下页面:
文本生成模型调优虽然能在特定业务/场景取得非常好的效果,但有以下限制:
百炼推荐您在考虑使用文本生成模型调优前先尝试使用 Prompt 工程(Prompt Engineering)和插件调用(Function Calling)定制化您的应用,模型调优也通常作为改进模型表现“最后的手段”。因为:
在许多任务中,模型最初可能表现不佳,但通过应用正确的 Prompt 技巧可以改进结果,不一定需要使用模型调优。
迭代优化 Prompt、插件,比模型调优的迭代更敏捷、成本更低,因为模型调优的迭代可能需要重新收集数据、清洗优化数据、收集 bad case、发起客户调研等。
即使最后一定要进行模型调优,最初的 Prompt 工程、插件迭代优化相关工作也不会浪费。您的这些前期工作可以充分地在构建调优数据集时复用(用于构建数据集的输入)。
您可以前往百炼的Prompt 最佳实践和插件概述学习相关知识,帮助您在不进行模型调优的情况下激发模型的最大潜力。
如果模型调优后,评测效果不好怎么办?
如果您使用的是人工评测,请检查评测维度是否符合业务或场景。
收集在模型评测时评测结果不佳的测试用例,统计分析评测结果不佳的原因,根据分析结果调整训练数据集,继续迭代微调模型。
根据评测结果不佳的用例生成 DPO 用例,对模型进行 DPO 训练。
模型调优、模型部署、模型评测怎么收费?
模型调优计费方式与模型调用计费方式相同,但费用会更高。模型评测按照模型调用计费。训练好的模型在部署后只收取部署费用,不收取模型的调用费用。详细数据请参考计费项与定价。