天天看點

Huggingface推理端點LLM部署及通路實戰

作者:新缸中之腦

Falcon、(Open-)LLaMA、X-Gen、StarCoder 或 RedPajama 等開源 LLM 在最近幾個月取得了長足的進步,在某些用例中可以與 ChatGPT 或 GPT4 等閉源模型競争。 然而,以高效和優化的方式部署這些模型仍然面臨挑戰。

在這篇博文中,我們将展示如何将開源 LLM 部署到 Hugging Face Inference Endpoints,以及如何流式傳輸響應并測試端點的性能。 那麼讓我們開始吧!

在開始之前,讓我們回顧一下有關推理端點的知識。

Huggingface推理端點LLM部署及通路實戰
推薦:用 NSDT編輯器 快速搭建可程式設計3D場景

1、什麼是推理端點

Hugging Face Inference Endpoints 提供了一種簡單、安全的方法來部署機器學習模型以用于生産。 推理端點使開發人員和資料科學家等能夠在無需管理基礎設施的情況下建立人工智能應用程式:将部署過程簡化為幾次點選,包括通過自動擴充處理大量請求、通過規模為零來降低基礎設施成本以及提供進階安全性。

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

  • 輕松部署:隻需點選幾下即可将模型部署為生産就緒的 API,無需處理基礎設施或 MLOps。
  • 成本效率:受益于自動擴充到零容量,通過在端點不使用時縮小基礎設施來降低成本,同時根據端點的正常運作時間付費,確定成本效益。
  • 企業安全性:在隻能通過直接 VPC 連接配接通路的安全離線端點中部署模型,由 SOC2 類型 2 認證支援,并提供 BAA 和 GDPR 資料處理協定以增強資料安全性和合規性。
  • LLM 優化:針對 LLM 進行優化,通過分頁注意力實作高吞吐量,通過自定義轉換器代碼實作低延遲,并通過文本生成推理實作閃存注意力功能
  • 全面的任務支援:對 Transformers、Sentence-Transformers 和 Diffusers 任務和模型的開箱即用支援,以及輕松自定義以啟用揚聲器分類或任何機器學習任務和庫等進階任務。

點選這裡可以開始使用推理端點。

2、Falcon 40B部署說明

首先,你需要使用設定了付費方式的使用者或組織帳戶登入(可以在此處添加付款方式),然後通過 這裡 通路推理端點。

然後,單擊“新端點”。 選擇存儲庫、雲和區域,調整執行個體和安全設定,然後在我們的案例 tiiiuae/falcon-40b-instruct 中進行部署。

Huggingface推理端點LLM部署及通路實戰

推理端點根據模型大小建議執行個體類型,模型大小應足以運作模型。 這裡有 4 個 NVIDIA T4 GPU。 為了獲得 LLM 的最佳性能,請将執行個體更改為 GPU [xlarge] · 1x Nvidia A100。

注意:如果無法選擇執行個體類型,你需要聯系我們申請執行個體配額。

Huggingface推理端點LLM部署及通路實戰

然後,你可以通過單擊“建立端點”來部署模型。 10 分鐘後,端點應線上并可處理請求。

3、測試 LLM 端點

端點概述提供對推理小部件的通路,該小部件可用于手動發送請求。 這使你可以使用不同的輸入快速測試端點并與團隊成員共享。 這些小部件不支援參數 - 在這種情況下,這會導緻“短”生成。

Huggingface推理端點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"
           

你可以使用不同的參數來控制生成,在有效負載的參數屬性中定義它們。 截至今天,支援以下參數:

  • temperature:控制模型中的随機性。 較低的值将使模型更具确定性,較高的值将使模型更加随機。 預設值為 1.0。
  • max_new_tokens:要生成的最大令牌數。 預設值為 20,最大值為 512。
  • repetition_penalty:控制重複的可能性。 預設為空。
  • seed:用于随機生成的種子。 預設為空。
  • stop:停止生成的令牌清單。 當生成其中一個token時,生成将停止。
  • top_k:為 top-k 過濾保留的最高機率詞彙标記的數量。 預設值為 null,這會禁用 top-k-filtering。
  • top_p:為核采樣保留的參數最高機率詞彙标記的累積機率,預設為 null
  • do_sample:是否使用采樣; 否則使用貪婪解碼。 預設值為 false。
  • best_of:生成 best_of 序列并傳回最高 token logprobs 的那個,預設為 null。
  • details:是否傳回有關該代的詳細資訊。 預設值為 false。
  • return_full_text:是否傳回全文或僅傳回生成的部分。 預設值為 false。
  • truncate:是否将輸入截斷至模型的最大長度。 預設值為 true。
  • typical_p:令牌的典型機率。 預設值為空。
  • watermark:用于生成的水印。 預設值為 false。

4、使用 Javascript 和 Python 傳輸響應

使用LLM請求和生成文本可能是一個耗時且反複的過程。 改善使用者體驗的一個好方法是在令牌生成時将其流式傳輸給使用者。 以下是如何使用 Python 和 JavaScript 流式傳輸令牌的兩個示例。 對于 Python,我們将使用 Text Generation Inference 的用戶端,對于 JavaScript,我們将使用 HuggingFace.js 庫

4.1 使用 Python 傳輸請求

首先,需要安裝文本生成用戶端

pip install text-generation
           

我們可以建立一個用戶端,提供我們的端點 URL 和憑證以及我們想要使用的超參數

from text_generation import Client

# HF Inference Endpoints parameter
endpoint_url = "https://YOUR_ENDPOINT.endpoints.huggingface.cloud"
hf_token = "hf_YOUR_TOKEN"

# Streaming Client
client = Client(endpoint_url, headers={"Authorization": f"Bearer {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.generate_stream(prompt, **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 指令替換為輸出或要将令牌流式傳輸到的函數。

Huggingface推理端點LLM部署及通路實戰

4.2 使用 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)
}
           

将 process.stdout 調用替換為yield 或想要将令牌流式傳輸到的函數。

Huggingface推理端點LLM部署及通路實戰

原文連結:http://www.bimant.com/blog/hf-inference-endpoint-hands-on/