
# 配置调优
该章节介绍针对不同框架给出的常见调优配置和建议，实际使用过程中由于模型参数量、训练数据集及资源数的不同，需要结合参数进行持续调整。
#### MindSpeed-LLM
1. 并行策略优化：当模型权重或序列长度较大时，需要开启模型并行或长序列并行缓解显存占用。
- **关键参数** ：
  - **tensor-model-parallel-size**（简称TP）：模型并行大小，设置越大显存占用越小、通信开销越大
  
  - **pipeline-model-parallel-size**（简称pp）：流水线并行大小，设置越大显存占用越小、通信开销越大
  
  - **context-parallel-size**（简称cp）：序列并行大小，设置越大显存占用越小、通信开销越大
  
  - **expert-model-parallel-size**（简称ep）：专家并行大小，设置越大显存占用越小、通信开销越大
  
  - **data-parallel-size**（简称dp）：数值通过计算得到，计算公式=总训练卡数 /（tensor-model-parallel-size \* pipeline-model-parallel-size \* context-parallel-size）
   

- **调整策略**：开启模型并行或长序列并行会带来额外的通信开销，降低训练性能，理论上通信开销是按pp-dp-ep-cp-tp的顺序依次增加，因此可以按需调整并行策略，平衡显存占用和训练性能。
2. 显存优化：
- **use-distributed-optimizer**：开启后使能优化器状态被切分到各DP组中，降低显存消耗
- **recompute-num-layers**：设置为全量重计算层数，对于显存非常有限的情况，全量重计算只保存Transformer层或层组的输入激活值，其他部分全部重新计算。
- **recompute-granularity**：设置为full，表示全量激活重计算，配合recompute-num-layers参数使用。
- **recompute-method**：设置为uniform时，表示将Transformer 层均匀划分组（每组大小--recompute-num-layers），按组存储输入和激活值；设置为block时，表示将前--recompute-num-layers个Transformer层重计算，剩余层不进行重计算。当显存有空余时设置为block，提升训练性能。
- **recompute-activation-function**：开启后使能激活函数重计算。
- **recompute-activation-function-num-layers**：指定激活函数重计算层数。注意：激活函数重计算可以与权重计算同时开启，同时开启时，仅支持 --recompute-method 为 block；同时开启时，会按照指定的全重计算和激活函数重计算的层数做各自类型的重计算，即不会有一层既做全重计算又做激活函数重计算。
- **swap-attention**：开启后利用设备内存和CPU内存来存放激活值，在梯度反传的同时从CPU内存预取激活值来减少重计算，充分利用H2D高带宽的优势以网补存、以网强算，提升MFU，加速大模型的训练。
 
3. 通信优化：
- **overlap-grad-reduce**：开启后在DP组内通过流水线技术来实现计算与通信的流水掩盖
- **overlap-param-gather**：开启后在DP组内使能参数聚合重叠。使用时需确保同时开启了以下两个参数：--use-distributed-optimizer和--overlap-grad-reduce。
- **use-ascend-coc**：开启后在TP组内将ColumnParallelLinear和RowParallelLinear中的MatMul计算任务和前后毗邻的AllReduce（不开启序列并行）或AllGather和ReduceScatter（开启序列并行）通信任务分别拆分成更细粒度的子任务来实现相互的流水掩盖。
 
#### Llama-Factory
1. ZeRO并行方面（**backend_config.training.deepspeed** ）：不同参数量的模型对于显存占用不一致，随着优化阶段的提升（从ZeRO-Stage 0到ZeRO-Stage 3，以及启用Offload），模型训练所需要的显存占用会显著降低。但这种显存占用的减少通常伴随额外的通信开销和计算协调成本，这可能导致整体训练性能变差。
   以下配置的性能由高到低，所需显存也由高到低：ds_config_zero0.json、ds_config_zero1.json、ds_config_zero2.json、ds_config_zero2_offload.json、ds_config_zero3.json、ds_config_zero3_offload.json
   
2. 重计算方面（**backend_config.training.recompute_layers_ratio** ）：重计算是通过牺牲性能换取显存的优化技术。
   当显存充足，追求性能，设置模型参数disable_gradient_checkpointing: true，表示关闭重计算；当显存紧张，优先省显存，设置模型参数disable_gradient_checkpointing: false，通过调整模型参数recompute_layers_ratio来选择适当的比例，以在显存节省和计算开销之间取得平衡。当值越大，显存占用越少，性能越差。
   
3. 单设备训练批量大小方面（**backend_config.training.per_device_train_batch_size**）：通过设置模型参数per_device_train_batch_size的值来优化性能，当这个值越大，可能会提高性能，但是对显存的利用率增加，当设置为1的时候，对于显存的占用是最小的。
 
#### VeRL
1. 长序列优化：data.max_prompt_length和data.max_response_length需设置为较大值以支持长序列训练。例如，若模型推理回答长度最大为16k，则需要将data.max_response_length设置为16384。**注意**：过大的序列长度可能导致显存不足，需结合其他参数（如序列并行）平衡。
2. actor_rollout_ref.actor.ulysses_sequence_parallel_size启用**序列并行** （Sequence Parallel）机制，将长序列分割为多个小块并行处理。
   - **调整规则**：序列越长，此参数值应越大。例如，若max_response_length=16384，可设置 ulysses_sequence_parallel_size=8（分割为8段）。
   
   - **关键参数**：一般设置ppo_max_token_len_per_gpu = max_response_length / ulysses_sequence_parallel_size确保每个设备分片的序列长度不超过其显存限制。一个PPO批次中每个设备的最大token。
    
3. 批处理参数优化
   - **data.train_batch_size**：需调小以适应长序列的显存占用。
   
   - **actor_rollout_ref.rollout.n**：推理时每条prompt生成的response数量，该值设置越大，显存占用越大。
   
   - **actor_rollout_ref.actor.ppo_mini_batch_size**：最小配置参考公式：actor_rollout_ref.rollout.n \* ppo_mini_batch_size=卡数 。
   
   - **actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu、actor_rollout_ref.rollout.log_prob_micro_batch_size_per_gpu 和 actor_rollout_ref.ref.log_prob_micro_batch_size_per_gpu**：这些参数控制单设备内的微批次大小，需足够小以避免显存溢出，最小配置均为1。
    
 
#### MindSpeed-RL
1. 推理阶段参数配置
   - 并行配置参数
     - **infer_tensor_parallel_size：**张量并行大小，设置越大显存占用越小、通信开销越大
     
     - **infer_pipeline_parallel_size：**流水线并行大小，设置越大显存占用越小、通信开销越大
     
     - **infer_expert_parallel_size：**专家并行大小，MOE模型使用，deepseek模型推荐大EP
      
   
   - vllm引擎参数
     - **max_num_seqs：**每次处理最大序列数
     
     - **max_model_len：**最大输出句长
     
     - **max_num_batched_tokens：**每次迭代的最大批处理token数
     
     - **gpu_memory_utilization：**模型权重和kv-cache的预留显存空间
     
     - **enforce_eager：**设置为True时关闭图模式
      
    
2. 训练阶段参数配置
   - 并行配置参数
     - **tensor_model_parallel_size：**张量并行大小，设置越大显存占用越小、通信开销越大
     
     - **pipeline_model_parallel_size：**流水线并行大小，设置越大显存占用越小、通信开销越大
     
     - **expert_model_parallel_size：**专家并行大小
     
     - **context_parallel_size**：序列并行大小，设置越大显存占用越小、通信开销越大
      
   
   - 显存优化： **swap_optimizer：**通过在前反向期间，卸载优化器状态到host侧内存，device侧仅保留逻辑视图，在step更新阶段再加载回device侧，来降低显存峰值。
     
   
   - 批处理参数：
     - **global_batch_size：**一个step内处理的prompt数据量
     
     - **mini_batch_size：**global_batch_size除以mini_batch_size代表每个step内actor模型更新的次数
     
     - **micro_batch_size：**训练阶段的micro_batch_size，开启use_dynamic_bsz时不生效
      
   
   - rl参数
     - **use_integrated_worker：**设置true使用共卡模式
     
     - **use_dynamic_bsz：**使用动态batch特性，使得不同DP域内的样本数一致，数据长度和接近
     
     - **max_packing_token_size：**使用动态batch时，限制一个batch内的最大token数
     
     - **blocking：**是否开启异步，默认为 true
     
     - **use_remove_padding：**去除padding的token，避免无效计算
     
     - **n_samples_per_prompt：**每条prompt生成多少条response
      
    
 
#### MindSpeed-MM
1. 并行策略优化：当模型权重或序列长度较大时，需要开启模型并行或长序列并行缓解显存占用。
- **关键参数** ：
  - **tensor-model-parallel-size**（简称TP）：模型并行大小，设置越大显存占用越小、通信开销越大
  
  - **pipeline-model-parallel-size**（简称pp）：流水线并行大小，设置越大显存占用越小、通信开销越大
  
  - **context-parallel-size**（简称cp）：序列并行大小，设置越大显存占用越小、通信开销越大
  
  - **data-parallel-size**（简称dp）：数值通过计算得到，计算公式=总训练卡数 /（tensor-model-parallel-size \* pipeline-model-parallel-size \* context-parallel-size）
   

- **调整策略**：开启模型并行或长序列并行会带来额外的通信开销，降低训练性能，理论上通信开销是按pp-dp-cp-tp的顺序依次增加，因此可以按需调整并行策略，平衡显存占用和训练性能。
2. 显存优化：
- **use-distributed-optimizer**：开启后使能优化器状态被切分到各DP组中，降低显存消耗
- **recompute-num-layers**：设置为全量重计算层数，对于显存非常有限的情况，全量重计算只保存Transformer层或层组的输入激活值，其他部分全部重新计算。
- **recompute-granularity**：设置为full，表示全量激活重计算，配合recompute-num-layers参数使用。
- **recompute-method**：设置为uniform时，表示将Transformer 层均匀划分组（每组大小--recompute-num-layers），按组存储输入和激活值；设置为block时，表示将前--recompute-num-layers个Transformer层重计算，剩余层不进行重计算。当显存有空余时设置为block，提升训练性能。
- **recompute-activation-function**：开启后使能激活函数重计算。
- **recompute-activation-function-num-layers**：指定激活函数重计算层数。注意：激活函数重计算可以与权重计算同时开启，同时开启时，仅支持 --recompute-method 为 block；同时开启时，会按照指定的全重计算和激活函数重计算的层数做各自类型的重计算，即不会有一层既做全重计算又做激活函数重计算。
- **swap-attention**：开启后利用设备内存和CPU内存来存放激活值，在梯度反传的同时从CPU内存预取激活值来减少重计算，充分利用H2D高带宽的优势以网补存、以网强算，提升MFU，加速大模型的训练。
 
3. 通信优化：
- **overlap-grad-reduce**：开启后在DP组内通过流水线技术来实现计算与通信的流水掩盖
- **overlap-param-gather**：开启后在DP组内使能参数聚合重叠。使用时需确保同时开启了以下两个参数：--use-distributed-optimizer和--overlap-grad-reduce。
- **use-ascend-coc**：开启后在TP组内将ColumnParallelLinear和RowParallelLinear中的MatMul计算任务和前后毗邻的AllReduce（不开启序列并行）或AllGather和ReduceScatter（开启序列并行）通信任务分别拆分成更细粒度的子任务来实现相互的流水掩盖。
 
