配置说明¶
ChatLearn 的配置主要由两个部分组成:
runtime_args:框架的核心训练配置。models:每个独立模型的配置。
配置模板位于 ChatLearn/template 目录中。
runtime_args¶
runtime_args:
# setup配置
train_backend: fsdp
rollout_backend: vllm
exp_name: grpo_fsdp
colocation: [policy,policy_trainer,ref_policy]
# 路径配置
output_dir: your_output_dir
data_path: your_data_path
eval_data_path: your_eval_data_path
data_checkpoint_path: ${runtime_args.output_dir}/data_checkpoint_path/
# 训练配置
num_episode: 200
sample_per_episode: 512
train_global_batch_size: 512
save_episode_interval: 200
# 数据配置
data_shuffle: True
data_rerank: True
# 评估配置
eval_episode_interval: 5
enable_eval_before_training: False
log_args_dict:
log_dir: ${runtime_args.output_dir}
enable_wandb: False
wandb_project: your_wandb_project
wandb_dir: ${runtime_args.output_dir}
wandb_name: ${runtime_args.exp_name}
wandb_id: ${runtime_args.exp_name}
wandb_resume: allow
runtime_args.train_backend:训练后端,支持 fsdp 或 megatron。runtime_args.rollout_backend:推理后端,可选择 vllm 或 sglang。runtime_args.exp_name:实验名称,用于日志记录。runtime_args.colocation:列出的模型将放置在同一个在 GPU 上并顺序执行, 当执行一个模型时,其他模型权重会卸载到内存中。runtime_args.output_dir:保存所有中间训练结果的目录。runtime_args.data_path:训练数据路径。请确保该目录下的数据文件与数据读取代码兼容。runtime_args.eval_data_path:评估数据路径。请确保该目录下的数据文件与数据读取代码兼容。runtime_args.data_checkpoint_path:数据检查点保存路径。默认为runtime_args.output_dir下的data_checkpoint_path/。runtime_args.num_episode:总训练轮数(episode)。每轮包含多次权重更新。runtime_args.sample_per_episode:每轮训练的样本数量(sample_per_episode = prompt_per_episode * num_inference_per_prompt)。runtime_args.train_global_batch_size:将sample_per_episode划分为多个train_global_batch_size。每个批次用于一次模型权重更新。runtime_args.save_episode_interval:保存中间检查点的间隔。runtime_args.eval_episode_interval:执行评估的轮数间隔。runtime_args.data_shuffle:若启用,则打乱数据集样本顺序,忽略原始顺序。runtime_args.data_rerank:若启用,则相同数据样本的多个副本不会被分配到同一个推理 actor。runtime_args.enable_eval_before_training:是否在训练前进行一次评估。runtime_args.log_args_dict:日志记录配置。当runtime_args.enable_wandb=True时,请确保已登录 wandb账号。
models¶
对于 GRPO 算法,ChatLearn 使用四个模型:policy_trainer、ref_policy、policy 和 reward。
注意:policy_trainer 和 ref_policy 共享相同的训练后端。
policy_trainer¶
通用配置¶
policy_trainer:
free_gpu_memory:
offload_weights: True
offload_optimizer_states: True
free_grad_buffers: True
optimizer:
lr: 2e-6
clip_grad: 1
trainable: True
generation_batch_size: 8
train_micro_batch_size: ${runtime_args.train_micro_batch_size}
packing: False
max_token_in_packing: 32768
load: your_hf_model_path
pos_clip_ratio: 0.2
neg_clip_ratio: 0.2
entropy_coef: 0.0
kl_coef: 0.0
gpu_per_process: 1
num_gpu: 1
models.policy_trainer.free_gpu_memory.*:控制 GPU 内存卸载;在colocation场景中建议全部设为True(目前不支持非colocation)。models.policy_trainer.optimizer.lr:学习率。models.policy_trainer.optimizer.clip_grad:梯度裁剪阈值。models.policy_trainer.trainable:是否启用训练,此模型应始终设为True。models.policy_trainer.generation_batch_size:单次模型前向传播的batch_size大小(用于计算 old_logprobs)。models.policy_trainer.train_micro_batch_size:每个每个模型在训练时的batch_size大小,用于前向/反向传播和梯度累积。models.policy_trainer.packing:若启用,则样本将按总token数不超过models.policy_trainer.max_token_in_packing重新进行分组。分组后,每批将打包为单个序列传递给模型推理。启用后,generation_batch_size和train_micro_batch_size将被忽略。models.policy_trainer.max_token_in_packing:当packing启用时用于重新分组的token上限。models.policy_trainer.load:模型权重的加载路径。models.policy_trainer.pos_clip_ratio,models.policy_trainer.neg_clip_ratio:GRPO 算法的裁剪系数。models.policy_trainer.entropy_coef:设为大于 0.0 则在训练过程中启用entropy loss。models.policy_trainer.kl_coef:设为大于 0.0 则在训练过程中启用kl loss。models.policy_trainer.gpu_per_process:每个 Ray actor 分配的 GPU 数量。models.policy_trainer.num_gpu:训练所用的总 GPU 数。
FSDP policy_trainer 配置¶
以下是 FSDP 训练后端的特定配置:
policy_trainer:
fsdp_size: ${models.policy_trainer.num_gpu}
ulysses_sequence_parallel_size: 1
meta_init: False
groupgemm: False
gradient_checkpointing: True
save_hf: True
models.policy_trainer.fsdp_size:设置 FSDP 并行组大小;默认包含所有可用 GPU。models.policy_trainer.ulysses_sequence_parallel_size:设为大于 1 时启用 Ulysses 序列并行。目前支持 Qwen3-Dense 和 Qwen2.5-Dense。models.policy_trainer.meta_init:是否使用meta init。模型权重仅在 rank 0 加载,并在初始化时广播到其他 rank。models.policy_trainer.groupgemm:将 Sequential MLP 替换为 GroupGEMM,目前仅支持 Qwen3-Moe。models.policy_trainer.gradient_checkpointing:启用gradient checkpointing,通过重新计算中间激活值来节省内存。models.policy_trainer.save_hf:若为True,则在训练过程中保存 Hugging Face 格式的检查点。提供了一个 离线合并脚本,可将 FSDP 分布式权重合并为 Hugging Face 格式。
Megatron policy_trainer 配置¶
以下是 Megatron-Core 训练后端的特定配置:
policy_trainer:
bf16: True
max_prompt_tokens_length: ${models.policy.max_prompt_tokens_length}
max_response_tokens_length: ${models.policy.max_response_tokens_length}
tokenizer_type: 'HuggingFaceTokenizer'
tokenizer_model: ${models.policy.load}
tensor_model_parallel_size: 1
pipeline_model_parallel_size: 1
expert_tensor_parallel_size: null
expert_model_parallel_size: 1
virtual_pipeline_model_parallel_size: null
decoder_first_pipeline_num_layers: null
decoder_last_pipeline_num_layers: null
moe_router_force_load_balancing: False
# 训练配置
load: your_megatron_model_path
sequence_parallel: True
use_distributed_optimizer: True
recompute_granularity: null
# 其他
use_group_sequence_policy: False
models.policy_trainer.bf16:启用 bfloat16 精度。若为False,则使用 fp32。models.policy_trainer.max_prompt_tokens_length, models.policy_trainer.max_response_tokens_length:用于计算Megatron 训练的序列长度,models.policy_trainer.seq_length = models.policy_trainer.max_prompt_tokens_length + models.policy_trainer.max_prompt_tokens_length。若启用了packing,此值将被忽略;否则必须与Rollout中seq_length一致。models.policy_trainer.tokenizer_type:Megatron 训练所用的 tokenizer 类型。大多数情况下推荐使用HuggingFaceTokenizer。models.policy_trainer.tokenizer_model:Megatron 训练所用的 tokenizer 模型路径。models.policy_trainer.tensor_model_parallel_size:张量并行大小。models.policy_trainer.pipeline_model_parallel_size:流水线并行大小。models.policy_trainer.expert_tensor_parallel_size:专家张量并行大小。models.policy_trainer.expert_model_parallel_size:专家并行大小。models.policy_trainer.virtual_pipeline_model_parallel_size:虚拟流水线并行大小。当pipeline_model_parallel_size大于 1 时使用。models.policy_trainer.decoder_first_pipeline_num_layers:在流水线并行时第一个切分中decoder 层数。当模型层数无法被pipeline_model_parallel_size整除时使用。models.policy_trainer.decoder_last_pipeline_num_layers:在流水线并行时最后一个切分的 decoder 层数。同上。models.policy_trainer.moe_router_force_load_balancing:(吞吐测试时使用)若启用,则强制 MoE 路由器进行负载均衡,开启时影响强化学习训练收敛结果。models.policy_trainer.load:模型权重导入路径。models.policy_trainer.sequence_parallel:是否启用序列并行。当tensor_model_parallel_size大于 1 时启用。models.policy_trainer.use_distributed_optimizer:是否使用分布式优化器以减少内存占用。建议设为True。models.policy_trainer.recompute_granularity:选择重计算粒度以节省内存。可选值为null、sel或full。models.policy_trainer.use_group_sequence_policy:是否使用 GSPO 算法。
ref_policy¶
ref_policy 与 policy_trainer 使用相同的后端,但需要独立配置。
通用 ref_policy 配置¶
ref_policy:
free_gpu_memory:
offload_weights: True
generation_batch_size: 8
gpu_per_process: 1
num_gpu: ${models.policy_trainer.num_gpu}
trainable: False
load: ${models.policy_trainer.load}
packing: ${models.policy_trainer.packing}
max_token_in_packing: ${models.policy_trainer.max_token_in_packing}
models.ref_policy.free_gpu_memory.offload_weights:启用权重卸载。在colocation场景中应设为True(目前不支持非colocation场景)。models.ref_policy.generation_batch_size:计算 ref_logprobs 时单次batch_size大小。可与policy_trainer的不同。models.ref_policy.trainable:此模型应始终设为 False,因其仅用于推理。models.ref_policy.packing:与policy_trainer中功能相同,控制批次重组和打包。models.ref_policy.max_token_in_packing:当packing启用时用于重组,此值可与policy_trainer不同。models.ref_policy.load:基础模型检查点路径。通常应与policy_trainer一致。models.ref_policy.gpu_per_process:每个 Ray actor 分配的 GPU 数量。models.ref_policy.num_gpu:为此模型分配的总 GPU 数。
FSDP ref_policy 配置¶
FSDP 后端的自定义设置:
ref_policy:
fsdp_size: ${models.policy_trainer.num_gpu}
meta_init: False
groupgemm: False
models.ref_policy.fsdp_size、meta_init、groupgemm:与policy_trainer中的选项相同,但可独立设置以覆盖默认值。
Megatron ref_policy 配置¶
Megatron 后端的自定义设置:
ref_policy:
seq_length: ${models.policy_trainer.seq_length}
tokenizer_type: 'HuggingFaceTokenizer'
tokenizer_model: ${models.policy.load}
bf16: True
sequence_parallel: True
tensor_model_parallel_size: ${models.policy_trainer.tensor_model_parallel_size}
pipeline_model_parallel_size: ${models.policy_trainer.pipeline_model_parallel_size}
expert_tensor_parallel_size: ${models.policy_trainer.expert_tensor_parallel_size}
expert_model_parallel_size: ${models.policy_trainer.expert_model_parallel_size}
decoder_first_pipeline_num_layers: ${models.policy_trainer.decoder_first_pipeline_num_layers}
decoder_last_pipeline_num_layers: ${models.policy_trainer.decoder_last_pipeline_num_layers}
moe_router_force_load_balancing: ${models.policy_trainer.moe_router_force_load_balancing}
load: ${models.policy_trainer.load}
以上配置与 policy_trainer 相同,但可为 ref_policy 单独覆盖。然而,为确保强化学习目标函数计算的数值稳定性,建议保持两者一致,尤其是在 MoE 模型训练中。
policy¶
SgLang 和 VLLM 使用相同的配置:
policy:
free_gpu_memory:
offload_weights: True
generation_batch_size: 256
gpu_per_process: 1
num_gpu: ${models.policy_trainer.num_gpu}
tensor_model_parallel_size: 1
trainable: False
load: ${models.policy_trainer.load}
num_inference_per_prompt: 32
max_prompt_tokens_length: 1024
max_response_tokens_length: 2048
temperature: 1.0
top_p: 1.0
eval_temperature: 0.6
eval_top_p: 0.95
eval_top_k: 20
enable_thinking: False
gpu_memory_utilization: 0.8
models.policy.free_gpu_memory.offload_weights:若启用,则开启卸载模型权重。推荐用于colocation场景(目前不支持非colocation场景)。models.policy.generation_batch_size:用于vLLM 的max_num_seqs。models.policy.gpu_per_process:每个 Ray actor 分配的 GPU 数量。models.policy.num_gpu:模型推理所用的总 GPU 数。models.policy.tensor_model_parallel_size:模型张量并行大小。models.policy.trainable:推理模型不可训练。models.policy.load:模型权重路径;GRPO 中应与policy_trainer.load一致。models.policy.num_inference_per_prompt:每个 prompt 生成的response数量。models.policy.max_prompt_tokens_length:用于筛选输入prompt,如果输入prompt tokens的长度超过此值,则该prompt将被忽略。models.policy.max_response_tokens_length:最大生成的response tokens长度。models.policy.temperature,models.policy.top_p:训练推理时的采样超参数。models.policy.eval_temperature,models.policy.eval_top_p,models.policy.eval_top_k:评估推理时的采样超参数。models.policy.enable_thinking:若启用,为 Qwen3 模型启用“思考模式”。models.policy.gpu_memory_utilization:推理引擎的GPU显存使用率。需谨慎设置,避免 OOM。
reward¶
models:
reward:
num_cpu: 2
cpu_per_process: 1
generation_batch_size: 256
models.reward.num_cpu:rule-based reward actor 分配的总 CPU 数。models.reward.cpu_per_process:每个 reward actor 使用的 CPU 数量。models.reward.generation_batch_size: 单次 reward 前向计算的batch_size大小。