如何使用 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-Instruct、qwen/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),仅供参考