使用 Hugging Face 推理端点部署 LLMs
开源 LLM,如 Falcon、(Open-)LLaMA、X-Gen、StarCoder 或 RedPajama,最近几个月取得了长足的进步,在某些用例中可以与 ChatGPT 或 GPT4 等闭源模型竞争。然而,以高效优化的方式部署这些模型仍然是一个挑战。
在本博客文章中,我们将向您展示如何将开源 LLM 部署到 Hugging Face 推理端点,这是我们托管的 SaaS 解决方案,可以轻松部署模型。此外,我们还将教您如何流式传输响应并测试我们端点的性能。那么,让我们开始吧!
在开始之前,让我们回顾一下推理端点的知识。
什么是 Hugging Face 推理端点
Hugging Face 推理端点提供了一种简单安全的方式来部署机器学习模型以供生产使用。推理端点使开发人员和数据科学家都能创建 AI 应用程序而无需管理基础设施:将部署过程简化为几次点击,包括通过自动伸缩处理大量请求,通过零扩展降低基础设施成本,并提供高级安全性。
以下是一些用于 LLM 部署的最重要功能
- 轻松部署:只需点击几下即可将模型部署为生产就绪的 API,无需处理基础设施或 MLOps。
- 成本效益:受益于自动零扩展功能,当端点不使用时通过缩减基础设施来降低成本,同时根据端点的正常运行时间付费,确保成本效益。
- 企业安全:在安全的离线端点中部署模型,这些端点只能通过直接 VPC 连接访问,并由 SOC2 Type 2 认证支持,提供 BAA 和 GDPR 数据处理协议以增强数据安全性和合规性。
- LLM 优化:为 LLM 优化,通过分页注意力实现高吞吐量,并通过 Text Generation Inference 支持的自定义 Transformers 代码和 Flash Attention 实现低延迟。
- 全面的任务支持:开箱即用支持 🤗 Transformers、Sentence-Transformers 和 Diffusers 任务和模型,并易于定制以支持高级任务,如说话人分离或任何机器学习任务和库。
您可以访问 https://ui.endpoints.huggingface.co/ 开始使用推理端点
1. 如何部署 Falcon 40B instruct
首先,您需要使用已登记付款方式的用户或组织账户登录(您可以在此处添加),然后访问推理端点:https://ui.endpoints.huggingface.co
然后,点击“新建端点”。选择存储库、云和区域,调整实例和安全设置,然后部署我们的案例 `tiiuae/falcon-40b-instruct`。
推理端点会根据模型大小建议实例类型,该实例类型应足够大以运行模型。这里是 `4x NVIDIA T4` GPU。为了获得 LLM 的最佳性能,将实例更改为 `GPU [xlarge] · 1x Nvidia A100`。
注意:如果无法选择实例类型,您需要联系我们并申请实例配额。
然后,您可以通过点击“创建端点”来部署模型。10 分钟后,端点应在线并可用于处理请求。
2. 测试 LLM 端点
端点概览提供了推理小部件的访问权限,可用于手动发送请求。这使您可以快速测试不同输入下的端点,并与团队成员共享。这些小部件不支持参数 - 在这种情况下,会导致“短”生成。
该小部件还会生成一个可供您使用的 cURL 命令。只需添加您的 `hf_xxx` 并进行测试。
curl https://j4xhm53fxl9ussm8.us-east-1.aws.endpoints.huggingface.cloud \
-X POST \
-d '{"inputs":"Once upon a time,"}' \
-H "Authorization: Bearer <hf_token>" \
-H "Content-Type: application/json"
您可以使用不同的参数来控制生成,在有效负载的 `parameters` 属性中定义它们。截至目前,支持以下参数:
temperature
:控制模型的随机性。值越低,模型越确定;值越高,模型越随机。默认值为 1.0。max_new_tokens
:要生成的最大词元数。默认值为 20,最大值为 512。repetition_penalty
:控制重复的可能性。默认为 `null`。seed
:用于随机生成的种子。默认为 `null`。stop
:停止生成的词元列表。当生成其中一个词元时,生成将停止。top_k
:用于 top-k 过滤的最高概率词汇词元的数量。默认值为 `null`,这会禁用 top-k 过滤。top_p
:用于核采样(nucleus sampling)的最高概率词汇词元的累积概率,默认为 `null`do_sample
:是否使用采样;否则使用贪婪解码。默认值为 `false`。best_of
:生成 best_of 序列,并返回词元对数概率最高的序列,默认为 `null`。details
:是否返回生成详情。默认值为 `false`。return_full_text
:是否返回完整文本或仅生成部分。默认值为 `false`。truncate
:是否将输入截断为模型的最大长度。默认值为 `true`。typical_p
:词元的典型概率。默认值为 `null`。watermark
:用于生成的水印。默认值为 `false`。
3. 在 Javascript 和 Python 中流式传输响应
使用 LLM 请求和生成文本可能是一个耗时且迭代的过程。改善用户体验的一个好方法是向用户流式传输生成的词元。以下是使用 Python 和 JavaScript 流式传输词元的两个示例。对于 Python,我们将使用 Text Generation Inference 的客户端,对于 JavaScript,我们将使用 HuggingFace.js 库
使用 Python 进行流式请求
首先,您需要安装 `huggingface_hub` 库
pip install -U huggingface_hub
我们可以创建一个 `InferenceClient`,提供我们的端点 URL 和凭据以及我们想要使用的超参数
from huggingface_hub import InferenceClient
# HF Inference Endpoints parameter
endpoint_url = "https://YOUR_ENDPOINT.endpoints.huggingface.cloud"
hf_token = "hf_YOUR_TOKEN"
# Streaming Client
client = InferenceClient(endpoint_url, token=hf_token)
# generation parameter
gen_kwargs = dict(
max_new_tokens=512,
top_k=30,
top_p=0.9,
temperature=0.2,
repetition_penalty=1.02,
stop_sequences=["\nUser:", "<|endoftext|>", "</s>"],
)
# prompt
prompt = "What can you do in Nuremberg, Germany? Give me 3 Tips"
stream = client.text_generation(prompt, stream=True, details=True, **gen_kwargs)
# yield each generated token
for r in stream:
# skip special tokens
if r.token.special:
continue
# stop if we encounter a stop sequence
if r.token.text in gen_kwargs["stop_sequences"]:
break
# yield the generated token
print(r.token.text, end = "")
# yield r.token.text
用 `yield` 或您想要将词元流式传输到的函数替换 `print` 命令。
使用 JavaScript 进行流式请求
首先,您需要安装 `@huggingface/inference` 库。
npm install @huggingface/inference
我们可以创建一个 `HfInferenceEndpoint`,提供我们的端点 URL 和凭据以及我们想要使用的超参数。
import { HfInferenceEndpoint } from '@huggingface/inference'
const hf = new HfInferenceEndpoint('https://YOUR_ENDPOINT.endpoints.huggingface.cloud', 'hf_YOUR_TOKEN')
//generation parameter
const gen_kwargs = {
max_new_tokens: 512,
top_k: 30,
top_p: 0.9,
temperature: 0.2,
repetition_penalty: 1.02,
stop_sequences: ['\nUser:', '<|endoftext|>', '</s>'],
}
// prompt
const prompt = 'What can you do in Nuremberg, Germany? Give me 3 Tips'
const stream = hf.textGenerationStream({ inputs: prompt, parameters: gen_kwargs })
for await (const r of stream) {
// # skip special tokens
if (r.token.special) {
continue
}
// stop if we encounter a stop sequence
if (gen_kwargs['stop_sequences'].includes(r.token.text)) {
break
}
// yield the generated token
process.stdout.write(r.token.text)
}
用 `yield` 或您想要将词元流式传输到的函数替换 `process.stdout` 调用。
结论
在本博客文章中,我们向您展示了如何使用 Hugging Face 推理端点部署开源 LLM,如何使用高级参数控制文本生成,以及如何将响应流式传输到 Python 或 JavaScript 客户端以改善用户体验。通过使用 Hugging Face 推理端点,您只需点击几下即可将模型部署为生产就绪的 API,通过自动零扩展降低成本,并将模型部署到由 SOC2 Type 2 认证支持的安全离线端点中。