From 1ff5a1c855e3697d2151994cb10e672f741fcac6 Mon Sep 17 00:00:00 2001 From: liutongtong27 Date: Mon, 16 Jun 2025 19:02:05 +0800 Subject: [PATCH] update actor-update part of verl GRPO profiling --- .../rl/VeRL_for_PyTorch/docs/profiler.md | 46 +++++++++++-------- .../verl/workers/actor/dp_actor.py | 10 +++- .../verl/workers/fsdp_workers.py | 2 +- 3 files changed, 35 insertions(+), 23 deletions(-) diff --git a/PyTorch/built-in/rl/VeRL_for_PyTorch/docs/profiler.md b/PyTorch/built-in/rl/VeRL_for_PyTorch/docs/profiler.md index 8100df9e39..8f7d7b594a 100644 --- a/PyTorch/built-in/rl/VeRL_for_PyTorch/docs/profiler.md +++ b/PyTorch/built-in/rl/VeRL_for_PyTorch/docs/profiler.md @@ -28,24 +28,24 @@ actor_rollout_ref: ### 主要配置参数说明 -| 参数 | 说明 | 可选值 | -|-----------------------|---------------|-------------------------------------------------------------------------------------------| -| profile | 性能分析开关 | true/false,所有性能数据采集均依赖该开关开启 | -| mstx | 轻量级打点采集模式 | true/false,启用/关闭轻量级打点采集 | -| role | 角色 | 不需要修改 | -| stage | 性能数据采集阶段 | all(表示采集所有阶段)、 actor_generate, actor_compute_log_prob, ref_compute_log_prob, actor_update | -| profile_save_path | 性能数据输出目录 | 任意有效路径,默认为"./profiler_data" | -| profile_export_type | 导出格式 | text、db (可减少约70%磁盘空间),默认值text | -| profile_step_start | 开启采集数据的步骤 | 任意正整数,默认为1,profile_step_start从1开始 | -| profile_step_end | 结束采集数据的步骤 | 任意正整数,默认为2,实际采集步数不包含profile_step_end,采集总步数为profile_step_end-profile_step_start | -| profile_level | 采集级别 | level_none、level0、level1、level2,默认值level0 | -| profile_with_memory | 内存分析开关 | true/false,默认值false,启用/关闭内存分析 | -| profile_record_shapes | 张量形状记录开关 | true/false,默认值false,是否记录张量形状 | -| profile_with_cpu | Host侧性能数据开关 | true/false,默认值false,是否包含Host侧性能数据 | -| profile_with_npu | Device侧性能数据开关 | true/false,默认值false,是否包含NPU侧性能数据 | -| profile_with_module | Python调用栈信息开关 | true/false,默认值false,是否包含Python侧调用栈信息 | -| profile_analysis | 自动解析开关 | true/false,默认值false,是否在采集后自动解析数据 | -| profile_ranks | 采集数据的卡号 | all表示所有rank, 默认值all,可以通过列表指定,如[0, 1] | +| 参数 | 说明 | 可选值 | +|-----------------------|---------------|--------------------------------------------------------------------------------------------------------------------------------------------| +| profile | 性能分析开关 | true/false,所有性能数据采集均依赖该开关开启 | +| mstx | 轻量级打点采集模式 | true/false,启用/关闭轻量级打点采集 | +| role | 角色 | 不需要修改 | +| stage | 性能数据采集阶段 | all(表示采集所有阶段)、 actor_generate, actor_compute_log_prob, ref_compute_log_prob, actor_update, actor_update_micro(表示采集actor_update阶段的第一次前反向数据) | +| profile_save_path | 性能数据输出目录 | 任意有效路径,默认为"./profiler_data" | +| profile_export_type | 导出格式 | text、db (可减少约70%磁盘空间),默认值text | +| profile_step_start | 开启采集数据的步骤 | 任意正整数,默认为1,profile_step_start从1开始 | +| profile_step_end | 结束采集数据的步骤 | 任意正整数,默认为2,实际采集步数不包含profile_step_end,采集总步数为profile_step_end-profile_step_start | +| profile_level | 采集级别 | level_none、level0、level1、level2,默认值level0 | +| profile_with_memory | 内存分析开关 | true/false,默认值false,启用/关闭内存分析 | +| profile_record_shapes | 张量形状记录开关 | true/false,默认值false,是否记录张量形状 | +| profile_with_cpu | Host侧性能数据开关 | true/false,默认值false,是否包含Host侧性能数据 | +| profile_with_npu | Device侧性能数据开关 | true/false,默认值false,是否包含NPU侧性能数据 | +| profile_with_module | Python调用栈信息开关 | true/false,默认值false,是否包含Python侧调用栈信息 | +| profile_analysis | 自动解析开关 | true/false,默认值false,是否在采集后自动解析数据 | +| profile_ranks | 采集数据的卡号 | all表示所有rank, 默认值all,可以通过列表指定,如[0, 1] | ## 性能数据采集 @@ -65,6 +65,7 @@ actor_rollout_ref: - actor_compute_log_prob - ref_compute_log_prob - actor_update + - actor_update_micro - **适用场景**: 需要查看训练某一特定阶段的详细计算、通信profiling数据 @@ -109,7 +110,12 @@ actor_rollout_ref: ```python import torch_npu # 在性能数据采集完成后,可对所有性能数据执行离线解析("./profiler_data"可包含多份性能数据,解析可并行进行) -torch_npu.profiler.profiler.analyse(profiler_path="./profiler_data") +# 端到端采集情况下,"./profiler_data"路径下包含actor_rollout_ref文件夹,使用以下命令进行离线解析 +torch_npu.profiler.profiler.analyse(profiler_path="./profiler_data/actor_rollout_ref") + +# 分阶段采集情况下,"./profiler_data"路径下根据设置的stage参数不同,可能存在actor_generate、actor_compute_log_prob、ref_compute_log_prob、actor_update或actor_update_micro文件夹 +# 选择需要离线解析的阶段,以actor_generate为例,使用以下命令进行离线解析 +torch_npu.profiler.profiler.analyse(profiler_path="./profiler_data/actor_generate") ``` ### 2. 在线解析 @@ -118,6 +124,6 @@ torch_npu.profiler.profiler.analyse(profiler_path="./profiler_data") ## 结果可视化 -解析后的性能数据保存在`profile_save_path`指定目录中,可通过以下工具进行可视化: +解析后的性能数据保存在`profile_save_path`指定目录的不同子目录中,可通过以下工具进行可视化: - **MindStudio Insight**:提供丰富的性能分析视图,包括时间线视图、算子分析、通信分析。详细使用指南可参考[MindStudio文档](https://www.hiascend.com/document/detail/zh/mindstudio/80RC1/index/index.html) diff --git a/PyTorch/built-in/rl/VeRL_for_PyTorch/verl/workers/actor/dp_actor.py b/PyTorch/built-in/rl/VeRL_for_PyTorch/verl/workers/actor/dp_actor.py index 4decfd0ebc..72e211e368 100644 --- a/PyTorch/built-in/rl/VeRL_for_PyTorch/verl/workers/actor/dp_actor.py +++ b/PyTorch/built-in/rl/VeRL_for_PyTorch/verl/workers/actor/dp_actor.py @@ -29,7 +29,7 @@ from verl.utils.py_functional import append_to_dict from verl.utils.torch_functional import logprobs_from_logits, masked_mean from verl.utils.ulysses import ulysses_pad_and_slice_inputs, gather_outpus_and_unpad from verl.utils.seqlen_balancing import rearrange_micro_batches, get_reverse_idx -from verl.utils.profiler import mstx_timer_decorator +from verl.utils.profiler import mstx_timer_decorator, profiler_start, profiler_step import verl.utils.torch_functional as verl_F from verl.utils.device import get_device_name, get_torch_device, is_cuda_available, is_npu_available @@ -69,6 +69,7 @@ class DataParallelPPOActor(BasePPOActor): if self.config.get('use_torch_compile', True) # use torch compile by default else entropy_from_logits) self.device_name = get_device_name() + self.prof_iteration = 1 @mstx_timer_decorator def _forward_micro_batch(self, micro_batch, temperature) -> Tuple[torch.Tensor, torch.Tensor]: @@ -251,7 +252,7 @@ class DataParallelPPOActor(BasePPOActor): return log_probs @mstx_timer_decorator - def update_policy(self, data: DataProto): + def update_policy(self, data: DataProto, profiler_config=None): # make sure we are in training mode self.actor_module.train() @@ -272,6 +273,9 @@ class DataParallelPPOActor(BasePPOActor): else: dataloader = batch.split(self.config.ppo_mini_batch_size) + update_actor_micro_profiler = profiler_start(profiler_config, + role="actor_update_micro", + profiler_iteration=self.prof_iteration) metrics = {} for epoch in range(self.config.ppo_epochs): for batch_idx, data in enumerate(dataloader): @@ -360,9 +364,11 @@ class DataParallelPPOActor(BasePPOActor): 'actor/pg_clipfrac_lower': pg_clipfrac_lower.detach().item(), } append_to_dict(metrics, data) + profiler_step(update_actor_micro_profiler) grad_norm = self._optimizer_step() data = {'actor/grad_norm': grad_norm.detach().item()} append_to_dict(metrics, data) self.actor_optimizer.zero_grad() + self.prof_iteration += 1 return metrics diff --git a/PyTorch/built-in/rl/VeRL_for_PyTorch/verl/workers/fsdp_workers.py b/PyTorch/built-in/rl/VeRL_for_PyTorch/verl/workers/fsdp_workers.py index 0babbc6bea..f65cd1f3d8 100644 --- a/PyTorch/built-in/rl/VeRL_for_PyTorch/verl/workers/fsdp_workers.py +++ b/PyTorch/built-in/rl/VeRL_for_PyTorch/verl/workers/fsdp_workers.py @@ -473,7 +473,7 @@ class ActorRolloutRefWorker(Worker): data = self.ulysses_sharding_manager.preprocess_data(data=data) # perform training with Timer(name='update_policy', logger=None) as timer: - metrics = self.actor.update_policy(data=data) + metrics = self.actor.update_policy(data=data, profiler_config=self.profiler_config.actor_rollout_ref) delta_time = timer.last global_num_tokens = data.meta_info['global_token_num'] estimated_flops, promised_flops = self.flops_counter.estimate_flops(global_num_tokens, delta_time) -- Gitee