[Misc] Refactor aclgraph accuracy test to use logprob-based comparison (#7455)
### What this PR does / why we need it?
Replace text-match assertions with a two-tier logprob accuracy check:
- Prefill (token 0): assert token ID is identical between eager baseline
and compiled mode, then verify logprob matches within `atol`.
- Decode (tokens 1-2): if chosen tokens match, compare logprobs
directly; if they differ, cross-lookup the baseline token in the
compiled model's top-20 distribution and assert the assigned logprob is
within `decode_atol` (defaults to 2x atol). This tolerates minor argmax
drift caused by floating-point differences while still catching
distribution divergence.
### Does this PR introduce _any_ user-facing change?
### How was this patch tested?
- vLLM version: v0.17.0
- vLLM main:
8a680463fa
---------
Signed-off-by: wangli <wangli858794774@gmail.com>
This commit is contained in:
@@ -21,97 +21,61 @@ import os
|
||||
|
||||
import pytest
|
||||
|
||||
from tests.e2e.singlecard.utils import PROMPTS_LONG, PROMPTS_SHORT, LLMTestCase, gen_and_valid
|
||||
from tests.e2e.conftest import wait_until_npu_memory_free
|
||||
from tests.e2e.singlecard.utils import PROMPTS_LONG, PROMPTS_SHORT, LLMTestCase, compare_logprobs
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Test cases – no golden_answers needed; accuracy is verified via logprob
|
||||
# comparison against an eager-mode baseline. Token 0 covers the prefill
|
||||
# forward pass; tokens 1-2 cover decode forward passes.
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
CASE_QWEN_ACLGRAPH = LLMTestCase(
|
||||
model="Qwen/Qwen3-0.6B",
|
||||
prompts=PROMPTS_SHORT,
|
||||
golden_answers=[
|
||||
" Lina. I'm a 22-year-old student from China. I'm interested in studying in the US. I'm looking for a job in the",
|
||||
" the same as the president of the United Nations. This is because the president of the United States is the same as the president of the United Nations. The president",
|
||||
" Paris. The capital of France is also the capital of the Republic of France. The capital of France is also the capital of the European Union. The capital of",
|
||||
" not just a technological challenge but a profound transformation of how we live, work, and interact with the world. As we stand at the intersection of artificial intelligence and",
|
||||
],
|
||||
)
|
||||
|
||||
CASE_DS_ACLGRAPH = LLMTestCase(
|
||||
model="vllm-ascend/DeepSeek-V2-Lite-W8A8",
|
||||
quantization="ascend",
|
||||
prompts=PROMPTS_SHORT,
|
||||
golden_answers=[
|
||||
"\nI am a 20 year old female, and I have been suffering from depression for 3 years now. I have been on medication for 2",
|
||||
" a man who has been in the public eye for decades. He has been a senator, a governor, and a businessman. He has also been married to the",
|
||||
" Paris, which is also the largest city in the country. The city is located on the River Seine and is known for its beautiful architecture, museums, and art",
|
||||
" here, and it’s not what you think.\nThe future of AI is here, and it’s not what you think.\nThe future of",
|
||||
],
|
||||
)
|
||||
|
||||
CASE_QWEN_FULL = LLMTestCase(
|
||||
model="Qwen/Qwen3-0.6B",
|
||||
prompts=PROMPTS_SHORT,
|
||||
golden_answers=[
|
||||
" Lina. I'm a 22-year-old student from China. I'm interested in studying in the US. I'm looking for a job in the",
|
||||
" the same as the president of the United Nations. This is because the president of the United States is the same as the president of the United Nations. The president",
|
||||
" Paris. The capital of France is also the capital of the Republic of France. The capital of France is also the capital of the European Union. The capital of",
|
||||
" not just a technological challenge but a profound transformation of how we live, work, and interact with the world. As we stand at the intersection of artificial intelligence and",
|
||||
],
|
||||
)
|
||||
|
||||
CASE_DS_FULL = LLMTestCase(
|
||||
model="vllm-ascend/DeepSeek-V2-Lite-W8A8",
|
||||
quantization="ascend",
|
||||
prompts=PROMPTS_SHORT,
|
||||
golden_answers=[
|
||||
"\nI am a 20 year old female, and I have been suffering from depression for 3 years now. I have been on medication for 2",
|
||||
" a man who has been in the public eye for decades. He has been a senator, a governor, and a businessman. He has also been married to the",
|
||||
" Paris, which is also the largest city in the country. The city is located on the River Seine and is known for its beautiful architecture, museums, and art",
|
||||
" here, and it’s not what you think.\nThe future of AI is here, and it’s not what you think.\nThe future of",
|
||||
],
|
||||
)
|
||||
|
||||
CASE_QWEN_FULL_DECODE_ONLY = LLMTestCase(
|
||||
model="Qwen/Qwen3-0.6B",
|
||||
prompts=PROMPTS_LONG,
|
||||
golden_answers=[
|
||||
" \n\nTo solve this problem, we need to use the Law of Sines and Law of Cosines. Let me start by drawing triangle $ABC$ with the",
|
||||
" \n\nTo solve this problem, we can use the following approach: Let $P$ be the perimeter of the square. Then, the expected value of the area",
|
||||
" \n\nTo solve this problem, we can use the following approach: Let $ \\alpha $ be the common real root of the two equations. Then, we can",
|
||||
],
|
||||
)
|
||||
|
||||
CASE_DS_FULL_DECODE_ONLY = LLMTestCase(
|
||||
model="vllm-ascend/DeepSeek-V2-Lite-W8A8",
|
||||
quantization="ascend",
|
||||
prompts=PROMPTS_LONG,
|
||||
golden_answers=[
|
||||
"\n\nSelect an assignment template",
|
||||
"\n\nI'm not sure how to approach this problem. I'm thinking that the area of the triangle is $1/2$ times the area",
|
||||
"\n\n## Answer\n\n$a + b + c = 0$\n\nSolution\n\nLet $x = \\alpha$ be the common root",
|
||||
],
|
||||
)
|
||||
|
||||
CASE_QWEN_EX = LLMTestCase(
|
||||
model="Qwen/Qwen3-0.6B",
|
||||
prompts=PROMPTS_LONG,
|
||||
golden_answers=[
|
||||
" \n\nTo solve this problem, we need to use the Law of Sines and Law of Cosines. Let me start by drawing triangle $ABC$ with the",
|
||||
" \n\nTo solve this problem, we can use the following approach: Let $P$ be the perimeter of the square. Then, the expected value of the area",
|
||||
" \n\nTo solve this problem, we can use the following approach: Let $ \\alpha $ be the common real root of the two equations. Then, we can",
|
||||
],
|
||||
)
|
||||
|
||||
CASE_DS_EX = LLMTestCase(
|
||||
model="vllm-ascend/DeepSeek-V2-Lite-W8A8",
|
||||
quantization="ascend",
|
||||
prompts=PROMPTS_LONG,
|
||||
golden_answers=[
|
||||
"\n\nSelect an assignment template",
|
||||
"\n\nI'm not sure how to approach this problem. I'm thinking that the area of the triangle is $1/2$ times the area",
|
||||
"\n\n## Answer\n\n$a + b + c = 0$\n\nSolution\n\nLet $x = \\alpha$ be the common root",
|
||||
],
|
||||
)
|
||||
|
||||
|
||||
@wait_until_npu_memory_free(0.7)
|
||||
@pytest.mark.parametrize("cur_case", [CASE_QWEN_ACLGRAPH, CASE_DS_ACLGRAPH])
|
||||
def test_piecewise_res_consistency(cur_case: LLMTestCase):
|
||||
runner_kwargs = {
|
||||
@@ -120,14 +84,10 @@ def test_piecewise_res_consistency(cur_case: LLMTestCase):
|
||||
"cudagraph_capture_sizes": [1, 2, 4, 8],
|
||||
"quantization": cur_case.quantization,
|
||||
}
|
||||
gen_and_valid(
|
||||
runner_kwargs=runner_kwargs,
|
||||
prompts=cur_case.prompts,
|
||||
sampling_params=cur_case.sampling_params,
|
||||
golden_answers=cur_case.golden_answers,
|
||||
)
|
||||
compare_logprobs(runner_kwargs=runner_kwargs, prompts=cur_case.prompts)
|
||||
|
||||
|
||||
@wait_until_npu_memory_free(0.7)
|
||||
@pytest.mark.parametrize("cur_case", [CASE_QWEN_FULL, CASE_DS_FULL])
|
||||
def test_full_res_consistency(cur_case: LLMTestCase, monkeypatch):
|
||||
monkeypatch.delenv("HCCL_OP_EXPANSION_MODE", raising=False)
|
||||
@@ -137,14 +97,10 @@ def test_full_res_consistency(cur_case: LLMTestCase, monkeypatch):
|
||||
"compilation_config": {"cudagraph_capture_sizes": [4, 8, 32, 64], "cudagraph_mode": "FULL_DECODE_ONLY"},
|
||||
"quantization": cur_case.quantization,
|
||||
}
|
||||
gen_and_valid(
|
||||
runner_kwargs=runner_kwargs,
|
||||
prompts=cur_case.prompts,
|
||||
sampling_params=cur_case.sampling_params,
|
||||
golden_answers=cur_case.golden_answers,
|
||||
)
|
||||
compare_logprobs(runner_kwargs=runner_kwargs, prompts=cur_case.prompts)
|
||||
|
||||
|
||||
@wait_until_npu_memory_free(0.7)
|
||||
@pytest.mark.parametrize("cur_case", [CASE_QWEN_FULL_DECODE_ONLY, CASE_DS_FULL_DECODE_ONLY])
|
||||
def test_full_decode_only_res_consistency(cur_case: LLMTestCase, monkeypatch):
|
||||
monkeypatch.delenv("HCCL_OP_EXPANSION_MODE", raising=False)
|
||||
@@ -155,14 +111,10 @@ def test_full_decode_only_res_consistency(cur_case: LLMTestCase, monkeypatch):
|
||||
"quantization": cur_case.quantization,
|
||||
"additional_config": {"ascend_compilation_config": {"enable_npugraph_ex": False}},
|
||||
}
|
||||
gen_and_valid(
|
||||
runner_kwargs=runner_kwargs,
|
||||
prompts=cur_case.prompts,
|
||||
sampling_params=cur_case.sampling_params,
|
||||
golden_answers=cur_case.golden_answers,
|
||||
)
|
||||
compare_logprobs(runner_kwargs=runner_kwargs, prompts=cur_case.prompts)
|
||||
|
||||
|
||||
@wait_until_npu_memory_free(0.7)
|
||||
@pytest.mark.parametrize("cur_case", [CASE_QWEN_EX, CASE_DS_EX])
|
||||
def test_npugraph_ex_res_consistency(cur_case: LLMTestCase, monkeypatch):
|
||||
monkeypatch.delenv("HCCL_OP_EXPANSION_MODE", raising=False)
|
||||
@@ -173,17 +125,13 @@ def test_npugraph_ex_res_consistency(cur_case: LLMTestCase, monkeypatch):
|
||||
"compilation_config": {"cudagraph_capture_sizes": [4, 8, 32, 64], "cudagraph_mode": "FULL_DECODE_ONLY"},
|
||||
"additional_config": {"ascend_compilation_config": {"enable_npugraph_ex": True}},
|
||||
}
|
||||
gen_and_valid(
|
||||
runner_kwargs=runner_kwargs,
|
||||
prompts=cur_case.prompts,
|
||||
sampling_params=cur_case.sampling_params,
|
||||
golden_answers=cur_case.golden_answers,
|
||||
)
|
||||
compare_logprobs(runner_kwargs=runner_kwargs, prompts=cur_case.prompts)
|
||||
|
||||
|
||||
# The accuracy has already been verified in the previous test case.
|
||||
# This test case is used to check whether the functionality works properly
|
||||
# after enabling the static kernel and whether it is uninstalled as expected.
|
||||
@wait_until_npu_memory_free(0.7)
|
||||
@pytest.mark.parametrize("cur_case", [CASE_QWEN_EX])
|
||||
def test_npugraph_ex_with_static_kernel(cur_case: LLMTestCase, monkeypatch):
|
||||
monkeypatch.delenv("HCCL_OP_EXPANSION_MODE", raising=False)
|
||||
@@ -199,14 +147,9 @@ def test_npugraph_ex_with_static_kernel(cur_case: LLMTestCase, monkeypatch):
|
||||
}
|
||||
},
|
||||
}
|
||||
gen_and_valid(
|
||||
runner_kwargs=runner_kwargs,
|
||||
prompts=cur_case.prompts,
|
||||
sampling_params=cur_case.sampling_params,
|
||||
golden_answers=cur_case.golden_answers,
|
||||
)
|
||||
compare_logprobs(runner_kwargs=runner_kwargs, prompts=cur_case.prompts)
|
||||
|
||||
# Check whether the static kernel is properly uninstall
|
||||
# Check whether the static kernel is properly uninstalled
|
||||
ascend_home_path = os.environ["ASCEND_HOME_PATH"]
|
||||
static_kernel_install_path = os.path.join(ascend_home_path, "opp/static_kernel/ai_core")
|
||||
assert not os.path.exists(static_kernel_install_path)
|
||||
|
||||
Reference in New Issue
Block a user