news 2026/9/13 22:53:50

如何使用 SGLang 离线 Engine API 完成不带 HTTP 服务的批量推理?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何使用 SGLang 离线 Engine API 完成不带 HTTP 服务的批量推理?

如何使用 SGLang 离线 Engine API 完成不带 HTTP 服务的批量推理?

【免费下载链接】sglangSGLang is a high-performance serving framework for large language models and multimodal models.项目地址: https://gitcode.com/GitHub_Trending/sg/sglang

如果你需要在一批 prompt 上跑离线推理,但不想为此先启动一个 HTTP 服务、再通过客户端逐条或批量发请求,SGLang 提供了离线 Engine API:用sgl.Engine在进程内直接加载模型并调用generate接口,一次传入多条 prompt 即可完成批量生成。该方式适用于离线批处理,以及基于引擎搭建自有服务接口这两类场景(本文只覆盖离线批处理)。适用前提以文档说明为准:Python 3.10 或更高版本,主要面向 NVIDIA GPU 平台,SGLang 要求 CUDA 13(CUDA 12 的cu129wheel 和镜像已停发,SGLang 0.5.19是最后一个带 CUDA 12 通道的版本)。

准备:安装 SGLang

按 安装文档 的方式,推荐用 uv 安装:

pip install --upgrade pip pip install uv uv pip install --prerelease=allow sglang

这里的--prerelease=allow不能省:SGLang 的部分依赖在 PyPI 上只发布了 pre-release 版本,不加该参数时旧版 uv 会静默装到 SGLang 0.5.9,而 uv 0.12.0 起该参数是无副作用的 no-op。

如果安装时遇到OSError: CUDA_HOME environment variable is not set,文档给出的两个解决办法是:用export CUDA_HOME=/usr/local/cuda-<your-cuda-version>CUDA_HOME指向你的 CUDA 安装根目录,或先按 FlashInfer 安装文档装好 FlashInfer 再装 SGLang。

主路径:同步非流式批量推理

最小可用的主路径在 离线 Engine API 文档 中,分两步:启动引擎,然后一次性把 prompt 列表交给generate

import sglang as sgl llm = sgl.Engine(model_path="qwen/qwen2.5-0.5b-instruct")

model_path换成你要跑的模型。启动后,传入 prompt 列表和采样参数:

prompts = [ "Hello, my name is", "The president of the United States is", "The capital of France is", "The future of AI is", ] sampling_params = {"temperature": 0.8, "top_p": 0.95} outputs = llm.generate(prompts, sampling_params) for prompt, output in zip(prompts, outputs): print("===============================") print(f"Prompt: {prompt}\nGenerated text: {output['text']}")

generate的返回是一个与输入 prompt 一一对应的列表,每个元素是字典,生成的文本在text字段里。批量调度由引擎负责:如果一次传入很大的 batch,引擎会智能调度请求,避免 OOM(Out of Memory)——这一点在 引擎示例说明 中有明确描述,所以不必自己把大 batch 拆小。

同样的逻辑也封装成了可直接运行的脚本 offline_batch_inference.py,它通过ServerArgs.add_cli_args把全部服务参数暴露成命令行选项,运行时只需指定模型:

python3 offline_batch_inference.py --model meta-llama/Llama-3.1-8B-Instruct

注意这个脚本(以及仓库里所有sgl.Engine入口脚本)都带了if __name__ == "__main__":保护,这不是形式问题:引擎用 "spawn" 方式创建子进程,spawn 每次启动一个全新进程,如果没有__main__保护会陷入无限循环地继续 spawn 子进程。自己写脚本时保留这个结构。

验证结果

文档给出的验证方式就是脚本自身的打印:程序对每条 prompt 输出一段以分隔线开头、包含Prompt: ...Generated text: ...的结果。跑完 4 条 prompt 就应该看到 4 段这样的输出,输出条数与输入 prompt 数一致即为正常完成。文档没有给出固定的生成文本样例,Generated text的具体内容取决于模型和采样参数,不应把任何示例输出当成必须命中的固定值。

可选分支:流式与异步模式

主路径之外,同一文档演示了另外三种调用方式,都复用上面启动的llm

同步流式。用stream_and_merge(定义在 sglang/utils.py)逐条 prompt 流式合并输出:

from sglang.utils import stream_and_merge for prompt in prompts: merged_output = stream_and_merge(llm, prompt, sampling_params) print("Generated text:", merged_output)

异步非流式。在async函数里await llm.async_generate(prompts, sampling_params),同样接收 prompt 列表、返回output['text'],入口用asyncio.run(main())驱动。

异步流式。用async for cleaned_chunk in async_stream_and_merge(llm, prompt, sampling_params)逐块打印,async_stream_and_merge同样来自 sglang/utils.py。

仓库中的 offline_batch_inference_async.py 展示了异步模式的批量用法:把 400 条 prompt(4 条样本 × 100 副本)各自asyncio.create_task并发提交,再逐个await取结果。该脚本同样支持--model-path等完整命令行参数,例如:

python offline_batch_inference_async.py --model-path Qwen/Qwen2-VL-7B-Instruct

如果你的目标是"大 batch 离线跑满吞吐",异步提交 + 引擎端调度是文档推荐的组合;如果只需要脚本式的一条命令批处理,同步generate已经够用。

使用限制

  • ipython 或其他嵌套事件循环环境:直接asyncio.run会失败,文档要求先执行nest_asyncio.apply()再使用离线引擎。
  • 模型来源:示例中使用的是 Hugging Face 模型名(如meta-llama/Meta-Llama-3.1-8B-Instructqwen/qwen2.5-0.5b-instruct),需要能访问对应模型源;换用本地路径时替换model_path即可。
  • 进程收尾:批处理结束后调用llm.shutdown()释放引擎资源,见 launch_engine.py 的完整最小示例。

进一步

同一引擎 API 还支持 VLM 离线批量推理(offline_batch_inference_vlm.py)和提取 hidden states(examples/runtime/hidden_states);如果想在这个引擎之上自建带/generate/generate_stream接口的服务,可参考 custom_server.py 的 Sanic 示例,但这已经偏离"不启动 HTTP 服务"的目标,仅在需要时再看。

【免费下载链接】sglangSGLang is a high-performance serving framework for large language models and multimodal models.项目地址: https://gitcode.com/GitHub_Trending/sg/sglang

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 22:51:34

Spring AI 中多轮对话历史管理与滑动窗口截断

Spring AI 中多轮对话历史管理与滑动窗口截断在 LLM 应用开发中&#xff0c;多轮对话&#xff08;Multi-turn Conversation&#xff09;的上下文管理直接决定了交互体验与接口调用的成本。一旦对话轮次加深&#xff0c;上下文膨胀会直接触发大模型厂商的 context_length_exceed…

作者头像 李华
网站建设 2026/9/13 22:50:33

从 mypy / pyright 迁移到 ty:规则映射、严格模式与迁移实战指南

从 mypy / pyright 迁移到 ty&#xff1a;规则映射、严格模式与迁移实战指南 【免费下载链接】ty An extremely fast Python type checker and language server, written in Rust. 项目地址: https://gitcode.com/GitHub_Trending/ty2/ty 迁移到新类型检查器时&#xff…

作者头像 李华
网站建设 2026/9/13 22:39:40

Cilium CLI 安装指南:版本选择、校验和下载脚本逐项解析

Cilium CLI 安装指南&#xff1a;版本选择、校验和下载脚本逐项解析 【免费下载链接】cilium eBPF-based Networking, Security, and Observability 项目地址: https://gitcode.com/GitHub_Trending/ci/cilium Cilium CLI 是管理 Cilium 集群的核心命令行工具&#xff0…

作者头像 李华
网站建设 2026/9/13 22:39:21

Claude Code与DeepSeek模型集成配置与优化指南

1. Claude Code 与 DeepSeek 模型集成概述 Claude Code 作为终端环境下的 AI 编程助手&#xff0c;与 DeepSeek 模型的深度整合为开发者提供了更强大的代码生成与问题解决能力。这种技术组合的核心价值在于将 Claude 的自然语言理解优势与 DeepSeek 的专业领域知识相结合&#…

作者头像 李华