我第一次接触 TGI(Text Generation Inference)的时候,国内社区对它的中文教程少得可怜,而 HuggingFace 官方文档默认假设你已经会 Docker、会 GPU 驱动、会写 Python 调用,看起来门槛极高。所以这篇文章,我决定用最朴素的语言,把"把开源模型打成 API"这件事,从零拆给你看。

你只要会复制粘贴命令、会装一个 Python,就能跟着做完。整篇文章以图文步骤(用文字模拟截图)+ 可复制代码为主,目标:让一台有 GPU 的服务器,10 分钟内对外提供和 OpenAI 一样的 /v1/chat/completions 接口。

一、先搞懂:TGI 到底是什么?

TGI 是 HuggingFace 官方开源的大模型推理服务。它的核心功能只有一句话:

说人话:你写了一行命令,它就给你一个"本地版 ChatGPT API",可以挂到你自己的网站、机器人、企业系统里。完全免费、不限调用次数,只受限于你的显卡。

二、为什么要把开源模型 API 化?

直接用 transformers 的 model.generate() 不行吗?不行。原因有三:

  1. 不能并发:你写一个 Flask 包一层,10 个人同时问,显卡排队,第一个人等第 10 个人回答完才轮到,体验极差。
  2. 没有标准协议:每个项目调法不一样,换模型要改业务代码。
  3. 没有流式输出:网页端打字机效果做不出来。

TGI 帮你把这些坑全填了。部署完之后,你拿到的接口和 OpenAI、Claude 完全兼容(路径、参数名都一样),换模型不用改一行代码。

三、环境准备(新手只看这一节就够)

硬件最低配置:

软件依赖:

截图步骤 ① 检查显卡:打开终端,输入下面这行:

nvidia-smi

你应该能看到一张显卡信息表,右上角显示驱动版本 ≥ 525。如果没有,请去 NVIDIA 官网装最新驱动。

截图步骤 ② 检查 Docker:

docker --version
docker run --rm --gpus all nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi

第二行如果也能输出显卡信息,说明 NVIDIA Container Toolkit 装好了。如果报 could not select device driver "",去搜 "ubuntu install nvidia container toolkit",照官方命令一条条跑就行。

四、Step 1:一条命令启动 TGI 服务

我最喜欢 TGI 的就是这一步——HuggingFace 把所有依赖打包成镜像,你只需要 docker run

这里我们跑一个 Qwen2.5-7B-Instruct(阿里通义千问,中文能力很强,INT4 量化后只占 6GB 显存):

docker run -d \
  --name tgi-qwen \
  --gpus all \
  --shm-size 1g \
  -p 8080:80 \
  -v ~/.cache/huggingface:/data \
  ghcr.io/huggingface/text-generation-inference:2.3.0 \
  --model-id Qwen/Qwen2.5-7B-Instruct \
  --quantize bitsandbytes-nf4 \
  --max-concurrent-requests 32 \
  --max-input-length 4096 \
  --max-total-tokens 8192

参数白话翻译:

截图步骤 ③ 查看日志:

docker logs -f tgi-qwen

当你看到一行 INFO text_generation_router Server listening on 0.0.0.0:80,恭喜你,服务起来了。第一次启动会下载模型权重(大约 4~8GB),取决于你的网速,可能要等 5~20 分钟。

五、Step 2:用 curl 测试接口

最朴素的测试方式,在任意终端执行:

curl http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Qwen/Qwen2.5-7B-Instruct",
    "messages": [{"role": "user", "content": "你好,请用一句话介绍你自己"}],
    "max_tokens": 100,
    "stream": false
  }'

返回 JSON 里能看到 "content": "我是通义千问...",说明 API 通了。注意这个路径 /v1/chat/completions——和 OpenAI 一模一样,意味着你现有的 OpenAI 客户端代码,只要把 base_url 改一下就能直接用

六、Step 3:用 Python 写一个真正的客户端

很多人不知道,OpenAI 官方提供的 openai Python 包支持自定义 base_url,所以一行代码就能对接 TGI:

# pip install openai
from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:8080/v1",  # 指向你本地 TGI
    api_key="not-needed",                  # TGI 默认不校验
)

resp = client.chat.completions.create(
    model="Qwen/Qwen2.5-7B-Instruct",
    messages=[{"role": "user", "content": "写一首关于程序员的七言绝句"}],
    temperature=0.7,
    max_tokens=200,
)
print(resp.choices[0].message.content)

流式输出(打字机效果)也非常简单:

stream = client.chat.completions.create(
    model="Qwen/Qwen2.5-7B-Instruct",
    messages=[{"role": "user", "content": "讲个笑话"}],
    stream=True,
)
for chunk in stream:
    print(chunk.choices[0].delta.content or "", end="", flush=True)

这就是 API 化的好处:业务代码完全标准化,换 TGI 换 OpenAI 换 Claude,业务代码一行不用改。

七、不想自己部署?用 HolySheep AI 一键调用主流模型

老实说,自己买 GPU 部署 TGI 适合日均调用量超过 500 万 token的团队。如果你是个人开发者或者小公司初创项目,自建成本其实不如直接用托管 API。

我自己现在主力用的是 立即注册 HolySheep AI,理由很简单:

对接代码和 TGI 完全一样,只改两行:

from openai import OpenAI

client = OpenAI(
    base_url="https://api.holysheep.ai/v1",        # ← HolySheep 网关
    api_key="YOUR_HOLYSHEEP_API_KEY",               # ← 在控制台一键生成
)

resp = client.chat.completions.create(
    model="deepseek-chat",                          # HolySheep 兼容 DeepSeek V3.2
    messages=[{"role": "user", "content": "用 Python 写一个快速排序"}],
    max_tokens=300,
)
print(resp.choices[0].message.content)

同样的代码、同样的包,只是换了个 base_url 和 key。这就是 OpenAI 协议统一生态的好处。我曾经在深夜紧急赶一个项目,自建 TGI 的 GPU 突然 OOM 挂了,30 秒切到 HolySheep 的 DeepSeek V3.2,业务没中断,那一刻真的觉得这种"抽象层"是工程师的救命稻草。

八、性能调优小贴士(我踩过的坑)

如果你坚持自建 TGI,这几个参数能让你少走 3 天弯路:

常见报错排查

① 报错:docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]]

原因:没装 NVIDIA Container Toolkit。解决:

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
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/$distribution/libnvidia-container.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 systemctl restart docker

② 报错:torch.cuda.OutOfMemoryError: CUDA out of memory

原因:模型太大,量化没开。解决:在 docker run 里加 --quantize awq,或者换小一号的模型(比如把 14B 换成 7B)。

③ 报错:调用 API 返回 404 Not Found

原因:访问路径错了。TGI 默认挂载在容器 80 端口,你映射到宿主机的 8080,所以应该访问 http://IP:8080/v1/chat/completions,少写了 /v1 就会 404。

④ 报错:openai.AuthenticationError: Incorrect API key provided

原因:用了 OpenAI 的 key。解决:TGI 本地部署不需要鉴权,api_key="not-needed" 随便填即可;如果是调 HolySheep,去控制台 注册 后重新生成。

常见错误与解决方案

错误 1:模型下载到一半断网,容器一直重启

解决:用本地卷缓存。TGI 会把模型下载到 /data 目录,挂载到宿主机的 ~/.cache/huggingface,下次启动直接复用:

# 先在宿主机手动下载(可选)
huggingface-cli download Qwen/Qwen2.5-7B-Instruct --local-dir ~/.cache/huggingface/hub

然后启动 docker,加 -v 映射(上面命令已有)

docker start tgi-qwen

错误 2:Python 客户端报 openai.APIConnectionError

原因:base_url 写成了 https://,但 TGI 默认没开 HTTPS。解决:把协议改成 http://,或者启动时加 --ssl-keyfile --ssl-certfile

# 错误写法
client = OpenAI(base_url="https://localhost:8080/v1", api_key="...")

正确写法

client = OpenAI(base_url="http://localhost:8080/v1", api_key="not-needed")

错误 3:流式输出只有一行,没"打字机效果"

原因:客户端没设 stream=True,或者服务端没开 SSE。解决:

# 客户端必须显式开启
stream = client.chat.completions.create(
    model="Qwen/Qwen2.5-7B-Instruct",
    messages=[{"role": "user", "content": "hello"}],
    stream=True,          # ← 关键
)
for chunk in stream:
    delta = chunk.choices[0].delta.content
    if delta:
        print(delta, end="", flush=True)

错误 4:部署完成后外网访问不到

原因:云服务商的安全组没开 8080 端口。解决:去云控制台(阿里云安全组 / 腾讯云防火墙 / AWS Security Group)添加入站规则,协议 TCP,端口 8080,来源 0.0.0.0/0。如果只是内网用,写成 172.16.0.0/16(你的 VPC 网段)。

错误 5:并发一高就 OOM

原因:--max-concurrent-requests 设太大,KV cache 把显存吃光。解决:把并发降到 16 或 8,同时启用量化:

docker run -d --gpus all --shm-size 2g -p 8080:80 \
  ghcr.io/huggingface/text-generation-inference:2.3.0 \
  --model-id Qwen/Qwen2.5-7B-Instruct \
  --quantize awq \
  --max-concurrent-requests 8 \
  --max-batch-prefill-tokens 2048 \
  --max-total-tokens 4096

九、总结:自建 vs 托管,到底怎么选?

我现在的标准工作流是:本地用 TGI 跑 7B 做开发调试,上线前用 HolySheep 的 DeepSeek V3.2 做压测($0.42/MTok 真的便宜),正式环境两者并存。整个过程代码不用改,因为大家都是 OpenAI 协议。

👉 免费注册 HolySheep AI,获取首月赠额度,亲自体验一下国内直连 <50ms 的速度。