Files
notes/resource/ai/大模型安装笔记/003 vllm 启动日志.md
T
Docker7530 e4a339bd77 1774597379
2026-03-27 15:43:03 +08:00

14 KiB
Raw Blame History

(APIServer pid=17207) INFO 03-24 13:28:31 [api_server.py:580] Starting vLLM server on http://0.0.0.0:6006
(APIServer pid=17207) INFO 03-24 13:28:31 [launcher.py:37] Available routes are:
(APIServer pid=17207) INFO 03-24 13:28:31 [launcher.py:46] Route: /openapi.json, Methods: HEAD, GET
(APIServer pid=17207) INFO 03-24 13:28:31 [launcher.py:46] Route: /docs, Methods: HEAD, GET
(APIServer pid=17207) INFO 03-24 13:28:31 [launcher.py:46] Route: /docs/oauth2-redirect, Methods: HEAD, GET
(APIServer pid=17207) INFO 03-24 13:28:31 [launcher.py:46] Route: /redoc, Methods: HEAD, GET
(APIServer pid=17207) INFO 03-24 13:28:31 [launcher.py:46] Route: /tokenize, Methods: POST
(APIServer pid=17207) INFO 03-24 13:28:31 [launcher.py:46] Route: /detokenize, Methods: POST
(APIServer pid=17207) INFO 03-24 13:28:31 [launcher.py:46] Route: /load, Methods: GET
(APIServer pid=17207) INFO 03-24 13:28:31 [launcher.py:46] Route: /version, Methods: GET
(APIServer pid=17207) INFO 03-24 13:28:31 [launcher.py:46] Route: /health, Methods: GET
(APIServer pid=17207) INFO 03-24 13:28:31 [launcher.py:46] Route: /metrics, Methods: GET
(APIServer pid=17207) INFO 03-24 13:28:31 [launcher.py:46] Route: /v1/models, Methods: GET
(APIServer pid=17207) INFO 03-24 13:28:31 [launcher.py:46] Route: /ping, Methods: GET
(APIServer pid=17207) INFO 03-24 13:28:31 [launcher.py:46] Route: /ping, Methods: POST
(APIServer pid=17207) INFO 03-24 13:28:31 [launcher.py:46] Route: /invocations, Methods: POST
(APIServer pid=17207) INFO 03-24 13:28:31 [launcher.py:46] Route: /v1/chat/completions, Methods: POST
(APIServer pid=17207) INFO 03-24 13:28:31 [launcher.py:46] Route: /v1/responses, Methods: POST
(APIServer pid=17207) INFO 03-24 13:28:31 [launcher.py:46] Route: /v1/responses/{response_id}, Methods: GET
(APIServer pid=17207) INFO 03-24 13:28:31 [launcher.py:46] Route: /v1/responses/{response_id}/cancel, Methods: POST
(APIServer pid=17207) INFO 03-24 13:28:31 [launcher.py:46] Route: /v1/completions, Methods: POST
(APIServer pid=17207) INFO 03-24 13:28:31 [launcher.py:46] Route: /v1/messages, Methods: POST
(APIServer pid=17207) INFO 03-24 13:28:31 [launcher.py:46] Route: /v1/messages/count_tokens, Methods: POST
(APIServer pid=17207) INFO 03-24 13:28:31 [launcher.py:46] Route: /inference/v1/generate, Methods: POST
(APIServer pid=17207) INFO 03-24 13:28:31 [launcher.py:46] Route: /scale_elastic_ep, Methods: POST
(APIServer pid=17207) INFO 03-24 13:28:31 [launcher.py:46] Route: /is_scaling_elastic_ep, Methods: POST
(APIServer pid=17207) INFO 03-24 13:28:31 [launcher.py:46] Route: /v1/chat/completions/render, Methods: POST
(APIServer pid=17207) INFO 03-24 13:28:31 [launcher.py:46] Route: /v1/completions/render, Methods: POST
(APIServer pid=17207) INFO:     Started server process [17207]
(APIServer pid=17207) INFO:     Waiting for application startup.
(APIServer pid=17207) INFO:     Application startup complete.

一、最前面的基础信息

1)版本和模型路径

version 0.18.0
model   /root/autodl-tmp/DeepSeek-R1-32B

表示:

  • 当前 vLLM 版本:0.18.0
  • 加载的模型目录:/root/autodl-tmp/DeepSeek-R1-32B

这是最基础的确认信息。


2)非默认启动参数

non-default args: {
  'port': 6006,
  'model': '/root/autodl-tmp/DeepSeek-R1-32B',
  'max_model_len': 8192,
  'served_model_name': ['deepseek-r1'],
  'gpu_memory_utilization': 0.95
}

这里列的是你手动指定、不同于默认值的参数。

你的关键参数含义:

  • port: 6006 服务监听端口是 6006

  • model: /root/autodl-tmp/DeepSeek-R1-32B 模型目录

  • max_model_len: 8192 最大上下文长度 8192 token

  • served_model_name: deepseek-r1 API 层暴露给客户端的模型名

  • gpu_memory_utilization: 0.95 vLLM 最多使用 95% GPU 显存来做模型和缓存分配


二、模型识别与调度信息

3)模型架构识别

Resolved architecture: Qwen2ForCausalLM

说明 vLLM 识别出这个模型底层架构是:

  • Qwen2ForCausalLM

虽然你目录叫 DeepSeek-R1-32B,但很多 DeepSeek 模型底层是兼容 Qwen 架构的,所以这是正常的。


4)最大长度设置

Using max model len 8192

表示最终采用的最大序列长度是 8192。

这个值会直接影响:

  • KV Cache 占用
  • 最大并发
  • 显存使用

5Chunked Prefill

Chunked prefill is enabled with max_num_batched_tokens=8192.

说明启用了 分块预填充(chunked prefill

作用:

  • 输入 prompt 很长时,不是一次性全部 prefill,而是按块处理
  • 能改善吞吐和显存使用
  • 对长上下文模型很有帮助

6)异步调度

Asynchronous scheduling is enabled.

表示启用了 异步调度器

作用:

  • 更好地调度多个请求
  • 通常提升吞吐
  • 对服务化部署更友好

三、Engine 初始化配置

这段很重要:

Initializing a V1 LLM engine (v0.18.0) with config: ...

这是整个推理引擎的详细配置总表。里面关键信息包括:


7dtype

dtype=torch.bfloat16

模型以 bfloat16 精度运行。

说明:

  • 显存比 fp32 小很多
  • 通常速度更快
  • 需要 GPU 支持 bf16

8)并行配置

tensor_parallel_size=1
pipeline_parallel_size=1
data_parallel_size=1

表示当前都是单卡/单副本:

  • 张量并行 TP = 1
  • 流水线并行 PP = 1
  • 数据并行 DP = 1

也就是:你现在实际上是单卡部署


9)前缀缓存

enable_prefix_caching=True

表示启用了 prefix caching(前缀缓存)

作用:

  • 如果多个请求共享相同前缀 prompt
  • 可以复用前缀计算结果
  • 节省时间,提高吞吐

10)编译配置

compilation_config=...
backend='inductor'
cudagraph_mode=FULL_AND_PIECEWISE

说明 vLLM 启用了编译优化和 CUDA Graph:

  • torch.compile
  • inductor
  • CUDA Graph

这会提高推理性能,但启动时会多花一些时间做 warmup 和 graph capture。


四、分布式与 rank 信息

11world size / rank

world_size=1 rank=0 local_rank=0 ... backend=nccl

说明:

  • 总进程数:1
  • 当前 rank0
  • 本地 rank0
  • 通信后端:NCCL

虽然你只有单卡,但 vLLM 内部还是走统一的分布式初始化逻辑,这是正常的。


12)并行角色分配

rank 0 in world size 1 is assigned as DP rank 0, PP rank 0, PCP rank 0, TP rank 0

表示当前唯一这个进程兼任所有角色。


五、模型加载阶段

13)开始加载模型

Starting to load model /root/autodl-tmp/DeepSeek-R1-32B...

开始读取模型权重。


14Attention 后端

Using FLASH_ATTN attention backend ...
Using FlashAttention version 2

说明 vLLM 最终选用了:

  • FLASH_ATTN
  • 版本 FlashAttention v2

这是高性能 attention 实现,通常是比较理想的情况。

候选后端里还有:

  • FLASHINFER
  • TRITON_ATTN
  • FLEX_ATTENTION

但最终选择了 FlashAttention。


15checkpoint shard 加载进度

Loading safetensors checkpoint shards: ...

表示模型权重是分片存储的,一共 8 个 shard。

日志里看到:

  • 0/8
  • 1/8
  • 8/8

说明模型权重成功全部加载完成。


16)权重加载耗时

Loading weights took 13.38 seconds

纯粹“读权重文件并装入”的时间是 13.38 秒。


17)模型加载显存占用

Model loading took 61.06 GiB memory and 14.101032 seconds

这是一个非常关键的信息:

  • 模型加载后占用了 61.06 GiB 显存
  • 总耗时约 14.1 秒

这能帮助你判断:

  • 模型本体有多大
  • 剩余显存还能留多少给 KV Cache 和 CUDA Graph

六、编译和缓存信息

18torch.compile 缓存目录

Using cache directory: /root/.cache/vllm/torch_compile_cache/...

说明 vLLM 使用这个目录缓存 torch.compile 的编译结果。

好处:

  • 下次重启如果配置没变,可能直接复用缓存
  • 启动速度更快

19)编译耗时

Dynamo bytecode transform time: 4.52 s
torch.compile took 7.13 s in total

表示:

  • Dynamo 变换用了 4.52 秒
  • 整体 compile 用了 7.13 秒

20)直接从缓存加载编译图

Directly load the compiled graph(s) ... from the cache
Directly load AOT compilation from path ...

说明你这次并不是全量重新编译,而是 命中了历史缓存

所以启动会快很多。


七、warmup 和 profiling

21)初始 profiling / warmup

Initial profiling/warmup run took 2.69 s

表示模型做了一次预热运行:

  • 激活算子
  • 建立执行图
  • 为后面正式推理做准备

八、KV Cache 相关信息

这部分是服务性能、并发能力最关键的。

22KV cache block override

Overriding num_gpu_blocks=0 with num_gpu_blocks_override=512

说明最终 GPU KV Cache block 数被设为 512

这个值决定了可缓存多少 token。


23CUDA graph 显存估计

Estimated CUDA graph memory: 0.93 GiB total

表示 CUDA graph 本身大概占用 0.93 GiB 显存。


24)可用于 KV cache 的显存

Available KV cache memory: 11.89 GiB

这是很关键的一行:

  • 模型权重 + 编译 + graph 占完之后
  • 剩下给 KV Cache 的显存是 11.89 GiB

25GPU KV cache size

GPU KV cache size: 48,704 tokens

表示 GPU 上最多可缓存约:

  • 48,704 token

这是总 token 容量,不是单请求。


26)最大并发估算

Maximum concurrency for 8,192 tokens per request: 5.95x

意思是:

  • 如果每个请求都占满 8192 token
  • 理论上最多支持接近 5.95 个这样的请求同时驻留

也就是大约 5~6 个满长请求并发

这是一个“理论上限估计”,实际情况还会受生成长度、调度、碎片等影响。


九、CUDA Graph 捕获

27)捕获过程

Capturing CUDA graphs (mixed prefill-decode, PIECEWISE): ...
Capturing CUDA graphs (decode, FULL): ...

表示 vLLM 正在为不同 batch size / 场景捕获 CUDA Graph。

作用:

  • 降低 kernel launch 开销
  • 提升推理速度
  • 尤其对稳定 batch 的在线推理很有用

28)捕获结果

Graph capturing finished in 13 secs, took 0.93 GiB
CUDA graph pool memory: 0.93 GiB (actual), 0.93 GiB (estimated)

说明:

  • Graph capture 总共耗时 13 秒
  • 占显存 0.93 GiB
  • 实测和预估几乎一致

这是正常且比较理想的结果。


29Engine 初始化总耗时

init engine (profile, create kv cache, warmup model) took 25.79 seconds

表示引擎最终初始化总耗时约:

  • 25.79 秒

包括:

  • profiling
  • 创建 KV cache
  • warmup

十、API 服务层信息

30)支持的任务

Supported tasks: ['generate']

说明当前模型/服务支持的任务是:

  • generate

也就是文本生成类任务。


31generation_config 覆盖提醒

Default vLLM sampling parameters have been overridden by the model's `generation_config.json`: {'temperature': 0.6, 'top_p': 0.95}

表示模型目录里的 generation_config.json 覆盖了 vLLM 默认采样参数。

当前默认采样变成:

  • temperature = 0.6
  • top_p = 0.95

如果你不想让模型自带配置生效,可以加:

--generation-config vllm

32chat template 格式检测

Detected the chat template content format to be 'string'

说明 vLLM 检测到聊天模板内容格式是 string

一般不用管,除非你自定义 chat template。


33)服务启动地址

Starting vLLM server on http://0.0.0.0:6006

表示:

  • 监听所有网卡:0.0.0.0
  • 端口:6006

如果你本机访问,就是:

http://127.0.0.1:6006

如果外部访问,要换成宿主机 IP。


十一、可用接口列表

日志中列出了所有路由。最常用的是:

OpenAI 兼容接口

  • /v1/chat/completions
  • /v1/completions
  • /v1/models

其他接口

  • /health:健康检查
  • /metrics:监控指标
  • /version:版本信息
  • /tokenize:分词
  • /detokenize:反分词

十二、Uvicorn/FastAPI 启动完成

最后几行:

Started server process [70536]
Waiting for application startup.
Application startup complete.

这表示:

  • API server 进程已经启动
  • 应用初始化完成
  • 服务已经可以接收请求

也就是说:你的 vLLM 已经成功启动完成了。


十三、这份日志里最值得关注的几个核心指标

如果你以后只想快速判断服务状态,重点看这几项:


1)模型是否识别成功

Resolved architecture: Qwen2ForCausalLM

2)模型是否加载成功

Loading weights took 13.38 seconds
Model loading took 61.06 GiB memory

3KV Cache 有多少

Available KV cache memory: 11.89 GiB
GPU KV cache size: 48,704 tokens

4)理论最大并发

32
Maximum concurrency for 8,192 tokens per request: 5.95x
1.5
Maximum concurrency for 8,192 tokens per request: 318.54x

1.5 128k
Maximum concurrency for 131,072 tokens per request: 19.91x

5)服务是否真正启动

Starting vLLM server on http://0.0.0.0:6006
Application startup complete.

十四、根据你的日志,可以总结成一句话

你的这次启动结果是:

  • vLLM 版本:0.18.0
  • 模型:DeepSeek-R1-32B
  • 底层架构:Qwen2ForCausalLM
  • 精度:bfloat16
  • 单卡部署
  • 模型权重占用显存:61.06 GiB
  • 可用 KV Cache 显存:11.89 GiB
  • KV Cache 总容量:48,704 tokens
  • 8192 上下文长度下理论并发约:5.95
  • 服务监听地址:http://0.0.0.0:6006
  • OpenAI 兼容接口可用:/v1/chat/completions

十五、你可以马上这样测试服务

比如用 curl

curl http://127.0.0.1:6006/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-r1",
    "messages": [
      {"role": "user", "content": "你好,介绍一下你自己"}
    ],
    "temperature": 0.6,
    "top_p": 0.95,
    "max_tokens": 128
  }'
 Value error, User-specified max_model_len (200000) is greater than the derived max_model_len (max_position_embeddings=131072.0 or model_max_length=None in model's config.json