当前位置:首页 > 文章列表 > 科技周边 > 人工智能 > vLLM 怎样配置连续批处理最大 token

vLLM 怎样配置连续批处理最大 token

来源:17golang原创 2026-11-06 17:14:12 0浏览 收藏

vLLM 中,连续批处理每次迭代最多处理多少 token,主要由 max_num_batched_tokens 控制。它不是“最多同时处理多少个请求”,而是一次调度迭代里可安排的 token 总预算。通常可以先用 8192 或 16384 作为起点,再根据首 token 延迟(TTFT)、交互延迟(ITL)、吞吐量和显存余量调整。

官方地址:https://docs.vllm.ai/en/latest/configuration/optimization/

需要降低交互延迟时先减小 max_num_batched_tokens;需要提高长提示词的 TTFT 和吞吐潜力时再逐步增大。参数改变后,要把它和 max_model_len、chunked prefill 以及 KV Cache 一起看。

这个参数到底限制什么

max_num_batched_tokens 表示单次迭代允许处理的最大 token 数。连续批处理会把已经进入解码阶段的请求和正在做预填充的请求放进调度循环,但每轮不能超过这份预算。它与下面几个参数的职责不同:

参数关注点调节方向
max_num_batched_tokens单次迭代的 token 预算影响预填充占用和解码响应速度
max_num_seqs单次迭代可处理的序列数影响并发请求数量
max_model_len单个请求的上下文长度上限影响单请求 KV Cache 需求
vLLM 连续批处理按 max_num_batched_tokens 预算调度解码请求和预填充分块的结构说明图
图1:vLLM 连续批处理的 token 预算、解码优先和预填充分块关系示意图;这是静态说明图,不是运行截图。

Python 启动时怎样配置

如果使用 vllm.LLM 创建引擎,可以直接传入同名的 Python 参数。下面的例子把每次迭代预算设为 16384,适合用来说明参数位置;实际数值仍要按模型、GPU 和请求长度调整。

from vllm import LLM

# 通过 token 预算控制每轮连续批处理的规模。
# 较大的值允许一次安排更多预填充 token,但可能增加解码请求的等待。
llm = LLM(
    model="your-model-id",
    max_num_batched_tokens=16384,
    max_model_len=8192,
)

# 这里的 prompts 只是示例输入,真正服务场景应使用自己的请求队列。
outputs = llm.generate(["请用三句话解释连续批处理"])
for output in outputs:
    # 读取生成文本,便于把结果交给上层业务。
    print(output.outputs[0].text)

这段配置的关键是参数名称中的 batched:它控制的是批次 token 预算,不会把单个请求的上下文上限自动改成 16384。若 max_model_len 仍是 8192,单请求依旧受到 8192 的长度限制。

在线服务怎样用 vllm serve 设置

在线服务对应的 CLI 参数是 --max-num-batched-tokens。vLLM 文档支持带单位的可读整数,因此可以写成 16k;为了减少不同脚本或环境对单位解析的误解,也可以直接写成 16384。

# 启动兼容 OpenAI API 的 vLLM 服务,并设置每轮 token 预算。
# 16k 表示 16,000;生产脚本也可以改写为 16384。
vllm serve your-model-id \
  --max-model-len 8192 \
  --max-num-batched-tokens 16k \
  --port 8000

# 查看命令帮助,确认当前安装版本暴露的调度参数。
vllm serve --help | grep max-num-batched-tokens

如果服务脚本还设置了 --max-num-scheduled-tokens,它通常会跟随 max_num_batched_tokens,但在某些会向批次追加 token 的场景下可能更小。不要只修改其中一个参数就假设实际调度预算一定相同。

vLLM Python 配置和 vllm serve 命令配置连续批处理 token 预算的路径示意图
图2:Python 配置与 vllm serve 配置路径,以及它们和 max_model_len、max_num_scheduled_tokens 的关系示意图;这是静态说明图。

怎样根据延迟目标选择数值

vLLM 的 chunked prefill 会把长预填充拆成更小的块,并与解码请求放到同一调度循环。官方优化说明给出的方向很明确:

  • 更小的预算,例如 2048,更有利于 ITL,因为一轮预填充占用的 token 更少,解码请求不容易被拖慢。
  • 更大的预算更有利于 TTFT,因为一次可以处理更多提示词 token;在较小模型和大 GPU 上,官方建议为了吞吐量考虑高于 8192 的值。
  • 预算不是越大越好。预填充一次占用过多会让已经在生成的请求等待,显存不足时还可能触发抢占和重算。

可以按下面的顺序调参:先固定模型和 max_model_len,从 8192 或 16384 运行一组稳定负载;如果 ITL 超过目标,降低预算;如果 TTFT 和吞吐量仍有余量,再逐步提高。每次只改一个关键变量,便于把变化归因到 token 预算。

关闭 chunked prefill 时的边界

在 vLLM V1 中,chunked prefill 在可用时默认开启。若显式关闭它,官方文档要求 max_num_batched_tokens 大于 max_model_len;如果反过来设置,服务可能在启动阶段失败。因此,下面这种组合不适合关闭 chunked prefill 的场景:

# 关闭分块预填充时,批次 token 预算必须高于单请求上下文上限。
# 这里 16384 大于 8192,满足该边界;实际仍要结合显存决定。
vllm serve your-model-id \
  --disable-chunked-prefill \
  --max-model-len 8192 \
  --max-num-batched-tokens 16384

如果只是为了控制长提示词对解码的影响,优先考虑保留 chunked prefill 并调小预算,而不是直接关闭分块机制。关闭后,预填充和解码之间的调度关系会改变,旧的经验值不能直接照搬。

和显存、抢占问题怎样一起判断

当日志频繁出现 preemption 或显存不足时,单纯增大 token 预算可能让问题更严重。此时要把几个旋钮放在一起看:

  • 适当提高 gpu_memory_utilization,为 KV Cache 留出更多空间,但要给系统和其他进程保留余量。
  • 降低 max_num_batched_tokens 或 max_num_seqs,减少单轮调度的工作量。
  • 如果模型和硬件允许,再考虑增加 tensor parallel 或 pipeline parallel;这会引入同步和通信成本。
  • 持续观察 preemption 计数与 TTFT、ITL,不要只看 GPU 利用率。

一个实用的起始表如下:

主要症状优先动作注意事项
交互请求 ITL 偏高下调 token 预算可能牺牲长提示词 TTFT
长提示词 TTFT 偏高逐步上调 token 预算观察解码请求是否被拖慢
频繁 preemption下调预算或并发序列数同时检查 KV Cache 余量
关闭 chunked prefill 后启动失败让 token 预算高于 max_model_len仍需确认显存可承受

一份简短的配置决策

如果你只需要一个可执行的选择过程,可以按这四步做:

  1. 在线对话优先关注 ITL,从 2048、4096 或 8192 这类较小预算开始。
  2. 批量生成或长提示词优先关注 TTFT 和吞吐量,从 8192 或 16384 开始。
  3. 发现 preemption、OOM 或解码请求排队变长时,先回退预算,再检查并发序列数和 KV Cache。
  4. 关闭 chunked prefill 前,确认 max_num_batched_tokens > max_model_len,并重新评估显存。

最后要记住:max_num_batched_tokens 是调度预算,不是性能保证值。真正合适的数字取决于模型大小、提示词分布、输出长度、GPU 显存和业务延迟目标。

常见问题

max_num_batched_tokens 越大吞吐量一定越高吗?

不一定。它提高了单轮可以安排的 token 数,但过大的预填充工作会让解码请求等待,也可能增加显存压力。应结合 TTFT、ITL 和吞吐量一起观察。

它和 max_num_seqs 可以互相替代吗?

不能。前者限制 token 总预算,后者限制序列数量。短请求很多时可能先碰到序列数上限,长提示词场景则可能先碰到 token 预算上限。

为什么命令行参数是横线,Python 参数是下划线?

这是 CLI 和 Python 参数的命名约定不同:命令行使用 --max-num-batched-tokens,Python 使用 max_num_batched_tokens,表达的是同一项配置。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
ONNX Runtime 怎样读取可覆盖初始化器的名称与类型ONNX Runtime 怎样读取可覆盖初始化器的名称与类型
上一篇
ONNX Runtime 怎样读取可覆盖初始化器的名称与类型
LangChain RunnableBranch 怎样路由输入
下一篇
LangChain RunnableBranch 怎样路由输入
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    912次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    919次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    999次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    995次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    815次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码