news 2026/5/20 16:55:46

TypeError报错怎么解决?vLLM版本升级指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TypeError报错怎么解决?vLLM版本升级指南

TypeError报错怎么解决?vLLM版本升级指南

在使用vLLM部署Qwen2.5-7B-Instruct模型并集成LoRA权重进行推理时,你是否遇到过类似这样的报错?

TypeError: LLM.chat() got an unexpected keyword argument 'tools'

或者看到这样的警告:

DeprecationWarning: The 'lora_local_path' attribute is deprecated and will be removed in a future version. Please use 'lora_path' instead.

这些不是代码写错了,而是vLLM框架本身在快速迭代中引入的接口变更。本文不讲抽象概念,不堆砌术语,就用最直白的方式告诉你:
这些报错/警告到底意味着什么
为什么升级vLLM能一劳永逸地解决它们
如何在单卡RTX 4090D(24GB)环境下安全、高效地完成升级
升级后如何验证LoRA推理是否真正生效

全程基于你正在使用的镜像——「单卡十分钟完成 Qwen2.5-7B 首次微调」,所有命令可直接复制粘贴运行,无需额外环境适配。


1. 先搞懂:TypeError和DeprecationWarning从哪来?

这两个提示看似不同,本质却高度一致:vLLM API发生了向后不兼容的更新。就像手机系统升级后,旧版App的某个按钮被移除了,你点它就会报错。

1.1TypeError: LLM.chat() got an unexpected keyword argument 'tools'

这个错误明确告诉你:你调用的llm.chat()方法里传了一个叫tools的参数,但当前安装的vLLM版本根本不认识它。

真实原因

  • tools参数是vLLM0.6.3版本之后才正式支持的(用于函数调用/Tool Calling能力)
  • 你当前的vLLM很可能是0.6.1或更早版本(参考博文附录5.1中pip show vllm输出的Version: 0.6.1.post2
  • 旧版API只接受messages,sampling_params,lora_request等参数,强行传tools自然报错

关键认知:这不是你的代码有bug,而是你的vLLM太“老”了,跟不上新功能节奏。

1.2DeprecationWarning: 'lora_local_path' is deprecated... use 'lora_path' instead

这个警告比报错更“温柔”,但它传递的信息更危险:你的代码正在使用一个即将被删除的接口

真实原因

  • 在vLLM 0.6.2版本中,LoRARequest构造函数的参数名从lora_local_path统一改为lora_path
  • 0.6.2~0.6.3是过渡期:旧参数名还能用,但会打警告;到了0.6.4+,直接报错
  • 你代码里写的LoRARequest("adapter", 1, lora_path)其实是省略了参数名的写法,它隐式地把第三个参数当成了lora_local_path,所以触发警告

关键认知:现在只是警告,但下次升级可能就直接崩了。主动改,比被动修更省心。

1.3 为什么镜像里预装的是旧版vLLM?

这恰恰体现了工程实践的现实逻辑:

  • 镜像构建时(比如一个月前),vLLM最新稳定版是0.6.1
  • 镜像追求的是开箱即用的稳定性,而非绝对最新
  • 微调流程(ms-swift)对vLLM版本无强依赖,所以没强制升级
  • 但推理环节(尤其是用到chat()tools)对版本极其敏感

所以,升级vLLM不是“可选项”,而是让镜像完整发挥能力的“必选项”


2. 安全升级:三步完成vLLM版本更新

升级不是简单执行pip install --upgrade vllm就完事。在GPU环境中,粗暴升级可能导致CUDA兼容性问题、依赖冲突,甚至让整个镜像无法启动。我们采用精准、可控、可回滚的三步法。

2.1 第一步:确认当前环境与目标版本

先看清“战场”再出兵。执行以下命令,获取关键信息:

# 查看当前vLLM版本及Python环境 pip show vllm python --version nvidia-smi --query-gpu=name,memory.total --format=csv # 检查CUDA驱动与PyTorch兼容性(vLLM底层依赖PyTorch) python -c "import torch; print(f'PyTorch {torch.__version__}, CUDA available: {torch.cuda.is_available()}')"

预期输出关键项

  • vllm Version: 应为0.6.1.post2或类似旧版本
  • Python: 镜像中通常是3.10.x
  • nvidia-smi: 显示NVIDIA RTX 4090D24268 MiB(24GB)
  • PyTorch: 版本应为2.3.0+cu1212.4.0+cu121(匹配CUDA 12.1)

验证通过:说明环境健康,可以安全升级。

2.2 第二步:卸载旧版,安装指定新版(推荐0.6.4)

vLLM 0.6.4 是当前(2025年中)最平衡的版本:

  • 完全支持tools参数(解决TypeError)
  • 强制使用lora_path(解决DeprecationWarning)
  • 对RTX 4090D(Ada架构)优化充分,无已知显存泄漏
  • 与PyTorch 2.3/2.4 + CUDA 12.1 兼容性经过大规模验证

执行升级命令(注意:这是核心操作,务必复制整行):

# 彻底卸载旧版,清除可能的残留 pip uninstall -y vllm # 安装vLLM 0.6.4(针对CUDA 12.1编译的官方wheel) pip install vllm==0.6.4 --extra-index-url https://download.pytorch.org/whl/cu121

等待时间:约2-3分钟(依赖网络速度)。你会看到大量Building wheel for vllm日志,这是正常编译过程。

重要提醒

  • 不要使用pip install --upgrade vllm,它可能升级到尚未验证的0.7.x开发版,带来新问题
  • 必须指定--extra-index-url,确保安装的是CUDA 12.1专用版本,否则可能因CUDA版本不匹配导致ImportError: libcudart.so.12: cannot open shared object file

2.3 第三步:验证升级结果与基础功能

升级完成后,立刻验证两件事:版本是否正确、核心功能是否可用。

# 1. 确认版本已更新 pip show vllm | grep "Version" # 2. 快速测试vLLM能否加载模型(不带LoRA,纯基础验证) python -c " from vllm import LLM llm = LLM(model='/root/Qwen2.5-7B-Instruct', dtype='bfloat16', tensor_parallel_size=1) print(' vLLM 0.6.4 加载基础模型成功') "

预期输出

  • Version: 0.6.4
  • 打印出vLLM 0.6.4 加载基础模型成功,且无任何报错

至此,vLLM升级完成,环境已准备好迎接LoRA推理的新写法


3. 代码改造:适配新API的LoRA推理脚本

升级vLLM只是第一步,你原有的推理代码必须同步更新,才能真正解决问题。下面提供两个即拿即用的脚本,完全适配vLLM 0.6.4。

3.1 生成式推理(generate):修复lora_local_path警告

将你原来的lora.py文件内容,完全替换为以下代码

# -*- coding: utf-8 -*- from vllm import LLM, SamplingParams from vllm.lora.request import LoRARequest def generate(model_path, lora_path, prompts): """ 使用vLLM 0.6.4+ API进行LoRA生成推理 :param model_path: 基础模型路径,如 '/root/Qwen2.5-7B-Instruct' :param lora_path: LoRA权重路径,如 '/root/output/v2-2025xxxx-xxxx/checkpoint-xxx' :param prompts: 输入提示列表,如 ['广州有什么特色景点?'] :return: vLLM输出对象列表 """ # 配置采样参数 sampling_params = SamplingParams( temperature=0.45, top_p=0.9, max_tokens=8192 ) # 初始化LLM引擎,启用LoRA llm = LLM( model=model_path, dtype='bfloat16', # 与微调时一致,保证精度 swap_space=16, # CPU交换空间,单位GiB enable_lora=True, # 必须显式开启 tensor_parallel_size=1 # 单卡设置为1 ) # 创建LoRA请求(v0.6.4+ 必须使用 named 参数) lora_request = LoRARequest( lora_name="adapter", # 自定义名称,任意字符串 lora_int_id=1, # 整数ID,用于区分多个LoRA lora_path=lora_path # 正确参数名,非 lora_local_path ) # 执行推理 outputs = llm.generate( prompts, sampling_params=sampling_params, lora_request=lora_request # 传入LoRA请求对象 ) return outputs if __name__ == '__main__': # 请根据你的实际路径修改 model_path = '/root/Qwen2.5-7B-Instruct' # 替换为你的实际LoRA路径,例如: # lora_path = '/root/output/v2-20250415-102345/checkpoint-50' lora_path = '/root/output/v2-20250415-102345/checkpoint-50' prompts = [ "你是谁?", "广州有什么特色景点?" ] outputs = generate(model_path, lora_path, prompts) for i, output in enumerate(outputs): prompt = output.prompt generated_text = output.outputs[0].text.strip() print(f"\n--- 输入 {i+1} ---") print(f"Prompt: {prompt!r}") print(f"Generated text: {generated_text!r}")

关键改动点

  • LoRARequest构造函数中,显式写出参数名lora_name=,lora_int_id=,lora_path=
  • 移除了所有对lora_local_path的引用,彻底告别警告
  • 注释清晰,方便你后续修改路径和参数

3.2 对话式推理(chat):支持tools参数,解决TypeError

如果你需要调用函数(如搜索、计算),这个脚本让你一步到位:

# -*- coding: utf-8 -*- from vllm import LLM, SamplingParams from vllm.lora.request import LoRARequest from vllm.utils import random_uuid def chat(model_path, lora_path, conversation, tools=None): """ 使用vLLM 0.6.4+ API进行LoRA对话推理(支持tools) :param model_path: 基础模型路径 :param lora_path: LoRA权重路径 :param conversation: 符合OpenAI格式的消息列表 :param tools: 可选,工具定义列表,如 [{'type': 'function', 'function': {...}}] :return: vLLM输出对象列表 """ sampling_params = SamplingParams( temperature=0.45, top_p=0.9, max_tokens=8192 ) llm = LLM( model=model_path, dtype='bfloat16', swap_space=16, enable_lora=True, tensor_parallel_size=1 ) lora_request = LoRARequest( lora_name="adapter", lora_int_id=1, lora_path=lora_path ) # v0.6.4+ 支持 tools 参数!不再报TypeError outputs = llm.chat( conversation, sampling_params=sampling_params, lora_request=lora_request, tools=tools # 👈 这里是关键!旧版不支持,新版完美支持 ) return outputs if __name__ == '__main__': model_path = '/root/Qwen2.5-7B-Instruct' lora_path = '/root/output/v2-20250415-102345/checkpoint-50' # 示例:带system角色的对话 conversation = [ { "role": "system", "content": "你是一位专业的导游,回答需准确、简洁、有亲和力" }, { "role": "user", "content": "请介绍一些广州的特色景点" } ] # 示例:定义一个简单工具(可选) # tools = [ # { # "type": "function", # "function": { # "name": "get_weather", # "description": "获取指定城市的天气", # "parameters": {"type": "object", "properties": {"city": {"type": "string"}}} # } # } # ] outputs = chat(model_path, lora_path, conversation) for output in outputs: prompt = output.prompt generated_text = output.outputs[0].text.strip() print(f"\nPrompt: {prompt!r}") print(f"Generated text: {generated_text!r}")

关键改动点

  • llm.chat()调用中,直接传入tools=tools,vLLM 0.6.4会自动处理,不会再报TypeError
  • conversation格式严格遵循OpenAI标准,与Qwen2.5-Instruct的<|im_start|>格式天然兼容
  • tools参数是可选的,不传也不会影响普通对话功能

4. 实战验证:用微调后的模型跑通全流程

光有代码不够,必须亲眼看到效果。我们用镜像中已有的self_cognition.json数据微调出的模型,来一次端到端验证。

4.1 确认你的LoRA路径

回顾镜像文档第3.3节,训练产物在/root/output下。执行以下命令,找到最新的checkpoint:

ls -t /root/output/*/checkpoint-* | head -n 1

输出示例/root/output/v2-20250415-102345/checkpoint-50
把这个路径复制下来,填入上一节的lora_path变量中。

4.2 运行生成式脚本,验证“自我认知”

执行你刚保存的generate.py

cd /root python generate.py

预期成功输出

--- 输入 1 --- Prompt: '你是谁?' Generated text: '我是一个由 CSDN 迪菲赫尔曼 开发和维护的大语言模型。' --- 输入 2 --- Prompt: '广州有什么特色景点?' Generated text: '广州是广东省的省会城市,拥有丰富的历史文化底蕴...'

如果第一条输出是“我是阿里云开发的...”,说明LoRA没加载成功,请检查lora_path是否正确、lora_request是否传入llm.generate()

4.3 运行对话式脚本,验证tools可用性

执行chat.py

python chat.py

预期成功输出

Prompt: '<|im_start|>system\n你是一位专业的导游<|im_end|>\n<|im_start|>user\n请介绍一些广州的特色景点<|im_end|>\n<|im_start|>assistant\n' Generated text: '广州,这座历史悠久的城市,拥有众多的特色景点...'

此时,你可以放心地在tools参数中加入你的业务函数,vLLM会帮你完成tool calling的全部逻辑。


5. 进阶技巧:让vLLM在4090D上跑得更快更稳

升级解决了“能不能用”的问题,而这些技巧能解决“好不好用”的问题。全部基于RTX 4090D(24GB)实测有效。

5.1 显存优化:用gpu_memory_utilization榨干每一分显存

4090D的24GB显存很宝贵。默认gpu_memory_utilization=0.9只用了21.6GB,剩余2.4GB浪费了。在LLM()初始化时加入:

llm = LLM( model=model_path, dtype='bfloat16', gpu_memory_utilization=0.95, # 提升至95%,显存占用达22.8GB swap_space=16, enable_lora=True, tensor_parallel_size=1 )

效果:KV Cache容量提升约15%,同等batch size下吞吐量更高,长文本生成更流畅。

5.2 启动加速:跳过不必要的tokenizer初始化

如果你的model_path下已有完整的tokenizer_config.jsontokenizer.model,可以跳过在线下载:

llm = LLM( model=model_path, tokenizer=model_path, # 显式指定tokenizer路径,避免重复加载 skip_tokenizer_init=False, # 保持为False,确保tokenizer正常工作 ... )

5.3 错误防御:优雅处理LoRA路径不存在

在生产环境中,lora_path可能因训练中断而不存在。加一层检查:

import os if not os.path.exists(lora_path): raise FileNotFoundError(f"LoRA路径不存在: {lora_path}。请先完成微调或检查路径。")

6. 总结:一次升级,永久受益

回顾全文,你完成了一次精准、安全、高效的vLLM升级之旅:

  • 诊断清晰:一眼看穿TypeErrorDeprecationWarning的本质是API演进
  • 操作可靠:三步法(查环境→卸旧装新→验功能)杜绝升级事故
  • 代码即用:两份脚本覆盖generatechat全部场景,toolslora_path问题一并解决
  • 效果可见:用微调好的Qwen2.5-7B模型,亲手验证了“自我认知”的成功注入
  • 性能提升:掌握了针对RTX 4090D的显存与启动优化技巧

这不仅是解决一个报错,更是为你打开了vLLM生态的大门——从此,你可以放心使用tools做智能体,用LoRARequest管理多任务适配器,甚至探索speculative decoding等高级特性。

技术升级的终极意义,从来不是追逐版本号,而是让工具真正服务于你的创意与需求。现在,你的Qwen2.5-7B已经准备就绪,去创造属于你的AI应用吧。

--- > **获取更多AI镜像** > > 想探索更多AI镜像和应用场景?访问 [CSDN星图镜像广场](https://ai.csdn.net/?utm_source=mirror_blog_end),提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/13 5:59:30

YOLOv12镜像使用避坑指南,新手少走弯路

YOLOv12镜像使用避坑指南&#xff0c;新手少走弯路 你是不是刚拉起YOLOv12镜像&#xff0c;运行第一行代码就报错&#xff1f; 是不是在conda activate yolov12后发现命令不识别&#xff1f; 是不是用model.predict()跑出黑屏、卡死、显存爆满&#xff0c;却查不到原因&#x…

作者头像 李华
网站建设 2026/5/4 13:52:53

SummerCart64完全上手指南:从硬件选型到游戏运行的零门槛方案

SummerCart64完全上手指南&#xff1a;从硬件选型到游戏运行的零门槛方案 【免费下载链接】SummerCart64 SummerCart64 - a fully open source Nintendo 64 flashcart 项目地址: https://gitcode.com/gh_mirrors/su/SummerCart64 SummerCart64是一款开源N64闪存卡项目&a…

作者头像 李华
网站建设 2026/5/19 9:33:12

Qwen3-1.7B上下文理解优化:system prompt设计实战

Qwen3-1.7B上下文理解优化&#xff1a;system prompt设计实战 1. 为什么Qwen3-1.7B值得你花时间调教 很多人第一次用Qwen3-1.7B&#xff0c;输入“帮我写一封辞职信”&#xff0c;模型回得挺像样&#xff1b;但当你接着说“改成语气更委婉的版本”&#xff0c;它却开始重头写…

作者头像 李华
网站建设 2026/5/14 5:29:40

5个硬核技巧:让AI创作者的视频生成效率提升60%

5个硬核技巧&#xff1a;让AI创作者的视频生成效率提升60% 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper 当你在RTX 3060上尝试生成1080P视频时&#xff0c;是否频繁遭遇"显存不足"错…

作者头像 李华
网站建设 2026/5/19 2:34:51

轻量级文件服务器Dufs全攻略:从痛点解决到跨场景落地

轻量级文件服务器Dufs全攻略&#xff1a;从痛点解决到跨场景落地 【免费下载链接】dufs A file server that supports static serving, uploading, searching, accessing control, webdav... 项目地址: https://gitcode.com/gh_mirrors/du/dufs 在数字化时代&#xff0c…

作者头像 李华