vllm -- 源码剖析4 (serve启动流程) 小白级教程
声明: 纯兴趣爱好,如有疏漏敬请谅解。
源码版本: v0.21.0
学习相关源码路径:
vllm/vllm/entrypoints/cli/serve.py at v0.21.0 · vllm-project/vllm · GitHub
模块描述
代码中的描述
DESCRIPTION = """Launch a local OpenAI-compatible API server to serve LLM
completions via HTTP. Defaults to Qwen/Qwen3-0.6B if no model is specified.
Search by using: `--help=<ConfigGroup>` to explore options by section (e.g.,
--help=ModelConfig, --help=Frontend)
Use `--help=all` to show all available flags at once.
"""
启动兼容 OpenAI 接口的本地 API 服务,通过 HTTP 协议提供大语言模型(LLM)补全能力。未指定模型时,默认使用 Qwen/Qwen3-0.6B。
使用方式:通过 --help= 按分类查看对应配置项(示例:--help=ModelConfig、--help=Frontend)。
执行 --help=all 可一次性展示全部启动参数。
相关命令:
vllm serve --help
vllm serve --help=ModelConfig
vllm serve --help=all
流程梳理:
args: argparse.Namespace调用者传入的参数
1. model属性
逻辑:
判断args中是否有model_tag属性,如果不为空,将model_tag赋值给args中的model属性
相关代码:
if hasattr(args, "model_tag") and args.model_tag is not None:
args.model = args.model_tag
2. grpc属性
逻辑:
判断是否设置了grpc标识,如果设置了则使用grpc启动。
相关代码
if getattr(args, "grpc", False):
from vllm.entrypoints.grpc_server import serve_grpc
uvloop.run(serve_grpc(args))
return
相关命令:
vllm serve --grpc
日志输出:
(EngineCore pid=5351) WARNING 06-11 03:21:40 [cpu.py:136] VLLM_CPU_KVCACHE_SPACE not set. Using 30.78 GiB for KV cache.
INFO 06-11 03:21:40 [servicer.py:97] VllmEngineServicer initialized
INFO 06-11 03:21:40 [grpc_server.py:113] vLLM gRPC server started on 0.0.0.0:8000
INFO 06-11 03:21:40 [grpc_server.py:114] Server is ready to accept requests
3. 校验参数(headless与api_server_count)
逻辑:
检验headless、api_server_count参数
相关代码:
if args.headless:
if args.api_server_count is not None and args.api_server_count > 0:
raise ValueError(
f"--api-server-count={args.api_server_count} cannot be "
"used with --headless (no API servers are started in "
"headless mode)."
)
# Default to 0 in headless mode (no API servers)
args.api_server_count = 0
错误命令:
错误命令,同时指定headless、api_server_count
vllm serve --headless --api_server_count=10
程序运行抛出异常
4.负载均衡模式检验
逻辑:
外部负载均衡和混合负载均衡不能同时开启
相关代码:
is_external_lb = (
args.data_parallel_external_lb or args.data_parallel_rank is not None
)
is_hybrid_lb = (
args.data_parallel_hybrid_lb or args.data_parallel_start_rank is not None
)
if is_external_lb and is_hybrid_lb:
raise ValueError(
"Cannot use both external and hybrid data parallel load "
"balancing modes. External LB is enabled via "
"--data-parallel-external-lb or --data-parallel-rank. "
"Hybrid LB is enabled via --data-parallel-hybrid-lb or "
"--data-parallel-start-rank. Use one mode or the other."
)
错误命令:
vllm serve --data-parallel-external-lb --data-parallel-hybrid-lb
5. api_server_count设置
逻辑:
api_server_count参数兜底赋值, api_server_count参数未传设置兜底值
相关代码:
if args.api_server_count is None:
if is_external_lb:
args.api_server_count = 1
elif is_hybrid_lb:
args.api_server_count = args.data_parallel_size_local or 1
if args.api_server_count > 1:
logger.info(
"Defaulting api_server_count to data_parallel_size_local "
"(%d) for hybrid LB mode.",
args.api_server_count,
)
else:
args.api_server_count = args.data_parallel_size
if args.api_server_count > 1:
logger.info(
"Defaulting api_server_count to data_parallel_size (%d).",
args.api_server_count,
)
if getattr(args, "enable_elastic_ep", False) and args.api_server_count > 1:
logger.warning(
"Elastic EP only supports running with with at most one API server. "
"Capping api_server_count from %d to 1.",
args.api_server_count,
)
args.api_server_count = 1
6. 启动逻辑
逻辑:
根据api_server_count分发不同启动逻辑(run_headless(args)、run_multi_api_server(args)、uvloop.run(run_server(args)))
具体启动逻辑下次剖析源码
相关代码:
if args.api_server_count < 1:
run_headless(args)
elif args.api_server_count > 1:
run_multi_api_server(args)
else:
# Single API server (this process).
args.api_server_count = None
uvloop.run(run_server(args))
知识点:
1.argparse.Namespace变量
Python argparse 内置的一个简单类。本质是一个空对象,用来把所有命令行参数变成「点属性」直接用。
相关代码:
import argparse
#创建解析器
parser = argparse.ArgumentParser()
#添加参数
parser.add_argument("--model")
parser.add_argument("--port", type=int)
#解析 → 返回 Namespace
args = parser.parse_args()
#使用参数
print(args.model)
print(args.port)
2. getattr
安全获取对象的属性 有就返回,没有就返回默认值。
相关代码:
if getattr(args, "grpc", False):
from vllm.entrypoints.grpc_server import serve_grpc
uvloop.run(serve_grpc(args))
return更多推荐



所有评论(0)