| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| """ |
| This CI test is used for checking whether device api usage is irregular, suggest using api in `verl/utils/device.py`. |
| Search targets include .py files in verl/recipe and verl/verl. |
| Some files that must contain ".cuda", "cuda" or "nccl" keyword is pre-defined in whitelist below. |
| """ |
|
|
| import os |
| from argparse import ArgumentParser |
| from pathlib import Path |
|
|
| |
| CUDA_KEYWORD_CHECK_WHITELIST = [ |
| "verl/utils/device.py", |
| "verl/utils/torch_functional.py", |
| "verl/utils/profiler/nvtx_profile.py", |
| "verl/utils/profiler/torch_profile.py", |
| "verl/utils/profiler/config.py", |
| "verl/utils/kernel/linear_cross_entropy.py", |
| "verl/utils/rendezvous/ray_backend.py", |
| "verl/single_controller/ray/base.py", |
| "verl/trainer/ppo/ray_trainer.py", |
| "verl/experimental/transfer_queue/ray_trainer.py", |
| "verl/experimental/one_step_off_policy/ray_trainer.py", |
| "verl/utils/reward_score/sandbox_fusion/utils.py", |
| "verl/third_party/torch/distributed/_state_dict_utils.py", |
| "verl/third_party/torch/distributed/checkpoint/state_dict.py", |
| "verl/workers/engine/base.py", |
| "verl/workers/engine/utils.py", |
| "verl/workers/engine/fsdp/transformer_impl.py", |
| "verl/workers/engine/veomni/transformer_impl.py", |
| "verl/workers/engine/torchtitan/transformer_impl.py", |
| "verl/workers/engine/torchtitan/utils.py", |
| "verl/workers/rollout/vllm_rollout/vllm_async_server.py", |
| "verl/workers/rollout/sglang_rollout/async_sglang_server.py", |
| "verl/workers/rollout/trtllm_rollout/trtllm_async_server.py", |
| "verl/workers/rollout/replica.py", |
| "verl/checkpoint_engine", |
| ] |
|
|
| |
| NCCL_KEYWORD_CHECK_WHITELIST = [ |
| "verl/utils/device.py", |
| "verl/third_party/sglang/parallel_state.py", |
| ] |
|
|
| SEARCH_WHITELIST = CUDA_KEYWORD_CHECK_WHITELIST + NCCL_KEYWORD_CHECK_WHITELIST |
|
|
| SEARCH_KEYWORDS = [".cuda", '"cuda"', '"nccl"'] |
|
|
|
|
| if __name__ == "__main__": |
| parser = ArgumentParser() |
| parser.add_argument("--directory", "-d", required=True, type=str) |
| args = parser.parse_args() |
| directory_in_str = args.directory |
|
|
| pathlist = Path(directory_in_str).glob("**/*.py") |
| for path in pathlist: |
| path_in_str = str(path.absolute()) |
|
|
| |
| path_in_whitelist = False |
|
|
| for sw in SEARCH_WHITELIST: |
| |
| sw = sw.replace("/", os.sep) |
| if sw in path_in_str: |
| print(f"[SKIP] File {path_in_str} is in device api usage check whitelist, checking is skipped.") |
| path_in_whitelist = True |
| break |
|
|
| if path_in_whitelist: |
| continue |
|
|
| with open(path_in_str, encoding="utf-8") as f: |
| file_content = f.read() |
|
|
| find_invalid_device_management = False |
|
|
| for sk in SEARCH_KEYWORDS: |
| if sk in file_content: |
| find_invalid_device_management = True |
| break |
|
|
| print( |
| f"[CHECK] File {path_in_str} is detected for device api usage check, check result: " |
| f"{'success' if not find_invalid_device_management else f'failed, because detect {sk}'}." |
| ) |
|
|
| assert not find_invalid_device_management, ( |
| f'file {path_in_str} contains .cuda/"cuda"/"nccl" usage, please use api in ' |
| f"verl/utils/device.py directly." |
| ) |
|
|