### What this PR does / why we need it?
Currently, there are two paths to judge the chip type in code,
`get_ascend_soc_version` use `get_soc_version` api in torch_npu, and
`is_310p` `use _build_info.__soc_version__`, which generate when
install. We need to unify the two paths.
We need to unify these codes based on the following points:
1. We need to ensure consistency in chip type judgment between compiling
and running states;
2. In compiling state, we need chip type to complete op's compilation,
but in running state, we only need device
type(910B/910_93/310P/910_95/etc) to make code branch judgement;
3. In compiling state, torch_npu may not have been installed yet, so we
can't use torch_npu's api.
Based on the above points, we have made the following changes:
1. When user set env `SOC_VERSION`, use it; when not set, query
soc_version by `npu-smi`;
2. generate device_type based on soc_version when compiling, and write
`__device_type__` instead of `__soc_version__` in `_build_info.py`;
3. In running state, use `__device_type__` to judge code branch.
### Does this PR introduce _any_ user-facing change?
When not set env `SOC_VERSION`, it will not be `ASCEND910B1` by default,
we will query soc_version by `npu-smi`. And env `SOC_VERSION` must be in
the list `soc_to_device` in `setup.py`.
- vLLM version: v0.11.0
- vLLM main:
2918c1b49c
Signed-off-by: zzzzwwjj <1183291235@qq.com>
112 lines
4.8 KiB
Python
112 lines
4.8 KiB
Python
# 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.
|
|
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
import pytest
|
|
|
|
from vllm_ascend.ascend_forward_context import MoECommType
|
|
from vllm_ascend.utils import AscendDeviceType
|
|
from vllm_ascend.worker.model_runner_v1 import NPUModelRunner
|
|
|
|
|
|
# yapf: disable
|
|
@pytest.mark.parametrize(
|
|
"soc_version, enable_expert_parallel, world_size, num_tokens, mc2_tokens_capacity, quant_type, expected_method",
|
|
[
|
|
# Case 1: Expert parallel is disabled, should always be 'allgather'
|
|
(AscendDeviceType._910B, False, 8, 100, 256, None, MoECommType.ALLGATHER),
|
|
(AscendDeviceType._910_93, False, 16, 500, 256, None, MoECommType.ALLGATHER),
|
|
|
|
# Case 2: A2 SOC with w4a8_dynamic -> use alltoall when not mc2
|
|
(AscendDeviceType._910B, True, 8, 100, 256, "w4a8_dynamic", MoECommType.ALLTOALL),
|
|
(AscendDeviceType._910B, True, 16, 257, 256, "w4a8_dynamic", MoECommType.ALLTOALL),
|
|
(AscendDeviceType._910B, True, 16, 100, 256, "w4a8_dynamic", MoECommType.MC2), # meets mc2 condition
|
|
|
|
# Case 3: A2 SOC without w4a8_dynamic -> fallback to allgather
|
|
(AscendDeviceType._910B, True, 8, 100, 256, None, MoECommType.ALLGATHER),
|
|
(AscendDeviceType._910B, True, 16, 257, 256, None, MoECommType.ALLGATHER),
|
|
|
|
# Case 4: A3 SOC
|
|
(AscendDeviceType._910_93, True, 8, 100, 256, None, MoECommType.MC2),
|
|
(AscendDeviceType._910_93, True, 8, 257, 256, None, MoECommType.ALLTOALL),
|
|
])
|
|
# yapf: enable
|
|
def test_select_moe_comm_method(soc_version, enable_expert_parallel,
|
|
world_size, num_tokens, mc2_tokens_capacity,
|
|
quant_type, expected_method):
|
|
"""
|
|
Tests the _select_moe_comm_method with various configurations including quant_type.
|
|
"""
|
|
# Mock the NPUModelRunner instance and its dependencies
|
|
mock_runner = MagicMock(spec=NPUModelRunner)
|
|
mock_runner.parallel_config = MagicMock()
|
|
mock_runner.parallel_config.enable_expert_parallel = enable_expert_parallel
|
|
mock_runner.parallel_config.world_size_across_dp = world_size
|
|
mock_runner.mc2_tokens_capacity = mc2_tokens_capacity
|
|
|
|
# Add vllm_config.model_config.hf_config mock with moe_quantize
|
|
mock_hf_config = MagicMock()
|
|
mock_hf_config.moe_quantize = quant_type
|
|
mock_model_config = MagicMock()
|
|
mock_model_config.hf_config = mock_hf_config
|
|
mock_vllm_config = MagicMock()
|
|
mock_vllm_config.model_config = mock_model_config
|
|
mock_runner.vllm_config = mock_vllm_config
|
|
|
|
# Patch the helper functions
|
|
with patch('vllm_ascend.worker.model_runner_v1.get_ascend_device_type',
|
|
return_value=soc_version), \
|
|
patch('vllm_ascend.worker.model_runner_v1.is_global_first_rank',
|
|
return_value=True), \
|
|
patch('vllm_ascend.worker.model_runner_v1.is_moe_model',
|
|
return_value=True):
|
|
|
|
# Bind the real method to the mock object
|
|
method = NPUModelRunner._select_moe_comm_method(
|
|
mock_runner, num_tokens)
|
|
|
|
# Assert the result
|
|
assert method == expected_method
|
|
|
|
|
|
def test_select_moe_comm_method_unsupported_soc():
|
|
"""
|
|
Tests that _select_moe_comm_method raises ValueError for an unsupported SOC.
|
|
"""
|
|
mock_runner = MagicMock(spec=NPUModelRunner)
|
|
mock_runner.parallel_config = MagicMock()
|
|
mock_runner.parallel_config.enable_expert_parallel = True
|
|
mock_runner.mc2_tokens_capacity = 256
|
|
|
|
# Add vllm_config.model_config.hf_config mock with moe_quantize
|
|
mock_hf_config = MagicMock()
|
|
mock_hf_config.moe_quantize = None
|
|
mock_model_config = MagicMock()
|
|
mock_model_config.hf_config = mock_hf_config
|
|
mock_vllm_config = MagicMock()
|
|
mock_vllm_config.model_config = mock_model_config
|
|
mock_runner.vllm_config = mock_vllm_config
|
|
|
|
unsupported_soc = "UnsupportedSOC"
|
|
|
|
with patch('vllm_ascend.worker.model_runner_v1.get_ascend_device_type',
|
|
return_value=unsupported_soc), \
|
|
patch('vllm_ascend.worker.model_runner_v1.is_global_first_rank',
|
|
return_value=True), \
|
|
patch('vllm_ascend.worker.model_runner_v1.is_moe_model',
|
|
return_value=True), \
|
|
pytest.raises(ValueError, match=f"Unsupported soc_version: {unsupported_soc}"):
|
|
|
|
NPUModelRunner._select_moe_comm_method(mock_runner, 100)
|