声明: 纯兴趣爱好,如有疏漏敬请谅解。
源码版本: 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 LLMcompletions 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属性
相关代码:
ifhasattr(args, "model_tag") andargs.model_tag isnot None:args.model = args.model_tag
2. grpc属性
逻辑:
判断是否设置了grpc标识,如果设置了则使用grpc启动。
相关代码
if getattr(args, "grpc", False):from vllm.entrypoints.grpc_server import serve_grpcuvloop.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 initializedINFO 06-11 03:21:40 [grpc_server.py:113] vLLM gRPC server started on 0.0.0.0:8000INFO 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 = 1elif is_hybrid_lb:args.api_server_count = args.data_parallel_size_local or 1if 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_sizeif args.api_server_count > 1:logger.info("Defaulting api_server_count to data_parallel_size (%d).",args.api_server_count,)ifgetattr(args, "enable_elastic_ep", False) andargs.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 = Noneuvloop.run(run_server(args))
知识点:
1.argparse.Namespace变量
Python argparse 内置的一个简单类。本质是一个空对象,用来把所有命令行参数变成「点属性」直接用。
相关代码:
import argparse#创建解析器parser = argparse.ArgumentParser()#添加参数parser.add_argument("--model")parser.add_argument("--port", type=int)#解析 → 返回 Namespaceargs = parser.parse_args()#使用参数print(args.model)print(args.port)
2. getattr
安全获取对象的属性 有就返回,没有就返回默认值。
相关代码:
if getattr(args, "grpc", False):from vllm.entrypoints.grpc_server import serve_grpcuvloop.run(serve_grpc(args))return
夜雨聆风