94057c3d3e
PR Test (NPU) / check-changes (push) Has been cancelled
PR Test (NPU) / pr-gate (push) Has been cancelled
PR Test (NPU) / set-image-config (push) Has been cancelled
PR Test (NPU) / stage-b-test-1-npu-a2 (0) (push) Has been cancelled
PR Test (NPU) / stage-b-test-1-npu-a2 (1) (push) Has been cancelled
PR Test (NPU) / stage-b-test-2-npu-a2 (0) (push) Has been cancelled
PR Test (NPU) / stage-b-test-2-npu-a2 (1) (push) Has been cancelled
PR Test (NPU) / stage-b-test-4-npu-a3 (push) Has been cancelled
PR Test (NPU) / stage-b-test-16-npu-a3 (push) Has been cancelled
PR Test (NPU) / multimodal-gen-test-1-npu-a3 (push) Has been cancelled
PR Test (NPU) / multimodal-gen-test-2-npu-a3 (push) Has been cancelled
PR Test (Arm64) / pr-gate (push) Has been cancelled
PR Test (Arm64) / check-changes (push) Has been cancelled
PR Test (Arm64) / build-test (push) Has been cancelled
PR Test (sgl-router) / gate (push) Has been cancelled
PR Test (sgl-router) / tier-1 — lint (push) Has been cancelled
PR Test (sgl-router) / tier-2 — build + test (push) Has been cancelled
PR Test (sgl-router) / tier-3 — docker (placeholder) (push) Has been cancelled
PR Test (sgl-router) / tier-3 — k8s integration (push) Has been cancelled
PR Test (sgl-router) / tier-3 — e2e (push) Has been cancelled
PR Test (sgl-router) / finish (push) Has been cancelled
PR Test (NPU) / single-node-poc (map[name:qwen3_6_27b_w8a8_1p_in64k_out1k_50ms runner:linux-aarch64-a3-2 test_case:test/registered/ascend/performance/qwen3_6_27b/test_npu_qwen3_6_27b_w8a8_1p_in64k_out1k_50ms.py test_type:perf]) (push) Has been cancelled
PR Test (NPU) / pr-test-npu-finish (push) Has been cancelled
PR Test (Xeon) / pr-gate (push) Has been cancelled
PR Test (Xeon) / check-changes (push) Has been cancelled
PR Test (Xeon) / build-test (, xeon-gnr, base-b-test-cpu) (push) Has been cancelled
PR Test (XPU) / check-changes (push) Has been cancelled
PR Test (XPU) / pr-gate (push) Has been cancelled
PR Test (XPU) / stage-a-test-1-gpu-xpu (push) Has been cancelled
PR Test (XPU) / wait-for-stage-a (push) Has been cancelled
PR Test (XPU) / stage-b-test-1-gpu-xpu (push) Has been cancelled
PR Test (XPU) / finish (push) Has been cancelled
CI Model Inventory / build-inventory (push) Has been cancelled
Lint / lint (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark Compilation Check (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark - Manual Policy (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark - Request Processing (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark Summary (push) Has been cancelled
PR Test (SMG) / build-wheel (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on windows (x86_64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on macos (x86_64 - auto) (push) Has been cancelled
PR Test (SMG) / python-unit-tests (push) Has been cancelled
PR Test (SMG) / unit-tests (push) Has been cancelled
PR Test (SMG) / benchmarks (push) Has been cancelled
PR Test (SMG) / chat-completions (push) Has been cancelled
PR Test (SMG) / chat-completions-4gpu (push) Has been cancelled
PR Test (SMG) / e2e (push) Has been cancelled
PR Test (SMG) / docker-build-test (push) Has been cancelled
PR Test (SMG) / k8s-integration (push) Has been cancelled
PR Test (SMG) / finish (push) Has been cancelled
PR Test (SMG) / summarize-benchmarks (push) Has been cancelled
Release SGLang Model Gateway Docker Image / publish (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on macos (aarch64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (aarch64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (x86_64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (aarch64 - musllinux_1_1) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (x86_64 - musllinux_1_1) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / Build SDist (push) Has been cancelled
Release SGLang Model Gateway to PyPI / Upload to PyPI (push) Has been cancelled
Release SGLang Kernels / build-cu129-matrix (aarch64, 12.9, 3.10, arm-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / build-cu129-matrix (x86_64, 12.9, 3.10, x64-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / release-cu129 (push) Has been cancelled
Release SGLang Kernels / build-cu130-matrix (aarch64, 13.0, 3.10, arm-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / build-cu130-matrix (x86_64, 13.0, 3.10, x64-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / release-cu130 (push) Has been cancelled
Release SGLang Kernels / build-rocm-matrix (3.10, 700) (push) Has been cancelled
Release SGLang Kernels / build-rocm-matrix (3.10, 720) (push) Has been cancelled
Release SGLang Kernels / release-rocm700 (push) Has been cancelled
Release SGLang Kernels / release-rocm720 (push) Has been cancelled
Release SGLang Kernels / build-musa43 (43, 3.10) (push) Has been cancelled
Release SGLang Kernels / release-musa43 (push) Has been cancelled
144 lines
4.6 KiB
Plaintext
144 lines
4.6 KiB
Plaintext
---
|
||
title: "Offline Engine API"
|
||
metatags:
|
||
description: "Use SGLang's offline engine for direct batch inference without HTTP server overhead. Supports sync/async and streaming modes."
|
||
---
|
||
SGLang provides a direct inference engine without the need for an HTTP server, especially for use cases where additional HTTP server adds unnecessary complexity or overhead. Here are two general use cases:
|
||
|
||
- Offline Batch Inference
|
||
- Custom Server on Top of the Engine
|
||
|
||
This document focuses on the offline batch inference, demonstrating four different inference modes:
|
||
|
||
- Non-streaming synchronous generation
|
||
- Streaming synchronous generation
|
||
- Non-streaming asynchronous generation
|
||
- Streaming asynchronous generation
|
||
|
||
Additionally, you can easily build a custom server on top of the SGLang offline engine. A detailed example working in a python script can be found in [custom_server](https://github.com/sgl-project/sglang/blob/main/examples/runtime/engine/custom_server.py).
|
||
|
||
## Nest Asyncio
|
||
Note that if you want to use **Offline Engine** in ipython or some other nested loop code, you need to add the following code:
|
||
```python Example
|
||
import nest_asyncio
|
||
|
||
nest_asyncio.apply()
|
||
|
||
```
|
||
|
||
## Advanced Usage
|
||
|
||
The engine supports [vlm inference](https://github.com/sgl-project/sglang/blob/main/examples/runtime/engine/offline_batch_inference_vlm.py) as well as [extracting hidden states](https://github.com/sgl-project/sglang/tree/main/examples/runtime/hidden_states).
|
||
|
||
Please see [the examples](https://github.com/sgl-project/sglang/tree/main/examples/runtime/engine) for further use cases.
|
||
|
||
## Offline Batch Inference
|
||
|
||
SGLang offline engine supports batch inference with efficient scheduling.
|
||
|
||
```python Example
|
||
# launch the offline engine
|
||
import asyncio
|
||
|
||
import sglang as sgl
|
||
import sglang.test.doc_patch
|
||
from sglang.utils import async_stream_and_merge, stream_and_merge
|
||
|
||
llm = sgl.Engine(model_path="qwen/qwen2.5-0.5b-instruct")
|
||
```
|
||
|
||
### Non-streaming Synchronous Generation
|
||
|
||
```python Example
|
||
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']}")
|
||
```
|
||
|
||
### Streaming Synchronous Generation
|
||
|
||
```python Example
|
||
prompts = [
|
||
"Write a short, neutral self-introduction for a fictional character. Hello, my name is",
|
||
"Provide a concise factual statement about France’s capital city. The capital of France is",
|
||
"Explain possible future trends in artificial intelligence. The future of AI is",
|
||
]
|
||
|
||
sampling_params = {
|
||
"temperature": 0.2,
|
||
"top_p": 0.9,
|
||
}
|
||
|
||
print("\n=== Testing synchronous streaming generation with overlap removal ===\n")
|
||
|
||
for prompt in prompts:
|
||
print(f"Prompt: {prompt}")
|
||
merged_output = stream_and_merge(llm, prompt, sampling_params)
|
||
print("Generated text:", merged_output)
|
||
print()
|
||
```
|
||
|
||
### Non-streaming Asynchronous Generation
|
||
|
||
```python Example
|
||
prompts = [
|
||
"Write a short, neutral self-introduction for a fictional character. Hello, my name is",
|
||
"Provide a concise factual statement about France’s capital city. The capital of France is",
|
||
"Explain possible future trends in artificial intelligence. The future of AI is",
|
||
]
|
||
|
||
sampling_params = {"temperature": 0.8, "top_p": 0.95}
|
||
|
||
print("\n=== Testing asynchronous batch generation ===")
|
||
|
||
async def main():
|
||
outputs = await llm.async_generate(prompts, sampling_params)
|
||
|
||
for prompt, output in zip(prompts, outputs):
|
||
print(f"\nPrompt: {prompt}")
|
||
print(f"Generated text: {output['text']}")
|
||
|
||
asyncio.run(main())
|
||
```
|
||
|
||
### Streaming Asynchronous Generation
|
||
|
||
```python Example
|
||
prompts = [
|
||
"Write a short, neutral self-introduction for a fictional character. Hello, my name is",
|
||
"Provide a concise factual statement about France’s capital city. The capital of France is",
|
||
"Explain possible future trends in artificial intelligence. The future of AI is",
|
||
]
|
||
|
||
sampling_params = {"temperature": 0.8, "top_p": 0.95}
|
||
|
||
print("\n=== Testing asynchronous streaming generation (no repeats) ===")
|
||
|
||
async def main():
|
||
for prompt in prompts:
|
||
print(f"\nPrompt: {prompt}")
|
||
print("Generated text: ", end="", flush=True)
|
||
|
||
# Replace direct calls to async_generate with our custom overlap-aware version
|
||
async for cleaned_chunk in async_stream_and_merge(llm, prompt, sampling_params):
|
||
print(cleaned_chunk, end="", flush=True)
|
||
|
||
print() # New line after each prompt
|
||
|
||
asyncio.run(main())
|
||
```
|
||
|
||
```python Example
|
||
llm.shutdown()
|
||
```
|