GitHub: huggingface/text-generation-inference Stars: 10,900+ | Language: Python (78.6%), Rust (16.3%) | License: Apache-2.0官网: huggingface.co/docs/text-generation-inference
注意: 该项目已于 2026 年 3 月 21 日归档(archived),进入维护模式。HuggingFace 官方推荐新项目使用 vLLM 、SGLang 、llama.cpp 或 MLX 作为替代方案。但 TGI 作为 HuggingFace Hub 官方推理引擎的历史地位和工程实践仍有重要学习价值,大量存量部署仍在使用。
目录
项目速览
功能概述
适用场景
快速上手
源码架构
实操 Demo
同类对比
参考资源
项目速览 Text Generation Inference(TGI)是 HuggingFace 官方推出的 LLM 推理服务引擎,旨在为 HuggingFace Hub 上的数十万模型提供生产级服务。TGI 从诞生之初就定位为企业级推理引擎,采用 Rust + Python 的双语言架构:Rust 编写的 router 负责高性能 HTTP 请求路由和调度,Python 编写的 server 负责模型推理和生成逻辑。
截至 2026 年 3 月归档时,项目在 GitHub 上获得了 10,900+ Star ,被广泛部署于 HuggingFace 的付费推理端点(Inference Endpoints)、HuggingChat 等官方服务。TGI 的贡献包括:率先实现了基于 Rust 的高效 gRPC 路由层,引入了 watermarking(水印)技术用于生成文本溯源,以及深度融合 HuggingFace Hub 的模型生态。
TGI 虽然在竞争中逐渐被 vLLM 和 SGLang 超越(主要原因包括部署依赖 Docker、吞吐量在通用场景下不及竞品、Rust 路由层增加了调试和维护复杂度),但它的许多设计理念被后来的项目借鉴。作为 HuggingFace 生态的”官方推理栈”,理解 TGI 有助于深入理解 LLM 推理服务的系统设计。
功能概述 张量并行 — 多 GPU 透明加速 TGI 的招牌特性之一是开箱即用的张量并行(Tensor Parallelism),通过 NCCL(NVIDIA Collective Communications Library)实现多 GPU 间的权重分片和通信。对于 70B+ 参数的大模型,只需增加 --num-shard 参数即可将模型分布到多 GPU:
docker run --gpus all --shm-size 1g -p 8080:80 \ ghcr.io/huggingface/text-generation-inference:3.3.5 \ --model-id meta-llama/Llama-3.1-70B-Instruct \ --num-shard 4
TGI 的张量并行不需要对模型代码做任何修改,框架会自动切分注意力头、MLP 层等权重矩阵。在多 GPU 节点上,使用 NVLink/NVSwitch 互联的 GPU 可以接近线性加速。
量化支持矩阵 TGI 集成了多种量化方案,可通过 --quantize 参数一键切换:
量化方案
命令参数
适用场景
bitsandbytes NF4
--quantize bitsandbytes-nf4
通用 GPU 量化,4-bit
bitsandbytes FP4
--quantize bitsandbytes-fp4
与 NF4 类似,浮点 4-bit
GPT-Q
--quantize gptq
INT4 权重量化,精度较高
AWQ
--quantize awq
Activation-aware,低精度损失
Marlin
--quantize marlin
GPT-Q 的 CUDA kernel 加速版
EETQ
--quantize eetq
高效 INT8
FP8
--quantize fp8
H100/Ada 原生 FP8,几乎无损
量化可以大幅降低显存需求。以 Llama-3.1-70B 为例,FP16 需要约 140GB 显存,使用 bitsandbytes NF4 量化后只需约 40GB,使其能在单张 A100 (80GB) 上运行。
流式输出与 SSE TGI 原生支持 Server-Sent Events (SSE) 流式输出,提供了 /generate_stream 端点:
curl 127.0.0.1:8080/generate_stream -X POST \ -d '{"inputs":"What is Deep Learning?","parameters":{"max_new_tokens":50}}' \ -H 'Content-Type: application/json'
每生成一个 token,服务器就推送一个事件,客户端可以实时渲染。流式输出对用户体验至关重要:用户看到逐字输出而非等待 10 秒后看到完整结果。
TGI 还实现了 token streaming with watermarking :在生成流中的每个 token 都可以被水印标记,结合 --watermark-gamma 和 --watermark-delta 参数调整水印强度,用于识别 AI 生成的文本。
OpenAI 兼容 Messages API TGI 提供了与 OpenAI Chat Completions API 兼容的 /v1/chat/completions 端点:
curl localhost:8080/v1/chat/completions -X POST -d '{ "model": "tgi", "messages": [ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "What is deep learning?"} ], "stream": true, "max_tokens": 256 }' -H 'Content-Type: application/json'
这意味着使用 OpenAI Python/JavaScript SDK 的应用可以无缝切换到 TGI 后端,只需修改 base_url。
Guidance 和 JSON 约束生成 TGI 集成了 Guidance 的语法约束引擎,支持通过 grammar 控制模型的输出格式。在 API 调用中可以通过 grammar 参数传入 BNF 语法字符串,强制模型生成符合语法的文本:
curl 127.0.0.1:8080/generate -X POST -d '{ "inputs": "Extract person info: John, 30, New York", "parameters": { "max_new_tokens": 100, "grammar": "root ::= \"{\" \"name\" \":\" string \",\" \"age\" \":\" number \",\" \"city\" \":\" string \"}\"" } }' -H 'Content-Type: application/json'
这使得 TGI 在需要精确格式输出的场景(如 API 参数生成、数据标注)中仍有独特优势。
生产级可观测性 TGI 内置了完善的生产运维支持:
Prometheus 指标 :自动暴露 /metrics 端点,包含请求数、延迟分布、队列长度、token 吞吐量等指标
OpenTelemetry 分布式追踪 :通过 --otlp-endpoint 将请求全链路 trace 发送到 OTLP 兼容的后端(如 Jaeger、Datadog)
健康检查 :/health 端点用于 Kubernetes liveness probe
结构化日志 :JSON 格式日志,方便接入 ELK/Loki 等日志系统
这些特性使 TGI 在需要严格 SLA 的企业部署中仍然可见一斑。
适用场景 HuggingFace Hub 深度集成 如果你的模型托管在 HuggingFace Hub,且需要使用 gated model(需要 token 访问的模型),TGI 提供了最流畅的体验:只需设置 HF_TOKEN 环境变量,TGI 会自动处理认证和模型下载。这在企业私有模型部署中很实用。
存量部署维护 大量在 2022-2025 年间采用 TGI 构建的生产系统仍在运行。理解和维护这些存量系统需要掌握 TGI 的部署、配置和调试方法。
多 GPU 大模型推理 TGI 的张量并行在多 GPU 环境中配置简单(--num-shard N),透明度高。对于没有专门的 GPU 集群管理平台的小团队,TGI 的 Docker 化部署提供了一致的环境。
需要水印能力的生成场景 如果业务需要检测 AI 生成文本(如教育平台需要验证学生作业是否由 AI 生成),TGI 是为数不多的内置水印支持的推理引擎。配合 --watermark-gamma 参数,可以在生成过程中嵌入统计水印。
学习推理服务架构设计 TGI 的 Rust + Python 双语言架构、gRPC 路由层、launcher 进程管理模型等工程实践,对学习 LLM 推理服务系统设计有很好的参考价值。
快速上手 环境要求
Docker(主要部署方式)
NVIDIA GPU(推荐)或 AMD GPU(ROCm)/ Intel GPU / CPU
NVIDIA Container Toolkit(GPU 场景)
Docker 部署(推荐) docker pull ghcr.io/huggingface/text-generation-inference:3.3.5 model=HuggingFaceH4/zephyr-7b-beta volume=$PWD /data docker run --gpus all \ --shm-size 1g \ -p 8080:80 \ -v $volume :/data \ ghcr.io/huggingface/text-generation-inference:3.3.5 \ --model-id $model
需要访问 gated model 时传入 HF Token:
model=meta-llama/Meta-Llama-3.1-8B-Instruct token=hf_your_token_here docker run --gpus all \ --shm-size 1g \ -e HF_TOKEN=$token \ -p 8080:80 \ -v $PWD /data:/data \ ghcr.io/huggingface/text-generation-inference:3.3.5 \ --model-id $model
AMD GPU:
docker run --device /dev/kfd --device /dev/dri \ --shm-size 1g \ -p 8080:80 \ -v $PWD /data:/data \ ghcr.io/huggingface/text-generation-inference:3.3.5-rocm \ --model-id $model
量化部署 docker run --gpus all --shm-size 1g -p 8080:80 \ -v $PWD /data:/data \ ghcr.io/huggingface/text-generation-inference:3.3.5 \ --model-id meta-llama/Llama-3.1-8B-Instruct \ --quantize bitsandbytes-nf4 docker run --gpus all --shm-size 1g -p 8080:80 \ -v $PWD /data:/data \ ghcr.io/huggingface/text-generation-inference:3.3.5 \ --model-id TheBloke/Llama-2-7B-GPTQ \ --quantize gptq
客户端调用 import requestsimport jsonresponse = requests.post( "http://localhost:8080/generate" , json={ "inputs" : "Explain deep learning in one sentence." , "parameters" : { "max_new_tokens" : 100 , "temperature" : 0.7 , "top_p" : 0.95 , } }, headers={"Content-Type" : "application/json" }, ) print (response.json()["generated_text" ])response = requests.post( "http://localhost:8080/generate_stream" , json={ "inputs" : "Tell me a story about a robot." , "parameters" : {"max_new_tokens" : 200 }, }, stream=True , headers={"Content-Type" : "application/json" }, ) for line in response.iter_lines(): if line: data = json.loads(line.decode("utf-8" ).removeprefix("data:" )) if data.get("token" , {}).get("text" ): print (data["token" ]["text" ], end="" , flush=True ) if data.get("generated_text" ): break print ()from openai import OpenAIclient = OpenAI(base_url="http://localhost:8080/v1" , api_key="token-abc123" ) response = client.chat.completions.create( model="tgi" , messages=[ {"role" : "user" , "content" : "What is the capital of France?" } ], max_tokens=50 , ) print (response.choices[0 ].message.content)
源码架构 TGI 采用 Rust + Python 混合架构,Rust 负责高性能路由和调度,Python 负责模型推理:
text-generation-inference/ ├── router/ # Rust 实现的 HTTP/gRPC 路由层 │ ├── src/ │ │ ├── main.rs # 路由入口 │ │ ├── server.rs # HTTP/gRPC 服务器启动 │ │ ├── queue.rs # 请求队列管理 │ │ └── health.rs # 健康检查端点 │ └── Cargo.toml ├── launcher/ # 启动器(Python) │ └── src/main.rs # text-generation-launcher 命令入口 ├── server/ # Python 推理服务核心 │ ├── text_generation_server/ │ │ ├── server.py # gRPC 服务端(接收 router 的转发请求) │ │ ├── models/ # 模型适配层 │ │ │ ├── model.py # 模型加载基类 │ │ │ ├── flash_causal_lm.py # FlashAttention 优化的因果 LM │ │ │ ├── bloom.py # BLOOM 模型适配 │ │ │ └── ... # 其他模型适配 │ │ ├── utils/ │ │ │ ├── watermark.py # 水印算法实现 │ │ │ └── dist.py # NCCL 分布式通信 │ │ └── pb/ # 从 proto 生成的 Python gRPC 代码 │ └── Makefile ├── backends/ # 硬件后端 │ ├── backends.py # 后端抽象 │ └── ... # Nvidia/AMD/Intel 后端 ├── proto/ # gRPC protobuf 定义 │ └── generate.proto # 推理服务协议 ├── clients/python/ # 官方 Python 客户端库 ├── benchmark/ # 性能基准测试 ├── integration-tests/ # 集成测试 ├── load_tests/ # 负载测试 ├── docs/ # 文档 └── assets/ # 静态资源
核心模块说明:
**router/**:Rust 实现的高性能 HTTP 前端。它接收外部 HTTP 请求,负责请求排队、负载分发、认证和健康检查。router 通过 gRPC 与 Python server 通信——这种设计使 HTTP 层完全无阻塞,所有请求解析和排队都在高性能 Rust 代码中完成。
**launcher/**:启动器进程,负责下载/缓存模型、管理环境、启动 Rust router 和 Python server 两个子进程。text-generation-launcher 是用户入口命令。
server/text_generation_server/server.py :Python 推理服务的主进程。它接收来自 Rust router 的 gRPC 请求,调用模型进行推理,并通过 gRPC 流返回生成结果。实现了 continuous batching 的调度逻辑。
**server/text_generation_server/models/**:模型适配层,为不同模型架构提供统一的推理接口。flash_causal_lm.py 是核心实现,集成了 Flash Attention 内核。每个模型家族都有独立的适配代码处理其特有的 attention mask、position encoding 和层结构。
utils/watermark.py :实现了基于 Kirchenbauer 等人(2023)提出的统计水印算法。在 token 采样阶段,通过偏向特定 token 的选择来嵌入可检测的模式。
proto/generate.proto :定义了推理服务的 gRPC 协议,包括 ServiceDiscovery、Info、Health、Service、TextService 等服务接口,以及 Batch、Request、GeneratedText 等消息类型。
实操 Demo 完整部署示例:从 Docker 到 API 调用 1. 拉取镜像并启动服务
mkdir -p ~/tgi-datadocker run --gpus all \ --shm-size 1g \ -p 8080:80 \ -v ~/tgi-data:/data \ -e HF_TOKEN=hf_your_token_here \ ghcr.io/huggingface/text-generation-inference:3.3.5 \ --model-id meta-llama/Meta-Llama-3.1-8B-Instruct \ --max-total-tokens 4096 \ --max-batch-size 8
启动成功后,控制台输出类似:
2026-06-15T10:00:00.000000Z INFO text_generation_launcher: Args { model_id: "meta-llama/Meta-Llama-3.1-8B-Instruct", ... } 2026-06-15T10:00:05.123456Z INFO download: text_generation_launcher: Downloading model... 2026-06-15T10:00:30.654321Z INFO text_generation_launcher: Server started at http://0.0.0.0:80 2026-06-15T10:00:30.654321Z INFO text_generation_launcher: Starting router...
2. 基础 API 调用
import requestsimport jsonimport timeBASE_URL = "http://localhost:8080" resp = requests.get(f"{BASE_URL} /health" ) print (f"Status: {resp.status_code} " )resp = requests.get(f"{BASE_URL} /info" ) info = resp.json() print (f"Model: {info.get('model_id' )} " )print (f"Max tokens: {info.get('max_total_tokens' )} " )print (f"Quantization: {info.get('quantization' , 'none' )} " )response = requests.post( f"{BASE_URL} /generate" , json={ "inputs" : "用中文写一个简单的二分查找函数。" , "parameters" : { "max_new_tokens" : 256 , "temperature" : 0.3 , "top_p" : 0.95 , "do_sample" : True , }, }, headers={"Content-Type" : "application/json" }, ) print ("\n=== 生成结果 ===" )print (response.json()["generated_text" ])
3. 流式输出 + 实时渲染
import requestsimport jsonimport sysdef stream_generate (prompt: str , max_tokens: int = 200 ): """流式生成并实时打印到终端""" response = requests.post( "http://localhost:8080/generate_stream" , json={ "inputs" : prompt, "parameters" : { "max_new_tokens" : max_tokens, "temperature" : 0.7 , "top_p" : 0.9 , "do_sample" : True , }, }, stream=True , headers={"Content-Type" : "application/json" }, ) first_token_time = None token_count = 0 for line in response.iter_lines(): if not line: continue line = line.decode("utf-8" ) if not line.startswith("data:" ): continue try : data = json.loads(line[len ("data:" ):]) except json.JSONDecodeError: continue if first_token_time is None and "token" in data: first_token_time = time.time() if "token" in data and "text" in data["token" ]: sys.stdout.write(data["token" ]["text" ]) sys.stdout.flush() token_count += 1 if data.get("generated_text" ): break print (f"\n\n--- 首 token 延迟: {first_token_time - start:.2 f} s | 总 token: {token_count} ---" ) start = time.time() stream_generate("请详细解释 Docker 和虚拟机的区别,用表格对比。" )
4. OpenAI 兼容 API 调用
from openai import OpenAIclient = OpenAI(base_url="http://localhost:8080/v1" , api_key="not-needed" ) response = client.chat.completions.create( model="tgi" , messages=[ {"role" : "system" , "content" : "你是一个 Python 编程专家,回答使用中文。" }, {"role" : "user" , "content" : "解释 Python 装饰器的原理并给出一个实际例子。" }, ], temperature=0.7 , max_tokens=512 , ) print (response.choices[0 ].message.content)print (f"\nToken 使用: {response.usage} " )stream = client.chat.completions.create( model="tgi" , messages=[{"role" : "user" , "content" : "写一首关于人工智能的现代诗。" }], stream=True , max_tokens=256 , ) for chunk in stream: if chunk.choices[0 ].delta.content: print (chunk.choices[0 ].delta.content, end="" , flush=True ) print ()messages = [ {"role" : "system" , "content" : "你是一个技术面试官。" }, ] questions = [ "什么是微服务架构?" , "它和单体架构相比有什么优势?" , "容器化在微服务中扮演什么角色?" , ] for q in questions: messages.append({"role" : "user" , "content" : q}) resp = client.chat.completions.create( model="tgi" , messages=messages, max_tokens=256 , ) answer = resp.choices[0 ].message.content messages.append({"role" : "assistant" , "content" : answer}) print (f"\nQ: {q} " ) print (f"A: {answer[:150 ]} ..." )
5. 并发性能测试
import concurrent.futuresimport timefrom openai import OpenAIclient = OpenAI(base_url="http://localhost:8080/v1" , api_key="not-needed" ) def make_request (i ): start = time.time() response = client.chat.completions.create( model="tgi" , messages=[{"role" : "user" , "content" : f"用{i+1 } 句话解释什么是机器学习。" }], max_tokens=100 , ) elapsed = time.time() - start return { "id" : i, "time" : elapsed, "tokens" : response.usage.completion_tokens if response.usage else 0 , } for concurrency in [2 , 4 , 8 ]: start = time.time() with concurrent.futures.ThreadPoolExecutor(max_workers=concurrency) as executor: futures = [executor.submit(make_request, i) for i in range (concurrency)] results = [f.result() for f in futures] total = time.time() - start avg = sum (r["time" ] for r in results) / len (results) print (f"并发 {concurrency} : 总耗时 {total:.2 f} s, 平均 {avg:.2 f} s/请求" )
6. curl 命令行测试
curl -s http://localhost:8080/generate \ -X POST \ -d '{"inputs":"What is Python?","parameters":{"max_new_tokens":50}}' \ -H 'Content-Type: application/json' | jq -r '.generated_text' curl -N http://localhost:8080/generate_stream \ -X POST \ -d '{"inputs":"Tell me a joke.","parameters":{"max_new_tokens":100}}' \ -H 'Content-Type: application/json' curl -s http://localhost:8080/v1/chat/completions \ -X POST \ -d '{ "model": "tgi", "messages": [{"role": "user", "content": "Hello, who are you?"}], "max_tokens": 50 }' \ -H 'Content-Type: application/json' | jq -r '.choices[0].message.content' curl -s http://localhost:8080/generate \ -X POST \ -d '{ "inputs": "输出一个包含name和age的JSON", "parameters": { "max_new_tokens": 100, "grammar": "root ::= \"{\" \"\\\"name\\\"\" \":\" string \",\" \"\\\"age\\\"\" \":\" number \"}\"" } }' \ -H 'Content-Type: application/json' | jq -r '.generated_text' curl -s http://localhost:8080/metrics | head -20
同类对比
特性
TGI
vLLM
SGLang
DeepSpeed-MII
维护者
HuggingFace
UC Berkeley + 社区
LMSYS
Microsoft
状态
已归档(维护模式)
活跃开发
活跃开发
低活跃度
部署方式
Docker(主要)
pip install
pip install
pip install + DeepSpeed
语言架构
Rust + Python
Python
Python
Python
张量并行
原生(NCCL)
支持
支持(TP/PP/EP)
原生(DeepSpeed 集成)
Continuous Batching
支持
支持
支持
支持
KV Cache 优化
PagedAttention
PagedAttention
RadixAttention
无专项优化
量化
GPT-Q/AWQ/bitsandbytes/FP8
AWQ/GPTQ/FP8/GGUF 等
AWQ/GPTQ/FP8/INT4
有限支持
流式输出
SSE 流式
SSE 流式
SSE 流式
支持
Structured Output
Grammar (BNF)
xgrammar/guidance
FSM + regex + JSON schema
不支持
水印
内置
不支持
不支持
不支持
HF Hub 集成
最深(官方)
支持
支持
支持
OpenTelemetry
内置
可选
可选
不支持
Star
10.9k
82.9k
29k
1.8k
选型建议:
TGI 适合维护现有部署,或需要 HuggingFace 最深度集成、水印能力、gated model 便利访问的场景。新项目不建议作为首选。
vLLM 是当前最成熟的生产级推理引擎,通用场景最优,社区最大,适合大多数新项目。
SGLang 在长前缀场景和结构化生成方面有独特优势,适合 Agent 系统和 JSON 抽取管线。
DeepSpeed-MII 基于微软 DeepSpeed 框架,在微软生态中仍有使用,但社区活跃度已明显下降。新项目不建议采用。
参考资源