-
-
Save HDCharles/76c01a7ad64600426e466644007bc411 to your computer and use it in GitHub Desktop.
| """Repro: W2A8 humming GEMM produces NaN at large shape_m on SM90. | |
| The NaN only appears at shape_m >= some threshold (around 16384 in vllm's | |
| profiling run). Smaller batch sizes used during CUDA graph capture (1-512) | |
| pass fine, which is why earlier repros missed this. | |
| """ | |
| import subprocess | |
| import sys | |
| TEST_SCRIPT = ''' | |
| import json, torch | |
| from humming import dtypes | |
| from humming.forward import humming_forward | |
| from humming.schema.humming import HummingWeightSchema, HummingInputSchema | |
| from humming.transform import prepare_layer_config, transform_humming_tensors | |
| num_bits, shape_n, shape_k, group_size, has_zp, batch_size = {bits}, {n}, {k}, {gs}, {zp}, {bs} | |
| schema = HummingWeightSchema( | |
| b_dtype=dtypes.DataType.from_str(f"uint{{num_bits}}"), | |
| weight_scale_group_size=group_size, has_zero_point=has_zp) | |
| input_schema = HummingInputSchema(a_dtype=dtypes.int8) | |
| config = prepare_layer_config( | |
| shape_n=shape_n, shape_k=shape_k, | |
| weight_schema=schema, input_schema=input_schema, | |
| pad_n_to_multiple=256, pad_k_to_multiple=128, | |
| torch_dtype=torch.bfloat16) | |
| packed_k = shape_k * num_bits // 32 | |
| num_groups = shape_k // group_size | |
| tensors = {{ | |
| "weight": torch.randint(0, 255, (shape_n, packed_k), dtype=torch.int32, device="cuda"), | |
| "weight_scale": torch.randn(shape_n, num_groups, dtype=torch.bfloat16, device="cuda"), | |
| }} | |
| if has_zp: | |
| packed_n = shape_n * num_bits // 32 | |
| tensors["zero_point"] = torch.zeros(packed_n, num_groups, dtype=torch.int32, device="cuda") | |
| torch.cuda.synchronize() | |
| result = transform_humming_tensors(config, tensors) | |
| torch.cuda.synchronize() | |
| x = torch.randn(batch_size, shape_k, dtype=torch.bfloat16, device="cuda") | |
| locks = torch.zeros(1024, dtype=torch.int32, device="cuda") | |
| cc = json.dumps({{"use_batch_invariant": False, "use_f16_accum": False, "gemm_type": "dense"}}) | |
| out = humming_forward(config, inputs=x, weight=result["weight"], | |
| weight_scale=result.get("weight_scale"), zero_point=result.get("zero_point"), | |
| bias=None, weight_scale_2=result.get("weight_scale_2"), locks=locks, compute_config=cc) | |
| torch.cuda.synchronize() | |
| has_nan = out.isnan().any().item() | |
| has_inf = out.isinf().any().item() | |
| print(f"OK nan={{has_nan}} inf={{has_inf}}") | |
| ''' | |
| def run(bits, n, k, gs, zp, bs): | |
| script = TEST_SCRIPT.format(bits=bits, n=n, k=k, gs=gs, zp=zp, bs=bs) | |
| r = subprocess.run([sys.executable, "-c", script], | |
| capture_output=True, text=True, timeout=120) | |
| lines = r.stdout.strip().split("\n") if r.stdout.strip() else [] | |
| err = r.stderr.strip().split("\n")[-1] if r.stderr.strip() else "" | |
| return lines[-1] if lines else err[:100] | |
| print("=== W2A8 gate_up_proj (n=28672 k=4096) varying shape_m ===") | |
| for bs in [1, 4, 16, 64, 256, 512, 1024, 2048, 4096, 8192, 16384]: | |
| result = run(2, 28672, 4096, 128, False, bs) | |
| print(f" shape_m={bs:6d} -> {result}") | |
| print("\n=== W2A8 qkv_proj (n=6144 k=4096) varying shape_m ===") | |
| for bs in [1, 4, 16, 64, 256, 512, 1024, 2048, 4096, 8192, 16384]: | |
| result = run(2, 6144, 4096, 128, False, bs) | |
| print(f" shape_m={bs:6d} -> {result}") | |
| print("\n=== All even-bit WNA8 at n=28672 shape_m=16384 ===") | |
| for bits in [2, 4, 6, 8]: | |
| result = run(bits, 28672, 4096, 128, False, 16384) | |
| print(f" W{bits}A8 -> {result}") | |
| print("\n=== Narrow threshold for W2A8 n=28672 ===") | |
| for bs in [4096, 5120, 6144, 7168, 8192, 10240, 12288, 14336, 16384]: | |
| result = run(2, 28672, 4096, 128, False, bs) | |
| print(f" shape_m={bs:6d} -> {result}") |
| """Narrow down which shape_m values trigger cuFuncSetAttribute for W6A8asym.""" | |
| import subprocess | |
| import sys | |
| TEST_SCRIPT = ''' | |
| import json, torch | |
| from humming import dtypes | |
| from humming.forward import humming_forward | |
| from humming.schema.humming import HummingWeightSchema, HummingInputSchema | |
| from humming.transform import prepare_layer_config, transform_humming_tensors | |
| num_bits, shape_n, shape_k, group_size, has_zp, batch_size = {bits}, {n}, {k}, {gs}, {zp}, {bs} | |
| schema = HummingWeightSchema( | |
| b_dtype=dtypes.DataType.from_str(f"uint{{num_bits}}"), | |
| weight_scale_group_size=group_size, has_zero_point=has_zp) | |
| input_schema = HummingInputSchema(a_dtype=dtypes.int8) | |
| config = prepare_layer_config( | |
| shape_n=shape_n, shape_k=shape_k, | |
| weight_schema=schema, input_schema=input_schema, | |
| pad_n_to_multiple=256, pad_k_to_multiple=128, | |
| torch_dtype=torch.bfloat16) | |
| packed_k = shape_k * num_bits // 32 | |
| num_groups = shape_k // group_size | |
| tensors = {{ | |
| "weight": torch.randint(0, 255, (shape_n, packed_k), dtype=torch.int32, device="cuda"), | |
| "weight_scale": torch.randn(shape_n, num_groups, dtype=torch.bfloat16, device="cuda"), | |
| }} | |
| if has_zp: | |
| packed_n = shape_n * num_bits // 32 | |
| tensors["zero_point"] = torch.zeros(packed_n, num_groups, dtype=torch.int32, device="cuda") | |
| torch.cuda.synchronize() | |
| result = transform_humming_tensors(config, tensors) | |
| torch.cuda.synchronize() | |
| x = torch.randn(batch_size, shape_k, dtype=torch.bfloat16, device="cuda") | |
| locks = torch.zeros(1024, dtype=torch.int32, device="cuda") | |
| cc = json.dumps({{"use_batch_invariant": False, "use_f16_accum": False, "gemm_type": "dense"}}) | |
| out = humming_forward(config, inputs=x, weight=result["weight"], | |
| weight_scale=result.get("weight_scale"), zero_point=result.get("zero_point"), | |
| bias=None, weight_scale_2=result.get("weight_scale_2"), locks=locks, compute_config=cc) | |
| torch.cuda.synchronize() | |
| has_nan = out.isnan().any().item() | |
| print(f"OK nan={{has_nan}}") | |
| ''' | |
| # Test 1: narrow range around bs=32 for W6A8asym at n=6144 | |
| print("=== W6A8asym n=6144 k=4096: fine-grained shape_m sweep ===") | |
| for bs in range(16, 65): | |
| script = TEST_SCRIPT.format(bits=6, n=6144, k=4096, gs=128, zp=True, bs=bs) | |
| r = subprocess.run( | |
| [sys.executable, "-c", script], | |
| capture_output=True, text=True, timeout=60, | |
| ) | |
| stdout_lines = r.stdout.strip().split("\n") if r.stdout.strip() else [] | |
| stderr_last = r.stderr.strip().split("\n")[-1] if r.stderr.strip() else "" | |
| result = stdout_lines[-1] if stdout_lines else stderr_last[:100] | |
| status = "PASS" if "OK" in result else "FAIL" | |
| print(f" bs={bs:3d} -> {status} {result[:80]}") | |
| # Test 2: does symmetric W6A8 also fail at bs=32? | |
| print("\n=== W6A8 symmetric n=6144 k=4096 bs=32 ===") | |
| script = TEST_SCRIPT.format(bits=6, n=6144, k=4096, gs=128, zp=False, bs=32) | |
| r = subprocess.run([sys.executable, "-c", script], capture_output=True, text=True, timeout=60) | |
| out = r.stdout.strip().split("\n")[-1] if r.stdout.strip() else r.stderr.strip().split("\n")[-1][:100] | |
| print(f" W6A8 sym bs=32 -> {out}") | |
| # Test 3: do other bit widths also fail at bs=32? | |
| print("\n=== Various WNA8asym at n=6144 k=4096 bs=32 ===") | |
| for bits in [2, 3, 4, 5, 6, 7, 8]: | |
| script = TEST_SCRIPT.format(bits=bits, n=6144, k=4096, gs=128, zp=True, bs=32) | |
| r = subprocess.run([sys.executable, "-c", script], capture_output=True, text=True, timeout=60) | |
| out = r.stdout.strip().split("\n")[-1] if r.stdout.strip() else r.stderr.strip().split("\n")[-1][:100] | |
| print(f" W{bits}A8asym bs=32 -> {out}") | |
| # Test 4: other shapes at bs=32 | |
| print("\n=== W6A8asym bs=32 at all Llama3 shapes ===") | |
| for name, n, k in [("qkv", 6144, 4096), ("o", 4096, 4096), ("gate_up", 28672, 4096), ("down", 4096, 14336)]: | |
| script = TEST_SCRIPT.format(bits=6, n=n, k=k, gs=128, zp=True, bs=32) | |
| r = subprocess.run([sys.executable, "-c", script], capture_output=True, text=True, timeout=60) | |
| out = r.stdout.strip().split("\n")[-1] if r.stdout.strip() else r.stderr.strip().split("\n")[-1][:100] | |
| print(f" {name:8s} n={n:5d} k={k:5d} -> {out}") |
| """Test each WNA8 config in a separate subprocess to avoid GPU error contamination.""" | |
| import subprocess | |
| import sys | |
| TEST_SCRIPT = ''' | |
| import json, sys, torch | |
| from humming import dtypes | |
| from humming.forward import humming_forward | |
| from humming.schema.humming import HummingWeightSchema, HummingInputSchema | |
| from humming.transform import prepare_layer_config, transform_humming_tensors | |
| num_bits, shape_n, shape_k, group_size, has_zp = {bits}, {n}, {k}, {gs}, {zp} | |
| schema = HummingWeightSchema( | |
| b_dtype=dtypes.DataType.from_str(f"uint{{num_bits}}"), | |
| weight_scale_group_size=group_size, has_zero_point=has_zp) | |
| input_schema = HummingInputSchema(a_dtype=dtypes.int8) | |
| config = prepare_layer_config( | |
| shape_n=shape_n, shape_k=shape_k, | |
| weight_schema=schema, input_schema=input_schema, | |
| pad_n_to_multiple=256, pad_k_to_multiple=128, | |
| torch_dtype=torch.bfloat16) | |
| packed_k = shape_k * num_bits // 32 | |
| num_groups = shape_k // group_size | |
| tensors = {{ | |
| "weight": torch.randint(0, 255, (shape_n, packed_k), dtype=torch.int32, device="cuda"), | |
| "weight_scale": torch.randn(shape_n, num_groups, dtype=torch.bfloat16, device="cuda"), | |
| }} | |
| if has_zp: | |
| packed_n = shape_n * num_bits // 32 | |
| tensors["zero_point"] = torch.zeros(packed_n, num_groups, dtype=torch.int32, device="cuda") | |
| torch.cuda.synchronize() | |
| result = transform_humming_tensors(config, tensors) | |
| torch.cuda.synchronize() | |
| x = torch.randn(4, shape_k, dtype=torch.bfloat16, device="cuda") | |
| locks = torch.zeros(1024, dtype=torch.int32, device="cuda") | |
| cc = json.dumps({{"use_batch_invariant": False, "use_f16_accum": False, "gemm_type": "dense"}}) | |
| out = humming_forward(config, inputs=x, weight=result["weight"], | |
| weight_scale=result.get("weight_scale"), zero_point=result.get("zero_point"), | |
| bias=None, weight_scale_2=result.get("weight_scale_2"), locks=locks, compute_config=cc) | |
| torch.cuda.synchronize() | |
| has_nan = out.isnan().any().item() | |
| print(f"OK nan={{has_nan}}") | |
| ''' | |
| def run_test(bits, n, k, gs=128, zp=False): | |
| script = TEST_SCRIPT.format(bits=bits, n=n, k=k, gs=gs, zp=zp) | |
| r = subprocess.run( | |
| [sys.executable, "-c", script], | |
| capture_output=True, text=True, timeout=30, | |
| ) | |
| out = (r.stdout + r.stderr).strip().split("\n")[-1] | |
| return out | |
| # Llama 3 8B layer shapes that vllm creates (after merging) | |
| print("=== W5A8 per vllm-merged shape ===") | |
| shapes = [ | |
| ("qkv_proj", 6144, 4096), | |
| ("o_proj", 4096, 4096), | |
| ("gate_up_proj", 28672, 4096), | |
| ("down_proj", 4096, 14336), | |
| ] | |
| for name, n, k in shapes: | |
| for zp in [False, True]: | |
| label = f"{name}{'_zp' if zp else ''}" | |
| r = run_test(5, n, k, zp=zp) | |
| print(f" {label:22s} n={n:5d} k={k:5d} -> {r[:80]}") | |
| # Sweep bit widths at the problematic gate_up shape | |
| print("\n=== Varying bits at n=28672 k=4096 ===") | |
| for bits in [2, 3, 4, 5, 6, 7, 8]: | |
| r = run_test(bits, 28672, 4096) | |
| print(f" W{bits}A8 -> {r[:80]}") | |
| # Sweep shape_n for W5A8 | |
| print("\n=== W5A8 sweep shape_n (k=4096) ===") | |
| for n in [256, 1024, 4096, 6144, 8192, 14336, 16384, 28672]: | |
| r = run_test(5, n, 4096) | |
| print(f" n={n:6d} -> {r[:80]}") |
Command: run python repro_w6a8asym_narrow.py
Reserved 1 GPU(s): [1] for command execution
=== W6A8asym n=6144 k=4096: fine-grained shape_m sweep ===
bs= 16 -> PASS OK nan=False
bs= 17 -> PASS OK nan=False
bs= 18 -> PASS OK nan=False
bs= 19 -> PASS OK nan=False
bs= 20 -> PASS OK nan=False
bs= 21 -> PASS OK nan=False
bs= 22 -> PASS OK nan=False
bs= 23 -> PASS OK nan=False
bs= 24 -> PASS OK nan=False
bs= 25 -> FAIL RuntimeError: check_curesult, /project/humming/csrc/launcher/././utils.h:11, cuF
bs= 26 -> FAIL RuntimeError: check_curesult, /project/humming/csrc/launcher/././utils.h:11, cuF
bs= 27 -> FAIL RuntimeError: check_curesult, /project/humming/csrc/launcher/././utils.h:11, cuF
bs= 28 -> FAIL RuntimeError: check_curesult, /project/humming/csrc/launcher/././utils.h:11, cuF
bs= 29 -> FAIL RuntimeError: check_curesult, /project/humming/csrc/launcher/././utils.h:11, cuF
bs= 30 -> FAIL RuntimeError: check_curesult, /project/humming/csrc/launcher/././utils.h:11, cuF
bs= 31 -> FAIL RuntimeError: check_curesult, /project/humming/csrc/launcher/././utils.h:11, cuF
bs= 32 -> FAIL RuntimeError: check_curesult, /project/humming/csrc/launcher/././utils.h:11, cuF
bs= 33 -> PASS OK nan=False
bs= 34 -> PASS OK nan=False
bs= 35 -> PASS OK nan=False
bs= 36 -> PASS OK nan=False
bs= 37 -> PASS OK nan=False
bs= 38 -> PASS OK nan=False
bs= 39 -> PASS OK nan=False
bs= 40 -> PASS OK nan=False
bs= 41 -> PASS OK nan=False
bs= 42 -> PASS OK nan=False
bs= 43 -> PASS OK nan=False
bs= 44 -> PASS OK nan=False
bs= 45 -> PASS OK nan=False
bs= 46 -> PASS OK nan=False
bs= 47 -> PASS OK nan=False
bs= 48 -> PASS OK nan=False
bs= 49 -> PASS OK nan=False
bs= 50 -> PASS OK nan=False
bs= 51 -> PASS OK nan=False
bs= 52 -> PASS OK nan=False
bs= 53 -> PASS OK nan=False
bs= 54 -> PASS OK nan=False
bs= 55 -> PASS OK nan=False
bs= 56 -> PASS OK nan=False
bs= 57 -> PASS OK nan=False
bs= 58 -> PASS OK nan=False
bs= 59 -> PASS OK nan=False
bs= 60 -> PASS OK nan=False
bs= 61 -> PASS OK nan=False
bs= 62 -> PASS OK nan=False
bs= 63 -> PASS OK nan=False
bs= 64 -> PASS OK nan=False
=== W6A8 symmetric n=6144 k=4096 bs=32 ===
W6A8 sym bs=32 -> RuntimeError: check_curesult, /project/humming/csrc/launcher/././utils.h:11, cuFuncSetAttribute fail
=== Various WNA8asym at n=6144 k=4096 bs=32 ===
W2A8asym bs=32 -> OK nan=False
W3A8asym bs=32 -> OK nan=False
W4A8asym bs=32 -> OK nan=False
W5A8asym bs=32 -> OK nan=False
W6A8asym bs=32 -> RuntimeError: check_curesult, /project/humming/csrc/launcher/././utils.h:11, cuFuncSetAttribute fail
W7A8asym bs=32 -> OK nan=False
W8A8asym bs=32 -> nvrtc_compile: compile failed: NVRTC_ERROR_COMPILATION
=== W6A8asym bs=32 at all Llama3 shapes ===
qkv n= 6144 k= 4096 -> RuntimeError: check_curesult, /project/humming/csrc/launcher/././utils.h:11, cuFuncSetAttribute fail
o n= 4096 k= 4096 -> OK nan=False
gate_up n=28672 k= 4096 -> RuntimeError: check_curesult, /project/humming/csrc/launcher/././utils.h:11, cuFuncSetAttribute fail
down n= 4096 k=14336 -> OK nan=False
Command: uv pip list
Using Python 3.12.13 environment at: /home/HDCharles/vllm
Package Version Editable project location
absl-py 2.5.0
accelerate 1.14.0
aiohappyeyeballs 2.7.1
aiohttp 3.14.3
aiosignal 1.4.0
annotated-doc 0.0.5
annotated-types 0.8.0
anthropic 0.121.0
anyio 4.14.2
apache-tvm-ffi 0.1.11
astor 0.8.1
attrs 26.1.0
av 18.0.0
blake3 1.0.9
cachetools 7.1.7
cbor2 6.1.4
certifi 2026.7.22
cffi 2.1.1
chardet 6.0.0.post1
charset-normalizer 3.4.9
click 8.4.2
cloudpickle 3.1.2
colorama 0.4.6
compressed-tensors 0.17.0
contourpy 1.3.3
cryptography 50.0.0
cuda-bindings 13.3.1
cuda-core 1.0.1
cuda-pathfinder 1.6.0
cuda-python 13.3.1
cuda-tile 1.6.0rc6
cuda-toolkit 13.0.3.0
cupy-cuda12x 14.1.1
cycler 0.12.1
dataproperty 1.1.1
datasets 5.0.1
defusedxml 0.7.1
depyf 0.20.0
detect-installer 0.1.0
dill 0.4.1
diskcache 5.6.3
distro 1.9.0
dnspython 2.8.0
docstring-parser 0.18.0
einops 0.8.2
email-validator 2.3.0
evaluate 0.4.6
fastapi 0.136.3
fastapi-cli 0.0.32
fastapi-cloud-cli 0.23.0
fastar 0.11.0
fastsafetensors 0.3.3
filelock 3.32.2
flashinfer-cubin 0.6.16.post3
flashinfer-python 0.6.16.post3
fonttools 4.63.0
frozenlist 1.8.0
fsspec 2026.6.0
gguf 0.19.0
googleapis-common-protos 1.75.1
grpcio 1.83.0
grpcio-reflection 1.81.1
h11 0.16.0
hf-xet 1.6.0
httpcore 1.0.9
httpcore2 2.10.0
httptools 0.8.0
httpx 0.28.1
httpx2 2.10.0
huggingface-hub 1.27.0
humming-kernels 0.1.12
idna 3.18
ijson 3.5.1
iniconfig 2.3.0
interegular 0.3.3
jinja2 3.1.6
jiter 0.16.0
jmespath 1.1.0
joblib 1.5.3
jsonschema 4.26.0
jsonschema-specifications 2025.9.1
kiwisolver 1.5.0
lark 1.2.2
llguidance 1.7.6
llvmlite 0.47.0
lm-eval 0.4.12
lm-format-enforcer 0.11.3
loguru 0.7.3
lxml 6.1.1
markdown-it-py 4.2.0
markupsafe 3.0.3
matplotlib 3.11.1
mbstrdecoder 1.1.5
mcp 2.0.0
mcp-types 2.0.0
mdurl 0.1.2
mistral-common 1.11.7
ml-dtypes 0.5.4
model-hosting-container-standards 0.1.16
more-itertools 11.1.0
mpmath 1.3.0
msgpack 1.2.1
msgspec 0.21.1
multidict 6.7.1
multiprocess 0.70.19
narwhals 2.24.0
nccl4py 0.3.1
networkx 3.6.1
ninja 1.13.0
nltk 3.10.2
numba 0.65.0
numpy 2.2.6
nvidia-cublas 13.1.1.3
nvidia-cuda-cccl 13.3.4.1.2rc1
nvidia-cuda-crt 13.4.46rc1
nvidia-cuda-cupti 13.0.85
nvidia-cuda-nvcc 13.4.46rc1
nvidia-cuda-nvdisasm 13.3.73
nvidia-cuda-nvrtc 13.0.88
nvidia-cuda-runtime 13.0.96
nvidia-cudnn-cu13 9.20.0.48
nvidia-cudnn-frontend 1.27.0
nvidia-cufft 12.0.0.61
nvidia-cufile 1.15.1.6
nvidia-curand 10.4.0.35
nvidia-cusolver 12.0.4.66
nvidia-cusparse 12.6.3.3
nvidia-cusparselt-cu13 0.8.1
nvidia-cutlass-dsl 4.6.2
nvidia-cutlass-dsl-libs-base 4.6.2
nvidia-cutlass-dsl-libs-core 4.6.2
nvidia-cutlass-dsl-libs-cu12 4.6.2
nvidia-cutlass-dsl-libs-cu13 4.6.2
nvidia-ml-py 13.610.43
nvidia-nccl-cu13 2.29.7
nvidia-nvjitlink 13.4.46rc1
nvidia-nvshmem-cu13 3.4.5
nvidia-nvtx 13.0.85
nvidia-nvvm 13.4.46rc1
nvtx 0.2.15
openai 2.53.0
openai-harmony 0.0.8
opencv-python-headless 5.0.0.93
opentelemetry-api 1.44.0
opentelemetry-exporter-otlp 1.44.0
opentelemetry-exporter-otlp-proto-common 1.44.0
opentelemetry-exporter-otlp-proto-grpc 1.44.0
opentelemetry-exporter-otlp-proto-http 1.44.0
opentelemetry-proto 1.44.0
opentelemetry-sdk 1.44.0
opentelemetry-semantic-conventions 0.65b0
opentelemetry-semantic-conventions-ai 0.5.1
outlines-core 0.2.14
packaging 26.3
pandas 3.0.5
partial-json-parser 0.2.1.1.post7
pathvalidate 3.3.1
pillow 12.3.0
pluggy 1.6.0
portalocker 4.1.0
prometheus-client 0.26.0
prometheus-fastapi-instrumentator 8.1.0
propcache 0.5.2
protobuf 6.33.6
psutil 7.2.2
py-cpuinfo 9.0.0
pyarrow 25.0.1
pybase64 1.5.0
pycountry 26.2.16
pycparser 3.0
pydantic 2.13.4
pydantic-core 2.46.4
pydantic-extra-types 2.11.1
pydantic-settings 2.15.0
pygments 2.20.0
pyjwt 2.13.0
pynvvideocodec 2.0.4
pyparsing 3.3.2
pytablewriter 1.2.1
pytest 9.1.1
python-dateutil 2.9.0.post0
python-dotenv 1.2.2
python-json-logger 4.1.0
python-multipart 0.0.32
pytz 2026.3.post1
pyyaml 6.0.3
pyzmq 27.1.0
quack-kernels 0.6.4
qwen-vl-utils 0.0.14
ray 2.56.1
referencing 0.37.0
regex 2026.7.19
requests 2.34.2
rich 15.0.0
rich-toolkit 0.20.3
rignore 0.8.1
rouge-score 0.1.2
rpds-py 2026.6.3
sacrebleu 2.6.0
safetensors 0.8.0
scikit-learn 1.9.0
scipy 1.18.0
sentencepiece 0.2.2
sentry-sdk 2.67.1
setproctitle 1.3.7
setuptools 78.1.0
shellingham 1.5.4
six 1.17.0
sniffio 1.3.1
sqlitedict 2.1.0
sse-starlette 3.4.8
starlette 1.6.0
supervisor 4.3.0
sympy 1.14.0
tabledata 1.3.5
tabulate 0.10.0
tblib 3.2.2
tcolorpy 0.1.7
threadpoolctl 3.6.0
tiktoken 0.13.0
tilelang 0.1.12
tokenizers 0.22.2
tokenspeed-mla 0.1.8
tokenspeed-triton 3.8.10.post20260721
torch 2.13.0+cu130
torch-c-dlpack-ext 0.1.5
torchaudio 2.11.0+cu130
torchcodec 0.15.0+cu130
torchvision 0.28.0+cu130
tqdm 4.70.0
transformers 5.15.0
triton 3.7.1
truststore 0.10.4
typepy 1.3.5
typer 0.27.1
typing-extensions 4.16.0
typing-inspection 0.4.3
urllib3 2.7.0
uvicorn 0.52.1
uvloop 0.22.1
vllm 0.26.1rc1.dev577+g2ef1d6f4d.precompiled /home/HDCharles/repos/vllm
watchfiles 1.2.0
websockets 17.0.1
word2number 1.1
xgrammar 0.2.3
xxhash 3.8.1
yarl 1.24.5
z3-solver 4.15.4.0
Command: run python repro_w2a8_large_m.py
Reserved 1 GPU(s): [0] for command execution
=== W2A8 gate_up_proj (n=28672 k=4096) varying shape_m ===
shape_m= 1 -> OK nan=False inf=False
shape_m= 4 -> OK nan=False inf=False
shape_m= 16 -> OK nan=False inf=False
shape_m= 64 -> OK nan=False inf=False
shape_m= 256 -> OK nan=False inf=False
shape_m= 512 -> OK nan=False inf=False
shape_m= 1024 -> OK nan=False inf=False
shape_m= 2048 -> OK nan=False inf=False
shape_m= 4096 -> OK nan=False inf=False
shape_m= 8192 -> OK nan=False inf=False
shape_m= 16384 -> OK nan=True inf=False
=== W2A8 qkv_proj (n=6144 k=4096) varying shape_m ===
shape_m= 1 -> OK nan=False inf=False
shape_m= 4 -> OK nan=False inf=False
shape_m= 16 -> OK nan=False inf=False
shape_m= 64 -> OK nan=False inf=False
shape_m= 256 -> OK nan=False inf=False
shape_m= 512 -> OK nan=False inf=False
shape_m= 1024 -> OK nan=False inf=False
shape_m= 2048 -> OK nan=False inf=False
shape_m= 4096 -> OK nan=False inf=False
shape_m= 8192 -> OK nan=False inf=False
shape_m= 16384 -> OK nan=True inf=False
=== All even-bit WNA8 at n=28672 shape_m=16384 ===
W2A8 -> OK nan=True inf=False
W4A8 -> OK nan=True inf=False
W6A8 -> OK nan=True inf=False
W8A8 -> OK nan=True inf=True
=== Narrow threshold for W2A8 n=28672 ===
shape_m= 4096 -> OK nan=False inf=False
shape_m= 5120 -> OK nan=False inf=False
shape_m= 6144 -> OK nan=False inf=False
shape_m= 7168 -> OK nan=False inf=False
shape_m= 8192 -> OK nan=False inf=False
shape_m= 10240 -> OK nan=True inf=True
shape_m= 12288 -> OK nan=False inf=False
shape_m= 14336 -> OK nan=True inf=False
shape_m= 16384 -> OK nan=False inf=False
Command: run python repro_wna8_isolated.py
Reserved 1 GPU(s): [0] for command execution
=== W5A8 per vllm-merged shape ===
qkv_proj n= 6144 k= 4096 -> OK nan=False
qkv_proj_zp n= 6144 k= 4096 -> OK nan=False
o_proj n= 4096 k= 4096 -> OK nan=False
o_proj_zp n= 4096 k= 4096 -> OK nan=False
gate_up_proj n=28672 k= 4096 -> For debugging consider passing CUDA_LAUNCH_BLOCKING=1
gate_up_proj_zp n=28672 k= 4096 -> OK nan=False
down_proj n= 4096 k=14336 -> OK nan=False
down_proj_zp n= 4096 k=14336 -> OK nan=False
=== Varying bits at n=28672 k=4096 ===
W2A8 -> OK nan=False
W3A8 -> For debugging consider passing CUDA_LAUNCH_BLOCKING=1
W4A8 -> OK nan=False
W5A8 -> For debugging consider passing CUDA_LAUNCH_BLOCKING=1
W6A8 -> OK nan=False
W7A8 -> For debugging consider passing CUDA_LAUNCH_BLOCKING=1
W8A8 -> OK nan=False
=== W5A8 sweep shape_n (k=4096) ===
n= 256 -> OK nan=False
n= 1024 -> OK nan=False
n= 4096 -> OK nan=False
n= 6144 -> OK nan=False
n= 8192 -> OK nan=False
n= 14336 -> OK nan=False
n= 16384 -> For debugging consider passing CUDA_LAUNCH_BLOCKING=1
n= 28672 -> For debugging consider passing CUDA_LAUNCH_BLOCKING=1