引言
文本生成已成为一项革命性的能力,改变了机器解读和生成类人文本的方式。这一热潮推动了众多工具的发展,旨在简化和增强与LLM合作的过程。
大型语言模型迅速扩展,新版本几乎每周都会出现,带动了支持该技术的托管选项同步增长。在众多可用工具中,Hugging Face的文本生成推理(TGI)脱颖而出,使我们能够在本地机器上将LLM作为服务运行。
本指南将深入探讨为什么Hugging Face TGI是一项重大创新,以及如何用它开发能够生成越来越难以与人类写作区分的文本的复杂AI模型。
什么是 Hugging Face 文本生成推理?
Hugging Face 文本生成推理(TGI)是一个用 Rust 和 Python 编写的框架,用于部署和服务大型语言模型。它是一个专为此目的设计的、可用于生产环境的工具包。
Hugging Face 开发并分发 TGI,采用 HFOILv1.0 许可证,允许商业使用,前提是它作为产品或服务中的辅助工具,而不是主要功能。它主要解决以下挑战:
Hugging Face 文本生成推理(TGI)的关键特性
-
高性能文本生成
— TGI 采用张量并行(Tensor Parallelism)将大型模型分布到多个 GPU,以及动态批处理(dynamic batching)在服务器内部实时组合提示,从而优化流行的开源 LLM(如 StarCoder、BLOOM、GPT-NeoX、Llama 和 T5)的性能。 -
高效资源使用
— TGI 使用连续批处理(continuous batching)、优化代码和张量并行,以最小化资源使用同时处理多个请求。 -
灵活性与安全性
— TGI 支持各种安全和防护特性,例如水印(watermarking)、logit 扭曲(通过注入偏差值修改特定 token 的 logits)和停止序列(stop sequences),确保负责任且受控的 LLM 使用。
Hugging Face 已经优化了一些 LLM 的架构,使其在 TGI 上运行更快,包括流行的模型如 LLaMA、Falcon7B 和 Mistral。支持的完整模型列表可在其文档中找到。
为什么要使用 Hugging Face TGI?
Hugging Face 已成为具有自然语言能力的人工智能开发首选平台。它托管了大量领先的开源模型,是 NLP 创新的强大引擎。传统上,这些模型太大,无法在本地运行,因此需要依赖基于云的服务。
然而,最近在量化技术(如 QLoRa 和 GPTQ)上的进步使得一些 LLM 可以在日常设备(包括本地计算机)上运行。
Hugging Face TGI 专门设计用于在本地机器上将 LLM 作为服务运行。这种方法通过保持模型在后台准备就绪以快速响应,解决了启动 LLM 的挑战,避免了为每个提示长时间等待。想象一下,拥有一个端点,上面有一系列顶级语言模型,可以按需生成文本。
TGI 的突出之处在于其简洁的实现。它支持多种简化的模型架构,使部署快速简便。
此外,TGI 已经为多个实际项目提供支持。一些例子包括:

- Hugging Chat,一个面向开放访问模型的开源接口。
- OpenAssistant,一个用于训练 LLM 的开源社区项目。
- nat.dev,一个用于探索和比较 LLM 的平台。
然而,有一个显著的限制:TGI 还不兼容基于 ARM 的 GPU Mac,包括 M1 系列及后续型号。
设置 Hugging Face TGI
首先,设置 Hugging Face TGI 端点。

要在本地安装和运行 Hugging Face TGI,首先安装 Rust。之后,使用 Python 3.9 或更高版本设置 Python 虚拟环境,例如使用 conda:
# 安装 Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# 创建 Python 虚拟环境
conda create -n text-generation-inference python=3.9
conda activate text-generation-inference
此外,安装 Protoc 是必要的。Hugging Face 建议使用 21.12 版本以获得最佳兼容性。请注意,你需要 sudo 权限才能执行此安装。
PROTOC_ZIP=protoc-21.12-linux-x86_64.zip
curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v21.12/$PROTOC_ZIP
sudo unzip -o $PROTOC_ZIP -d /usr/local bin/protoc
sudo unzip -o $PROTOC_ZIP -d /usr/local 'include/*'
rm -f $PROTOC_ZIP
首先,我将概述从零开始安装的过程,这可能并不直接。如果在此过程中遇到任何问题,你可以选择跳过,直接使用更简单的 Docker 镜像。两种方案都会介绍。
一旦所有前提条件满足,我们就可以继续设置 TGI。首先克隆 GitHub 仓库:
git clone https://github.com/huggingface/text-generation-inference.git
接下来,在本地机器上导航到 TGI 目录,并使用以下命令安装:
cd text-generation-inference/
BUILD_EXTENSIONS=False make install
现在,让我们探讨如何使用 TGI,包括使用 Docker 和不使用 Docker 的情况。为了演示,我将使用 Falcon-7B 模型,该模型采用 Apache 2.0 许可证。
不使用 Docker 启动模型
安装过程生成了一个新命令 text-generation-launcher,用于启动 TGI 服务器。要使用 Falcon-7B 模型激活一个端点,只需执行以下命令:
text-generation-launcher --model-id tiiuae/falcon-7b-instruct --num-shard 1 --port 8080 --quantize bitsandbytes
以下是每个输入参数的说明:
model-id:指 Hugging Face Hub 上列出的模型的具体名称。对于 Falcon-7B,它是tiiuae/falcon-7b-instruct。num-shard:调整此参数以匹配可用的 GPU 数量。默认值为 1。port:指定服务器监听请求的端口。默认端口是 8080。quantize:对于 VRAM 小于 24 GB 的 GPU,需要对模型进行量化以避免内存过载。在上面的命令中,选择了bitsandbytes进行即时量化。另一个选项GPTQ(gptq) 也可用,但其工作原理可能不太熟悉。
TGI 应用
有多种方式可以将文本生成推理(TGI)服务器集成到你的应用中。一旦它运行起来,你可以通过向 /generate 端点发送 POST 请求来获得结果。

如果你选择使用 TGI 进行连续 token 流式传输,可以使用下一个部分中演示的端点。这些请求可以使用你偏好的工具,如 curl、Python 或 TypeScript。要使用 Python 脚本查询由 TGI 服务的模型,你需要安装以下 text-generation 库。你可以通过运行以下 pip 命令轻松完成:
pip install text-generation
启动 TGI 服务器后,创建一个 InferenceClient() 实例,其 URL 指向模型服务端点。然后,你可以调用 text_generation() 来使用 Python 向端点发送请求。
from text_generation import Client
client = Client("http://127.0.0.1:8080")
client.text_generation(prompt="Your prompt here!")
要使用 InferenceClient 启用流式传输,只需设置 stream=True。这将使你能够实时接收服务器生成的 token。以下是使用流式传输的方法:
for token in client.text_generation("Your prompt here!", max_new_tokens=12, stream=True):
print(token)
通过 TGI 提示模型
请记住,你将与你端点上的部署模型进行交互,在我们的示例中是 Falcon-7B。通过 TGI,我们建立一个实时端点,便于从所选的 LLM 获取响应。
因此,使用 Python,可以直接通过我们本地设备上端口 8080 上托管的客户端向 LLM 发送提示。对应的 Python 脚本如下所示:
from text_generation import Client
client = Client("http://127.0.0.1:8080")
print(client.generate("Translate the following sentence into spanish: 'What does Large Language Model mean?'", max_new_tokens=500).generated_text)
我们将从模型接收到响应,而无需将其安装到我们的环境中。除了使用 Python,我们还可以使用 CURL 查询 LLM,如下例所示:
curl 127.0.0.1:8080/generate \
-X POST \
-d '{"inputs":"Code in Javascript a function to remove all spaces in a string and then print the string twice.","parameters":{"max_new_tokens":500}}' \
-H 'Content-Type: application/json'
经过试验,TGI 表现出令人印象深刻的速度。对于 Falcon-7B(token 限制为 500),只需要几秒钟。相比之下,使用 transformers 库的传统推理方法大约需要 30 秒。
使用 novita.ai 的 LLM 与 novita.ai 集成

从版本 1.4.0 开始,TGI 引入了一个与 novita.ai 的 LLM API 兼容的 API。这个新的 Messages API 使客户和用户能够无缝地从 novita.ai 模型过渡到开源 LLM。该 API 旨在直接与 novita.ai 的客户端库或与 LangChain 或 LlamaIndex 等第三方工具集成。

TGI 对 Messages 的支持确保其推理端点与 novita.ai LLM API 完全兼容。这种兼容性允许用户轻松替换任何使用 novita.ai 模型的现有脚本,而无需任何麻烦,使其能够使用托管在 TGI 端点上的开源 LLM。
此次升级实现了轻松的切换,使用户能够立即获得开源模型的广泛优势,包括:
- 对模型和数据的完全控制与透明度。
- 消除速率限制的担忧。
- 灵活定制系统以满足独特需求。
下面是一个如何将 TGI 集成到 novita.ai 聊天完成协议中的示例:
from openai import OpenAI
client = OpenAI(
base_url="https://api.novita.ai/v3/openai",
# 通过以下方式获取 NovitaAI API 密钥:https://novita.ai/get-started/Quick_Start.html#_3-create-an-api-key
api_key="<YOUR NovitaAI API Key>",
)
model = "meta-llama/llama-3-8b-instruct"
stream = True # 或 False
max_tokens = 512
chat_completion_res = client.chat.completions.create(
model=model,
messages=[
{
"role": "system",
"content": "Act like you are a helpful assistant.",
},
{
"role": "user",
"content": "Hi there!",
}
],
stream=stream,
max_tokens=max_tokens,
)
if stream:
for chunk in chat_completion_res:
print(chunk.choices[0].delta.content or "", end="")
else:
print(chat_completion_res.choices[0].message.content)
可见,我们可以使用 novita.ai 库来指定我们的端点和 Hugging Face 密码。有关此集成的更多详细信息,请参阅 Hugging Face TGI 文档。
使用 TGI 的实用技巧
LLM 核心概念
在深入 HuggingFace TGI 之前,了解大型语言模型非常重要。熟悉关键概念,如标记化(tokenization)、注意力机制(attention mechanisms)和 Transformer 架构。这些基础知识对于定制模型和增强文本生成结果至关重要。
模型准备与优化——了解 Hugging Face
学习如何根据你的特定需求准备和优化模型。这包括选择合适的模型、自定义标记器以及应用在不牺牲质量的前提下提升性能的技术。
熟悉 HuggingFace 的运作方式以及如何使用其 HuggingFace Hub 进行 NLP 开发。一个良好的起点是教程“使用 Transformers 和 Hugging Face 入门”。
理解微调(fine-tuning)的概念也很重要,因为模型通常需要针对特定目标进行优化。你可以通过指南“LLM 微调入门指南”学习如何微调模型。
生成策略
研究不同的文本生成方法,包括贪婪搜索(greedy search)、束搜索(beam search)和 top-k 采样(top-k sampling)。每种方法都有其优缺点,影响生成文本的连贯性、创造性和相关性。
结论
Hugging Face 的 TGI 工具包使个人能够探索 AI 文本生成。它提供了一个用户友好的工具包,用于部署和托管 LLM,以构建需要类人文本的复杂 NLP 应用。
虽然自托管大型语言模型提供了数据隐私和成本控制,但它需要强大的硬件。然而,该领域的最新进展使得小型模型可以直接在本地机器上使用。
novita.ai ,一站式无限创意平台,提供 100+ API。从图像生成和语言处理到音频增强和视频处理,按量付费便宜,让你在构建自己产品的同时免去 GPU 维护的烦恼。免费试用。
推荐阅读
