资讯动态

ColossalChat 社区示例实践:基于 Hugging Face PEFT LoRA 的 SFT 与 PPO Prompts 训练

发布时间:2026/9/6 20:06:01 来源:尧图企业网站定制
ColossalChat 社区示例实践基于 Hugging Face PEFT LoRA 的 SFT 与 PPO Prompts 训练【免费下载链接】ColossalAIMaking large AI models cheaper, faster and more accessible项目地址: https://gitcode.com/GitHub_Trending/co/ColossalAI本文围绕 ColossalChatColossal-AI 的 RLHF 训练应用核心模块为 Coati下的社区示例 applications/ColossalChat/examples/community/peft 展开讲清楚如何用 Hugging Face PEFT 的 LoRA 实现替换原有的 loralib 方案分别完成 SFT 监督微调train_peft_sft.py与 RLHF Stage-3 的 PPO prompts 训练train_peft_prompts.py。读完本文你将掌握该示例的完整参数体系、数据文件格式约定、LoRA 配置细节以及它与当前仓库中 Coati trainer 代码的对应关系和适用前提。一、背景为什么从 loralib 换成 Hugging Face PEFT原 ColossalChat 的 LoRA 实现基于 loralib其做法是把 LoRA 层在训练结束后直接合并进最终模型。该社区示例的动机见 示例 README是Hugging Face 的peft包是更完善的 LoRA 实现训练与分布式部署都更方便训练产物是独立的 adapteradapter_config.jsonadapter_model.bin无需合并权重即可加载复用奖励模型reward model相对较小示例作者保留其原始实现并建议对 reward/critic 模型采用全参数训练以获得更合适的效果该示例位于examples/community目录下属于社区驱动的示例合集社区示例总览 中将其描述为 Adding Peft support for SFT and Prompts model training。需要特别注意的是示例 README 开头带有This content may be outdated since the major update of Colossal Chat的警告。从当前仓库的源码结构看示例脚本依赖的coati.trainer.strategiesDDPStrategy、GeminiStrategy、LowLevelZeroStrategy模块已不存在于 coati/trainer 目录中当前SFTTrainer/PPOTrainer已改为基于colossalai.booster.Booster的接口。因此本文将该示例作为PEFT LoRA ColossalChat 分布式策略的设计范例来讲解若要对照当前主干运行需先做接口适配见第六节的对照说明。二、前置安装PEFT 依赖从源码安装README 明确指出当时 pypi 上的 peft 包0.2 版本存在 bug建议从源码安装。步骤为git clone huggingface 官方 peft 仓库地址 cd peft pip install .即在 clone 官方 peft 源码后进入目录执行pip install .而不是直接pip install peft。示例本身位于 Colossal-AI 仓库的 applications/ColossalChat 应用目录下运行前还需按 ColossalChat 的常规方式准备训练环境与数据。三、SFT 阶段train_peft_sft.py 全参数解析SFT 训练入口为 train_peft_sft.py。README 说明其参数几乎与原版train_sft.py一致仅新增--eval_dataset数据文件是纯文本格式约定见 easy_dataset.py。3.1 命令行参数表以源码 argparse 为准参数类型默认值说明--strategystrddp取值ddp/colossalai_gemini/colossalai_zero2选择分布式策略--modelstrbloom取值gpt2/bloom/opt/llama决定 tokenizer 加载方式--pretrainstrNone预训练模型名或本地路径--datasetstrNone训练数据纯文本文件路径--eval_datasetstrNone评估数据文件路径相对原版新增的参数--save_pathstroutputcheckpoint 保存目录也是 LoRA adapter 的加载检查位置--need_optim_ckptboolFalse是否额外保存优化器状态--max_epochsint3训练轮数--batch_sizeint4单卡 batch size--lora_rankint0LoRA 矩阵秩 0时代码回退为 32见 3.2--log_intervalint100日志间隔步数--lrfloat5e-6学习率--accumulation_stepsint8梯度累积步数--enable_peft_loraflagFalse仅声明、当前脚本逻辑未读取LoRA 是无条件启用的源码中train()未引用该 flag--is_short_textflagFalse控制数据集是否把多行文本拼接成长样本见 3.4以上均可在 train_peft_sft.py 的参数定义段 核对。3.2 策略与 LoRA 配置的源码细节策略分支源码ddp→DDPStrategy()colossalai_gemini→GeminiStrategy(placement_policystatic)colossalai_zero2→LowLevelZeroStrategy(stage2, placement_policycuda)。LoRA 注入逻辑源码lora_rank args.lora_rank if args.lora_rank 0 else 32 lora_config LoraConfig( task_typeTaskType.CAUSAL_LM, inference_modeFalse, rlora_rank, lora_alpha32, lora_dropout0.1 ) model get_peft_model(model, lora_config)要点r未显式指定时回退为 32lora_alpha固定 32lora_dropout固定 0.1。断点续训若--save_path下同时存在adapter_config.json与adapter_model.bin则用PeftModel.from_pretrained直接加载已保存的 adapter 继续训练源码这正是 PEFT 相对合并权重方案的运维优势。llama Gemini 的兼容性 hack当--model llama且策略为 Gemini 时会把非ColoParameter的参数典型是 resize 后的 embedding就地替换为ColoParameter以满足 Gemini 对参数类型的要求源码。优化器选择源码策略名以colossalai开头时使用HybridAdamcolossalai/nn/optimizer并带clipping_norm1.0梯度裁剪否则退化为原生torch.optim.Adam。数据加载与保存多卡时训练集使用DistributedSampler(shuffleTrue, seed42, drop_lastTrue)评估集shuffleFalse训练结束后trainer.save_model(pathargs.save_path, only_rank0True, tokenizertokenizer)仅在 rank0 保存--need_optim_ckpt为真时再由strategy.save_optimizer在所有 rank 保存优化器状态源码。3.3 tokenizer 配置差异按--model分支加载 tokenizer源码gpt2 用GPT2Tokenizer、bloom 用BloomTokenizerFast、opt 用AutoTokenizer均把pad_token设为eos_tokenllama 从--pretrain加载use_fastFalse、padding_sideright并把pad_token设为unk_token。3.4 数据格式纯文本 EasySFTDataset 的分组逻辑README 说明训练数据就是一个纯文本文件逐行读取。EasySFTDataset源码的处理流程为逐行tokenizer.encode超过max_length512的行被切分为多段is_group_textsTrue时即不传--is_short_text把相邻行拼接直到接近 512 长度使 LLM 学到更完整的语义上下文若各行彼此独立应传--is_short_text关闭拼接每个样本用pad_token_id补齐到 512并生成对应的attention_masklabels直接是input_ids的深拷贝自监督式 SFT。训练脚本中的用法是EasyDataset(args.dataset, tokenizertokenizer, is_group_textsnot args.is_short_text)源码--eval_dataset走同样的构造逻辑。四、Stage-3 RLHFtrain_peft_prompts.py 全参数解析Stage-3 的 PPO prompts 训练入口为 train_peft_prompts.py。README 说明其参数与原版train_prompts.py几乎一致唯一差异是prompt 数据与预训练数据都改用纯文本文件指定原版用 JSON 格式模型包装逻辑在 easy_models.py 中。README 同时声明目前只测试过 bloom 模型但技术上 gpt2/opt/llama 都应支持。4.1 命令行参数表以源码 argparse 为准参数类型默认值说明--prompt_pathstrNoneprompt 纯文本文件一行一个 prompt--pretrain_datasetstrNone预训练ptx loss纯文本文件--strategystrddpddp/colossalai_gemini/colossalai_zero2--modelstrgpt2actor 模型族可选 gpt2/bloom/opt/llama实际仅 bloom 走 PEFT 分支--pretrainstrNoneactor 预训练模型--sft_lora_pathstrNoneSFT 阶段产出的 PEFT adapter 目录--rm_modelstrNone奖励模型族缺省跟随--model--rm_pathstrNone奖励模型 checkpointtorch.load的 state_dict--rm_pretrainstrNone奖励/评估模型底座--save_pathstractor_checkpoint_promptsactor 保存目录--need_optim_ckptboolFalse是否保存 actor 优化器状态--num_episodesint10PPO 训练 episode 数--num_collect_stepsint10每轮经验采集步数--num_update_stepsint5每轮策略更新步数--train_batch_sizeint2训练 batch size--ptx_batch_sizeint1ptx预训练 lossbatch size--experience_batch_sizeint8经验采样 batch size--lora_rankint0critic 的 LoRA 秩会直接透传给 Critic建议显式指定正整数--kl_coeffloat0.1KL 散度系数--ptx_coeffloat0.9预训练 loss 系数4.2 Gemini 策略的完整 offload 配置与 SFT 脚本不同这里 Gemini 策略显式打开了全量 offload源码strategy GeminiStrategy( placement_policystatic, offload_optim_frac1.0, offload_param_frac1.0, initial_scale2**5 )offload_optim_frac1.0、offload_param_frac1.0表示优化器状态与参数全部放到 CPU 侧initial_scale2**5设置混合精度初始缩放因子colossalai_zero2分支则使用LowLevelZeroStrategy(stage2, placement_policycpu)。PPO 需要同时驻留 actor、critic、reward model、initial model参考模型四个模型全量 offload 是低显存跑通该阶段的关键配置。4.3 Actor 用 PEFT adapter 初始化Critic 用原生 LoRAActor / initial modelBLOOMActor(pretrainedargs.pretrain, lora_pathargs.sft_lora_path)源码。BLOOMActor定义在 easy_models.py先BloomForCausalLM.from_pretrained加载底座若给定lora_path则PeftModel.from_pretrained(model, lora_path)直接挂上 SFT 阶段训练好的 PEFT adapter再可选开启gradient_checkpointing。其generate()基于 Coati 的generate工具函数生成回复并依据 eos 位置构造action_mask供 PPO 的 action log-prob 计算使用源码。CriticBLOOMCritic(pretrainedargs.rm_pretrain, lora_rankargs.lora_rank, use_action_maskTrue)源码走 Coati 原生 LoRA 而非 PEFT且启用 action mask。Reward model按--rm_model选择BLOOMRM/GPTRM/OPTRM/LlamaRM若给了--rm_path则加载其 state_dict源码。这与 READMEreward model 保持原实现、建议全参训练的说法一致。非 Gemini 策略下四个模型统一.to(torch.float16).to(cuda)。4.4 tokenize 对齐与 PPOTrainer 调用生成阶段用一个局部tokenize_fn把 prompt 固定 pad 到 96 长度源码注释解释了原因各 rank 输入长度必须一致否则不同 rank 的生成步数不同在 Gemini 策略下会挂死。随后调用源码trainer PPOTrainer( strategy, actor, critic, reward_model, initial_model, actor_optim, critic_optim, kl_coefargs.kl_coef, ptx_coefargs.ptx_coef, train_batch_sizeargs.train_batch_size, experience_batch_sizeargs.experience_batch_size, tokenizertokenize_fn, max_length512, do_sampleTrue, temperature1.0, top_k50, pad_token_idtokenizer.pad_token_id, eos_token_idtokenizer.eos_token_id, ) trainer.fit( prompt_dataloaderprompt_dataloader, pretrain_dataloaderpretrain_dataloader, num_episodesargs.num_episodes, num_update_stepsargs.num_update_steps, num_collect_stepsargs.num_collect_steps, )即每个 episode 内先按num_collect_steps采集经验actor 对 prompt 采样生成、reward model 打分、critic 估值再按num_update_steps做策略/价值更新ptx 数据流则持续提供预训练 loss 抑制能力退化。训练结束同样支持 rank0 保存模型、可选保存优化器状态源码。五、数据文件格式约定easy_dataset.pyREADME 的 Dataformat 一节要求参考test_sft.txt、test_prompts.txt、test_pretrained.txt三个样例文件经检索这些样例文件在当前仓库的该目录下已不存在目录内仅剩 README、两个训练脚本和easy_dataset.py、easy_models.py因此格式需以 easy_dataset.py 的解析逻辑为准SFT 数据对应 test_sft.txt纯文本每行一条文本EasySFTDataset逐行编码并可拼接成长样本见 3.4 节行与行之间不需要任何分隔符。Prompts 数据对应 test_prompts.txtEasyPromptsDataset源码逐行读取若行内含回答则只保留其前缀部分作为 prompt再 tokenize 并paddingmax_length固定到 96 长度——与 4.4 节tokenize_fn的 96 上限呼应。Supervised 数据对应 test_pretrained.txt / ptxEasySupervisedDataset源码以中文分隔符回答切分分隔符及其之前为 source之后追加 eos为 targetlabels 中 source 区间被置为IGNORE_INDEX -100实现只对回答部分计算损失。另外该文件还定义了EasyRewardDatasetJSONL字段prompt/chosen/rejected拼接成提问... 回答...模板供奖励模型相关流程使用本示例两个脚本未直接使用。六、与当前仓库实现的对照与适用前提将该示例放回当前 Colossal-AI 仓库看有几条事实边界值得明确接口代际示例 import 的coati.trainer.strategies在当前 coati/trainer 目录中已不存在当前的 SFTTrainer 构造函数接收booster: Booster与lr_schedulerfit参数也改为train_dataloader/eval_dataloader/log_dir/use_wandb形式与示例中fit(logger..., log_interval...)的调用方式不一致。从源码结构看示例对应 ColossalChat 早期基于 strategy 的 API直接对当前主干运行会命中接口不匹配需做适配或选用与之匹配的历史版本——这也是 README 自述内容可能过时的准确含义。参数语义延续尽管接口变化PPO 侧的核心超参语义与当前 PPOTrainer 保持一致kl_coef默认 0.1、ptx_coef默认 0.9、train_batch_size、eps_clip0.2、value_clip等默认值均可在现行实现中找到对应说明示例的参数体系仍然具有参考价值。LoRA 实现现状当前 Coati 已在 coati/models/lora.py 等位置维护自己的 LoRA 实现本示例的价值在于演示了另一条路线——底座模型用原生 HF 结构、adapter 用 PEFT 管理从而获得adapter 独立保存/加载/续训的工作流。运行前提CUDA 环境、对应版本的 transformers/peft按第二节从源码安装、bloom 系模型为最稳妥组合源码中 gpt2/opt/llama 分支多为技术可行但未测试。七、小结该社区示例给出了一条清晰的 PEFT 化改造路径SFT 阶段用get_peft_modelLoraConfigr32 默认、alpha 32、dropout 0.1完成可续训的 adapter 训练并针对 Gemini 策略做了ColoParameter兼容处理Stage-3 PPO 阶段则让 actor/initial model 通过PeftModel.from_pretrained复用 SFT adapter、critic 使用原生 LoRA、reward model 保持全参配合 Gemini 的全量 offload 与 96 长度的 rank 对齐 tokenize在低显存下跑通四模型 PPO 流程。理解这套参数体系与数据格式约定后读者既可以直接复现该示例也能以此为模板把 PEFT adapter 工作流迁移到 Coati 当前 Booster API 之上。【免费下载链接】ColossalAIMaking large AI models cheaper, faster and more accessible项目地址: https://gitcode.com/GitHub_Trending/co/ColossalAI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价