

PyTorch:用于张量运算和分布式训练。 Hugging Face Transformers:用于加载预训练的语言模型和 tokenizer。 FlashAttention2:优化的注意力机制,有助于减少内存使用量并提高训练速度。 Weights & Biases (wandb):用于实验跟踪、可视化和模型版本控制。

设置随机种子:set_random_seed 函数通过为 Python 的随机模块、NumPy 和 PyTorch 设置种子,确保可复现性; 环境变量配置:设置 WANDB_API_KEY 和 WANDB_PROJECT 环境变量,以启用与 Weights & Biases 的实验跟踪; 导入必要的库,包括 random、copy、re、torch 等等。
extract_answer_from_model_output:此函数获取模型的输出文本,并提取 < answer > 标签内的内容; extract_answer_from_dataset:此函数从 GSM8K 数据集中提取预期答案,该数据集使用 “####” 分隔符来分隔答案:


token 化提示并生成响应:模型的输出是在 token 化提示的基础上生成的。 提取预测答案:从生成的响应中提取答案。 将预测答案与预期答案进行比较:这种比较是通过精确匹配以及数值等价检查来完成的。



模型和 tokenizer 初始化:使用优化设置(使用 torch.bfloat16 和 FlashAttention2)加载模型 Qwen/Qwen2.5-1.5B-Instruct。tokenizer 也要加载,其填充 token 设置为序列末尾 token。使用 torch.bfloat16 加载模型会将其参数转换为每个数值使用 16 位而不是 32 位的形式,这可将模型的内存使用量减少一半,并且可加快在现代 GPU 上的训练速度。 初步评估:在微调之前,根据几个示例对模型进行评估,以确定基准性能。 强化学习微调:为从头开始实现 GRPO 的训练函数 train_with_grpo 配置适当的训练参数和奖励函数。然后,在剩余的训练数据上执行强化学习训练。 最终评估和模型保存:强化学习微调后,再次评估模型,并保存最终模型。
确定设备(如果有 GPU 就用 GPU,否则就用 CPU)。 加载预训练版 Qwen2.5-1.5B-Instruct 模型和 tokenizer。tokenizer 的 pad token 设置为 eos_token。 保留一小部分数据集用于评估,以提供基线。 通过启用梯度检查点和禁用 KV 缓存,优化模型的内存效率。 步骤 1:在微调之前评估模型,以建立基线准确性。 步骤 2:使用 train_with_grpo 函数和我们定义的奖励函数(format_reward 和 correctness_reward,合并为 combined_reward)执行强化学习微调。这里使用了多台 GPU 训练模型。 步骤 3:将最终的微调模型和 tokenizer 保存到磁盘。
num_iterations=1:从当前策略模型创建新参考模型的外部迭代次数。一次迭代是指在整个数据集上执行一次通过。 num_steps=500:训练循环将执行最多 500 个步骤,每个步骤处理一批样本。 batch_size=7:在 8 台 GPU 的情况下,每个步骤每批处理 7 个样本,每台 GPU 上放置 1 个样本。使用一个 GPU (0) 被 DataParallel 用作主节点来聚合梯度并收集输出。 num_generations=14:对于训练数据中的每个提示词,训练器将生成 14 个不同的完成结果。这些生成结果将被用于计算指导强化学习更新的相对优势(或奖励信号)。如果你的 GPU 的 VRAM 较少,请减少此数字。 max_completion_length=400:在生成完成结果(序列的 response 部分)时,生成上限为 400 个 token。这限制了模型在 RL 阶段生成的输出的长度。如果你的 GPU 的 VRAM 较少,请减少此数字。 beta=0.04:GRPO 损失函数中 KL 散度惩罚的系数。这控制的是模型与参考模型的偏差程度。 learning_rate=5e-6:RL 微调的学习率。为了实现稳定的策略更新,这里使用了相对较低的学习率。 mu=1:对每批 rollout 数据执行的策略更新次数。在这里,我们每批只执行一次更新。 epsilon=0.1:GRPO 的 PPO 组件的 clipping 参数。这可以防止策略在单次更新中发生太大的变化。








