推理端點(專用)文件

推理工具包

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 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.