78 lines
2.1 KiB
Python
78 lines
2.1 KiB
Python
|
|
#!/usr/bin/env python3
|
|||
|
|
"""
|
|||
|
|
修复 CoreX 版 vLLM 0.17.0 的 Llama 4 chunked local attention bug。
|
|||
|
|
|
|||
|
|
症状(第一个真实请求时):
|
|||
|
|
TypeError: CommonAttentionMetadata.__init__() missing 2 required positional
|
|||
|
|
arguments: 'key_start_loc' and 'seq_lens_np'
|
|||
|
|
|
|||
|
|
原因:
|
|||
|
|
vllm/v1/attention/backends/utils.py 的
|
|||
|
|
make_local_attention_virtual_batches() 在构造 CommonAttentionMetadata 时
|
|||
|
|
没有传新版本 dataclass 要求的 key_start_loc / seq_lens_np。
|
|||
|
|
|
|||
|
|
本脚本幂等:已经打过补丁会直接返回 0。
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
import os
|
|||
|
|
import sys
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
import vllm
|
|||
|
|
except ImportError as e:
|
|||
|
|
print(f"ERROR: 无法 import vllm: {e}", file=sys.stderr)
|
|||
|
|
sys.exit(1)
|
|||
|
|
|
|||
|
|
TARGET = os.path.join(
|
|||
|
|
os.path.dirname(vllm.__file__),
|
|||
|
|
"v1",
|
|||
|
|
"attention",
|
|||
|
|
"backends",
|
|||
|
|
"utils.py",
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
MARKER = "seq_lens_np=seqlens_k_local"
|
|||
|
|
|
|||
|
|
OLD = """ query_start_loc=query_start_loc_cpu.to(device=device, non_blocking=True),
|
|||
|
|
seq_lens=seq_lens_cpu.to(device=device, non_blocking=True),"""
|
|||
|
|
|
|||
|
|
NEW = """ query_start_loc=query_start_loc_cpu.to(device=device, non_blocking=True),
|
|||
|
|
key_start_loc=torch.from_numpy(
|
|||
|
|
np.concatenate(
|
|||
|
|
(np.zeros(1, dtype=np.int32), np.cumsum(seqlens_k_local, dtype=np.int32))
|
|||
|
|
)
|
|||
|
|
).to(device=device, non_blocking=True),
|
|||
|
|
seq_lens=seq_lens_cpu.to(device=device, non_blocking=True),
|
|||
|
|
seq_lens_np=seqlens_k_local,"""
|
|||
|
|
|
|||
|
|
|
|||
|
|
def main() -> int:
|
|||
|
|
if not os.path.exists(TARGET):
|
|||
|
|
print(f"ERROR: 找不到目标文件: {TARGET}", file=sys.stderr)
|
|||
|
|
return 1
|
|||
|
|
|
|||
|
|
with open(TARGET, "r", encoding="utf-8") as f:
|
|||
|
|
src = f.read()
|
|||
|
|
|
|||
|
|
if MARKER in src:
|
|||
|
|
print(f"patch already applied: {TARGET}")
|
|||
|
|
return 0
|
|||
|
|
|
|||
|
|
if OLD not in src:
|
|||
|
|
print(
|
|||
|
|
"ERROR: 目标代码块未找到,vLLM 版本可能不同。\n"
|
|||
|
|
f"请手动检查: {TARGET}",
|
|||
|
|
file=sys.stderr,
|
|||
|
|
)
|
|||
|
|
return 1
|
|||
|
|
|
|||
|
|
with open(TARGET, "w", encoding="utf-8") as f:
|
|||
|
|
f.write(src.replace(OLD, NEW, 1))
|
|||
|
|
|
|||
|
|
print(f"patched: {TARGET}")
|
|||
|
|
return 0
|
|||
|
|
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
sys.exit(main())
|