乐于分享
好东西不私藏

vllm -- 源码剖析4 (serve启动流程) 小白级教程

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 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_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 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 = 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,           )ifgetattr(args"enable_elastic_ep", Falseandargs.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)#解析 → 返回 Namespaceargs = 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