From 35a83a08850f4184e683a82201156038be5ae725 Mon Sep 17 00:00:00 2001 From: Weiming Liao Date: Thu, 10 Sep 2026 10:16:14 +0800 Subject: [PATCH] [NPU][CI] Add A5 and 310P CI support (#6875) Signed-off-by: Weiming Liao Co-authored-by: wangyu <53896905+yenuo26@users.noreply.github.com> --- .buildkite/common/ci_mirror_hardwares.yml | 51 +++++ .buildkite/common/scripts/upload_pipeline.py | 10 +- .buildkite/npu/bootstrap-upload-steps.yml | 134 +++--------- .buildkite/npu/scripts/build-npu-image.sh | 48 +++++ .buildkite/npu/test-npu-ready.yml | 75 +++++-- docker/Dockerfile.npu | 20 +- docker/Dockerfile.npu.a3 | 36 ---- docker/Dockerfile.npu.ci | 20 +- docker/Dockerfile.npu.ci.a3 | 72 ------- docs/contributing/ci/ci_settings.md | 9 +- docs/contributing/ci/test_writing_guide.md | 4 +- .../installation/npu/npu.inc.md | 198 ++++++++++++++---- pyproject.toml | 2 + tests/diffusion/layers/test_activation.py | 16 +- 14 files changed, 387 insertions(+), 308 deletions(-) create mode 100644 .buildkite/npu/scripts/build-npu-image.sh delete mode 100644 docker/Dockerfile.npu.a3 delete mode 100644 docker/Dockerfile.npu.ci.a3 diff --git a/.buildkite/common/ci_mirror_hardwares.yml b/.buildkite/common/ci_mirror_hardwares.yml index e3c9a427a..d638ecb8d 100644 --- a/.buildkite/common/ci_mirror_hardwares.yml +++ b/.buildkite/common/ci_mirror_hardwares.yml @@ -17,6 +17,8 @@ # a2b3_npu_1 — ascend-a2b3, resource_class npu-1 (A2/B3 CI image) # a2b3_npu_4 — ascend-a2b3, resource_class npu-4 # a3_npu_2 — ascend-a3, resource_class npu-2 (A3 CI image tag …:$BUILDKITE_COMMIT-a3) +# a5_npu_2 — ascend-a5, resource_class npu-2 +# 310p_npu_1 — ascend-310p, resource_class npu-1 # # B200 (b200-k8s): matches vLLM device ``b200-k8s`` from ci-infra # (AgentQueue.B200_K8S + b200_plugin_template). Queue routes the K8s pool; @@ -646,3 +648,52 @@ mirror_hardwares: resource_class: "npu-16" image: "swr.cn-southwest-2.myhuaweicloud.com/modelfoundry/vllm-omni-ci-npu:${BUILDKITE_COMMIT}-a3" plugins: *npu_k8s_plugins + + a5_npu_2: + agents: + queue: "ascend-a5" + resource_class: "npu-2" + image: "swr.cn-southwest-2.myhuaweicloud.com/modelfoundry/vllm-omni-ci-npu:${BUILDKITE_COMMIT}-a5" + plugins: *npu_k8s_plugins + + a5_npu_4: + agents: + queue: "ascend-a5" + resource_class: "npu-4" + image: "swr.cn-southwest-2.myhuaweicloud.com/modelfoundry/vllm-omni-ci-npu:${BUILDKITE_COMMIT}-a5" + plugins: *npu_k8s_plugins + + a5_npu_8: + agents: + queue: "ascend-a5" + resource_class: "npu-8" + image: "swr.cn-southwest-2.myhuaweicloud.com/modelfoundry/vllm-omni-ci-npu:${BUILDKITE_COMMIT}-a5" + plugins: *npu_k8s_plugins + + a5_npu_16: + agents: + queue: "ascend-a5" + resource_class: "npu-16" + image: "swr.cn-southwest-2.myhuaweicloud.com/modelfoundry/vllm-omni-ci-npu:${BUILDKITE_COMMIT}-a5" + plugins: *npu_k8s_plugins + + 310p_npu_1: + agents: + queue: "ascend-310p" + resource_class: "npu-1" + image: "swr.cn-southwest-2.myhuaweicloud.com/modelfoundry/vllm-omni-ci-npu:${BUILDKITE_COMMIT}-310p" + plugins: *npu_k8s_plugins + + 310p_npu_2: + agents: + queue: "ascend-310p" + resource_class: "npu-2" + image: "swr.cn-southwest-2.myhuaweicloud.com/modelfoundry/vllm-omni-ci-npu:${BUILDKITE_COMMIT}-310p" + plugins: *npu_k8s_plugins + + 310p_npu_4: + agents: + queue: "ascend-310p" + resource_class: "npu-4" + image: "swr.cn-southwest-2.myhuaweicloud.com/modelfoundry/vllm-omni-ci-npu:${BUILDKITE_COMMIT}-310p" + plugins: *npu_k8s_plugins diff --git a/.buildkite/common/scripts/upload_pipeline.py b/.buildkite/common/scripts/upload_pipeline.py index 53da6f660..046b136d7 100644 --- a/.buildkite/common/scripts/upload_pipeline.py +++ b/.buildkite/common/scripts/upload_pipeline.py @@ -70,7 +70,15 @@ from tests.helpers.mark import ( # noqa: E402 LOG = "upload_pipeline" BOOTSTRAP_STEPS_FILENAME = "bootstrap-upload-steps.yml" -BOOTSTRAP_IMAGE_BUILD_KEYS = frozenset({"image-build", "image-build-a2", "image-build-a3"}) +BOOTSTRAP_IMAGE_BUILD_KEYS = frozenset( + { + "image-build", + "image-build-a2", + "image-build-a3", + "image-build-a5", + "image-build-310p", + } +) BOOTSTRAP_UPLOAD_IF_KEYS = { "upload-ready-pipeline": "ready", "upload-merge-pipeline": "merge", diff --git a/.buildkite/npu/bootstrap-upload-steps.yml b/.buildkite/npu/bootstrap-upload-steps.yml index 64b97f895..398fbc6dc 100644 --- a/.buildkite/npu/bootstrap-upload-steps.yml +++ b/.buildkite/npu/bootstrap-upload-steps.yml @@ -3,10 +3,10 @@ steps: - label: ":buildkit: Build and Push NPU Test Image - A2" key: image-build-a2 - agents: + agents: &npu-image-build-agents queue: "ascend-a2b3" resource_class: "npu-1" - plugins: + plugins: &npu-image-build-plugins - kubernetes: metadata: annotations: @@ -46,123 +46,47 @@ steps: IMAGE_NAME: "vllm-omni-ci-npu" IMAGE_REGISTRY: "swr.cn-southwest-2.myhuaweicloud.com/modelfoundry" BUILDKITD_ADDR: "tcp://buildkitd-service.buildkitd:1234" - command: | - set -ex - - echo "--- Building and pushing NPU Test Image" - echo "Image: $${IMAGE_REGISTRY}/$${IMAGE_NAME}:$${VLLM_IMAGE_TAG}" - echo "buildkitd address: $${BUILDKITD_ADDR}" - - if ! command -v buildctl &> /dev/null; then - echo "Installing buildctl..." - mkdir -p /tmp/buildkit - BUILDKIT_VERSION="v0.29.0" - wget -q "https://github.com/moby/buildkit/releases/download/$${BUILDKIT_VERSION}/buildkit-$${BUILDKIT_VERSION}.linux-arm64.tar.gz" -O /tmp/buildkit.tar.gz - tar -xzf /tmp/buildkit.tar.gz -C /tmp/buildkit - cp /tmp/buildkit/bin/buildctl /usr/local/bin/ - fi - - export DOCKER_CONFIG=/home/user/.docker - buildctl \ - --addr="$${BUILDKITD_ADDR}" \ - --tlscacert=/home/user/.docker/ca.pem \ - --tlscert=/home/user/.docker/cert.pem \ - --tlskey=/home/user/.docker/key.pem \ - build \ - --frontend dockerfile.v0 \ - --local context=. \ - --local dockerfile=./docker \ - --opt filename=Dockerfile.npu.ci \ - --secret id=dockerconfig,src=/home/user/.docker/config.json \ - --output type=image,name=$${IMAGE_REGISTRY}/$${IMAGE_NAME}:$${VLLM_IMAGE_TAG},push=true \ - --progress=plain - - echo "--- Image pushed successfully" - echo "$${IMAGE_REGISTRY}/$${IMAGE_NAME}:$${VLLM_IMAGE_TAG}" + command: bash .buildkite/npu/scripts/build-npu-image.sh Dockerfile.npu.ci "$${VLLM_IMAGE_TAG}" - label: ":buildkit: Build and Push NPU Test Image - A3" key: image-build-a3 - agents: - queue: "ascend-a2b3" - resource_class: "npu-1" - plugins: - - kubernetes: - metadata: - annotations: - vault.hashicorp.com/agent-init-first: "true" - vault.hashicorp.com/agent-inject: "true" - vault.hashicorp.com/agent-inject-perms-ca.pem: "0400" - vault.hashicorp.com/agent-inject-perms-cert.pem: "0400" - vault.hashicorp.com/agent-inject-perms-config.json: "0400" - vault.hashicorp.com/agent-inject-perms-key.pem: "0400" - vault.hashicorp.com/agent-inject-secret-ca.pem: internal/data/ascend/buildkitd - vault.hashicorp.com/agent-inject-secret-cert.pem: internal/data/ascend/buildkitd - vault.hashicorp.com/agent-inject-secret-config.json: internal/data/ascend/buildkitd - vault.hashicorp.com/agent-inject-secret-key.pem: internal/data/ascend/buildkitd - vault.hashicorp.com/agent-inject-template-ca.pem: "{{- with secret \"internal/data/ascend/buildkitd\" -}}\n{{ .Data.data.RootCA }}\n{{- end }}" - vault.hashicorp.com/agent-inject-template-cert.pem: "{{- with secret \"internal/data/ascend/buildkitd\" -}}\n{{ .Data.data.ClientCaCert }}\n{{- end }}" - vault.hashicorp.com/agent-inject-template-config.json: "{{- with secret \"internal/data/ascend/buildkitd\" -}}\n{{ .Data.data.dockerConfig }}\n{{- end }}" - vault.hashicorp.com/agent-inject-template-key.pem: "{{- with secret \"internal/data/ascend/buildkitd\" -}}\n{{ .Data.data.ClientCaKey }}\n{{- end }}" - vault.hashicorp.com/agent-pre-populate-only: "true" - vault.hashicorp.com/agent-run-as-group: "1000" - vault.hashicorp.com/agent-run-as-user: "1000" - vault.hashicorp.com/agent-service-account-token-volume-name: token-vol - vault.hashicorp.com/role: ascend-gha-runners - vault.hashicorp.com/secret-volume-path: /home/user/.docker/ - vault.hashicorp.com/tls-skip-verify: "true" - podSpecPatch: - volumes: - - name: token-vol - projected: - defaultMode: 420 - sources: - - serviceAccountToken: - audience: api - expirationSeconds: 600 - path: token + agents: *npu-image-build-agents + plugins: *npu-image-build-plugins env: VLLM_IMAGE_TAG: "${BUILDKITE_COMMIT}-a3" IMAGE_NAME: "vllm-omni-ci-npu" IMAGE_REGISTRY: "swr.cn-southwest-2.myhuaweicloud.com/modelfoundry" BUILDKITD_ADDR: "tcp://buildkitd-service.buildkitd:1234" - command: | - set -ex + command: bash .buildkite/npu/scripts/build-npu-image.sh Dockerfile.npu.ci "$${VLLM_IMAGE_TAG}" -a3 - echo "--- Building and pushing NPU Test Image" - echo "Image: $${IMAGE_REGISTRY}/$${IMAGE_NAME}:$${VLLM_IMAGE_TAG}" - echo "buildkitd address: $${BUILDKITD_ADDR}" + - label: ":buildkit: Build and Push NPU Test Image - A5" + key: image-build-a5 + agents: *npu-image-build-agents + plugins: *npu-image-build-plugins + env: + VLLM_IMAGE_TAG: "${BUILDKITE_COMMIT}-a5" + IMAGE_NAME: "vllm-omni-ci-npu" + IMAGE_REGISTRY: "swr.cn-southwest-2.myhuaweicloud.com/modelfoundry" + BUILDKITD_ADDR: "tcp://buildkitd-service.buildkitd:1234" + command: bash .buildkite/npu/scripts/build-npu-image.sh Dockerfile.npu.ci "$${VLLM_IMAGE_TAG}" -a5 - if ! command -v buildctl &> /dev/null; then - echo "Installing buildctl..." - mkdir -p /tmp/buildkit - BUILDKIT_VERSION="v0.29.0" - wget -q "https://github.com/moby/buildkit/releases/download/$${BUILDKIT_VERSION}/buildkit-$${BUILDKIT_VERSION}.linux-arm64.tar.gz" -O /tmp/buildkit.tar.gz - tar -xzf /tmp/buildkit.tar.gz -C /tmp/buildkit - cp /tmp/buildkit/bin/buildctl /usr/local/bin/ - fi - - export DOCKER_CONFIG=/home/user/.docker - buildctl \ - --addr="$${BUILDKITD_ADDR}" \ - --tlscacert=/home/user/.docker/ca.pem \ - --tlscert=/home/user/.docker/cert.pem \ - --tlskey=/home/user/.docker/key.pem \ - build \ - --frontend dockerfile.v0 \ - --local context=. \ - --local dockerfile=./docker \ - --opt filename=Dockerfile.npu.ci.a3 \ - --secret id=dockerconfig,src=/home/user/.docker/config.json \ - --output type=image,name=$${IMAGE_REGISTRY}/$${IMAGE_NAME}:$${VLLM_IMAGE_TAG},push=true \ - --progress=plain - - echo "--- Image pushed successfully" - echo "$${IMAGE_REGISTRY}/$${IMAGE_NAME}:$${VLLM_IMAGE_TAG}" + - label: ":buildkit: Build and Push NPU Test Image - 310P" + key: image-build-310p + agents: *npu-image-build-agents + plugins: *npu-image-build-plugins + env: + VLLM_IMAGE_TAG: "${BUILDKITE_COMMIT}-310p" + IMAGE_NAME: "vllm-omni-ci-npu" + IMAGE_REGISTRY: "swr.cn-southwest-2.myhuaweicloud.com/modelfoundry" + BUILDKITD_ADDR: "tcp://buildkitd-service.buildkitd:1234" + command: bash .buildkite/npu/scripts/build-npu-image.sh Dockerfile.npu.ci "$${VLLM_IMAGE_TAG}" -310p - label: "Upload Ready Pipeline" depends_on: - image-build-a2 - image-build-a3 + - image-build-a5 + - image-build-310p key: upload-ready-pipeline agents: queue: "cpu_queue_premerge" @@ -174,6 +98,8 @@ steps: depends_on: - image-build-a2 - image-build-a3 + - image-build-a5 + - image-build-310p key: upload-nightly-pipeline commands: - python3 .buildkite/common/scripts/upload_pipeline.py --upload .buildkite/npu/test-npu-nightly.yml diff --git a/.buildkite/npu/scripts/build-npu-image.sh b/.buildkite/npu/scripts/build-npu-image.sh new file mode 100644 index 000000000..415fa7d5e --- /dev/null +++ b/.buildkite/npu/scripts/build-npu-image.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash +set -ex + +dockerfile=${1:?Dockerfile is required} +image_tag=${2:?Image tag is required} +device_suffix=${3:-} + +image_name=${IMAGE_NAME:-vllm-omni-ci-npu} +image_registry=${IMAGE_REGISTRY:-swr.cn-southwest-2.myhuaweicloud.com/modelfoundry} +buildkitd_addr=${BUILDKITD_ADDR:-tcp://buildkitd-service.buildkitd:1234} + +echo "--- Building and pushing NPU Test Image" +echo "Image: ${image_registry}/${image_name}:${image_tag}" +echo "Dockerfile: ${dockerfile}" + +if ! command -v buildctl &> /dev/null; then + mkdir -p /tmp/buildkit + buildkit_version=v0.29.0 + wget -q \ + "https://github.com/moby/buildkit/releases/download/${buildkit_version}/buildkit-${buildkit_version}.linux-arm64.tar.gz" \ + -O /tmp/buildkit.tar.gz + tar -xzf /tmp/buildkit.tar.gz -C /tmp/buildkit + cp /tmp/buildkit/bin/buildctl /usr/local/bin/ +fi + +build_args=() +if [[ -n "${device_suffix}" ]]; then + build_args+=(--opt "build-arg:VLLM_ASCEND_DEVICE_SUFFIX=${device_suffix}") +fi + +export DOCKER_CONFIG=/home/user/.docker +buildctl \ + --addr="${buildkitd_addr}" \ + --tlscacert=/home/user/.docker/ca.pem \ + --tlscert=/home/user/.docker/cert.pem \ + --tlskey=/home/user/.docker/key.pem \ + build \ + --frontend dockerfile.v0 \ + --local context=. \ + --local dockerfile=./docker \ + --opt "filename=${dockerfile}" \ + "${build_args[@]}" \ + --secret id=dockerconfig,src=/home/user/.docker/config.json \ + --output "type=image,name=${image_registry}/${image_name}:${image_tag},push=true" \ + --progress=plain + +echo "--- Image pushed successfully" +echo "${image_registry}/${image_name}:${image_tag}" diff --git a/.buildkite/npu/test-npu-ready.yml b/.buildkite/npu/test-npu-ready.yml index 01fb32879..d475aad5b 100644 --- a/.buildkite/npu/test-npu-ready.yml +++ b/.buildkite/npu/test-npu-ready.yml @@ -1,28 +1,59 @@ steps: - - label: "Platforms Test" - key: ready-platforms-test + - group: ":card_index_dividers: Simple Test" depends_on: upload-ready-pipeline - mirror_hardwares: a3_npu_2 - commands: - - >- - pytest -s -v - tests/platforms/npu/test_minicpmo_code2wav_npugraph.py - -m 'core_model and npu and A3 and omni' - --run-level 'core_model' + steps: + - label: "Platforms Test" + key: ready-platforms-test + mirror_hardwares: a3_npu_2 + commands: + - >- + pytest -s -v + tests/platforms/npu/test_minicpmo_code2wav_npugraph.py + -m 'core_model and npu and A3 and omni' + --run-level 'core_model' - - label: "Diffusion NPU layer tests" - key: ready-diffusion-npu-layer-tests - depends_on: upload-ready-pipeline - mirror_hardwares: a3_npu_2 - commands: - - >- - pytest -s -v - tests/diffusion/layers/test_activation.py - tests/diffusion/layers/test_fused_qk_norm_rope_npu.py - tests/diffusion/models/minimax_h3/test_minimax_h3_qwen3vl_swiglu.py - tests/diffusion/models/minimax_h3/test_minimax_h3_modulation.py - -m 'core_model and npu and A3' - --run-level 'core_model' + - label: "Diffusion NPU layer tests - A2" + key: ready-diffusion-npu-layer-tests-a2 + mirror_hardwares: a2b3_npu_1 + commands: + - >- + pytest -s -v + tests/diffusion/layers/test_activation.py + -m 'core_model and npu and A2' + --run-level 'core_model' + + - label: "Diffusion NPU layer tests - A3" + key: ready-diffusion-npu-layer-tests + mirror_hardwares: a3_npu_2 + commands: + - >- + pytest -s -v + tests/diffusion/layers/test_activation.py + tests/diffusion/layers/test_fused_qk_norm_rope_npu.py + tests/diffusion/models/minimax_h3/test_minimax_h3_qwen3vl_swiglu.py + tests/diffusion/models/minimax_h3/test_minimax_h3_modulation.py + -m 'core_model and npu and A3' + --run-level 'core_model' + + - label: "Diffusion NPU layer tests - A5" + key: ready-diffusion-npu-layer-tests-a5 + mirror_hardwares: a5_npu_2 + commands: + - >- + pytest -s -v + tests/diffusion/layers/test_activation.py + -m 'core_model and npu and A5' + --run-level 'core_model' + + - label: "Diffusion NPU layer tests - 310P" + key: ready-diffusion-npu-layer-tests-310p + mirror_hardwares: 310p_npu_1 + commands: + - >- + pytest -s -v + tests/diffusion/layers/test_activation.py + -m 'core_model and npu and 310P' + --run-level 'core_model' - group: ":card_index_dividers: Omni Model Test" key: ready-omni-group diff --git a/docker/Dockerfile.npu b/docker/Dockerfile.npu index 3ebacdc98..0d91c0b32 100644 --- a/docker/Dockerfile.npu +++ b/docker/Dockerfile.npu @@ -1,20 +1,7 @@ ARG VLLM_ASCEND_IMAGE=quay.io/atlas-ci/vllm-ascend -ARG VLLM_ASCEND_TAG=v0.28.0 -FROM ${VLLM_ASCEND_IMAGE}:${VLLM_ASCEND_TAG} - -# WORKDIR /vllm-workspace/vllm -# RUN git fetch origin --tags && git checkout v0.18.0 - -# WORKDIR /vllm-workspace/vllm-ascend -# RUN git fetch origin releases/v0.18.0 && git checkout d781902ce9dbda8ab1e11bb0f2f0c1bc508fee7a -# # Install vllm-ascend -# # Append `libascend_hal.so` path (devlib) to LD_LIBRARY_PATH -# RUN export PIP_EXTRA_INDEX_URL=https://mirrors.huaweicloud.com/ascend/repos/pypi && \ -# source /usr/local/Ascend/ascend-toolkit/set_env.sh && \ -# source /usr/local/Ascend/nnal/atb/set_env.sh && \ -# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/Ascend/ascend-toolkit/latest/`uname -i`-linux/devlib && \ -# python3 -m pip install -v -e /vllm-workspace/vllm-ascend/ --extra-index https://download.pytorch.org/whl/cpu/ && \ -# python3 -m pip cache purge +ARG VLLM_ASCEND_VERSION=v0.28.0 +ARG VLLM_ASCEND_DEVICE_SUFFIX= +FROM ${VLLM_ASCEND_IMAGE}:${VLLM_ASCEND_VERSION}${VLLM_ASCEND_DEVICE_SUFFIX} ARG APP_DIR=/vllm-workspace/vllm-omni WORKDIR ${APP_DIR} @@ -24,6 +11,7 @@ RUN export PIP_EXTRA_INDEX_URL=https://mirrors.huaweicloud.com/ascend/repos/pypi source /usr/local/Ascend/ascend-toolkit/set_env.sh && \ source /usr/local/Ascend/nnal/atb/set_env.sh && \ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/Ascend/ascend-toolkit/latest/`uname -i`-linux/devlib && \ + python3 -m pip install -v "mindiesd==3.1.0" && \ python3 -m pip install -v -e /vllm-workspace/vllm-omni/ --no-build-isolation RUN python3 -m pip install -v --no-deps \ diff --git a/docker/Dockerfile.npu.a3 b/docker/Dockerfile.npu.a3 deleted file mode 100644 index d341d456d..000000000 --- a/docker/Dockerfile.npu.a3 +++ /dev/null @@ -1,36 +0,0 @@ -ARG VLLM_ASCEND_IMAGE=quay.io/atlas-ci/vllm-ascend -ARG VLLM_ASCEND_TAG=v0.28.0-a3 -FROM ${VLLM_ASCEND_IMAGE}:${VLLM_ASCEND_TAG} - -# WORKDIR /vllm-workspace/vllm -# RUN git fetch origin --tags && git checkout v0.18.0 - -# WORKDIR /vllm-workspace/vllm-ascend -# RUN git fetch origin releases/v0.18.0 && git checkout d781902ce9dbda8ab1e11bb0f2f0c1bc508fee7a -# # Install vllm-ascend -# # Append `libascend_hal.so` path (devlib) to LD_LIBRARY_PATH -# RUN export PIP_EXTRA_INDEX_URL=https://mirrors.huaweicloud.com/ascend/repos/pypi && \ -# source /usr/local/Ascend/ascend-toolkit/set_env.sh && \ -# source /usr/local/Ascend/nnal/atb/set_env.sh && \ -# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/Ascend/ascend-toolkit/latest/`uname -i`-linux/devlib && \ -# python3 -m pip install -v -e /vllm-workspace/vllm-ascend/ --extra-index https://download.pytorch.org/whl/cpu/ && \ -# python3 -m pip cache purge - -ARG APP_DIR=/vllm-workspace/vllm-omni -WORKDIR ${APP_DIR} -COPY . . - -RUN export PIP_EXTRA_INDEX_URL=https://mirrors.huaweicloud.com/ascend/repos/pypi && \ - source /usr/local/Ascend/ascend-toolkit/set_env.sh && \ - source /usr/local/Ascend/nnal/atb/set_env.sh && \ - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/Ascend/ascend-toolkit/latest/`uname -i`-linux/devlib && \ - python3 -m pip install -v -e /vllm-workspace/vllm-omni/ --no-build-isolation - -RUN python3 -m pip install -v --no-deps \ - "stepaudio2-minicpmo>=0.1.1" \ - "step-audio2>=1.0.0" - -ENV VLLM_TARGET_DEVICE=npu -ENV VLLM_WORKER_MULTIPROC_METHOD=spawn - -ENTRYPOINT [] diff --git a/docker/Dockerfile.npu.ci b/docker/Dockerfile.npu.ci index 029a905fd..0a150fdd8 100644 --- a/docker/Dockerfile.npu.ci +++ b/docker/Dockerfile.npu.ci @@ -1,10 +1,10 @@ ARG VLLM_ASCEND_IMAGE=quay.io/atlas-ci/vllm-ascend -ARG VLLM_ASCEND_TAG=v0.28.0 -FROM ${VLLM_ASCEND_IMAGE}:${VLLM_ASCEND_TAG} +ARG VLLM_ASCEND_VERSION=v0.28.0 +ARG VLLM_ASCEND_DEVICE_SUFFIX= +FROM ${VLLM_ASCEND_IMAGE}:${VLLM_ASCEND_VERSION}${VLLM_ASCEND_DEVICE_SUFFIX} ARG APP_DIR=/vllm-workspace/vllm-omni WORKDIR ${APP_DIR} -COPY . . RUN sed -i "s@^\(deb.*\)https\?://[a-z0-9.-]*\.ubuntu\.com@\1http://cache-service.nginx-pypi-cache.svc.cluster.local:8081@g" /etc/apt/sources.list @@ -22,11 +22,9 @@ RUN apt-get update && \ rm -rf /var/cache/apt/* && \ rm -rf /var/lib/apt/lists/* -RUN source /usr/local/Ascend/ascend-toolkit/set_env.sh && \ - source /usr/local/Ascend/nnal/atb/set_env.sh && \ - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/Ascend/ascend-toolkit/latest/`uname -i`-linux/devlib && \ - python3 -m pip install -U pip && \ +RUN python3 -m pip install -U pip && \ python3 -m pip install -v \ + "mindiesd==3.1.0" \ "pytest>=7.0.0" \ "pytest-asyncio>=0.21.0" \ "pytest-cov>=4.0.0" \ @@ -48,7 +46,13 @@ RUN source /usr/local/Ascend/ascend-toolkit/set_env.sh && \ "datasets>=3.0.0" \ --index-url http://cache-service.nginx-pypi-cache.svc.cluster.local/pypi/simple \ --trusted-host cache-service.nginx-pypi-cache.svc.cluster.local \ - --default-timeout=60 && \ + --default-timeout=60 + +COPY . . + +RUN source /usr/local/Ascend/ascend-toolkit/set_env.sh && \ + source /usr/local/Ascend/nnal/atb/set_env.sh && \ + export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/Ascend/ascend-toolkit/latest/`uname -i`-linux/devlib && \ python3 -m pip install -v -e /vllm-workspace/vllm-omni/ --no-build-isolation \ --index-url http://cache-service.nginx-pypi-cache.svc.cluster.local/pypi/simple \ --trusted-host cache-service.nginx-pypi-cache.svc.cluster.local \ diff --git a/docker/Dockerfile.npu.ci.a3 b/docker/Dockerfile.npu.ci.a3 deleted file mode 100644 index fe3741d04..000000000 --- a/docker/Dockerfile.npu.ci.a3 +++ /dev/null @@ -1,72 +0,0 @@ -ARG VLLM_ASCEND_IMAGE=quay.io/atlas-ci/vllm-ascend -ARG VLLM_ASCEND_TAG=v0.28.0-a3 -FROM ${VLLM_ASCEND_IMAGE}:${VLLM_ASCEND_TAG} - -ARG APP_DIR=/vllm-workspace/vllm-omni -WORKDIR ${APP_DIR} -COPY . . - -RUN sed -i "s@^\(deb.*\)https\?://[a-z0-9.-]*\.ubuntu\.com@\1http://cache-service.nginx-pypi-cache.svc.cluster.local:8081@g" /etc/apt/sources.list - -RUN apt-get update && \ - apt-get install -y --no-install-recommends \ - ffmpeg \ - libgl1 \ - libglib2.0-0 \ - libgomp1 \ - libsm6 \ - libxext6 \ - libxrender1 \ - libxcb1 \ - espeak-ng && \ - rm -rf /var/cache/apt/* && \ - rm -rf /var/lib/apt/lists/* - -RUN source /usr/local/Ascend/ascend-toolkit/set_env.sh && \ - source /usr/local/Ascend/nnal/atb/set_env.sh && \ - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/Ascend/ascend-toolkit/latest/`uname -i`-linux/devlib && \ - python3 -m pip install -U pip && \ - python3 -m pip install -v \ - "pytest>=7.0.0" \ - "pytest-asyncio>=0.21.0" \ - "pytest-cov>=4.0.0" \ - "pytest-mock>=3.10.0" \ - "openpyxl>=3.0.0" \ - "psutil>=7.2.0" \ - "soundfile>=0.13.1" \ - "pyttsx3>=2.99" \ - "opencc==1.4.1" \ - "opencv-python>=4.12.0.88" \ - "imageio[ffmpeg]>=0.6.0" \ - "jiwer>=3.0.0" \ - "zhon>=2.0.0" \ - "zhconv>=1.4.2" \ - "funasr>=1.0.0" \ - "hyperpyyaml>=1.2.0" \ - "onnx>=1.16.0" \ - "librosa>=0.10.0" \ - "torchmetrics>=1.9.0" \ - "datasets>=3.0.0" \ - --index-url http://cache-service.nginx-pypi-cache.svc.cluster.local/pypi/simple \ - --trusted-host cache-service.nginx-pypi-cache.svc.cluster.local \ - --default-timeout=60 && \ - python3 -m pip install -v -e /vllm-workspace/vllm-omni/ --no-build-isolation \ - --index-url http://cache-service.nginx-pypi-cache.svc.cluster.local/pypi/simple \ - --trusted-host cache-service.nginx-pypi-cache.svc.cluster.local \ - --default-timeout=60 - -# MiniCPM-o 4.5 Stage-2 vocoder assets: s3tokenizer plus flashcosyvoice, which -# is shipped by step-audio2. --no-deps keeps pip from replacing the Ascend torch -# build and from shadowing onnxruntime-cann with the vanilla onnxruntime wheel; -# the deps these two actually need are installed above. -RUN python3 -m pip install -v --no-deps \ - "s3tokenizer>=0.3.0" \ - "step-audio2>=1.0.0" \ - --index-url http://cache-service.nginx-pypi-cache.svc.cluster.local/pypi/simple \ - --trusted-host cache-service.nginx-pypi-cache.svc.cluster.local \ - --default-timeout=60 - -ENV VLLM_TARGET_DEVICE=npu -ENV VLLM_WORKER_MULTIPROC_METHOD=spawn - -ENTRYPOINT [] diff --git a/docs/contributing/ci/ci_settings.md b/docs/contributing/ci/ci_settings.md index d578b4b02..885ebd528 100644 --- a/docs/contributing/ci/ci_settings.md +++ b/docs/contributing/ci/ci_settings.md @@ -129,7 +129,7 @@ Canonical layout (prefer these paths for new changes): === "NPU" - **Bootstrap:** [`npu/pipeline-npu.yml`](https://github.com/vllm-project/vllm-omni/blob/main/.buildkite/npu/pipeline-npu.yml) + [`npu/bootstrap-upload-steps.yml`](https://github.com/vllm-project/vllm-omni/blob/main/.buildkite/npu/bootstrap-upload-steps.yml)—same split as CUDA; builds A2/B3 and A3 CI images, then uploads child test pipelines. + **Bootstrap:** [`npu/pipeline-npu.yml`](https://github.com/vllm-project/vllm-omni/blob/main/.buildkite/npu/pipeline-npu.yml) + [`npu/bootstrap-upload-steps.yml`](https://github.com/vllm-project/vllm-omni/blob/main/.buildkite/npu/bootstrap-upload-steps.yml)—same split as CUDA; builds A2/B3, A3, A5, and 310P CI images, then uploads child test pipelines. **Test YAML:** `npu/test-npu-ready.yml` (L2), `test-npu-nightly.yml` (L4). @@ -137,7 +137,12 @@ Canonical layout (prefer these paths for new changes): **Upload:** same as CUDA—`upload_pipeline.py --upload`. - **Hardware in YAML:** `mirror_hardwares` preset (string), expanded to `agents`, top-level `image`, and `plugins`. Presets: `a2b3_npu_1`, `a2b3_npu_4`, `a3_npu_2` in `common/ci_mirror_hardwares.yml`. + **Hardware in YAML:** `mirror_hardwares` preset (string), expanded to `agents`, top-level `image`, and `plugins`. NPU presets in `common/ci_mirror_hardwares.yml` are: + + - A2: `a2b3_npu_1`, `a2b3_npu_4`, `a2b3_npu_8` + - A3: `a3_npu_2`, `a3_npu_4`, `a3_npu_8`, `a3_npu_16` + - A5: `a5_npu_2`, `a5_npu_4`, `a5_npu_8`, `a5_npu_16` + - 310P: `310p_npu_1`, `310p_npu_2`, `310p_npu_4` **Conventions** diff --git a/docs/contributing/ci/test_writing_guide.md b/docs/contributing/ci/test_writing_guide.md index 469e69cac..762863bb3 100644 --- a/docs/contributing/ci/test_writing_guide.md +++ b/docs/contributing/ci/test_writing_guide.md @@ -48,6 +48,8 @@ Defined in `pyproject.toml`: | `MI325` | Tests that require MI325 GPU (AMD/ROCm) * | | `A2` | Tests that require A2 NPU * | | `A3` | Tests that require A3 NPU * | +| `A5` | Tests that require A5 NPU * | +| `310P` | Tests that require 310P NPU * | | `cards_{n}` | Tests that require *n* accelerator cards (`cards_1` … `cards_8`); auto-added from `num_cards` * | | `slow` | Slow tests (may skip in quick CI) | | `benchmark` | Benchmark tests (decorator on runner test functions; perf JSON uses `full_model` + type marker instead) | @@ -76,7 +78,7 @@ def test_video_to_audio() This decorator is intended to make hardware-aware, cross-platform test authoring easier and more robust for CI/CD environments. The `hardware_test` decorator in `vllm-omni/tests/helpers/mark.py` performs the following actions: 1. **Applies platform and resource markers** - Adds the appropriate pytest markers for each specified hardware platform (e.g., `cuda`, `rocm`, `xpu`, `npu`) and resource type (e.g., `L4`, `H100`, `H200`, `B200`, `MI325`, `B60`, `A2`, `A3`). + Adds the appropriate pytest markers for each specified hardware platform (e.g., `cuda`, `rocm`, `xpu`, `npu`) and resource type (e.g., `L4`, `H100`, `H200`, `B200`, `MI325`, `B60`, `A2`, `A3`, `A5`, `310P`). ```python @pytest.mark.cuda @pytest.mark.L4 diff --git a/docs/getting_started/installation/npu/npu.inc.md b/docs/getting_started/installation/npu/npu.inc.md index 0019d00bd..9ff477522 100644 --- a/docs/getting_started/installation/npu/npu.inc.md +++ b/docs/getting_started/installation/npu/npu.inc.md @@ -7,13 +7,34 @@ For detailed hardware and software requirements, please refer to the [vLLM-Ascen The recommended way to use vLLM-Omni on NPU is through the vLLM-Ascend pre-built Docker images: +=== "A2" + + ```bash + export IMAGE=quay.io/atlas-ci/vllm-ascend:v0.28.0 + ``` + +=== "A3" + + ```bash + export IMAGE=quay.io/atlas-ci/vllm-ascend:v0.28.0-a3 + ``` + +=== "A5" + + ```bash + export IMAGE=quay.io/atlas-ci/vllm-ascend:v0.28.0-a5 + ``` + +=== "310P (Experimental)" + + ```bash + export IMAGE=quay.io/atlas-ci/vllm-ascend:v0.28.0-310p + ``` + ```bash -# vLLM-Ascend image -# Atlas A2: quay.io/atlas-ci/vllm-ascend:v0.28.0 -# Atlas A3: quay.io/atlas-ci/vllm-ascend:v0.28.0-a3 docker run --rm \ --name vllm-omni-npu \ - --shm-size=1g \ + --shm-size=64g \ --device /dev/davinci0 \ --device /dev/davinci1 \ --device /dev/davinci2 \ @@ -27,8 +48,8 @@ docker run --rm \ -v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \ -v /etc/ascend_install.info:/etc/ascend_install.info \ -v /root/.cache:/root/.cache \ - -p 8000:8000 \ - -it quay.io/atlas-ci/vllm-ascend:v0.28.0-a3 bash + -p 8091:8091 \ + -it "$IMAGE" bash # Inside the container, install vLLM-Omni from source cd /vllm-workspace @@ -72,53 +93,146 @@ Supported images as following. | image name | Hardware | OS | |-|-|-| -| image-tag | Atlas A2 | Ubuntu | -| image-tag-a3 | Atlas A3 | Ubuntu | +| image-tag | A2 | Ubuntu | +| image-tag-a3 | A3 | Ubuntu | +| image-tag-a5 | A5 | Ubuntu | +| image-tag-310p | 310P (experimental) | Ubuntu | Here's an example deployment command that has been verified on 4 x NPUs: -```bash -# Atlas A2: quay.io/ascend/vllm-omni:v0.28.0 -# Atlas A3: quay.io/ascend/vllm-omni:v0.28.0-a3 -docker run --rm \ - --name vllm-omni-a3 \ - --shm-size=4g \ - --device /dev/davinci0 \ - --device /dev/davinci1 \ - --device /dev/davinci2 \ - --device /dev/davinci3 \ - --device /dev/davinci_manager \ - --device /dev/devmm_svm \ - --device /dev/hisi_hdc \ - -v /usr/local/dcmi:/usr/local/dcmi \ - -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ - -v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \ - -v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \ - --device /dev/davinci_manager \ - --device /dev/devmm_svm \ - --device /dev/hisi_hdc \ - -v /usr/local/dcmi:/usr/local/dcmi \ - -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ - -v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \ - -v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \ - -v /etc/ascend_install.info:/etc/ascend_install.info \ - -v ~/.cache:/root/.cache \ - -p 8091:8091 \ - -it quay.io/ascend/vllm-omni:v0.28.0-a3 bash -``` +=== "A2" + + ```bash + export IMAGE=quay.io/ascend/vllm-omni:v0.28.0 + docker run --rm \ + --name vllm-omni-a2 \ + --shm-size=64g \ + --device /dev/davinci0 \ + --device /dev/davinci1 \ + --device /dev/davinci2 \ + --device /dev/davinci3 \ + --device /dev/davinci_manager \ + --device /dev/devmm_svm \ + --device /dev/hisi_hdc \ + -v /usr/local/dcmi:/usr/local/dcmi \ + -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ + -v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \ + -v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \ + -v /etc/ascend_install.info:/etc/ascend_install.info \ + -v ~/.cache:/root/.cache \ + -p 8091:8091 \ + -it "$IMAGE" bash + ``` + +=== "A3" + + ```bash + export IMAGE=quay.io/ascend/vllm-omni:v0.28.0-a3 + docker run --rm \ + --name vllm-omni-a3 \ + --shm-size=64g \ + --device /dev/davinci0 \ + --device /dev/davinci1 \ + --device /dev/davinci2 \ + --device /dev/davinci3 \ + --device /dev/davinci_manager \ + --device /dev/devmm_svm \ + --device /dev/hisi_hdc \ + -v /usr/local/dcmi:/usr/local/dcmi \ + -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ + -v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \ + -v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \ + -v /etc/ascend_install.info:/etc/ascend_install.info \ + -v ~/.cache:/root/.cache \ + -p 8091:8091 \ + -it "$IMAGE" bash + ``` + +=== "A5" + + ```bash + export IMAGE=quay.io/ascend/vllm-omni:v0.28.0-a5 + docker run --rm \ + --name vllm-omni-a5 \ + --shm-size=64g \ + --device /dev/davinci0 \ + --device /dev/davinci1 \ + --device /dev/davinci2 \ + --device /dev/davinci3 \ + --device /dev/davinci_manager \ + --device /dev/devmm_svm \ + --device /dev/hisi_hdc \ + -v /usr/local/dcmi:/usr/local/dcmi \ + -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ + -v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \ + -v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \ + -v /etc/ascend_install.info:/etc/ascend_install.info \ + -v ~/.cache:/root/.cache \ + -p 8091:8091 \ + -it "$IMAGE" bash + ``` + +=== "310P (Experimental)" + + ```bash + export IMAGE=quay.io/ascend/vllm-omni:v0.28.0-310p + docker run --rm \ + --name vllm-omni-310p \ + --shm-size=64g \ + --device /dev/davinci0 \ + --device /dev/davinci1 \ + --device /dev/davinci2 \ + --device /dev/davinci3 \ + --device /dev/davinci_manager \ + --device /dev/devmm_svm \ + --device /dev/hisi_hdc \ + -v /usr/local/dcmi:/usr/local/dcmi \ + -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ + -v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \ + -v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \ + -v /etc/ascend_install.info:/etc/ascend_install.info \ + -v ~/.cache:/root/.cache \ + -p 8091:8091 \ + -it "$IMAGE" bash + ``` !!! tip You can use this docker image to serve models the same way you would with in vLLM! To do so, make sure you overwrite the default entrypoint (`vllm serve --omni`) which works only for models supported in the vLLM-Omni project. -Or build IMAGE from **source code**: +Or build the image from **source code**: ```bash git clone https://github.com/vllm-project/vllm-omni.git cd vllm-omni -# A2 -# docker build -t vllm-omni-dev-image:latest -f ./docker/Dockerfile.npu . -# A3 -docker build -t vllm-omni-dev-image:latest -f ./docker/Dockerfile.npu.a3 . ``` +All hardware variants use `docker/Dockerfile.npu`. Choose the device suffix for your hardware: + +=== "A2" + + ```bash + docker build -t vllm-omni-dev-image:latest -f docker/Dockerfile.npu . + ``` + +=== "A3" + + ```bash + docker build -t vllm-omni-dev-image:latest -f docker/Dockerfile.npu \ + --build-arg VLLM_ASCEND_DEVICE_SUFFIX=-a3 . + ``` + +=== "A5" + + ```bash + docker build -t vllm-omni-dev-image:latest -f docker/Dockerfile.npu \ + --build-arg VLLM_ASCEND_DEVICE_SUFFIX=-a5 . + ``` + +=== "310P (Experimental)" + + ```bash + docker build -t vllm-omni-dev-image:latest -f docker/Dockerfile.npu \ + --build-arg VLLM_ASCEND_DEVICE_SUFFIX=-310p . + ``` + # --8<-- [end:pre-built-images] diff --git a/pyproject.toml b/pyproject.toml index 3ba902977..0393c9c62 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -283,6 +283,8 @@ markers = [ "S5000: [hardware-resource] [musa] Tests that require S5000 GPU (Moore Threads/MUSA)", "A2: [hardware-resource] [npu] Tests that require A2 NPU", "A3: [hardware-resource] [npu] Tests that require A3 NPU", + "A5: [hardware-resource] [npu] Tests that require A5 NPU", + "310P: [hardware-resource] [npu] Tests that require 310P NPU", # Tag with [hardware-cards] for tests.helpers.mark.get_supported_card_counts(). "cards_1: [hardware-cards] Tests that require 1 accelerator card", "cards_2: [hardware-cards] Tests that require 2 accelerator cards", diff --git a/tests/diffusion/layers/test_activation.py b/tests/diffusion/layers/test_activation.py index c3205502f..321f2ab8f 100644 --- a/tests/diffusion/layers/test_activation.py +++ b/tests/diffusion/layers/test_activation.py @@ -5,7 +5,7 @@ import pytest import torch import torch.nn.functional as F -from tests.helpers.mark import hardware_test +from tests.helpers.mark import hardware_marks from vllm_omni.diffusion.layers.activation import SiluAndMul pytestmark = [pytest.mark.core_model, pytest.mark.diffusion] @@ -19,9 +19,17 @@ def test_silu_and_mul_native_matches_packed_reference() -> None: torch.testing.assert_close(SiluAndMul().forward_native(packed), F.silu(gate) * up) -@hardware_test(res={"npu": "A3"}, num_cards=1) -def test_silu_and_mul_npu_matches_packed_reference() -> None: - packed = torch.randn(257, 256, device="npu", dtype=torch.bfloat16) +@pytest.mark.parametrize( + "dtype", + [ + pytest.param(torch.bfloat16, marks=hardware_marks(res={"npu": "A2"}, num_cards=1), id="A2-bf16"), + pytest.param(torch.bfloat16, marks=hardware_marks(res={"npu": "A3"}, num_cards=1), id="A3-bf16"), + pytest.param(torch.bfloat16, marks=hardware_marks(res={"npu": "A5"}, num_cards=1), id="A5-bf16"), + pytest.param(torch.float16, marks=hardware_marks(res={"npu": "310P"}, num_cards=1), id="310P-fp16"), + ], +) +def test_silu_and_mul_npu_matches_packed_reference(dtype: torch.dtype) -> None: + packed = torch.randn(257, 256, device="npu", dtype=dtype) gate, up = packed.chunk(2, dim=-1) torch.testing.assert_close(