vllm v0.8.5.post1 版本,在 vllm/worker/model_runner.py 中 增加了代码,感觉没有被执行。什么条件下才能执行到该代码(启动参数、请求参数、还是其它情况)
# SPDX-License-Identifier: Apache-2.0
print("=== PATCHED model_runner.py LOADED ===")
import dataclasses
import gc
import inspect
import itertools
import time
import weakref
增加 print("=== PATCHED model_runner.py LOADED ===") ,在接收到请求时,模型服务的日志中没有该内容,是没有打印?还是输出到了其它地方?
模型启动命令为
export VLLM_ATTENTION_BACKEND=FLASHINFER
export VLLM_LOGGING_LEVEL=INFO
export VLLM_LOGGING_PREFIX="[vLLM] "
nohup python3 -m vllm.entrypoints.openai.api_server --host 0.0.0.0 \
--port 8080 \
--model /models/Qwen2.5-72B-Instruct-GPTQ-Int4 \
--served-model-name Qwen2.5-72B-Instruct-GPTQ-Int4 --trust-remote-code \
--gpu-memory-utilization 0.85 \
-tp 2 \
--collect-detailed-traces model \
--rope-scaling '{"rope_type":"yarn","factor":4.0,"original_max_position_embeddings":32768}' \
--max-model-len 60000 \
--tool-call-parser hermes --enable-auto-tool-choice > vllm-$(date +%Y%m%d%H%M).log 2>&1 &
RunLLM
2
我的理解是,你在 vllm/worker/model_runner.py 文件中增加了 print("=== PATCHED model_runner.py LOADED ==="),但在模型服务日志中没有看到这行输出。根据官方文档和源码结构,model_runner.py 只有在模型加载阶段才会被 import 和执行。也就是说,只有当 vLLM 进程真正初始化模型(即执行 load_model() 等相关方法)时,这段代码才会被执行。
如果你在启动命令后日志中没有看到该 print 输出,可能原因有:1)你修改的 model_runner.py 并未被实际加载(比如 Python 环境或路径不对);2)vLLM 进程还未走到模型加载阶段就异常退出;3)日志被重定向到了其他地方(你用的是 nohup ... > vllm-$(date +%Y%m%d%H%M).log 2>&1 &,请确认日志文件内容)。此外,print 默认输出到 stdout,建议用 logger.info 以确保内容写入日志文件。
你需要确认:1)你的 Python 环境和 vLLM 路径是否正确,2)日志文件是否包含所有启动阶段的输出,3)模型是否成功加载。如果这些都没问题,理论上只要服务进程启动并加载模型,model_runner.py 的 print 语句就会被执行并出现在日志里。如需进一步排查,可在 model_runner.py 的不同位置多加几处 print 或 logger 输出,定位具体未被执行的阶段。
需要更详细的排查步骤吗?
Sources:
在 model_runner.py 的不同位置多加几处 logger 输出,均没有相应内容,应该是没有触发该代码文件的执行。查了一下,好像是需要增加一些启动参数,需要帮忙确认是哪些参数、为什么要加这些参数
RunLLM
4
根据官方文档和源码结构,model_runner.py 只有在 vLLM 启动并真正加载模型时才会被 import 和执行。如果你在不同位置加了多处 print 或 logger 输出,但日志中都没有出现,说明你的代码没有被实际执行,常见原因如下:
- Python 多进程启动方式:vLLM 使用多进程,且 worker 进程的 import 路径和主进程可能不同。务必保证你修改的
model_runner.py 是 vLLM 实际运行时加载的文件。
- if name == ‘main’:如文档所述,vLLM 相关代码必须放在
if __name__ == '__main__': 块内,否则多进程不会正确 import 你的修改。
- 环境变量/参数:一般不需要额外参数即可触发
model_runner.py,只要模型加载就会 import 并执行。除非你用的是特殊的分布式/推理模式,否则无需特殊启动参数。
- 日志输出位置:
print 默认输出到 stdout,logger 受日志级别和配置影响。建议用 logger 并设置 VLLM_LOGGING_LEVEL=DEBUG,确保日志被写入你指定的日志文件。
综上,只要模型加载,model_runner.py 就会被执行,无需特殊参数。若仍无输出,请检查 Python 环境、文件路径、日志配置和多进程启动方式。
需要更详细的排查方法吗?
Sources:
@XiaoDouGeGe vllm/worker/model_runner.py is only used for v0. now that v1 is enabled by default.
RunLLM
6
你说得对,vllm/worker/model_runner.py 只在 vLLM v0 架构下被使用。v1 架构默认启用后,相关模型加载和推理逻辑已迁移到 v1 目录下(如 vllm/v1/worker/gpu_model_runner.py 等),model_runner.py 不再被调用。
因此,如果你在 v1 默认环境下修改 vllm/worker/model_runner.py,这些更改不会生效。要调试或插桩,请直接修改 v1 相关文件(如 vllm/v1/worker/gpu_model_runner.py)。
需要详细说明 v1 代码入口和如何插桩吗?
Sources:
需要了解v1代码入口和如何插桩,以及代码层面上如何判断走v0代码入口还是v1代码入口
RunLLM
8
vLLM v1 的主要代码入口在 vllm/v1/worker/gpu_model_runner.py、vllm/v1/worker/gpu_worker.py 等文件,模型加载和推理相关逻辑都在这些文件中。插桩时,建议在这些文件的类初始化、load_model、execute_model、profile_run 等方法内添加 print 或 logger 语句,这样能捕捉到模型实际加载和推理的关键路径。
判断当前运行的是 v0 还是 v1,可以查看环境变量 VLLM_USE_V1(v1 默认启用,设置为 0 才用 v0),或在日志/代码中查找 v1 相关类(如 EngineCore、gpu_model_runner 等)的调用。如果你看到 vllm/worker/model_runner.py 被 import,说明是 v0,否则是 v1。官方文档有详细说明。
需要具体插桩代码示例或更详细的判断方法吗?
Sources: