From a1fd1137fc7d720a1f6ac72d90e06f0ea0c4b393 Mon Sep 17 00:00:00 2001 From: moran Date: Wed, 5 Nov 2025 10:52:12 +0800 Subject: [PATCH] use patch.dict to set env --- .../cases_parallel/multilora_inference.py | 10 +- .../st/python/cases_parallel/shm_broadcast.py | 15 +- .../cases_parallel/vllm_deepseek_bf16_part.py | 20 +- .../vllm_deepseek_bf16_part_v1.py | 21 +- .../cases_parallel/vllm_deepseek_osl.py | 20 +- .../cases_parallel/vllm_deepseek_part.py | 26 +- .../cases_parallel/vllm_deepseek_part_v1.py | 21 +- .../vllm_deepseek_smoothquant.py | 21 +- .../vllm_deepseek_smoothquant_mss.py | 21 +- tests/st/python/cases_parallel/vllm_llama3.py | 16 +- .../python/cases_parallel/vllm_mf_qwen3_8b.py | 28 +- .../python/cases_parallel/vllm_mf_qwen_7b.py | 21 +- .../vllm_mf_qwen_7b_chunk_prefill.py | 21 +- .../vllm_mf_qwen_7b_chunk_prefill_v1.py | 21 +- .../vllm_mf_qwen_7b_cp_pc_mss.py | 21 +- .../cases_parallel/vllm_mf_qwen_7b_mss.py | 21 +- .../vllm_mf_qwen_7b_prefix_caching.py | 18 +- .../vllm_mf_qwen_7b_prefix_caching_v1.py | 18 +- .../cases_parallel/vllm_mf_qwen_7b_v1.py | 27 +- .../cases_parallel/vllm_mf_telechat2_7b.py | 14 +- .../cases_parallel/vllm_qwen2_5_vl_7b_v1.py | 31 ++- tests/st/python/cases_parallel/vllm_qwen3.py | 29 +- .../python/cases_parallel/vllm_qwen3_moe.py | 22 +- .../st/python/cases_parallel/vllm_qwen_7b.py | 20 +- .../python/cases_parallel/vllm_qwen_7b_v1.py | 24 +- .../st/python/cases_parallel/vllm_sampling.py | 19 +- tests/st/python/test_cases_parallel.py | 3 +- tests/st/python/test_custom_advstepflash.py | 2 +- tests/st/python/test_ds_online.py | 31 ++- tests/st/python/test_mcore_mix_parallel.py | 71 +++-- tests/st/python/test_sampler.py | 2 +- tests/st/python/test_sampler_v1.py | 2 +- tests/st/python/utils/__init__.py | 0 .../{utils.py => utils/cases_parallel.py} | 260 +++++++----------- tests/st/python/utils/env_var_manager.py | 41 +++ 35 files changed, 503 insertions(+), 455 deletions(-) create mode 100644 tests/st/python/utils/__init__.py rename tests/st/python/{utils.py => utils/cases_parallel.py} (59%) create mode 100644 tests/st/python/utils/env_var_manager.py diff --git a/tests/st/python/cases_parallel/multilora_inference.py b/tests/st/python/cases_parallel/multilora_inference.py index aae7a1ca..0a1e3776 100644 --- a/tests/st/python/cases_parallel/multilora_inference.py +++ b/tests/st/python/cases_parallel/multilora_inference.py @@ -19,9 +19,12 @@ for offline inference. """ import pytest +from unittest.mock import patch + import os -from tests.st.python.utils import EnvVarManager, cleanup_subprocesses +from tests.st.python.utils.cases_parallel import cleanup_subprocesses +from tests.st.python.utils.env_var_manager import EnvVarManager import vllm_mindspore # noqa: F401 from typing import Optional @@ -35,6 +38,7 @@ def teardown_function(): env_manager = EnvVarManager() +env_manager.setup_mindformers_environment() # def env env_vars = { "ASCEND_CUSTOM_PATH": os.path.expandvars("$ASCEND_HOME_PATH/../"), @@ -48,8 +52,6 @@ env_vars = { "ATB_LLM_LCOC_ENABLE": "0", "VLLM_USE_V1": "1", } -# set env -env_manager.setup_ai_environment(env_vars) def create_test_prompts( @@ -109,10 +111,10 @@ def initialize_engine() -> LLMEngine: return LLMEngine.from_engine_args(engine_args) +@patch.dict(os.environ, env_vars) def test_multilora_inference(): """test function that sets up and runs the prompt processing.""" engine = initialize_engine() lora_path = "/home/workspace/mindspore_dataset/weight/Qwen2.5-7B-Lora-Law" test_prompts = create_test_prompts(lora_path) process_requests(engine, test_prompts) - env_manager.unset_all() diff --git a/tests/st/python/cases_parallel/shm_broadcast.py b/tests/st/python/cases_parallel/shm_broadcast.py index ac9f03d4..c82688c2 100644 --- a/tests/st/python/cases_parallel/shm_broadcast.py +++ b/tests/st/python/cases_parallel/shm_broadcast.py @@ -21,7 +21,10 @@ # type: ignore # isort: skip_file +import pytest +from unittest.mock import patch +import os import multiprocessing import random import time @@ -32,11 +35,18 @@ import vllm_mindspore import torch.distributed as dist from vllm.distributed.device_communicators.shm_broadcast import MessageQueue from vllm.utils import get_ip, get_open_port, get_distributed_init_method -from tests.st.python import utils + +from tests.st.python.test_ds_online import env_vars +from tests.st.python.utils.cases_parallel import cleanup_subprocesses +from tests.st.python.utils.env_var_manager import EnvVarManager def teardown_function(): - utils.cleanup_subprocesses() + cleanup_subprocesses() + + +env_manager = EnvVarManager() +env_manager.setup_mindformers_environment() def get_arrays(n: int, seed: int = 0) -> list[np.ndarray]: @@ -141,5 +151,6 @@ def worker_fn(): print("StatelessProcessGroup passed the test!") +@patch.dict(os.environ, env_vars) def test_shm_broadcast(): distributed_run(worker_fn, 4) diff --git a/tests/st/python/cases_parallel/vllm_deepseek_bf16_part.py b/tests/st/python/cases_parallel/vllm_deepseek_bf16_part.py index fb9802e3..d1135916 100644 --- a/tests/st/python/cases_parallel/vllm_deepseek_bf16_part.py +++ b/tests/st/python/cases_parallel/vllm_deepseek_bf16_part.py @@ -14,16 +14,20 @@ # See the License for the specific language governing permissions and # limitations under the License. """test mf deepseek r1.""" +import pytest +from unittest.mock import patch import os -from tests.st.python import utils +from tests.st.python.utils.cases_parallel import cleanup_subprocesses +from tests.st.python.utils.env_var_manager import EnvVarManager def teardown_function(): - utils.cleanup_subprocesses() + cleanup_subprocesses() -env_manager = utils.EnvVarManager() +env_manager = EnvVarManager() +env_manager.setup_mindformers_environment() # def env env_vars = { "ASCEND_CUSTOM_PATH": os.path.expandvars("$ASCEND_HOME_PATH/../"), @@ -37,16 +41,15 @@ env_vars = { "ATB_LLM_LCOC_ENABLE": "0", "VLLM_USE_V1": "0" } -# set env -env_manager.setup_ai_environment(env_vars) -import vllm_mindspore # noqa: F401, E402 -from vllm import LLM, SamplingParams # noqa: E402 +@patch.dict(os.environ, env_vars) def test_deepseek_r1_bf16(): """ test case deepseek r1 bf16 """ + import vllm_mindspore + from vllm import LLM, SamplingParams # Sample prompts. prompts = [ @@ -74,6 +77,3 @@ def test_deepseek_r1_bf16(): generated_text = output.outputs[0].text print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}") assert generated_text == except_list[i] - - # unset env - env_manager.unset_all() diff --git a/tests/st/python/cases_parallel/vllm_deepseek_bf16_part_v1.py b/tests/st/python/cases_parallel/vllm_deepseek_bf16_part_v1.py index f3dd9da8..649f1b7a 100644 --- a/tests/st/python/cases_parallel/vllm_deepseek_bf16_part_v1.py +++ b/tests/st/python/cases_parallel/vllm_deepseek_bf16_part_v1.py @@ -14,16 +14,20 @@ # See the License for the specific language governing permissions and # limitations under the License. """test mf deepseek r1.""" +import pytest +from unittest.mock import patch import os -from tests.st.python import utils +from tests.st.python.utils.cases_parallel import cleanup_subprocesses +from tests.st.python.utils.env_var_manager import EnvVarManager def teardown_function(): - utils.cleanup_subprocesses() + cleanup_subprocesses() -env_manager = utils.EnvVarManager() +env_manager = EnvVarManager() +env_manager.setup_mindformers_environment() # def env env_vars = { "ASCEND_CUSTOM_PATH": os.path.expandvars("$ASCEND_HOME_PATH/../"), @@ -36,17 +40,15 @@ env_vars = { "ATB_MATMUL_SHUFFLE_K_ENABLE": "0", "ATB_LLM_LCOC_ENABLE": "0" } -# set env -env_manager.setup_ai_environment(env_vars) -import vllm_mindspore # noqa: F401, E402 -from vllm import LLM, SamplingParams # noqa: E402 +@patch.dict(os.environ, env_vars) def test_deepseek_r1_bf16(): """ test case deepseek r1 bf16 """ - + import vllm_mindspore + from vllm import LLM, SamplingParams # Sample prompts. prompts = [ "You are a helpful assistant.<|User|>将文本分类为中性、负面或正面。" @@ -73,6 +75,3 @@ def test_deepseek_r1_bf16(): generated_text = output.outputs[0].text print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}") assert generated_text == except_list[i] - - # unset env - env_manager.unset_all() diff --git a/tests/st/python/cases_parallel/vllm_deepseek_osl.py b/tests/st/python/cases_parallel/vllm_deepseek_osl.py index 79861735..68c54fd7 100644 --- a/tests/st/python/cases_parallel/vllm_deepseek_osl.py +++ b/tests/st/python/cases_parallel/vllm_deepseek_osl.py @@ -20,16 +20,20 @@ isort:skip_file # type: ignore # isort: skip_file +import pytest +from unittest.mock import patch import os -from tests.st.python import utils +from tests.st.python.utils.cases_parallel import cleanup_subprocesses +from tests.st.python.utils.env_var_manager import EnvVarManager def teardown_function(): - utils.cleanup_subprocesses() + cleanup_subprocesses() -env_manager = utils.EnvVarManager() +env_manager = EnvVarManager() +env_manager.setup_mindformers_environment() # def env env_vars = { "ASCEND_CUSTOM_PATH": os.path.expandvars("$ASCEND_HOME_PATH/../"), @@ -43,16 +47,15 @@ env_vars = { "ATB_LLM_LCOC_ENABLE": "0", "VLLM_USE_V1": "0" } -# set env -env_manager.setup_ai_environment(env_vars) -import vllm_mindspore # noqa: F401, E402 -from vllm import LLM, SamplingParams # noqa: E402 +@patch.dict(os.environ, env_vars) def test_deepseek_r1(): """ test case deepseek r1 w8a8 """ + import vllm_mindspore + from vllm import LLM, SamplingParams # Sample prompts. prompts = [ @@ -78,6 +81,3 @@ def test_deepseek_r1(): generated_text = output.outputs[0].text print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}") assert "博物院" in generated_text - - # unset env - env_manager.unset_all() diff --git a/tests/st/python/cases_parallel/vllm_deepseek_part.py b/tests/st/python/cases_parallel/vllm_deepseek_part.py index 162e09fb..8ed5ce6f 100644 --- a/tests/st/python/cases_parallel/vllm_deepseek_part.py +++ b/tests/st/python/cases_parallel/vllm_deepseek_part.py @@ -14,16 +14,20 @@ # See the License for the specific language governing permissions and # limitations under the License. """test mf deepseek r1.""" +import pytest +from unittest.mock import patch import os -from tests.st.python import utils +from tests.st.python.utils.cases_parallel import cleanup_subprocesses +from tests.st.python.utils.env_var_manager import EnvVarManager def teardown_function(): - utils.cleanup_subprocesses() + cleanup_subprocesses() -env_manager = utils.EnvVarManager() +env_manager = EnvVarManager() +env_manager.setup_mindformers_environment() # def env env_vars = { "ASCEND_CUSTOM_PATH": os.path.expandvars("$ASCEND_HOME_PATH/../"), @@ -37,16 +41,15 @@ env_vars = { "ATB_LLM_LCOC_ENABLE": "0", "VLLM_USE_V1": "0" } -# set env -env_manager.setup_ai_environment(env_vars) -import vllm_mindspore # noqa: F401, E402 -from vllm import LLM, SamplingParams # noqa: E402 +@patch.dict(os.environ, env_vars) def test_deepseek_r1(): """ test case deepseek r1 w8a8 """ + import vllm_mindspore + from vllm import LLM, SamplingParams # Sample prompts. prompts = [ @@ -78,14 +81,14 @@ def test_deepseek_r1(): print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}") assert generated_text in except_list - # unset env - env_manager.unset_all() - +@patch.dict(os.environ, env_vars) def test_deepseek_mtp(): """ test case deepseek mtp with main model of r1-w8a8 """ + import vllm_mindspore + from vllm import LLM, SamplingParams # Sample prompts. prompts = [ @@ -115,6 +118,3 @@ def test_deepseek_mtp(): generated_text = output.outputs[0].text print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}") assert generated_text in except_list - - # unset env - env_manager.unset_all() diff --git a/tests/st/python/cases_parallel/vllm_deepseek_part_v1.py b/tests/st/python/cases_parallel/vllm_deepseek_part_v1.py index a70528f0..06cacc35 100644 --- a/tests/st/python/cases_parallel/vllm_deepseek_part_v1.py +++ b/tests/st/python/cases_parallel/vllm_deepseek_part_v1.py @@ -14,16 +14,21 @@ # See the License for the specific language governing permissions and # limitations under the License. """test mf deepseek r1.""" +import pytest +from unittest.mock import patch import os -from tests.st.python import utils + +from tests.st.python.utils.cases_parallel import cleanup_subprocesses +from tests.st.python.utils.env_var_manager import EnvVarManager def teardown_function(): - utils.cleanup_subprocesses() + cleanup_subprocesses() -env_manager = utils.EnvVarManager() +env_manager = EnvVarManager() +env_manager.setup_mindformers_environment() # def env env_vars = { "ASCEND_CUSTOM_PATH": os.path.expandvars("$ASCEND_HOME_PATH/../"), @@ -36,16 +41,15 @@ env_vars = { "ATB_MATMUL_SHUFFLE_K_ENABLE": "0", "ATB_LLM_LCOC_ENABLE": "0" } -# set env -env_manager.setup_ai_environment(env_vars) -import vllm_mindspore # noqa: F401, E402 -from vllm import LLM, SamplingParams # noqa: E402 +@patch.dict(os.environ, env_vars) def test_deepseek_r1(): """ test case deepseek r1 w8a8 """ + import vllm_mindspore + from vllm import LLM, SamplingParams # Sample prompts. prompts = [ @@ -77,6 +81,3 @@ def test_deepseek_r1(): generated_text = output.outputs[0].text print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}") assert generated_text in except_list - - # unset env - env_manager.unset_all() diff --git a/tests/st/python/cases_parallel/vllm_deepseek_smoothquant.py b/tests/st/python/cases_parallel/vllm_deepseek_smoothquant.py index 8660fc1f..748b4337 100644 --- a/tests/st/python/cases_parallel/vllm_deepseek_smoothquant.py +++ b/tests/st/python/cases_parallel/vllm_deepseek_smoothquant.py @@ -17,16 +17,21 @@ # type: ignore # isort: skip_file +import pytest +from unittest.mock import patch import os -from tests.st.python import utils + +from tests.st.python.utils.cases_parallel import cleanup_subprocesses +from tests.st.python.utils.env_var_manager import EnvVarManager def teardown_function(): - utils.cleanup_subprocesses() + cleanup_subprocesses() -env_manager = utils.EnvVarManager() +env_manager = EnvVarManager() +env_manager.setup_mindformers_environment() # def env env_vars = { "ASCEND_CUSTOM_PATH": os.path.expandvars("$ASCEND_HOME_PATH/../"), @@ -40,16 +45,15 @@ env_vars = { "ATB_LLM_LCOC_ENABLE": "0", "VLLM_USE_V1": "0" } -# set env -env_manager.setup_ai_environment(env_vars) -import vllm_mindspore -from vllm import LLM, SamplingParams +@patch.dict(os.environ, env_vars) def test_deepseek_r1(): """ test case deepseek r1 w8a8 """ + import vllm_mindspore + from vllm import LLM, SamplingParams # Sample prompts. prompts = [ @@ -76,6 +80,3 @@ def test_deepseek_r1(): generated_text = output.outputs[0].text print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}") assert "博物院" in generated_text - - # unset env - env_manager.unset_all() diff --git a/tests/st/python/cases_parallel/vllm_deepseek_smoothquant_mss.py b/tests/st/python/cases_parallel/vllm_deepseek_smoothquant_mss.py index 8f02f8c7..37330609 100644 --- a/tests/st/python/cases_parallel/vllm_deepseek_smoothquant_mss.py +++ b/tests/st/python/cases_parallel/vllm_deepseek_smoothquant_mss.py @@ -17,16 +17,21 @@ # type: ignore # isort: skip_file +import pytest +from unittest.mock import patch import os -from tests.st.python import utils + +from tests.st.python.utils.cases_parallel import cleanup_subprocesses +from tests.st.python.utils.env_var_manager import EnvVarManager def teardown_function(): - utils.cleanup_subprocesses() + cleanup_subprocesses() -env_manager = utils.EnvVarManager() +env_manager = EnvVarManager() +env_manager.setup_mindformers_environment() # def env env_vars = { "ASCEND_CUSTOM_PATH": os.path.expandvars("$ASCEND_HOME_PATH/../"), @@ -40,16 +45,15 @@ env_vars = { "ATB_LLM_LCOC_ENABLE": "0", "VLLM_USE_V1": "0" } -# set env -env_manager.setup_ai_environment(env_vars) -import vllm_mindspore -from vllm import LLM, SamplingParams +@patch.dict(os.environ, env_vars) def test_deepseek_r1_mss(): """ test case deepseek r1 w8a8 mss """ + import vllm_mindspore + from vllm import LLM, SamplingParams # Sample prompts. prompts = [ @@ -77,6 +81,3 @@ def test_deepseek_r1_mss(): generated_text = output.outputs[0].text print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}") assert "博物院" in generated_text - - # unset env - env_manager.unset_all() diff --git a/tests/st/python/cases_parallel/vllm_llama3.py b/tests/st/python/cases_parallel/vllm_llama3.py index d4f820d6..8355cbd8 100644 --- a/tests/st/python/cases_parallel/vllm_llama3.py +++ b/tests/st/python/cases_parallel/vllm_llama3.py @@ -16,13 +16,19 @@ # isort:skip_file """test vllm llama3.""" +import pytest +from unittest.mock import patch + import os -from tests.st.python import utils +from tests.st.python.utils.cases_parallel import cleanup_subprocesses +from tests.st.python.utils.env_var_manager import EnvVarManager + import vllm_mindspore from vllm import LLM, SamplingParams -env_manager = utils.EnvVarManager() +env_manager = EnvVarManager() +env_manager.setup_mindformers_environment() # def env env_vars = { "ASCEND_CUSTOM_PATH": os.path.expandvars("$ASCEND_HOME_PATH/../"), @@ -36,10 +42,9 @@ env_vars = { "ATB_LLM_LCOC_ENABLE": "0", "VLLM_USE_V1": "1", } -# set env -env_manager.setup_ai_environment(env_vars) +@patch.dict(os.environ, env_vars) def test_vllm_llama3_8b(): """ test case llama3.1 8B @@ -73,6 +78,3 @@ def test_vllm_llama3_8b(): generated_text = output.outputs[0].text print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}") assert generated_text == except_list[i] - - # unset env - env_manager.unset_all() diff --git a/tests/st/python/cases_parallel/vllm_mf_qwen3_8b.py b/tests/st/python/cases_parallel/vllm_mf_qwen3_8b.py index 3a66efa3..7324d1c1 100644 --- a/tests/st/python/cases_parallel/vllm_mf_qwen3_8b.py +++ b/tests/st/python/cases_parallel/vllm_mf_qwen3_8b.py @@ -14,16 +14,21 @@ # See the License for the specific language governing permissions and # limitations under the License. """test mf qwen3.""" +import pytest +from unittest.mock import patch + import os -from tests.st.python import utils +from tests.st.python.utils.cases_parallel import cleanup_subprocesses +from tests.st.python.utils.env_var_manager import EnvVarManager def teardown_function(): - utils.cleanup_subprocesses() + cleanup_subprocesses() -env_manager = utils.EnvVarManager() +env_manager = EnvVarManager() +env_manager.setup_mindformers_environment() # def env env_vars = { "ASCEND_CUSTOM_PATH": os.path.expandvars("$ASCEND_HOME_PATH/../"), @@ -71,27 +76,22 @@ def run_mf_qwen3_networt(): assert generated_text == except_list[i] +@patch.dict(os.environ, {**env_vars, "VLLM_USE_V1": "0"}) def test_mf_qwen3_v0(): """Test qwen3 8B using V0 LLMEngine.""" - env_vars["VLLM_USE_V1"] = "0" - env_manager.setup_ai_environment(env_vars) run_mf_qwen3_networt() - env_manager.unset_all() +@patch.dict(os.environ, {**env_vars, "VLLM_USE_V1": "1"}) def test_mf_qwen3_v1(): """Test qwen3 8B using V0 LLMEngine.""" - env_vars["VLLM_USE_V1"] = "1" - env_manager.setup_ai_environment(env_vars) run_mf_qwen3_networt() - env_manager.unset_all() +@patch.dict(os.environ, { + **env_vars, "VLLM_USE_V1": "1", + "MS_ENABLE_INTERNAL_BOOST": "off" +}) def test_mf_qwen3_v1_310p(): """Test qwen3 8B using V1 LLMEngine in 310p.""" - env_vars["VLLM_USE_V1"] = "1" - # In 310p, INTERNAL BOOST will case unsupported kernel fusion - env_vars["MS_ENABLE_INTERNAL_BOOST"] = "off" - env_manager.setup_ai_environment(env_vars) run_mf_qwen3_networt() - env_manager.unset_all() \ No newline at end of file diff --git a/tests/st/python/cases_parallel/vllm_mf_qwen_7b.py b/tests/st/python/cases_parallel/vllm_mf_qwen_7b.py index 515a142d..2ee512fd 100644 --- a/tests/st/python/cases_parallel/vllm_mf_qwen_7b.py +++ b/tests/st/python/cases_parallel/vllm_mf_qwen_7b.py @@ -14,16 +14,21 @@ # See the License for the specific language governing permissions and # limitations under the License. """test mf qwen.""" +import pytest +from unittest.mock import patch import os -from tests.st.python import utils + +from tests.st.python.utils.cases_parallel import cleanup_subprocesses +from tests.st.python.utils.env_var_manager import EnvVarManager def teardown_function(): - utils.cleanup_subprocesses() + cleanup_subprocesses() -env_manager = utils.EnvVarManager() +env_manager = EnvVarManager() +env_manager.setup_mindformers_environment() # def env env_vars = { "ASCEND_CUSTOM_PATH": os.path.expandvars("$ASCEND_HOME_PATH/../"), @@ -37,16 +42,15 @@ env_vars = { "ATB_LLM_LCOC_ENABLE": "0", "VLLM_USE_V1": "0" } -# set env -env_manager.setup_ai_environment(env_vars) -import vllm_mindspore # noqa: F401, E402 -from vllm import LLM, SamplingParams # noqa: E402 +@patch.dict(os.environ, env_vars) def test_mf_qwen(): """ test case qwen2.5 7B """ + import vllm_mindspore + from vllm import LLM, SamplingParams # Sample prompts. prompts = [ @@ -72,6 +76,3 @@ def test_mf_qwen(): generated_text = output.outputs[0].text print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}") assert generated_text == except_list[i] - - # unset env - env_manager.unset_all() diff --git a/tests/st/python/cases_parallel/vllm_mf_qwen_7b_chunk_prefill.py b/tests/st/python/cases_parallel/vllm_mf_qwen_7b_chunk_prefill.py index 98775275..ffb30ce9 100644 --- a/tests/st/python/cases_parallel/vllm_mf_qwen_7b_chunk_prefill.py +++ b/tests/st/python/cases_parallel/vllm_mf_qwen_7b_chunk_prefill.py @@ -14,16 +14,21 @@ # See the License for the specific language governing permissions and # limitations under the License. """test mf qwen chunk prefill.""" +import pytest +from unittest.mock import patch import os -from tests.st.python import utils + +from tests.st.python.utils.cases_parallel import cleanup_subprocesses +from tests.st.python.utils.env_var_manager import EnvVarManager def teardown_function(): - utils.cleanup_subprocesses() + cleanup_subprocesses() -env_manager = utils.EnvVarManager() +env_manager = EnvVarManager() +env_manager.setup_mindformers_environment() # def env env_vars = { "ASCEND_CUSTOM_PATH": os.path.expandvars("$ASCEND_HOME_PATH/../"), @@ -37,16 +42,15 @@ env_vars = { "ATB_LLM_LCOC_ENABLE": "0", "VLLM_USE_V1": "0" } -# set env -env_manager.setup_ai_environment(env_vars) -import vllm_mindspore -from vllm import LLM, SamplingParams +@patch.dict(os.environ, env_vars) def test_mf_qwen_7b_chunk_prefill(): """ test case qwen_7b_chunk_prefill """ + import vllm_mindspore + from vllm import LLM, SamplingParams # Sample prompts. batch_datas = [ @@ -101,6 +105,3 @@ def test_mf_qwen_7b_chunk_prefill(): f"Prompt: {output.prompt!r}, Generated text: {generated_text!r}" ) assert generated_text == answer - - # unset env - env_manager.unset_all() diff --git a/tests/st/python/cases_parallel/vllm_mf_qwen_7b_chunk_prefill_v1.py b/tests/st/python/cases_parallel/vllm_mf_qwen_7b_chunk_prefill_v1.py index 899fd6ab..5d80b0a0 100644 --- a/tests/st/python/cases_parallel/vllm_mf_qwen_7b_chunk_prefill_v1.py +++ b/tests/st/python/cases_parallel/vllm_mf_qwen_7b_chunk_prefill_v1.py @@ -14,16 +14,21 @@ # See the License for the specific language governing permissions and # limitations under the License. """test mf qwen chunk prefill.""" +import pytest +from unittest.mock import patch import os -from tests.st.python import utils + +from tests.st.python.utils.cases_parallel import cleanup_subprocesses +from tests.st.python.utils.env_var_manager import EnvVarManager def teardown_function(): - utils.cleanup_subprocesses() + cleanup_subprocesses() -env_manager = utils.EnvVarManager() +env_manager = EnvVarManager() +env_manager.setup_mindformers_environment() # def env env_vars = { "ASCEND_CUSTOM_PATH": os.path.expandvars("$ASCEND_HOME_PATH/../"), @@ -36,16 +41,15 @@ env_vars = { "ATB_MATMUL_SHUFFLE_K_ENABLE": "0", "ATB_LLM_LCOC_ENABLE": "0" } -# set env -env_manager.setup_ai_environment(env_vars) -import vllm_mindspore -from vllm import LLM, SamplingParams +@patch.dict(os.environ, env_vars) def test_mf_qwen_7b_chunk_prefill(): """ test case qwen_7b_chunk_prefill """ + import vllm_mindspore + from vllm import LLM, SamplingParams # Sample prompts. batch_datas = [ @@ -99,6 +103,3 @@ def test_mf_qwen_7b_chunk_prefill(): f"Prompt: {output.prompt!r}, Generated text: {generated_text!r}" ) assert generated_text == answer - - # unset env - env_manager.unset_all() diff --git a/tests/st/python/cases_parallel/vllm_mf_qwen_7b_cp_pc_mss.py b/tests/st/python/cases_parallel/vllm_mf_qwen_7b_cp_pc_mss.py index d169adda..72a7c7aa 100644 --- a/tests/st/python/cases_parallel/vllm_mf_qwen_7b_cp_pc_mss.py +++ b/tests/st/python/cases_parallel/vllm_mf_qwen_7b_cp_pc_mss.py @@ -14,16 +14,21 @@ # See the License for the specific language governing permissions and # limitations under the License. """test mf qwen chunk prefill, prefix cache, mss.""" +import pytest +from unittest.mock import patch import os -from tests.st.python import utils + +from tests.st.python.utils.cases_parallel import cleanup_subprocesses +from tests.st.python.utils.env_var_manager import EnvVarManager def teardown_function(): - utils.cleanup_subprocesses() + cleanup_subprocesses() -env_manager = utils.EnvVarManager() +env_manager = EnvVarManager() +env_manager.setup_mindformers_environment() # def env env_vars = { "ASCEND_CUSTOM_PATH": os.path.expandvars("$ASCEND_HOME_PATH/../"), @@ -37,16 +42,15 @@ env_vars = { "ATB_LLM_LCOC_ENABLE": "0", "VLLM_USE_V1": "0" } -# set env -env_manager.setup_ai_environment(env_vars) -import vllm_mindspore -from vllm import LLM, SamplingParams +@patch.dict(os.environ, env_vars) def test_mf_qwen_7b_cp_pc_mss(): """ test case mf_qwen_7b_cp_pc_mss """ + import vllm_mindspore + from vllm import LLM, SamplingParams # Sample prompts. batch_datas = [ @@ -101,6 +105,3 @@ def test_mf_qwen_7b_cp_pc_mss(): print(f"Prompt: {output.prompt!r}, " f"Generated text: {generated_text!r}") assert generated_text == answer - - # unset env - env_manager.unset_all() diff --git a/tests/st/python/cases_parallel/vllm_mf_qwen_7b_mss.py b/tests/st/python/cases_parallel/vllm_mf_qwen_7b_mss.py index 5f9cb5c5..30e5a49a 100644 --- a/tests/st/python/cases_parallel/vllm_mf_qwen_7b_mss.py +++ b/tests/st/python/cases_parallel/vllm_mf_qwen_7b_mss.py @@ -14,16 +14,21 @@ # See the License for the specific language governing permissions and # limitations under the License. """test mf qwen mss.""" +import pytest +from unittest.mock import patch import os -from tests.st.python import utils + +from tests.st.python.utils.cases_parallel import cleanup_subprocesses +from tests.st.python.utils.env_var_manager import EnvVarManager def teardown_function(): - utils.cleanup_subprocesses() + cleanup_subprocesses() -env_manager = utils.EnvVarManager() +env_manager = EnvVarManager() +env_manager.setup_mindformers_environment() # def env env_vars = { "ASCEND_CUSTOM_PATH": os.path.expandvars("$ASCEND_HOME_PATH/../"), @@ -37,16 +42,15 @@ env_vars = { "ATB_LLM_LCOC_ENABLE": "0", "VLLM_USE_V1": "0" } -# set env -env_manager.setup_ai_environment(env_vars) -import vllm_mindspore -from vllm import LLM, SamplingParams +@patch.dict(os.environ, env_vars) def test_mf_qwen_7b_mss(): """ test case qwen_7b_mss """ + import vllm_mindspore + from vllm import LLM, SamplingParams # Sample prompts. prompts = [ @@ -75,6 +79,3 @@ def test_mf_qwen_7b_mss(): generated_text = output.outputs[0].text print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}") assert generated_text == except_list[i] - - # unset env - env_manager.unset_all() diff --git a/tests/st/python/cases_parallel/vllm_mf_qwen_7b_prefix_caching.py b/tests/st/python/cases_parallel/vllm_mf_qwen_7b_prefix_caching.py index 2bab23e6..8ac1e28c 100644 --- a/tests/st/python/cases_parallel/vllm_mf_qwen_7b_prefix_caching.py +++ b/tests/st/python/cases_parallel/vllm_mf_qwen_7b_prefix_caching.py @@ -14,16 +14,20 @@ # See the License for the specific language governing permissions and # limitations under the License. """test mf qwen prefix caching.""" +import pytest +from unittest.mock import patch import os -from tests.st.python import utils +from tests.st.python.utils.cases_parallel import cleanup_subprocesses +from tests.st.python.utils.env_var_manager import EnvVarManager def teardown_function(): - utils.cleanup_subprocesses() + cleanup_subprocesses() -env_manager = utils.EnvVarManager() +env_manager = EnvVarManager() +env_manager.setup_mindformers_environment() env_vars = { "ASCEND_CUSTOM_PATH": os.path.expandvars("$ASCEND_HOME_PATH/../"), "VLLM_MS_MODEL_BACKEND": "MindFormers", @@ -35,15 +39,15 @@ env_vars = { "ATB_LLM_LCOC_ENABLE": "0", "VLLM_USE_V1": "0" } -env_manager.setup_ai_environment(env_vars) -import vllm_mindspore # noqa: F401, E402 -from vllm import LLM, SamplingParams # noqa: E402 +@patch.dict(os.environ, env_vars) def test_mf_qwen_7b_prefix_caching(): """ test case qwen_7b_prefix_caching """ + import vllm_mindspore + from vllm import LLM, SamplingParams # First prompts. prompts = [ @@ -83,5 +87,3 @@ def test_mf_qwen_7b_prefix_caching(): print(f"Output2 - Prompt: {second_prompts[i]!r}, " f"Generated text: {second_generated_text!r}") assert second_generated_text == second_except_list[i] - - env_manager.unset_all() diff --git a/tests/st/python/cases_parallel/vllm_mf_qwen_7b_prefix_caching_v1.py b/tests/st/python/cases_parallel/vllm_mf_qwen_7b_prefix_caching_v1.py index ef300387..6fb0c608 100644 --- a/tests/st/python/cases_parallel/vllm_mf_qwen_7b_prefix_caching_v1.py +++ b/tests/st/python/cases_parallel/vllm_mf_qwen_7b_prefix_caching_v1.py @@ -14,16 +14,20 @@ # See the License for the specific language governing permissions and # limitations under the License. """test mf qwen prefix caching.""" +import pytest +from unittest.mock import patch import os -from tests.st.python import utils +from tests.st.python.utils.cases_parallel import cleanup_subprocesses +from tests.st.python.utils.env_var_manager import EnvVarManager def teardown_function(): - utils.cleanup_subprocesses() + cleanup_subprocesses() -env_manager = utils.EnvVarManager() +env_manager = EnvVarManager() +env_manager.setup_mindformers_environment() env_vars = { "ASCEND_CUSTOM_PATH": os.path.expandvars("$ASCEND_HOME_PATH/../"), "VLLM_MS_MODEL_BACKEND": "MindFormers", @@ -34,15 +38,15 @@ env_vars = { "ATB_MATMUL_SHUFFLE_K_ENABLE": "0", "ATB_LLM_LCOC_ENABLE": "0" } -env_manager.setup_ai_environment(env_vars) -import vllm_mindspore # noqa: F401, E402 -from vllm import LLM, SamplingParams # noqa: E402 +@patch.dict(os.environ, env_vars) def test_mf_qwen_7b_prefix_caching(): """ test case qwen_7b_prefix_caching """ + import vllm_mindspore + from vllm import LLM, SamplingParams # First prompts. prompts = [ @@ -80,5 +84,3 @@ def test_mf_qwen_7b_prefix_caching(): print(f"Output2 - Prompt: {second_prompts[i]!r}, " f"Generated text: {second_generated_text!r}") assert second_generated_text == second_except_list[i] - - env_manager.unset_all() diff --git a/tests/st/python/cases_parallel/vllm_mf_qwen_7b_v1.py b/tests/st/python/cases_parallel/vllm_mf_qwen_7b_v1.py index 057d94bc..70bca244 100644 --- a/tests/st/python/cases_parallel/vllm_mf_qwen_7b_v1.py +++ b/tests/st/python/cases_parallel/vllm_mf_qwen_7b_v1.py @@ -14,17 +14,20 @@ # See the License for the specific language governing permissions and # limitations under the License. """test mf qwen.""" +import pytest +from unittest.mock import patch import os -import pytest -from tests.st.python import utils +from tests.st.python.utils.cases_parallel import cleanup_subprocesses +from tests.st.python.utils.env_var_manager import EnvVarManager def teardown_function(): - utils.cleanup_subprocesses() + cleanup_subprocesses() -env_manager = utils.EnvVarManager() +env_manager = EnvVarManager() +env_manager.setup_mindformers_environment() # def env env_vars = { "ASCEND_CUSTOM_PATH": os.path.expandvars("$ASCEND_HOME_PATH/../"), @@ -37,16 +40,15 @@ env_vars = { "ATB_MATMUL_SHUFFLE_K_ENABLE": "0", "ATB_LLM_LCOC_ENABLE": "0" } -# set env -env_manager.setup_ai_environment(env_vars) -import vllm_mindspore # noqa: F401, E402 -from vllm import LLM, SamplingParams # noqa: E402 +@patch.dict(os.environ, env_vars) def test_mf_qwen(): """ test case qwen2.5 7B """ + import vllm_mindspore + from vllm import LLM, SamplingParams # Sample prompts. prompts = [ @@ -73,16 +75,16 @@ def test_mf_qwen(): print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}") assert generated_text == except_list[i] - # unset env - env_manager.unset_all() - @pytest.mark.skip(reason="pc precision need to be fixed on v0.8.3 V0") +@patch.dict(os.environ, env_vars) def test_mf_qwen_batch(): """ test case qwen2.5 7B, to test prefill and decode mixed, can trigger PA q_seq_len > 1 """ + import vllm_mindspore + from vllm import LLM, SamplingParams # Sample prompts. prompts = [ "北京烤鸭是", @@ -114,6 +116,3 @@ def test_mf_qwen_batch(): generated_text = output.outputs[0].text print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}") assert generated_text in except_list[i] - - # unset env - env_manager.unset_all() diff --git a/tests/st/python/cases_parallel/vllm_mf_telechat2_7b.py b/tests/st/python/cases_parallel/vllm_mf_telechat2_7b.py index 45f97b4f..0a38a51b 100644 --- a/tests/st/python/cases_parallel/vllm_mf_telechat2_7b.py +++ b/tests/st/python/cases_parallel/vllm_mf_telechat2_7b.py @@ -14,16 +14,21 @@ # See the License for the specific language governing permissions and # limitations under the License. """test mf telechat2 7b.""" +import pytest +from unittest.mock import patch + import os -from tests.st.python import utils +from tests.st.python.utils.cases_parallel import cleanup_subprocesses +from tests.st.python.utils.env_var_manager import EnvVarManager def teardown_function(): - utils.cleanup_subprocesses() + cleanup_subprocesses() -env_manager = utils.EnvVarManager() +env_manager = EnvVarManager() +env_manager.setup_mindformers_environment() # def env env_vars = { "ASCEND_CUSTOM_PATH": os.path.expandvars("$ASCEND_HOME_PATH/../"), @@ -69,8 +74,7 @@ def run_mf_telechat2_7b_network(): assert generated_text == except_list[i] +@patch.dict(os.environ, env_vars) def test_mf_telechat2_7b(): """Test telechat2_7b.""" - env_manager.setup_ai_environment(env_vars) run_mf_telechat2_7b_network() - env_manager.unset_all() diff --git a/tests/st/python/cases_parallel/vllm_qwen2_5_vl_7b_v1.py b/tests/st/python/cases_parallel/vllm_qwen2_5_vl_7b_v1.py index 5dcf3030..dc36d548 100644 --- a/tests/st/python/cases_parallel/vllm_qwen2_5_vl_7b_v1.py +++ b/tests/st/python/cases_parallel/vllm_qwen2_5_vl_7b_v1.py @@ -15,21 +15,26 @@ # limitations under the License. # ============================================================================ """test mf qwen2.5 vl 7B.""" +import pytest +from unittest.mock import patch + import os import cv2 import numpy as np from PIL import Image -from tests.st.python import utils +from tests.st.python.utils.cases_parallel import cleanup_subprocesses +from tests.st.python.utils.env_var_manager import EnvVarManager from tests.st.python.cases_parallel.similarity import compare_distance from transformers import AutoProcessor def teardown_function(): - utils.cleanup_subprocesses() + cleanup_subprocesses() -env_manager = utils.EnvVarManager() +env_manager = EnvVarManager() +env_manager.setup_mindformers_environment() # def env env_vars = { "ASCEND_CUSTOM_PATH": os.path.expandvars("$ASCEND_HOME_PATH/../"), @@ -41,10 +46,6 @@ env_vars = { "ATB_MATMUL_SHUFFLE_K_ENABLE": "0", "ATB_LLM_LCOC_ENABLE": "0", } -# set env -env_manager.setup_ai_environment(env_vars) -import vllm_mindspore -from vllm import LLM, SamplingParams PROMPT_TEMPLATE = ( "<|im_start|>system\nYou are a helpful assistant.<|im_end|>" @@ -68,6 +69,7 @@ def pil_image() -> Image.Image: def generate_llm_engine(enforce_eager=False, tensor_parallel_size=1): + from vllm import LLM # Create an LLM. llm = LLM(model=model_path, gpu_memory_utilization=0.9, @@ -81,6 +83,7 @@ def generate_llm_engine(enforce_eager=False, tensor_parallel_size=1): def forward_and_check(llm): + from vllm import SamplingParams inputs = [ { "prompt": PROMPT_TEMPLATE, @@ -172,31 +175,33 @@ def prepare_text(processor: AutoProcessor, prompt: str): return text +@patch.dict(os.environ, env_vars) def test_qwen2_5_vl_7b_v1(): """ test case qwen2.5 vl 7B """ + import vllm_mindspore llm = generate_llm_engine(enforce_eager=False, tensor_parallel_size=2) forward_and_check(llm) - # unset env - env_manager.unset_all() - +@patch.dict(os.environ, env_vars) def test_qwen2_5_vl_7b_v1_enforce_eager(): """ test case qwen2.5 vl 7B with eager mode """ + import vllm_mindspore llm = generate_llm_engine(enforce_eager=True, tensor_parallel_size=1) forward_and_check(llm) - # unset env - env_manager.unset_all() - +@patch.dict(os.environ, env_vars) def test_qwen2_5_vl_7b_v1_video_infer(): + import vllm_mindspore + from vllm import LLM, SamplingParams + frames = video_to_ndarrays(video_path, num_frames=10) print("frames shape", frames.shape) diff --git a/tests/st/python/cases_parallel/vllm_qwen3.py b/tests/st/python/cases_parallel/vllm_qwen3.py index b32e35ed..f2eb008c 100644 --- a/tests/st/python/cases_parallel/vllm_qwen3.py +++ b/tests/st/python/cases_parallel/vllm_qwen3.py @@ -16,16 +16,21 @@ # isort:skip_file """test vllm qwen3.""" +import pytest +from unittest.mock import patch + import os -from tests.st.python import utils +from tests.st.python.utils.cases_parallel import cleanup_subprocesses +from tests.st.python.utils.env_var_manager import EnvVarManager def teardown_function(): - utils.cleanup_subprocesses() + cleanup_subprocesses() -env_manager = utils.EnvVarManager() +env_manager = EnvVarManager() +env_manager.setup_mindformers_environment() # def env env_vars = { "ASCEND_CUSTOM_PATH": os.path.expandvars("$ASCEND_HOME_PATH/../"), @@ -38,16 +43,13 @@ env_vars = { "ATB_LLM_LCOC_ENABLE": "0", "VLLM_USE_V1": "1", } -# set env -env_manager.setup_ai_environment(env_vars) -import vllm_mindspore -from vllm import LLM, SamplingParams def run_vllm_qwen3_8b(enforce_eager=False): """ run case qwen3 8B """ + from vllm import LLM, SamplingParams # Sample prompts. prompts = [ @@ -78,14 +80,14 @@ def run_vllm_qwen3_8b(enforce_eager=False): assert generated_text == except_list[ i], f"Expected: {except_list[i]}, but got: {generated_text}" - # unset env - env_manager.unset_all() - +@patch.dict(os.environ, env_vars) def test_vllm_qwen3_0_6b(): """ test case qwen3 0.6B """ + import vllm_mindspore + from vllm import LLM, SamplingParams # Sample prompts. prompts = [ @@ -115,19 +117,20 @@ def test_vllm_qwen3_0_6b(): assert generated_text == except_list[ i], f"Expected: {except_list[i]}, but got: {generated_text}" - # unset env - env_manager.unset_all() - +@patch.dict(os.environ, env_vars) def test_vllm_qwen3_8b(): """ test case qwen3 8B """ + import vllm_mindspore run_vllm_qwen3_8b() +@patch.dict(os.environ, env_vars) def test_qwen3_enforce_eager(): """ Test qwen3 8B using ENFORCE_EAGER. """ + import vllm_mindspore run_vllm_qwen3_8b(enforce_eager=True) diff --git a/tests/st/python/cases_parallel/vllm_qwen3_moe.py b/tests/st/python/cases_parallel/vllm_qwen3_moe.py index 5ca501e9..ec2d5737 100644 --- a/tests/st/python/cases_parallel/vllm_qwen3_moe.py +++ b/tests/st/python/cases_parallel/vllm_qwen3_moe.py @@ -16,16 +16,21 @@ # isort:skip_file """test vllm qwen3 moe.""" +import pytest +from unittest.mock import patch + import os -from tests.st.python import utils +from tests.st.python.utils.cases_parallel import cleanup_subprocesses +from tests.st.python.utils.env_var_manager import EnvVarManager def teardown_function(): - utils.cleanup_subprocesses() + cleanup_subprocesses() -env_manager = utils.EnvVarManager() +env_manager = EnvVarManager() +env_manager.setup_mindformers_environment() # def env env_vars = { "ASCEND_CUSTOM_PATH": os.path.expandvars("$ASCEND_HOME_PATH/../"), @@ -38,16 +43,14 @@ env_vars = { "ATB_LLM_LCOC_ENABLE": "0", "VLLM_USE_V1": "1", } -# set env -env_manager.setup_ai_environment(env_vars) -import vllm_mindspore -from vllm import LLM, SamplingParams def run_vllm_qwen3_30b_a3b(enforce_eager=False): """ test case qwen3-30B-A3B """ + import vllm_mindspore + from vllm import LLM, SamplingParams # Sample prompts. prompts = [ @@ -80,10 +83,8 @@ def run_vllm_qwen3_30b_a3b(enforce_eager=False): assert generated_text == except_list[ i], f"Expected: {except_list[i]}, but got: {generated_text}" - # unset env - env_manager.unset_all() - +@patch.dict(os.environ, env_vars) def test_vllm_qwen3_30b_a3b(): """ test case qwen3-30B-A3B @@ -92,6 +93,7 @@ def test_vllm_qwen3_30b_a3b(): run_vllm_qwen3_30b_a3b() +@patch.dict(os.environ, env_vars) def test_vllm_qwen3_30b_a3b_eager(): """ test case qwen3-30B-A3B eager mode diff --git a/tests/st/python/cases_parallel/vllm_qwen_7b.py b/tests/st/python/cases_parallel/vllm_qwen_7b.py index 652c3515..8a6e9301 100644 --- a/tests/st/python/cases_parallel/vllm_qwen_7b.py +++ b/tests/st/python/cases_parallel/vllm_qwen_7b.py @@ -14,16 +14,20 @@ # See the License for the specific language governing permissions and # limitations under the License. """test vllm qwen.""" +import pytest +from unittest.mock import patch import os -from tests.st.python import utils +from tests.st.python.utils.cases_parallel import cleanup_subprocesses +from tests.st.python.utils.env_var_manager import EnvVarManager def teardown_function(): - utils.cleanup_subprocesses() + cleanup_subprocesses() -env_manager = utils.EnvVarManager() +env_manager = EnvVarManager() +env_manager.setup_mindformers_environment() # def env env_vars = { "ASCEND_CUSTOM_PATH": os.path.expandvars("$ASCEND_HOME_PATH/../"), @@ -37,16 +41,15 @@ env_vars = { "ATB_LLM_LCOC_ENABLE": "0", "VLLM_USE_V1": "0" } -# set env -env_manager.setup_ai_environment(env_vars) -import vllm_mindspore # noqa: F401, E402 -from vllm import LLM, SamplingParams # noqa: E402 +@patch.dict(os.environ, env_vars) def test_vllm_qwen(): """ test case qwen2.5 7B """ + import vllm_mindspore + from vllm import LLM, SamplingParams # Sample prompts. prompts = [ @@ -72,6 +75,3 @@ def test_vllm_qwen(): generated_text = output.outputs[0].text print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}") assert generated_text == except_list[i] - - # unset env - env_manager.unset_all() diff --git a/tests/st/python/cases_parallel/vllm_qwen_7b_v1.py b/tests/st/python/cases_parallel/vllm_qwen_7b_v1.py index ddc695ae..35c3e0b7 100644 --- a/tests/st/python/cases_parallel/vllm_qwen_7b_v1.py +++ b/tests/st/python/cases_parallel/vllm_qwen_7b_v1.py @@ -14,16 +14,20 @@ # See the License for the specific language governing permissions and # limitations under the License. """test vllm qwen.""" +import pytest +from unittest.mock import patch import os -from tests.st.python import utils +from tests.st.python.utils.cases_parallel import cleanup_subprocesses +from tests.st.python.utils.env_var_manager import EnvVarManager def teardown_function(): - utils.cleanup_subprocesses() + cleanup_subprocesses() -env_manager = utils.EnvVarManager() +env_manager = EnvVarManager() +env_manager.setup_mindformers_environment() # def env env_vars = { "ASCEND_CUSTOM_PATH": os.path.expandvars("$ASCEND_HOME_PATH/../"), @@ -37,16 +41,13 @@ env_vars = { "ATB_LLM_LCOC_ENABLE": "0", "VLLM_USE_V1": "1" } -# set env -env_manager.setup_ai_environment(env_vars) -import vllm_mindspore # noqa: F401, E402 -from vllm import LLM, SamplingParams # noqa: E402 def run_vllm_qwen(enforce_eager=False): """ run qwen2.5 7B """ + from vllm import LLM, SamplingParams # Sample prompts. prompts = [ @@ -74,19 +75,20 @@ def run_vllm_qwen(enforce_eager=False): print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}") assert generated_text == except_list[i] - # unset env - env_manager.unset_all() - +@patch.dict(os.environ, env_vars) def test_vllm_qwen(): """ test case qwen2.5 7B """ + import vllm_mindspore run_vllm_qwen() +@patch.dict(os.environ, env_vars) def test_qwen_enforce_eager(): """ Test qwen2.5 7B using ENFORCE_EAGER. """ - run_vllm_qwen(enforce_eager=True) \ No newline at end of file + import vllm_mindspore + run_vllm_qwen(enforce_eager=True) diff --git a/tests/st/python/cases_parallel/vllm_sampling.py b/tests/st/python/cases_parallel/vllm_sampling.py index 1d093b53..d9578d54 100644 --- a/tests/st/python/cases_parallel/vllm_sampling.py +++ b/tests/st/python/cases_parallel/vllm_sampling.py @@ -14,16 +14,20 @@ # See the License for the specific language governing permissions and # limitations under the License. """test vllm sampling.""" +import pytest +from unittest.mock import patch import os -from tests.st.python import utils +from tests.st.python.utils.cases_parallel import cleanup_subprocesses +from tests.st.python.utils.env_var_manager import EnvVarManager def teardown_function(): - utils.cleanup_subprocesses() + cleanup_subprocesses() -env_manager = utils.EnvVarManager() +env_manager = EnvVarManager() +env_manager.setup_mindformers_environment() # def env env_vars = { "ASCEND_CUSTOM_PATH": os.path.expandvars("$ASCEND_HOME_PATH/../"), @@ -37,16 +41,15 @@ env_vars = { "VLLM_USE_V1": "1", "VLLM_MS_MODEL_BACKEND": "Native" } -# set env -env_manager.setup_ai_environment(env_vars) -import vllm_mindspore # noqa: F401, E402 -from vllm import LLM, SamplingParams # noqa: E402 +@patch.dict(os.environ, env_vars) def test_vllm_sampling_n_logprobs(): """ parameter n and logprobs test case """ + import vllm_mindspore + from vllm import LLM, SamplingParams # Sample prompts. prompts = ["介绍一下北京。"] @@ -75,5 +78,3 @@ def test_vllm_sampling_n_logprobs(): for sample_logprob in seq.logprobs ]) assert len(output.outputs) == 2 - # unset env - env_manager.unset_all() diff --git a/tests/st/python/test_cases_parallel.py b/tests/st/python/test_cases_parallel.py index 04ac7538..87ee11ca 100644 --- a/tests/st/python/test_cases_parallel.py +++ b/tests/st/python/test_cases_parallel.py @@ -20,7 +20,8 @@ from multiprocessing.pool import Pool import pytest -from .utils import cleanup_subprocesses, tasks_resource_alloc +from tests.st.python.utils.cases_parallel import (cleanup_subprocesses, + tasks_resource_alloc) def teardown_function(): diff --git a/tests/st/python/test_custom_advstepflash.py b/tests/st/python/test_custom_advstepflash.py index 0b0863c5..cd779f31 100644 --- a/tests/st/python/test_custom_advstepflash.py +++ b/tests/st/python/test_custom_advstepflash.py @@ -22,7 +22,7 @@ import pytest from vllm_mindspore import _custom_ops as custom_ops import torch -from .utils import cleanup_subprocesses +from tests.st.python.utils.cases_parallel import cleanup_subprocesses def teardown_function(): diff --git a/tests/st/python/test_ds_online.py b/tests/st/python/test_ds_online.py index c5f3dc23..ed342ffc 100644 --- a/tests/st/python/test_ds_online.py +++ b/tests/st/python/test_ds_online.py @@ -16,18 +16,20 @@ # isort:skip_file """test vllm deepseek online server.""" +import pytest +from unittest.mock import patch import os import json -import pytest import requests import subprocess import shlex import signal import time -from . import utils +from tests.st.python.utils.env_var_manager import EnvVarManager -env_manager = utils.EnvVarManager() +env_manager = EnvVarManager() +env_manager.setup_mindformers_environment() env_vars = { "vLLM_MODEL_BACKEND": "MindFormers", "MS_ENABLE_LCCL": "off", @@ -42,19 +44,13 @@ env_vars = { "LCAL_COMM_ID": "127.0.0.1:10068" } -env_manager.setup_ai_environment(env_vars) - -import vllm_mindspore # noqa: F401, E402 -from vllm.utils import get_open_port # noqa: E402 -from vllm.logger import init_logger - -logger = init_logger(__name__) - DS_R1_W8A8_MODEL = "/home/workspace/mindspore_dataset/weight/DeepSeek-R1-W8A8" def execute_shell_command(command): """执行 shell 命令并返回状态和输出""" + from vllm.logger import init_logger + logger = init_logger(__name__) status, output = subprocess.getstatusoutput(command) if status != 0: logger.info("执行命令失败: %s\n错误信息: %s", command, output) @@ -63,6 +59,8 @@ def execute_shell_command(command): def stop_vllm_server(process=None): """停止 vLLM 服务及其相关进程""" + from vllm.logger import init_logger + logger = init_logger(__name__) if process is not None: try: os.killpg(process.pid, signal.SIGTERM) @@ -112,6 +110,8 @@ def start_vllm_server(model, log_name, extra_params=''): Returns: process: 拉起服务的进程号 """ + from vllm.logger import init_logger + logger = init_logger(__name__) dirname, _ = os.path.split(os.path.abspath(__file__)) log_path = os.path.join(dirname, log_name) start_cmd = f"vllm-mindspore serve {model}" @@ -151,6 +151,8 @@ def start_vllm_server(model, log_name, extra_params=''): def set_request(model_path, master_ip="127.0.0.1", port="8000"): + from vllm.logger import init_logger + logger = init_logger(__name__) url = f"http://{master_ip}:{port}/v1/completions" headers = {"Content-Type": "application/json"} data = { @@ -190,10 +192,14 @@ def set_request(model_path, master_ip="127.0.0.1", port="8000"): assert generate_text == expect_result +@patch.dict(os.environ, env_vars) @pytest.mark.level0 @pytest.mark.platform_arm_ascend910b_training @pytest.mark.allcards def test_deepseek_r1_dp4_tp2_ep4_online(): + import vllm_mindspore + from vllm.utils import get_open_port # noqa: E402 + log_name = "test_deepseek_r1_dp4_tp2_ep4_online.log" log_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), log_name) @@ -227,6 +233,3 @@ def test_deepseek_r1_dp4_tp2_ep4_online(): stop_vllm_server(process) if os.path.exists(log_path): os.remove(log_path) - - # unset env - env_manager.unset_all() diff --git a/tests/st/python/test_mcore_mix_parallel.py b/tests/st/python/test_mcore_mix_parallel.py index e697ce10..148f0878 100644 --- a/tests/st/python/test_mcore_mix_parallel.py +++ b/tests/st/python/test_mcore_mix_parallel.py @@ -16,21 +16,21 @@ # isort:skip_file """test vllm mix parallel.""" +import pytest +from unittest.mock import patch import os -import copy from multiprocessing import Process, Queue -import pytest - -from . import utils -from .utils import cleanup_subprocesses +from tests.st.python.utils.cases_parallel import cleanup_subprocesses +from tests.st.python.utils.env_var_manager import EnvVarManager def teardown_function(): cleanup_subprocesses() -env_manager = utils.EnvVarManager() +env_manager = EnvVarManager() +env_manager.setup_mindformers_environment() env_vars = { "ASCEND_CUSTOM_PATH": os.path.expandvars("$ASCEND_HOME_PATH/../"), "VLLM_MS_MODEL_BACKEND": "MindFormers", @@ -46,10 +46,6 @@ env_vars = { "HCCL_IF_BASE_PORT": "60000", "LCAL_COMM_ID": "127.0.0.1:10068" } -env_manager.setup_ai_environment(env_vars) -import vllm_mindspore # noqa: F401, E402 -from vllm import LLM, SamplingParams # noqa: E402 -from vllm.utils import get_open_port # noqa: E402 ds_model_path = "/home/workspace/mindspore_dataset/weight/DeepSeek-R1-W8A8" common_ds_prompt = ("You are a helpful assistant.<|User|>将文本分类为中性、" @@ -67,6 +63,7 @@ quant_type = 'ascend' def dp_func(dp_size, local_dp_rank, global_dp_rank, tp_size, ep_size, dp_master_port, prompts, expect_list, result_q, model_path, quantization): + from vllm import LLM, SamplingParams dp_master_ip = "127.0.0.1" os.environ["VLLM_DP_RANK"] = str(global_dp_rank) @@ -119,6 +116,8 @@ def exec_model_with_dp(dp_size, expect_list, model_path, quantization=None): + from vllm.utils import get_open_port + node_size = 1 node_rank = 0 dp_master_port = get_open_port() @@ -152,9 +151,6 @@ def exec_model_with_dp(dp_size, result = result and result_q.get() assert result - # unset env - env_manager.unset_all() - def exec_model_without_dp(tp_size, ep_size, @@ -162,6 +158,7 @@ def exec_model_without_dp(tp_size, expect_list, model_path, quantization=None): + from vllm import LLM, SamplingParams # Create a sampling params object. sampling_params = SamplingParams(temperature=0.0, max_tokens=3, @@ -189,10 +186,8 @@ def exec_model_without_dp(tp_size, print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}") assert generated_text == expect_list[i] - # unset env - env_manager.unset_all() - +@patch.dict(os.environ, env_vars) @pytest.mark.level0 @pytest.mark.platform_arm_ascend910b_training @pytest.mark.allcards @@ -200,6 +195,8 @@ def test_vllm_qwen3_moe_30b_dp4_tp2_ep4(): """ test case qwen3_moe_30B with DP4TP2EP4 """ + import vllm_mindspore + dp_size = 4 tp_size = 2 ep_size = 4 @@ -210,6 +207,7 @@ def test_vllm_qwen3_moe_30b_dp4_tp2_ep4(): qwen_model_path) +@patch.dict(os.environ, env_vars) @pytest.mark.level1 @pytest.mark.platform_arm_ascend910b_training @pytest.mark.allcards @@ -217,6 +215,8 @@ def test_deepseek_r1_dp4_tp2_ep4(): """ test case deepseek r1 w8a8 dp4 tp2 ep4 """ + import vllm_mindspore + dp_size = 4 tp_size = 2 ep_size = 4 @@ -231,10 +231,13 @@ def test_deepseek_r1_dp4_tp2_ep4(): reason= "Currently does not support relevant communication fusion operators in 910b" ) +@patch.dict(os.environ, env_vars) def test_deepseek_r1_dp8_tp1_ep8(): """ test case deepseek r1 w8a8 Dp8 tp1 ep8 """ + import vllm_mindspore + dp_size = 8 tp_size = 1 ep_size = 8 @@ -245,6 +248,7 @@ def test_deepseek_r1_dp8_tp1_ep8(): ds_model_path, quant_type) +@patch.dict(os.environ, env_vars) @pytest.mark.level4 @pytest.mark.platform_arm_ascend910b_training @pytest.mark.allcards @@ -252,6 +256,8 @@ def test_deepseek_r1_dp2_tp4_ep1(): """ test case deepseek r1 w8a8 dp2 tp4 ep1 """ + import vllm_mindspore + dp_size = 2 tp_size = 4 ep_size = 1 @@ -262,6 +268,7 @@ def test_deepseek_r1_dp2_tp4_ep1(): ds_model_path, quant_type) +@patch.dict(os.environ, env_vars) @pytest.mark.skip( reason= "Currently does not support relevant communication fusion operators in 910b" @@ -270,6 +277,8 @@ def test_deepseek_r1_dp4_tp2_ep8(): """ test case deepseek r1 w8a8 dp4 tp2 ep8 """ + import vllm_mindspore + dp_size = 4 tp_size = 2 ep_size = 8 @@ -280,6 +289,7 @@ def test_deepseek_r1_dp4_tp2_ep8(): ds_model_path, quant_type) +@patch.dict(os.environ, env_vars) @pytest.mark.level4 @pytest.mark.platform_arm_ascend910b_training @pytest.mark.allcards @@ -287,6 +297,8 @@ def test_deepseek_r1_dp8_tp1_ep1(): """ test case deepseek r1 w8a8 dp8 tp1 ep1 """ + import vllm_mindspore + dp_size = 8 tp_size = 1 ep_size = 1 @@ -297,6 +309,7 @@ def test_deepseek_r1_dp8_tp1_ep1(): ds_model_path, quant_type) +@patch.dict(os.environ, env_vars) @pytest.mark.level4 @pytest.mark.platform_arm_ascend910b_training @pytest.mark.allcards @@ -304,6 +317,8 @@ def test_deepseek_r1_dp8_tp1_ep4(): """ test case deepseek r1 w8a8 dp8 tp1 ep4 """ + import vllm_mindspore + dp_size = 8 tp_size = 1 ep_size = 4 @@ -314,6 +329,7 @@ def test_deepseek_r1_dp8_tp1_ep4(): ds_model_path, quant_type) +@patch.dict(os.environ, env_vars) @pytest.mark.level4 @pytest.mark.platform_arm_ascend910b_training @pytest.mark.allcards @@ -321,6 +337,8 @@ def test_deepseek_r1_tp8_ep8(): """ test case deepseek r1 w8a8 tp8 ep8 """ + import vllm_mindspore + tp_size = 8 ep_size = 8 # Sample prompts. @@ -330,6 +348,7 @@ def test_deepseek_r1_tp8_ep8(): ds_model_path, quant_type) +@patch.dict(os.environ, env_vars) @pytest.mark.level4 @pytest.mark.platform_arm_ascend910b_training @pytest.mark.allcards @@ -337,6 +356,8 @@ def test_deepseek_r1_tp8_ep4(): """ test case deepseek r1 w8a8 tp8 ep4 """ + import vllm_mindspore + tp_size = 8 ep_size = 4 # Sample prompts. @@ -346,6 +367,7 @@ def test_deepseek_r1_tp8_ep4(): ds_model_path, quant_type) +@patch.dict(os.environ, {**env_vars, "VLLM_MS_MODEL_BACKEND": "Native"}) @pytest.mark.level0 @pytest.mark.platform_arm_ascend910b_training @pytest.mark.allcards @@ -353,10 +375,8 @@ def test_vllm_native_qwen3_moe_30b_dp4_tp2_ep4(): """ test case qwen3_moe_30B with DP4TP2EP4 """ - tmp_env = copy.deepcopy(env_vars) - tmp_env["VLLM_MS_MODEL_BACKEND"] = "Native" - env_manager.unset_all() - env_manager.setup_ai_environment(tmp_env) + import vllm_mindspore + dp_size = 4 tp_size = 2 ep_size = 4 @@ -365,10 +385,9 @@ def test_vllm_native_qwen3_moe_30b_dp4_tp2_ep4(): expect_list = [common_qwen_expect_result] * 4 exec_model_with_dp(dp_size, tp_size, ep_size, prompts, expect_list, qwen_model_path) - env_manager.unset_all() - env_manager.setup_ai_environment(env_vars) +@patch.dict(os.environ, {**env_vars, "VLLM_MS_MODEL_BACKEND": "Native"}) @pytest.mark.level4 @pytest.mark.platform_arm_ascend910b_training @pytest.mark.allcards @@ -376,10 +395,8 @@ def test_vllm_native_qwen3_moe_30b_tp8_ep4(): """ test case qwen3_moe_30B with TP8EP4 """ - tmp_env = copy.deepcopy(env_vars) - tmp_env["VLLM_MS_MODEL_BACKEND"] = "Native" - env_manager.unset_all() - env_manager.setup_ai_environment(tmp_env) + import vllm_mindspore + tp_size = 8 ep_size = 4 # Sample prompts. @@ -387,5 +404,3 @@ def test_vllm_native_qwen3_moe_30b_tp8_ep4(): expect_list = [common_qwen_expect_result] exec_model_without_dp(tp_size, ep_size, prompts, expect_list, qwen_model_path, quant_type) - env_manager.unset_all() - env_manager.setup_ai_environment(env_vars) diff --git a/tests/st/python/test_sampler.py b/tests/st/python/test_sampler.py index ce31f5d1..4a6c4795 100644 --- a/tests/st/python/test_sampler.py +++ b/tests/st/python/test_sampler.py @@ -41,7 +41,7 @@ from vllm.utils import Counter, is_pin_memory_available from vllm.sequence import SamplingParams from vllm_mindspore.sequence import SequenceData, SequenceGroupMetadata -from .utils import cleanup_subprocesses +from tests.st.python.utils.cases_parallel import cleanup_subprocesses def teardown_function(): diff --git a/tests/st/python/test_sampler_v1.py b/tests/st/python/test_sampler_v1.py index 39fac8d0..12662927 100644 --- a/tests/st/python/test_sampler_v1.py +++ b/tests/st/python/test_sampler_v1.py @@ -33,7 +33,7 @@ from vllm.utils import make_tensor_with_pad from vllm.v1.sample.metadata import SamplingMetadata from vllm.v1.sample.sampler import Sampler -from .utils import cleanup_subprocesses +from tests.st.python.utils.cases_parallel import cleanup_subprocesses def teardown_function(): diff --git a/tests/st/python/utils/__init__.py b/tests/st/python/utils/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/st/python/utils.py b/tests/st/python/utils/cases_parallel.py similarity index 59% rename from tests/st/python/utils.py rename to tests/st/python/utils/cases_parallel.py index 84354ea1..29216fb4 100644 --- a/tests/st/python/utils.py +++ b/tests/st/python/utils/cases_parallel.py @@ -1,157 +1,103 @@ -# SPDX-License-Identifier: Apache-2.0 - -# Copyright 2025 Huawei Technologies Co., Ltd. -# -# 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. - -import contextlib -import os -import signal -import sys -from typing import Optional - -import psutil - - -class EnvVarManager: - - def __init__(self): - self._original_env: dict[str, Optional[str]] = {} - self._managed_vars: dict[str, str] = {} - - def set_env_var(self, var_name: str, value: str) -> None: - """Set environment variable and record original value.""" - # Record original values corresponding to var_name, None if not exist. - if var_name not in self._original_env: - self._original_env[var_name] = os.environ.get(var_name) - - os.environ[var_name] = value - self._managed_vars[var_name] = value - - def unset_env_var(self, var_name: str) -> None: - """Unset environment variable with original value.""" - if var_name not in self._original_env: - raise ValueError( - f"Variable {var_name} was not set by this manager") - - original_value = self._original_env[var_name] - if original_value is not None: - os.environ[var_name] = original_value - else: - if var_name in os.environ: - del os.environ[var_name] - - del self._original_env[var_name] - del self._managed_vars[var_name] - - def unset_all(self) -> None: - """Unset all environment variables with original values.""" - for var_name in list(self._managed_vars.keys()): - self.unset_env_var(var_name) - - def get_managed_vars(self) -> dict[str, str]: - """get all managered variables.""" - return self._managed_vars.copy() - - def setup_ai_environment(self, env_vars: dict[str, str]) -> None: - """Set ai environment by given values.""" - # Insert mindformers to PYTHONPATH. - mindformers_path =\ - "/home/jenkins/mindspore/testcases/testcases/tests/mindformers" - - if mindformers_path not in sys.path: - sys.path.insert(0, mindformers_path) - - current_pythonpath = os.environ.get("PYTHONPATH", "") - if current_pythonpath: - os.environ[ - "PYTHONPATH"] = f"{mindformers_path}:{current_pythonpath}" - else: - os.environ["PYTHONPATH"] = mindformers_path - - # Update environments. - for var_name, value in env_vars.items(): - self.set_env_var(var_name, value) - - -def cleanup_subprocesses() -> None: - """Cleanup all subprocesses raise by main test process.""" - cur_proc = psutil.Process(os.getpid()) - children = cur_proc.children(recursive=True) - for child in children: - with contextlib.suppress(ProcessLookupError): - os.killpg(child.pid, signal.SIGKILL) - - -def tasks_resource_alloc(tasks: list[tuple[int]]) -> list[tuple[str]]: - """ - Allocate devices, lccl base port, hccl base port to tasks - according to device requirement of each task. - - For example: - [(2, "cases_parallel/vllm_task.py::test_1", "test_1.log")] - ==> [("export ASCEND_RT_VISIBLE_DEVICES=0,1 && - export LCAL_COMM_ID=127.0.0.1:10068 && " - "export HCCL_IF_BASE_PORT=61000 && " - "pytest -s -v cases_parallel/vllm_task.py::test_1 > test_1.log", - "test_1.log")] - - Args: - tasks (list[tuple[int]]): list of tasks. Each task contain 3 elements. - 1. device_req (int): Num of device requirements, - which will occur device_req devices, - device_req ports for lccl, - device_req ports for hccl. - 2. case_desc (str): The case description, - such as "path_to_case/case.py::target_case". - 3. log_file (str): The logging file path. - - Returns: - list[tuple[str]]: Append resource environment to the task commands. - """ - device_limit = 8 - device_base = 0 - lccl_base_port = 10068 - hccl_base_port = 61000 - - out_tasks: list[tuple[str]] = [] - for task in tasks: - assert len(task) == 3 - resource_req, task_case, log_file = task - if not isinstance(resource_req, int): - raise TypeError( - "First argument of task should be a int or str, but got %s!", - str(type(resource_req))) - - device_str = ",".join( - [str(d) for d in range(device_base, device_base + resource_req)]) - lccl_str = f"127.0.0.1:{lccl_base_port}" - - commands = [ - f"export ASCEND_RT_VISIBLE_DEVICES={device_str}", - f"export LCAL_COMM_ID={lccl_str}", - f"export HCCL_IF_BASE_PORT={hccl_base_port}" - ] - device_base += resource_req - lccl_base_port += resource_req - hccl_base_port += resource_req - - commands.append(f"pytest -s -v {task_case} > {log_file}") - out_tasks.append((" && ".join(commands), log_file)) - - if device_limit > device_limit: - raise ValueError( - "Total require device %d exceeding resource limits %d !", - device_base, device_limit) - - return out_tasks +# SPDX-License-Identifier: Apache-2.0 + +# Copyright 2025 Huawei Technologies Co., Ltd. +# +# 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. +import contextlib +import os +import signal +import psutil + + +def tasks_resource_alloc(tasks: list[tuple[int]]) -> list[tuple[str]]: + """ + Allocate devices, lccl base port, hccl base port to tasks + according to device requirement of each task. + + For example: + [(2, "cases_parallel/vllm_task.py::test_1", "test_1.log")] + ==> [("export ASCEND_RT_VISIBLE_DEVICES=0,1 && + export LCAL_COMM_ID=127.0.0.1:10068 && " + "export HCCL_IF_BASE_PORT=61000 && " + "pytest -s -v cases_parallel/vllm_task.py::test_1 > test_1.log", + "test_1.log")] + + Args: + tasks (list[tuple[int]]): list of tasks. Each task contain 3 elements. + 1. device_req (int): Num of device requirements, + which will occur device_req devices, + device_req ports for lccl, + device_req ports for hccl. + 2. case_desc (str): The case description, + such as "path_to_case/case.py::target_case". + 3. log_file (str): The logging file path. + + Returns: + list[tuple[str]]: Append resource environment to the task commands. + """ + device_limit = 8 + device_base = 0 + lccl_base_port = 10068 + hccl_base_port = 61000 + + out_tasks: list[tuple[str]] = [] + for task in tasks: + assert len(task) == 3 + resource_req, task_case, log_file = task + if not isinstance(resource_req, int): + raise TypeError( + "First argument of task should be a int or str, but got %s!", + str(type(resource_req))) + + device_str = ",".join( + [str(d) for d in range(device_base, device_base + resource_req)]) + lccl_str = f"127.0.0.1:{lccl_base_port}" + ''' + env_var = os.environ.copy() + env_var.update({ + "ASCEND_RT_VISIBLE_DEVICES": f"{device_str}", + "LCAL_COMM_ID": f"{lccl_str}", + "HCCL_IF_BASE_PORT": f"{hccl_base_port}" + }) + + out_tasks.append((env_var, task_case, log_file)) + + ''' + commands = [ + f"export ASCEND_RT_VISIBLE_DEVICES={device_str}", + f"export LCAL_COMM_ID={lccl_str}", + f"export HCCL_IF_BASE_PORT={hccl_base_port}" + ] + + device_base += resource_req + lccl_base_port += resource_req + hccl_base_port += resource_req + + commands.append(f"pytest -s -v {task_case} > {log_file}") + out_tasks.append((" && ".join(commands), log_file)) + + if device_base > device_limit: + raise ValueError( + "Total require device %d exceeding resource limits %d !", + device_base, device_limit) + + return out_tasks + + +def cleanup_subprocesses() -> None: + """Cleanup all subprocesses raise by main test process.""" + cur_proc = psutil.Process(os.getpid()) + children = cur_proc.children(recursive=True) + for child in children: + with contextlib.suppress(ProcessLookupError): + os.killpg(child.pid, signal.SIGKILL) diff --git a/tests/st/python/utils/env_var_manager.py b/tests/st/python/utils/env_var_manager.py new file mode 100644 index 00000000..e6490b82 --- /dev/null +++ b/tests/st/python/utils/env_var_manager.py @@ -0,0 +1,41 @@ +# SPDX-License-Identifier: Apache-2.0 + +# Copyright 2025 Huawei Technologies Co., Ltd. +# +# 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. + +import os +import sys + +import psutil + + +class EnvVarManager: + + @staticmethod + def setup_mindformers_environment(): + """Set MindFormers to PYTHONPATH""" + # Insert mindformers to PYTHONPATH. + mindformers_path =\ + "/home/jenkins/mindspore/testcases/testcases/tests/mindformers" + + if mindformers_path not in sys.path: + sys.path.insert(0, mindformers_path) + + current_pythonpath = os.environ.get("PYTHONPATH", "") + if current_pythonpath: + if mindformers_path not in current_pythonpath: + os.environ[ + "PYTHONPATH"] = f"{mindformers_path}:{current_pythonpath}" + else: + os.environ["PYTHONPATH"] = mindformers_path -- Gitee