推理端点(专用)文档

推理工具包

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

推理工具包

在某些情况下,您希望部署的模型不受任何高性能推理引擎的支持。在这种情况下,我们提供了一个备用选项。推理工具包支持在 Transformers、Sentence-Transformers 和 Diffusers 库中实现的模型,并将它们封装在轻量级 Web 服务器中。

推理工具包非常适合测试模型和构建演示,但不如 TGI、vLLM、SGLang 或 llama.cpp 那样适合生产。

创建自定义推理处理程序

Hugging Face Endpoints 支持所有 Transformers 和 Sentence-Transformers 任务,并支持自定义任务,包括自定义预处理和后处理。自定义可以通过 Hugging Face Hub 上的模型存储库中的 handler.py 文件完成。

handler.py 需要实现带有 __init____call__ 方法的 EndpointHandler 类。

如果您想使用自定义依赖项,例如 optimum,则必须在 requirements.txt 中列出这些依赖项,如上文“添加自定义依赖项”中所述。

教程

在创建自定义处理程序之前,您需要一个带有模型权重的 Hugging Face 模型存储库和一个具有写入访问权限的访问令牌。要查找、创建和管理访问令牌,请点击此处

如果您想为社区中的现有模型编写自定义处理程序,您可以使用 repo_duplicator 创建存储库分叉。

代码也可以在此 Notebook 中找到。

您还可以在此处搜索已存在的自定义处理程序:https://huggingface.co/models?other=endpoints-template

1. 设置开发环境

开发自定义处理程序最简单的方法是设置本地开发环境,在此处实现、测试和迭代,然后将其部署为推理端点。第一步是安装所有必需的开发依赖项。创建自定义处理程序所需,推理不需要

# install git-lfs to interact with the repository
sudo apt-get update
sudo apt-get install git-lfs
# install transformers (not needed since it is installed by default in the container)
pip install transformers[sklearn,sentencepiece,audio,vision]

安装库后,我们将把存储库克隆到我们的开发环境。

我们将在本教程中使用 philschmid/distilbert-base-uncased-emotion

git lfs install
git clone https://huggingface.co/philschmid/distilbert-base-uncased-emotion

为了以后能够推送我们的模型存储库,您需要登录到我们的 HF 帐户。这可以通过使用 huggingface-cli 完成。

注意:请务必也配置 git config。

# setup cli with token
huggingface-cli login
git config --global credential.helper store

2. 创建 EndpointHandler

设置好环境后,我们可以开始创建自定义处理程序。自定义处理程序是存储库中 handler.py 文件中的一个 Python 类(EndpointHandler)。EndpointHandler 需要实现 __init____call__ 方法。

  • __init__ 方法将在启动端点时被调用,并将接收一个参数,一个带有模型权重路径的字符串。这使您可以正确加载模型。
  • __call__ 方法将在每次请求时被调用,并接收一个字典,其中包含您的请求正文作为 Python 字典。它将始终包含 inputs 键。

第一步是在我们存储库的本地克隆中创建 handler.py

!cd distilbert-base-uncased-emotion && touch handler.py

在此文件中,您可以使用 __init____call__ 方法定义 EndpointHandler 类。

from typing import Dict, List, Any

class EndpointHandler():
    def __init__(self, path=""):
        # Preload all the elements you are going to need at inference.
        # pseudo:
        # self.model= load_model(path)

    def __call__(self, data: Dict[str, Any]) -> List[Dict[str, Any]]:
        """
       data args:
            inputs (:obj: `str` | `PIL.Image` | `np.array`)
            kwargs
      Return:
            A :obj:`list` | `dict`: will be serialized and returned
        """

        # pseudo
        # self.model(input)

3. 自定义 EndpointHandler

现在,您可以将所有要在初始化或推理期间使用的自定义逻辑添加到自定义端点。如果您需要一些灵感,可以在 Hub 上找到多个自定义处理程序。在我们的示例中,我们将根据附加有效载荷信息添加一个自定义条件。

我们在教程中使用的模型经过微调,可以检测情绪。我们将为日期添加一个额外的有效载荷字段,并使用一个外部包来检查它是否是节假日,以添加一个条件,当输入日期是节假日时,模型返回“快乐”——因为每个人在节假日都会感到快乐🌴🎉😆

首先,我们需要创建一个新的 requirements.txt 并添加我们的 假期检测包,并确保它也安装在我们的开发环境中。

!echo "holidays" >> requirements.txt
!pip install -r requirements.txt

接下来,我们必须调整 handler.pyEndpointHandler 以符合我们的条件。

from typing import Dict, List, Any
from transformers import pipeline
import holidays

class EndpointHandler():
    def __init__(self, path=""):
        self.pipeline = pipeline("text-classification",model=path)
        self.holidays = holidays.US()

    def __call__(self, data: Dict[str, Any]) -> List[Dict[str, Any]]:
        """
       data args:
            inputs (:obj: `str`)
            date (:obj: `str`)
      Return:
            A :obj:`list` | `dict`: will be serialized and returned
        """
        # get inputs
        inputs = data.pop("inputs",data)
        date = data.pop("date", None)

        # check if date exists and if it is a holiday
        if date is not None and date in self.holidays:
          return [{"label": "happy", "score": 1}]


        # run normal prediction
        prediction = self.pipeline(inputs)
        return prediction

4. 测试 EndpointHandler

为了测试我们的 EndpointHandler,我们可以简单地导入、初始化和测试它。因此,我们只需要准备一个示例负载。

from handler import EndpointHandler

# init handler
my_handler = EndpointHandler(path=".")

# prepare sample payload
non_holiday_payload = {"inputs": "I am quite excited how this will turn out", "date": "2022-08-08"}
holiday_payload = {"inputs": "Today is a though day", "date": "2022-07-04"}

# test the handler
non_holiday_pred=my_handler(non_holiday_payload)
holiday_pred=my_handler(holiday_payload)

# show results
print("non_holiday_pred", non_holiday_pred)
print("holiday_pred", holiday_pred)

# non_holiday_pred [{'label': 'joy', 'score': 0.9985942244529724}]
# holiday_pred [{'label': 'happy', 'score': 1}]

它成功了!🎉

注意:如果您正在使用笔记本,当您更改 handler.py 时,您可能需要重新启动内核,因为它不会自动重新导入。

5. 将自定义处理程序推送到您的存储库

在您成功地在本地测试了处理程序之后,您只需使用基本的 git 命令即可将其推送到您的存储库。

# add all our new files
!git add *
# commit our files
!git commit -m "add custom handler"
# push the files to the hub
!git push

现在,您应该在存储库的 “文件和版本” 选项卡中看到您的 handler.pyrequirements.txt

6. 将您的自定义处理程序部署为推理端点

最后一步是将您的自定义处理程序部署为推理端点。您可以像部署常规推理端点一样部署您的自定义处理程序。添加您的存储库,选择您的云和区域,您的实例和安全设置,然后进行部署。

创建端点时,推理端点服务将检查是否存在可用且有效的 handler.py,并将无论您选择哪个“任务”都使用它来处理请求。

注意:在您的 推理端点仪表板 中,此端点的任务现在应设置为“自定义”

示例

Hugging Face Hub 上有一些示例,您可以从中获取灵感或直接使用。这些存储库标有 endpoints-template 标签,可以在此链接下找到。

您将找到以下示例:

< > 在 GitHub 上更新