Docker部署HuggingFace TGI:高性能开源LLM推理服务

Docker部署HuggingFace TGI:高性能开源LLM推理服务

Ollama 好用,但它在生产场景下有点力不从心。如果你需要高并发、低延迟的 LLM 推理服务,HuggingFace 官方推出的 TGI(Text Generation Inference)才是正解。它支持 vLLM 调度,量化模型,还能直接暴露 HTTP API,非常适合接入自己的应用。

今天教你用 Docker 一键部署 TGI,把 HuggingFace 的开源模型变成你自己的推理后端。

准备工作

  1. 一台带 GPU 的 VPS:TGI 是吃显卡的。至少 1 张 A10G(24G 显存)才能跑 7B 级别模型。纯 CPU 也能跑,但速度感人。
  2. NVIDIA Container Toolkit:让 Docker 能调用 GPU。
  3. Docker 和 Docker Compose
  4. 一个 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 换成带 -GGUFQ4_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 应用的核心引擎。

这篇文章对你有帮助吗?