写点什么

Post-Training on PAI (4):模型微调 SFT、DPO、GRPO

  • 2025-07-17
    陕西
  • 本文字数:5256 字

    阅读完需:约 17 分钟

引言

Post-Training(即模型后训练)作为大模型落地的重要一环,能显著优化模型性能,适配特定领域需求。相比于 Pre-Training(即模型预训练),Post-Training 阶段对计算资源和数据资源需求更小,更易迭代,因此备受推崇。


近期,我们将体系化地分享基于阿里云人工智能平台 PAI 在强化学习、模型蒸馏、数据预处理、SFT 等方向的技术实践,旨在清晰地展现 PAI 在 Post-Training 各个环节的产品能力和使用方法,欢迎大家随时交流探讨。



对于大模型而言,预训练由于对算⼒和数据的需求非常⼤,因此在使用大模型时,用户一般不会涉及到预训练,更多的是基于开源的预训练基础模型(如 Qwen、DeepSeek、Llama 等)做模型微调。


本期介绍常见的模型微调训练方式,以及如何使用阿里云人工智能平台 PAI 的产品模块实现模型微调。

常用模型微调训练方式

模型微调的目的是让模型更好地理解特定任务的需求。例如,通过使用对话数据集对模型进行微调,可以让模型在遇到问题时生成更相关的答案。


广义上说,模型微调有多种方式,常见的如监督微调、偏好对齐、强化学习微调等。下面我们介绍几种现在常用的微调算法。

SFT

SFT(Supervised Fine-Tuning,监督微调)是在预训练模型的基础上,使⽤特定任务的标注数据进⾏⼆次训练,使模型能够更好地适应⽬标任务的需求。其核⼼思想是“迁移学习”,利⽤预训练模型已有的知识,通过微调快速适配新任务。


SFT 需要使用有标注的数据通过有监督方式微调模型,这些标注数据通常包含了问题和答案对,或者其他特定任务的数据。


SFT 根据更新参数量不同可以分为以下两种:


  • 全量参数更新 FFT(Full Fine-tuning):即对预训练模型的所有参数进⾏更新,训练速度较慢,消耗机器资源较多。

  • 参数⾼效微调 PEFT(Parameter-Efficient Fine-Tuning):只对部分参数做调整,训练速度快,消耗机器资源少。常见的如 LoRA 微调、QLoRA 微调。

  • LoRA 微调:在固定模型本身参数的基础上,仅对自注意力权重矩阵进行低秩分解,并更新低秩矩阵参数。该训练方法训练时间短,但效果可能会略差于全参微调,但在某些情况下可减少训练过拟合的风险。

  • QLoRA 微调:QLoRA 结合了模型量化和 LoRA 技术,除了引入 LoRA 旁路矩阵,QLoRA 在加载时将大模型量化为 4bit 或 8bit,相比 LoRA 微调进一步降低了显存占用。该训练方法训练时间短,但效果可能会略差于全参微调和 LoRA。

DPO

偏好对齐也是一种微调模型的方式,目的是使大模型的输出更符合人类偏好,常用于对齐人类价值观(如减少有害内容)或提升生成结果的可读性、安全性。


DPO(Direct Preference Optimization,直接偏好优化)是一种现在常用的偏好对齐方式。大模型对齐方法有多种,如 ChatGPT 使用的 RLHF,但 RLHF 较为复杂且缺乏稳定性。相比之下,DPO 算法简化了这一过程:它不需要训练专门的奖励模型,而是通过简单的分类损失来解决标准的 RLHF 问题。DPO 算法不仅具有良好的稳定性和卓越的性能,而且计算需求较低。



上图左侧展示了 RLHF 算法,而右侧则是 DPO 算法,通过两者的对比可以清楚地看到 DPO 的改进之处。


  1. RLHF 算法包含了奖励模型和策略模型,通过偏好数据结合强化学习进行不断迭代,以优化策略模型。

  2. DPO 算法去掉了奖励模型和强化学习过程,直接利用偏好数据进行模型微调,将强化学习过程简化为监督微调,从而使训练过程更加简单和高效,其主要改进集中在损失函数方面(即 DPO 使用监督学习的训练方式,达到了接近 RLHF 类似的效果)。


目前较常见的微调方式可以是先对基模进行 SFT,然后再进行 DPO,从而使模型具备业务领域能力同时输出符合价值观偏好。

GRPO

随着 DeepSeek-R1 模型的爆火,GRPO 技术也收到业界的广泛关注(GPRO:Group Relative Policy Optimization,群组相对策略优化)。GRPO 旨在通过优化模型在一组候选答案中的相对偏好,而不是依赖于单一的“黄金”答案来进行学习,从而提升模型的性能,尤其在数学推理等复杂任务上。


相比于 PPO 等传统算法,GRPO 算法具备以下特点:


  • 不需要单独的价值函数模型(Value Model):不同于 PPO,GRPO 无需维护单独的价值函数模型,简化了训练步骤,减少了内存消耗,提高了整体效率。

  • 基于组的优势计算:GRPO 通过为每个输入利用一组输出来计算基线奖励(Baseline Reward),计算方法为该组输出的平均得分。这种组基方法与奖励模型训练更加契合,尤其对推理任务有所帮助。

  • 直接优化 KL 散度:GRPO 将 KL 散度直接集成到损失函数中进行优化,实现比 PPO 中通过奖励信号间接控制更细致的管理。

微调算法比较

以下为 SFT、DPO 和 GRPO 这三种微调算法的使用门槛难度以及应用场景对比,供您参考比较。


PAI 模型微调实践

阿里云人工智能平台 PAI 提供了完整的模型微调产品能力,根据客户需求及代码能力层级,分别提供了 PAI-Model Gallery 一键微调、PAI-DSW Notebook 编程微调、PAI-DLC 容器化任务微调的全套产品功能。

PAI-Model Gallery

PAI-Model Gallery 集成了众多 AI 开源社区中优质的预训练模型,支持零代码实现模型微调、模型压缩、模型评测、模型部署操作,给开发者带来更快、更高效、更便捷的 AI 应用体验。对于希望零代码完成模型微调的用户来说,PAI-Model Gallery 的一键微调功能是您的理想选择。


  1. 选择想要微调的基础模型。PAI-Model Gallery 提供了丰富的基础模型,您可以在模型广场浏览并选择您想要微调的基础模型,点击模型卡片进入模型详情页。



  1. 在模型详情页点击“训练”按钮。我们以 Qwen3-8B 模型为例,模型支持零代码完成部署、训练和评测,详情页右上角有对应的操作按钮,选择点击“训练”按钮。



  1. 提交训练任务。PAI-ModelGallery 支持 SFT、GRPO 等多样化的训练方式,按需选择训练方式、配置训练数据集、配置训练超参数、计算资源后,即可一键提交训练任务。

  2. (注:不同模型提供的训练方式有所不同,具体请参照各模型详情页)



需注意的是,您需要提前准备好训练用的数据集。以 SFT 任务为例,训练数据集格式示例如下:(不同类型训练任务的训练集格式示例可参考模型详情页中的描述)


[    {        "instruction": "你是一个心血管科医生,请根据患者的问题给出建议:我患高血压五六年啦,天天喝药吃烦啦,哪种东西能根治高血压,高血压克星是什么?",        "output": "高血压的患者可以吃许多新鲜的水果蔬菜或者是芹菜山药之类的食物,可以起些降血压的作用,另外高血压的患者平时也应当注意低盐,低脂,低胆固醇饮食,适当的实施体育运动和锻练高血压的患者还应当在医生的指导下口服降血压的药物,断然不可擅自停药,防止对血压引发影响。"    },    {        "instruction": "你是一个呼吸科医生,请根据患者的问题给出建议:风寒感冒咳白痰怎么治疗?",        "output": "风寒感冒,咳有白痰的患者,主要症咳嗽痰多色白量多,兼具胸脘作闷,鼻塞,流清涕,全身酸痛,易疲劳等症状。临床诊断上常用杏苏散和二陈丸实施治疗。在用药物治疗的同时,应忌食辛辣刺激性的食物和寒凉性食物,多吃易消化营养丰富的食物,宜清淡饮食,留意歇息。"    }]
复制代码


关于训练超参数的介绍和如何调整,可参考文档:https://help.aliyun.com/zh/pai/user-guide/llm-fine-tuning-experience


  1. 查看训练任务。提交训练任务后,页面会自动跳转到训练任务详情页(也可以从 PAI-Model Gallery 首页-任务管理-训练任务中找到),该页面会显示训练任务的状态。任务完成后,微调后的模型会自动注册到 PAI 模型资产中,模型文件会输出到您指定的对象存储 OSS 中。同时,PAI-Model Gallery 提供模型血缘功能,帮助追踪模型的上下游全链路,根据血缘功能,可以看出模型微调任务的上游基础模型和数据集以及下游产出模型的存储路径,从整体上清晰地了解模型微调训练任务流程。




  1. (可选)在线部署微调后的模型。在训练任务详情页右上角,您可以选择把微调后的模型直接进行一键部署,将模型部署为在线服务,可通过 API 或其他方式实现调用。


PAI-DSW

PAI-DSW 是为 AI 开发者量身定制的云端机器学习交互式开发 IDE,随时随地开启 Notebook 快速读取数据、开发算法、训练及部署模型。对于熟悉 python、Notebook 等环境的 AI 开发者,可以使用 PAI-DSW 进行代码形式的交互式模型微调。


下面以使用 PAI 自研大模型全链路训练工具库 Pai-Megatron-Patch + PAI 灵骏智算资源微调 Qwen2.5-7b 模型为例,介绍如何在 PAI-DSW 中微调模型。


  1. 在 PAI 上启动一个 DSW 实例,选择专属镜像 dsw-registry.cn-wulanchabu.cr.aliyuncs.com/pai/pai-megatron-patch:25.01



具体资源配置信息如下:



资源规格:8 卡 GPU,96 核,1600G


挂载数据集:建议挂载 CPFS 数据集,用来存放模型、代码、数据等,方便后续开启多机训练(本文以 CPFS 数据集挂载到/mnt/data 为例)


  1. 下载 Pai-Megatron-Patch 包


cd /mnt/data/yymkdir qwen25_sftcd qwen25_sft#(Option 1)直接从github上下载Pai-Megatron-Patchgit clone --recurse-submodules https://github.com/alibaba/Pai-Megatron-Patch.git
复制代码


  1. 准备模型 Qwen2.5-7B 模型的 checkpoints(建议提前准备好模型文件)


cd /mnt/data/yy/qwen25-sftmkdir qwen-ckptscd qwen-ckptsmkdir Qwen2.5-7Bcd Qwen2.5-7Bpip install modelscopemodelscope download --model Qwen/Qwen2.5-7B --local_dir ./
复制代码


  1. 数据集准备:自制数据集准备过程可以参照示例:https://github.com/alibaba/Pai-Megatron-Patch/tree/main/toolkits/sft_data_preprocessing。也可以直接下载处理好的开源数据集。


cd /mnt/data/yy/qwen25_sftmkdir qwen-datasetscd qwen-datasetswget https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/pai-megatron-patch/qwen-datasets/mmap_qwen2_sft_datasets_text_document.binwget https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/pai-megatron-patch/qwen-datasets/mmap_qwen2_sft_datasets_text_document.idx
复制代码


此时目录结构为:Pai-Megatron-Patch 中是训练所需要的代码;qwen-ckpts 是原始模型文件;qwen-datasets 是训练数据集存放地址



  1. 将原始模型的 checkpoint 转化为 megatron 格式(Pai-Megatron-Patch 提供了各类丰富的格式转换工具)


cd /mnt/data/yy/qwen25_sft/Pai-Megatron-Patch/toolkits/distributed_checkpoints_convertorbash scripts/qwen2_5/run_8xH20.sh \7B \/mnt/data/yy/qwen25_sft/qwen-ckpts/Qwen2.5-7B \/mnt/data/yy/qwen25_sft/qwen-ckpts/Qwen2.5-7B-to-mcore  \false \true \bf16
复制代码


  1. 执行 SFT 全参微调命令。


参数说明:


ENV=$1                          # 运行环境配置开关: dsw单机训练训练,dlc表示多机训练环境MODEL_SIZE=$2                   # 模型结构参数量级: 0.5B/1.5B/3B/7B/14B/32B/72BBATCH_SIZE=$3                   # 一次迭代一个数据并行内的样本数GLOBAL_BATCH_SIZE=$4            # 一次迭代多个数据并行的总样本数LR=$5                           # 学习率MIN_LR=$6                       # 最小学习率SEQ_LEN=$7                      # 序列长度PAD_LEN=$8                      # Padding长度PR=${9}                         # 训练精度: fp16, bf16, fp8TP=${10}                        # 模型并行度PP=${11}                        # 流水并行度CP=${12}                        # 上下文并行度SP=${13}                        # 是否使用序列并行: true, falseDO=${14}                        # 是否使用Megatron版Zero-1降显存优化器: true, falseFL=${15}                        # 是否优先使用Flash Attention: true, falseSFT=${16}                       # 是否执行微调训练: true, falseAC=${17}                        # 激活检查点模式: sel, full, offload, falseOPTIMIZER_OFFLOAD=${18}         # 是否启用Offload optimizer: false, static, autoSAVE_INTERVAL=${19}             # 保存ckpt的间隔DATASET_PATH=${20}              # 训练数据集路径VALID_DATASET_PATH=${21}        # 验证数据集路径PRETRAIN_CHECKPOINT_PATH=${22}  # 预训练模型路径TRAIN_TOKENS_OR_ITERS=${23}     # 训练TOKEN或者Iter数WARMUP_TOKENS_OR_ITERS=${24}    # 预热TOKEN或者Iter数        OUTPUT_BASEPATH=${25}           # 训练输出日志文件路径
复制代码


执行命令:


cd /mnt/workspace/yy/qwen25_sft/Pai-Megatron-Patch/examples/qwen2_5sh run_mcore_qwen.sh  \dsw  \7B   \1    \8 \1e-5   \1e-6   \128  \128  \bf16  \1   \1  \1 \true \true   \true \true \false   \false \100  \/mnt/workspace/yy/qwen25_sft/qwen-datasets/mmap_qwen2_sft_datasets_text_document   \/mnt/workspace/yy/qwen25_sft/qwen-datasets/mmap_qwen2_sft_datasets_text_document   \/mnt/workspace/yy/qwen25_sft/qwen-ckpts/Qwen2.5-7B-to-mcore  \1000  \100   \/mnt/workspace/yy/qwen25_sft/qwen-ckpts/output_mcore_qwen2.5_finetune
复制代码


  1. 查看执行过程及结果。在 DSW 中可以查看训练过程的日志,也可以通过查看资源监控来观察任务运行状态。




模型训练好后,在 qwen-ckpts 中可以看到如下目录:



用户头像

还未添加个人签名 2020-10-15 加入

分享阿里云计算平台的大数据和AI方向的技术创新和趋势、实战案例、经验总结。

评论

发布
暂无评论
Post-Training on PAI (4):模型微调SFT、DPO、GRPO_人工智能_阿里云大数据AI技术_InfoQ写作社区