多节点测试

多节点测试#

多节点 CI 旨在测试非常大模型的分布式场景,例如:跨多节点的 disaggregated_prefill 多 DP 等。

工作原理#

下图展示了多节点 CI 机制的基本部署视图,它展示了 github action 如何与 lws(一种 Kubernetes CRD 资源)进行交互。

alt text

从工作流的角度来看,我们可以看到最终的测试脚本是如何执行的。关键在于这两个 lws.yaml 和 run.sh。前者定义了我们的 k8s 集群如何启动,后者定义了 pod 启动时的入口脚本。每个节点根据 LWS_WORKER_INDEX 环境变量执行不同的逻辑,从而使多个节点能够组成一个分布式集群来执行任务。

alt text

如何贡献#

  1. 上传自定义权重

    如果您需要自定义权重,例如,您为 DeepSeek-V3 量化了一个 w8a8 权重,并且希望您的权重能在 CI 上运行,欢迎将权重上传到 ModelScope 的 vllm-ascend 组织。如果您没有上传权限,请联系 @Potabk。

  2. 添加配置文件

    如入口脚本 run.sh 所示,Kubernetes Pod 启动意味着遍历 目录 中的所有 *.yaml 文件,并根据不同的配置进行读取和执行。因此,我们所需要做的就是添加像 DeepSeek-V3.yaml 这样的“yaml 文件”。

    假设您有 **2 个节点** 运行 1P1D 设置(1 个预填充器 + 1 个解码器)

    您可以添加一个如下所示的配置文件

    test_name: "test DeepSeek-V3 disaggregated_prefill"
    # the model being tested
    model: "vllm-ascend/DeepSeek-V3-W8A8"
    # how large the cluster is
    num_nodes: 2
    npu_per_node: 16
    # All env vars you need should add it here
    env_common:
    VLLM_USE_MODELSCOPE: true
    OMP_PROC_BIND: false
    OMP_NUM_THREADS: 100
    HCCL_BUFFSIZE: 1024
    SERVER_PORT: 8080
    disaggregated_prefill:
    enabled: true
    # node index(a list) which meet all the conditions:
    #  - prefiller
    #  - no headless(have api server)
    prefiller_host_index: [0]
    # node index(a list) which meet all the conditions:
    #  - decoder
    #  - no headless(have api server)
    decoder_host_index: [1]
    
    # Add each node's vllm serve cli command just like you run locally
    deployment:
    -
        server_cmd: >
            vllm serve ...
    -
        server_cmd: >
            vllm serve ...
    benchmarks:
    perf:
        # fill with performance test kwargs
    acc:
        # fill with accuracy test kwargs
    
  3. 本地运行(选项)

    步骤 1. 向配置文件添加 cluster_hosts

    在每个集群主机上修改,命令如下:例如,在 DeepSeek-V3.yamlnum_nodes 配置项之后,例如:cluster_hosts: ["xxx.xxx.xxx.188", "xxx.xxx.xxx.212"]

    步骤 2. 安装开发环境

    • 在每个集群主机上安装 vllm-ascend 开发包。

      cd /vllm-workspace/vllm-ascend
      python3 -m pip install -r requirements-dev.txt
      
    • 在集群主机中的第一个主机(leader 节点)上安装 AISBench。

      export AIS_BENCH_TAG="v3.0-20250930-master"
      export AIS_BENCH_URL="https://gitee.com/aisbench/benchmark.git"
      
      git clone -b ${AIS_BENCH_TAG} --depth 1 ${AIS_BENCH_URL} /vllm-workspace/vllm-ascend/benchmark
      cd /vllm-workspace/vllm-ascend/benchmark
      pip install -e . -r requirements/api.txt -r requirements/extra.txt
      

    步骤 3. 本地运行测试

    • 导出环境变量

      在 leader 主机上(第一个节点 xxx.xxx.xxx.188)

      export LWS_WORKER_INDEX=0
      export WORKSPACE=/vllm-workspace
      export CONFIG_YAML_PATH=DeepSeek-V3.yaml
      export FAIL_TAG=FAIL_TAG
      

      在 slave 主机上(其他节点,例如 xxx.xxx.xxx.212)

      export LWS_WORKER_INDEX=1
      export WORKSPACE=/vllm-workspace
      export CONFIG_YAML_PATH=DeepSeek-V3.yaml
      export FAIL_TAG=FAIL_TAG
      

      LWS_WORKER_INDEX 是此节点在 cluster_hosts 中的索引。索引为 0 的节点是 leader。slave 节点的索引值范围是 [1, num_nodes-1]。

    • 运行 vllm 服务实例

      在每个集群主机上复制并运行 run.sh,以启动 vllm,命令如下。

      cp /vllm-workspace/vllm-ascend/tests/e2e/nightly/multi_node/scripts/run.sh /vllm-workspace/
      cd /vllm-workspace/
      bash -x run.sh
      
  4. 将该用例添加到当前的 nightly 工作流中,多节点测试工作流定义在 vllm_ascend_test_nightly_a2/a3.yaml 中。

     multi-node-tests:
         needs: single-node-tests
         if: always() && (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch')
         strategy:
         fail-fast: false
         max-parallel: 1
         matrix:
             test_config:
             - name: multi-node-deepseek-pd
                 config_file_path: tests/e2e/nightly/multi_node/config/models/DeepSeek-V3.yaml
                 size: 2
             - name: multi-node-qwen3-dp
                 config_file_path: tests/e2e/nightly/multi_node/config/models/Qwen3-235B-A22B.yaml
                 size: 2
             - name: multi-node-dpsk-4node-pd
                 config_file_path: tests/e2e/nightly/multi_node/config/models/DeepSeek-R1-W8A8.yaml
                 size: 4
         uses: ./.github/workflows/_e2e_nightly_multi_node.yaml
         with:
         soc_version: a3
         image: m.daocloud.io/quay.io/ascend/cann:8.3.rc2-a3-ubuntu22.04-py3.11
         replicas: 1
         size: ${{ matrix.test_config.size }}
         config_file_path: ${{ matrix.test_config.config_file_path }}
    

上面的 matrix 定义了添加多机用例所需的所有参数。值得关注的参数(如果正在添加新用例)是 size 和 yaml 配置文件路径。前者定义了用例所需的节点数,后者定义了您在步骤 2 中完成的配置文件的路径。