使用Hugging Face推理端点部署LLMs

使用Hugging Face部署LLMs推理端点

开源的LLM模型如Falcon、(Open-)LLaMA、X-Gen、StarCoder或RedPajama在最近几个月取得了长足的进展,并且在某些用例中可以与ChatGPT或GPT4等闭源模型竞争。然而,以高效和优化的方式部署这些模型仍然是一个挑战。

在本博客文章中,我们将向您展示如何将开源的LLM模型部署到Hugging Face Inference Endpoints上,这是我们的托管SaaS解决方案,可以轻松部署模型。此外,我们还将教您如何流式传输响应并测试端点的性能。所以让我们开始吧!

  1. 如何部署Falcon 40B指南
  2. 测试LLM端点
  3. 在JavaScript和Python中流式传输响应

在开始之前,让我们复习一下推断端点的知识。

什么是Hugging Face推断端点

Hugging Face推断端点提供了一种简单而安全的方法,用于部署用于生产的机器学习模型。推断端点使开发人员和数据科学家都能够创建AI应用程序,而无需管理基础架构:通过几次点击简化部署流程,包括通过自动缩放处理大量请求、通过缩放到零降低基础架构成本,并提供高级安全性。

以下是LLM部署的一些最重要的功能:

  1. 简单部署:只需点击几下即可将模型部署为生产就绪的API,无需处理基础架构或MLOps。
  2. 成本效益:通过自动缩放到零功能减少成本,当端点不使用时,通过缩减基础架构来支付基于端点的正常运行时间,确保成本效益。
  3. 企业安全性:在仅通过直接VPC连接访问的安全离线端点上部署模型,支持SOC2 Type 2认证,并提供BAA和GDPR数据处理协议,以增强数据安全性和合规性。
  4. LLM优化:针对LLM进行优化,通过分页注意力实现高吞吐量,通过自定义transformer代码和Flash Attention提供低延迟的文本生成推断。
  5. 全面的任务支持:开箱即用支持🤗 Transformers、Sentence-Transformers和Diffusers任务和模型,并支持轻松定制,以启用演讲者分割等高级任务或任何机器学习任务和库。

您可以在以下网址开始使用推断端点:https://ui.endpoints.huggingface.co/

1. 如何部署Falcon 40B指南

首先,您需要使用已有付款方式的用户或组织帐户登录(您可以在此处添加付款方式),然后访问推断端点: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":"从前有一天,"}' \
-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采样的概率累积参数, 默认值为null
  • do_sample:是否使用采样;否则使用贪婪解码。默认值为false
  • best_of:生成best_of序列,并返回具有最高标记logprobs的序列。默认值为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

print命令替换为yield或您想要将标记流式传输到的函数。

使用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')

//生成参数
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>'],
}
//提示
const prompt = '您在德国纽伦堡可以做些什么?给我三个建议'

const stream = hf.textGenerationStream({ inputs: prompt, parameters: gen_kwargs })
for await (const r of stream) {
  //跳过特殊标记
  if (r.token.special) {
    continue
  }
  //如果遇到停止序列,则停止
  if (gen_kwargs['stop_sequences'].includes(r.token.text)) {
    break
  }
  //产生的标记
  process.stdout.write(r.token.text)
}

process.stdout调用替换为yield或您想要将标记流式传输到的函数。

结论

在本博客文章中,我们向您展示了如何使用Hugging Face推理端点部署开源LLM,如何使用高级参数控制文本生成,以及如何将响应流式传输到Python或JavaScript客户端以提高用户体验。通过使用Hugging Face推理端点,您可以仅需几次点击即可将模型部署为生产就绪的API,通过自动缩放到零来降低成本,并部署具有SOC2 Type 2认证支持的安全离线端点。


感谢阅读!如果您有任何问题,请随时在Twitter或LinkedIn上与我联系。