From bcb25e90aab79a46933f6e6bfbcbb3b9b63d3fd2 Mon Sep 17 00:00:00 2001 From: daishixun Date: Wed, 17 Dec 2025 11:06:10 +0800 Subject: [PATCH 1/8] adapt FlashComm2 with pcp rank Signed-off-by: daishixun --- vllm_ascend/distributed/parallel_state.py | 24 +++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/vllm_ascend/distributed/parallel_state.py b/vllm_ascend/distributed/parallel_state.py index 1709d150bde..8cc2424fed1 100644 --- a/vllm_ascend/distributed/parallel_state.py +++ b/vllm_ascend/distributed/parallel_state.py @@ -41,6 +41,7 @@ def init_ascend_model_parallel(parallel_config: ParallelConfig, ): global_tp_size = parallel_config.tensor_parallel_size global_dp_size = parallel_config.data_parallel_size global_pp_size = parallel_config.pipeline_parallel_size + global_pcp_size = parallel_config.prefill_context_parallel_size # The layout of all ranks: ExternalDP * EP # ExternalDP is the data parallel group that is not part of the model, @@ -168,16 +169,23 @@ def _create_shared_weight_group(group_name: str) -> GroupCoordinator: for pp_idx in range(global_pp_size): group = [] for dp_idx in range(global_dp_size): - base = (dp_idx * global_pp_size + pp_idx) * global_tp_size - for i in range(global_tp_size): - global_rank = base + i - group.append(global_rank) + for pcp_idx in range(global_pcp_size): + base = ( + dp_idx * global_pp_size * global_pcp_size * global_tp_size + + pp_idx * global_pcp_size * global_tp_size + + pcp_idx * global_tp_size + ) + for tp_idx in range(global_tp_size): + global_rank = base + tp_idx + group.append(global_rank) group_ranks.append(group) - return init_model_parallel_group(group_ranks, - get_world_group().local_rank, - backend, - group_name=group_name) + return init_model_parallel_group( + group_ranks, + get_world_group().local_rank, + backend, + group_name=group_name, + ) global _SHARED_WEIGHT # TODO: Check if the model is Deepseek V3.2 with enabled SFA CP and activated shared weights. It will then be normalized within the PCP parameters. -- clrs97 From ee0a0802e2b67f633016122c571e75ea0ff655a4 Mon Sep 17 00:00:00 2001 From: daishixun Date: Wed, 17 Dec 2025 11:47:40 +0800 Subject: [PATCH 2/8] fix pre-commit Signed-off-by: daishixun --- vllm_ascend/distributed/parallel_state.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/vllm_ascend/distributed/parallel_state.py b/vllm_ascend/distributed/parallel_state.py index 8cc2424fed1..a5130b42b02 100644 --- a/vllm_ascend/distributed/parallel_state.py +++ b/vllm_ascend/distributed/parallel_state.py @@ -170,11 +170,10 @@ def _create_shared_weight_group(group_name: str) -> GroupCoordinator: group = [] for dp_idx in range(global_dp_size): for pcp_idx in range(global_pcp_size): - base = ( - dp_idx * global_pp_size * global_pcp_size * global_tp_size - + pp_idx * global_pcp_size * global_tp_size - + pcp_idx * global_tp_size - ) + base = (dp_idx * global_pp_size * global_pcp_size * + global_tp_size + + pp_idx * global_pcp_size * global_tp_size + + pcp_idx * global_tp_size) for tp_idx in range(global_tp_size): global_rank = base + tp_idx group.append(global_rank) From aa071c0ea5644d01d6f2b963e918bc5507ff89fb Mon Sep 17 00:00:00 2001 From: daishixun Date: Thu, 18 Dec 2025 11:31:06 +0800 Subject: [PATCH 3/8] add st Signed-off-by: daishixun --- .github/workflows/_e2e_test.yaml | 2 + .../long_sequence/test_flashcomm2.py | 69 +++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 tests/e2e/multicard/long_sequence/test_flashcomm2.py diff --git a/.github/workflows/_e2e_test.yaml b/.github/workflows/_e2e_test.yaml index f4c6a65e47b..97971f1e969 100644 --- a/.github/workflows/_e2e_test.yaml +++ b/.github/workflows/_e2e_test.yaml @@ -203,6 +203,8 @@ jobs: pytest -sv --durations=0 tests/e2e/multicard/test_qwen3_moe.py pytest -sv --durations=0 tests/e2e/multicard/test_offline_weight_load.py + pytest -sv --durations=0 tests\e2e\multicard\long_sequence\test_flashcomm2.py + e2e-4-cards: name: multicard-4 needs: [e2e, e2e-2-cards] diff --git a/tests/e2e/multicard/long_sequence/test_flashcomm2.py b/tests/e2e/multicard/long_sequence/test_flashcomm2.py new file mode 100644 index 00000000000..008dca28213 --- /dev/null +++ b/tests/e2e/multicard/long_sequence/test_flashcomm2.py @@ -0,0 +1,69 @@ +# +# Copyright (c) 2025 Huawei Technologies Co., Ltd. All Rights Reserved. +# Copyright 2023 The vLLM team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# This file is a part of the vllm-ascend project. +# Adapted from vllm/tests/basic_correctness/test_basic_correctness.py +# +"""Compare the short outputs of HF and vLLM when using greedy sampling. + +Run `pytest tests/e2e/multicard/test_flashcomm2.py`. +""" + +import os +import pytest + +from vllm import SamplingParams +from tests.e2e.conftest import VllmRunner +from vllm_ascend.utils import vllm_version_is + +os.environ["VLLM_ASCEND_ENABLE_FLASHCOMM2_OSHARED"] = "1" +os.environ["VLLM_ASCEND_FLASHCOMM2_PARALLEL_SIZE"] = "1" + +@pytest.mark.skipif(vllm_version_is('0.12.0'), + reason="0.12.0 is not supported for context sequence.") +def test_pcp_dcp_flashcomm2(): + prompts = [ + "The capital of France is", + "Hello, my name is Tom, I am", + "The president of United States is", + "AI future is" + ] + model = "deepseek-ai/DeepSeek-V2-Lite-Chat" + sampling_params = SamplingParams(max_tokens=32, temperature=0.0) + with VllmRunner(model, + enforce_eager=True, + max_model_len=1024, + tensor_parallel_size=2, + prefill_context_parallel_size=2, + decode_context_parallel_size=2, + max_num_batched_tokens=1024, + enable_expert_parallel=True, + block_size=128 + ) as runner: + runner.model.generate(prompts, sampling_params) + + model = "vllm-ascend/Qwen3-30B-A3B-W8A8" + with VllmRunner( + model, + enforce_eager=True, + max_model_len=1024, + tensor_parallel_size=8, + prefill_context_parallel_size=2, + decode_context_parallel_size=2, + enable_expert_parallel=True, + block_size=128, + quantization="ascend", + ) as runner: + runner.model.generate(prompts, sampling_params) From 67ba0a86a7000d2fc595cb529d9c32ac84ecf341 Mon Sep 17 00:00:00 2001 From: daishixun Date: Thu, 18 Dec 2025 11:47:33 +0800 Subject: [PATCH 4/8] fix pre-commit Signed-off-by: daishixun --- tests/e2e/multicard/long_sequence/test_flashcomm2.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/e2e/multicard/long_sequence/test_flashcomm2.py b/tests/e2e/multicard/long_sequence/test_flashcomm2.py index 008dca28213..b2ccd156404 100644 --- a/tests/e2e/multicard/long_sequence/test_flashcomm2.py +++ b/tests/e2e/multicard/long_sequence/test_flashcomm2.py @@ -22,23 +22,24 @@ """ import os + import pytest from vllm import SamplingParams + from tests.e2e.conftest import VllmRunner from vllm_ascend.utils import vllm_version_is os.environ["VLLM_ASCEND_ENABLE_FLASHCOMM2_OSHARED"] = "1" os.environ["VLLM_ASCEND_FLASHCOMM2_PARALLEL_SIZE"] = "1" + @pytest.mark.skipif(vllm_version_is('0.12.0'), reason="0.12.0 is not supported for context sequence.") def test_pcp_dcp_flashcomm2(): prompts = [ - "The capital of France is", - "Hello, my name is Tom, I am", - "The president of United States is", - "AI future is" + "The capital of France is", "Hello, my name is Tom, I am", + "The president of United States is", "AI future is" ] model = "deepseek-ai/DeepSeek-V2-Lite-Chat" sampling_params = SamplingParams(max_tokens=32, temperature=0.0) @@ -50,8 +51,7 @@ def test_pcp_dcp_flashcomm2(): decode_context_parallel_size=2, max_num_batched_tokens=1024, enable_expert_parallel=True, - block_size=128 - ) as runner: + block_size=128) as runner: runner.model.generate(prompts, sampling_params) model = "vllm-ascend/Qwen3-30B-A3B-W8A8" From aa78c7be5c02c8c1137531e48d5b61bfa604300e Mon Sep 17 00:00:00 2001 From: daishixun Date: Thu, 18 Dec 2025 12:27:42 +0800 Subject: [PATCH 5/8] fix pre-commit Signed-off-by: daishixun --- .github/workflows/_e2e_test.yaml | 2 +- tests/e2e/multicard/long_sequence/test_flashcomm2.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/_e2e_test.yaml b/.github/workflows/_e2e_test.yaml index 97971f1e969..3a61960ad9c 100644 --- a/.github/workflows/_e2e_test.yaml +++ b/.github/workflows/_e2e_test.yaml @@ -203,7 +203,7 @@ jobs: pytest -sv --durations=0 tests/e2e/multicard/test_qwen3_moe.py pytest -sv --durations=0 tests/e2e/multicard/test_offline_weight_load.py - pytest -sv --durations=0 tests\e2e\multicard\long_sequence\test_flashcomm2.py + pytest -sv --durations=0 tests/e2e/multicard/long_sequence/test_flashcomm2.py e2e-4-cards: name: multicard-4 diff --git a/tests/e2e/multicard/long_sequence/test_flashcomm2.py b/tests/e2e/multicard/long_sequence/test_flashcomm2.py index b2ccd156404..cc15d1fc376 100644 --- a/tests/e2e/multicard/long_sequence/test_flashcomm2.py +++ b/tests/e2e/multicard/long_sequence/test_flashcomm2.py @@ -24,7 +24,6 @@ import os import pytest - from vllm import SamplingParams from tests.e2e.conftest import VllmRunner From 41c81749765b18c971fe8492faa696ae79f02082 Mon Sep 17 00:00:00 2001 From: daishixun Date: Thu, 18 Dec 2025 14:08:15 +0800 Subject: [PATCH 6/8] fix pre-commit Signed-off-by: daishixun --- tests/e2e/multicard/long_sequence/test_flashcomm2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/e2e/multicard/long_sequence/test_flashcomm2.py b/tests/e2e/multicard/long_sequence/test_flashcomm2.py index cc15d1fc376..c295030b8d9 100644 --- a/tests/e2e/multicard/long_sequence/test_flashcomm2.py +++ b/tests/e2e/multicard/long_sequence/test_flashcomm2.py @@ -52,7 +52,7 @@ def test_pcp_dcp_flashcomm2(): enable_expert_parallel=True, block_size=128) as runner: runner.model.generate(prompts, sampling_params) - + model = "vllm-ascend/Qwen3-30B-A3B-W8A8" with VllmRunner( model, From 663f9936b53ebc6766a34832f482822b9ce7b00e Mon Sep 17 00:00:00 2001 From: daishixun Date: Thu, 18 Dec 2025 15:11:58 +0800 Subject: [PATCH 7/8] delete qwen case Signed-off-by: daishixun --- .../e2e/multicard/long_sequence/test_flashcomm2.py | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/tests/e2e/multicard/long_sequence/test_flashcomm2.py b/tests/e2e/multicard/long_sequence/test_flashcomm2.py index c295030b8d9..a423161851f 100644 --- a/tests/e2e/multicard/long_sequence/test_flashcomm2.py +++ b/tests/e2e/multicard/long_sequence/test_flashcomm2.py @@ -52,17 +52,3 @@ def test_pcp_dcp_flashcomm2(): enable_expert_parallel=True, block_size=128) as runner: runner.model.generate(prompts, sampling_params) - - model = "vllm-ascend/Qwen3-30B-A3B-W8A8" - with VllmRunner( - model, - enforce_eager=True, - max_model_len=1024, - tensor_parallel_size=8, - prefill_context_parallel_size=2, - decode_context_parallel_size=2, - enable_expert_parallel=True, - block_size=128, - quantization="ascend", - ) as runner: - runner.model.generate(prompts, sampling_params) From eefc7e1e4ce935550d1ead9b95f267fb7fd0ae4c Mon Sep 17 00:00:00 2001 From: daishixun Date: Thu, 18 Dec 2025 17:51:02 +0800 Subject: [PATCH 8/8] move e2e to 4cards Signed-off-by: daishixun --- .github/workflows/_e2e_test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/_e2e_test.yaml b/.github/workflows/_e2e_test.yaml index 3a61960ad9c..fdc537119bd 100644 --- a/.github/workflows/_e2e_test.yaml +++ b/.github/workflows/_e2e_test.yaml @@ -203,7 +203,6 @@ jobs: pytest -sv --durations=0 tests/e2e/multicard/test_qwen3_moe.py pytest -sv --durations=0 tests/e2e/multicard/test_offline_weight_load.py - pytest -sv --durations=0 tests/e2e/multicard/long_sequence/test_flashcomm2.py e2e-4-cards: name: multicard-4 @@ -270,6 +269,7 @@ jobs: pytest -sv --durations=0 tests/e2e/multicard/test_offline_inference_distributed.py::test_models_distributed_DeepSeek_W4A8DYNAMIC pytest -sv --durations=0 tests/e2e/multicard/test_offline_inference_distributed.py::test_models_distributed_Kimi_K2_Thinking_W4A16 pytest -sv --durations=0 tests/e2e/multicard/test_data_parallel_tp2.py + pytest -sv --durations=0 tests/e2e/multicard/long_sequence/test_flashcomm2.py - name: Install Ascend toolkit & triton_ascend (for Qwen3-Next-80B-A3B-Instruct) shell: bash -l {0}