声明: 纯兴趣爱好,如有疏漏敬请谅解。

源码版本: 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
Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐