使用 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 認證支援的安全離線端點中。