Docker部署HuggingFace TGI:高性能开源LLM推理服务
Ollama 好用,但它在生产场景下有点力不从心。如果你需要高并发、低延迟的 LLM 推理服务,HuggingFace 官方推出的 TGI(Text Generation Inference)才是正解。它支持 vLLM 调度,量化模型,还能直接暴露 HTTP API,非常适合接入自己的应用。
今天教你用 Docker 一键部署 TGI,把 HuggingFace 的开源模型变成你自己的推理后端。
准备工作
- 一台带 GPU 的 VPS:TGI 是吃显卡的。至少 1 张 A10G(24G 显存)才能跑 7B 级别模型。纯 CPU 也能跑,但速度感人。
- NVIDIA Container Toolkit:让 Docker 能调用 GPU。
- Docker 和 Docker Compose。
- 一个 HuggingFace Token:部分模型需要授权,去 huggingface.co/settings/tokens 申请。
搭建步骤
第一步:安装 NVIDIA Container Toolkit
如果还没装,按顺序执行:
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
验证 GPU 是否被 Docker 识别:
docker run --rm --gpus all nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi
能看到显卡信息就说明搞定了。
第二步:创建 TGI 配置文件
新建一个目录并进入:
mkdir tgi && cd tgi
创建 docker-compose.yml:
version: '3.8'
services:
tgi:
image: ghcr.io/huggingface/text-generation-inference:2.3.0
container_name: tgi-server
restart: always
ports:
- "8080:80"
environment:
- HUGGINGFACE_HUB_TOKEN=${HF_TOKEN}
- HUGGING_FACE_HUB_TOKEN=${HF_TOKEN}
volumes:
- model-cache:/data
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
volumes:
model-cache:
这里用了 ghcr.io/huggingface/text-generation-inference:2.3.0 镜像,自动挂载 GPU,模型文件缓存在 Docker Volume 里,重启不丢失。
创建 .env 文件填入你的 Token:
echo "HF_TOKEN=hf_xxxxxxxxxxxxxxxx" > .env
第三步:启动服务
指定要跑的模型,直接启动:
HF_TOKEN=$(grep HF_TOKEN .env | cut -d= -f2)
docker compose up -d \
-e HUGGINGFACE_HUB_MODEL=mistralai/Mistral-7B-Instruct-v0.3 \
--env-file .env \
tgi
或者更简单的写法,在启动时传入模型名:
docker compose up -d tgi
首次启动会自动下载模型。7B 模型大约 14GB,取决于网络速度可能要等几分钟。你可以用 docker logs -f tgi-server 观察进度。
第四步:自定义参数(可选)
如果你想调整并发或启用量化,可以在启动命令加参数:
docker compose up -d \
--scale tgi=1 \
tgi
修改 docker-compose.yml 添加环境变量:
environment:
- HUGGINGFACE_HUB_TOKEN=${HF_TOKEN}
- MODEL_ID=mistralai/Mistral-7B-Instruct-v0.3
- NUM_SHARD=1
- MAX_INPUT_TOKENS=4096
- MAX_TOTAL_TOKENS=8192
- QUANTIZE=bitsandbytes-nf4
QUANTIZE=bitsandbytes-nf4 会把模型量化到 4-bit,显存占用减半,精度损失很小。
验证部署
方法一:健康检查
curl http://localhost:8080/health
返回 {"status":"ok" 说明服务正常。
方法二:实际推理
curl http://localhost:8080/generate \
-X POST \
-H "Content-Type: application/json" \
-d '{
"inputs": "介绍一下Docker是什么",
"parameters": {
"max_new_tokens": 256,
"do_sample": true,
"temperature": 0.7
}
}'
你会收到类似这样的 JSON 响应:
{
"generated_text": "Docker 是一个开源的应用容器引擎..."
}
方法三:Chat 接口
TGI 也支持 OpenAI 兼容的 chat 接口,可以直接对接各种前端:
curl http://localhost:8080/v1/chat/completions \
-X POST \
-H "Content-Type: application/json" \
-d '{
"model": "mistralai/Mistral-7B-Instruct-v0.3",
"messages": [{"role": "user", "content": "你好,请自我介绍"}],
"max_tokens": 512
}'
常见问题
Q1:显存不够怎么办?
用量化模型。把 MODEL_ID 换成带 -GGUF 或 Q4_K_M 后缀的版本,比如 bartowski/Mistral-7B-Instruct-v0.3-GGUF。量化后 8G 显存也能跑。
Q2:下载模型太慢?
TGI 默认从 HuggingFace Hub 下载,国内可能很慢。可以提前在本地下载好模型,然后挂载到容器:
volumes:
- /path/to/local/model:/data
environment:
- MODEL_ID=/data
Q3:如何同时跑多个模型?
TGI 一次只能加载一个模型。如果需要多模型,启动多个容器,每个监听不同端口:
tgi-qwen:
image: ghcr.io/huggingface/text-generation-inference:2.3.0
ports:
- "8081:80"
environment:
- MODEL_ID=Qwen/Qwen2.5-7B-Instruct
tgi-mistral:
image: ghcr.io/huggingface/text-generation-inference:2.3.0
ports:
- "8082:80"
environment:
- MODEL_ID=mistralai/Mistral-7B-Instruct-v0.3
Q4:API 延迟太高?
检查是否启用了 vLLM。在 docker-compose.yml 中添加:
environment:
- USE_VLLM=true
vLLM 的 PagedAttention 机制能显著提升吞吐量和降低延迟。
总结
TGI 是目前开源社区最强的 LLM 推理框架之一。配合 Docker 部署,几分钟就能拥有一个生产级的推理后端。相比 Ollama,它更适合需要高并发和 API 集成的场景。
下一步,你可以把 TGI 接入 LangChain 或 LlamaIndex,让它成为你 AI 应用的核心引擎。