Prhub

#41845 [Bugfix] Fix OOM in tensorizer LoRA deserialization

原始 PR 作者 orozery 合并时间 2026-05-07 17:17 文件变更 1 提交数 3 评论 0 代码增减 +1 / -0

执行摘要

修复 tensorizer 反序列化 LoRA 时未指定设备导致 OOM

修复 CI 中 test_tp2_serialize_and_deserialize_lora 在 22 GiB GPU 上因 tensorizer 反序列化 LoRA 时直接占用 GPU 显存导致 OOM 的问题(见 Buildkite 构建 #64715 失败记录)。调用方已将 device='cpu' 传入 from_local_checkpoint,但 tensorizer 路径未透传此参数。

值得合并。修复清晰,一行变更解决明确的 OOM 问题。

讨论亮点

Code review 机器人(gemini-code-assist)确认变更正确;审核者 jeejeelee 批准,认为可修复 LoRA 失败。无实质性讨论。

实现拆解

  1. vllm/lora/lora_model.pyTensorDeserializer 构造函数调用中,添加 device=device 参数,使 LoRA 权重反序列化时使用调用方指定的设备(CPU)。
  2. 该参数由 worker_manager 在调用 from_local_checkpoint 时传入,值为 'cpu'
  3. 其他反序列化路径(如 safetensors、torch.load)已正确使用 device 参数,本次仅对齐 tensorizer 路径的行为。
文件 模块 状态 重要度
vllm/lora/lora_model.py LoRA modified 4.96

关键源码片段

vllm/lora/lora_model.py data-contract

TensorDeserializer 缺少 device 参数导致 OOM 的根源文件,修复仅在此进行。

# vllm/lora/lora_model.py 第 203-207 行
# 修复前:缺少 device 参数,TensorDeserializer 默认将张量加载到 GPU,
# 导致 KV cache 已占用显存后再度分配显存触发 OOM
# 修复后:传入 device 参数(通常为 "cpu"),由调用方 worker_manager 控制
# LoRA 权重先落 CPU,再由 LoRA manager 按内存预算移动至 GPU
tensorizer_args = tensorizer_config._construct_tensorizer_args()
tensors = TensorDeserializer(
    lora_tensor_path,
    dtype=tensorizer_config.dtype,
    device=device, # 关键修复:显式传入 device 参数
    **tensorizer_args.deserialization_kwargs,
)

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

极低风险:仅添加一个参数传递,不改变反序列化逻辑,且与其他路径行为一致。唯一的依赖是 tensorizer 库的 TensorDeserializer 支持 device 参数(已确认支持)。

影响范围小:仅影响使用 tensorizer 加载 LoRA 权重的场景(其他反序列化路径未受影响)。修复后,在显存受限的 GPU(如 22 GiB)上可正常通过 CI 测试。

低风险

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论