掌握 Hugging Face 上大型語言模型的文字生成推理工具包

掌握 Hugging Face 上大型語言模型的文字生成推理工具包

簡介

文字生成已成為一項革命性能力,改變了機器解讀和生成人類文字的方式。這股熱潮促使許多工具誕生,旨在簡化並強化與大型語言模型(LLM)協作的流程。

大型語言模型快速擴張,幾乎每週都有新版本出現,連帶推動了支援此技術的代管選項增加。在眾多工具中,Hugging Face 的 Text Generation Inference(TGI)脫穎而出,讓我們能在本機上將 LLM 當作服務來執行。

本指南將深入探討為何 Hugging Face TGI 是一項重大創新,以及如何利用它開發能生成越來越接近人類文字的先進 AI 模型。

什麼是 Hugging Face Text Generation Inference?

Hugging Face Text Generation Inference(TGI)是一個以 Rust 和 Python 撰寫的框架,用於部署和提供大型語言模型服務。這是一個專為此目的設計的生產就緒工具包。

Hugging Face 開發並在 HFOILv1.0 授權下發布 TGI,只要 TGI 作為產品或服務中的輔助工具(而非主要功能),即可用於商業用途。它主要解決的挑戰包括:

Hugging Face Text Generation Inference(TGI)的主要特色

  1. 高效能文字生成
    — TGI 採用張量並行(Tensor Parallelism,將大型模型分散到多個 GPU)與動態批次處理(在伺服器中即時將提示分組)等技術,最佳化流行的開源 LLM(包括 StarCoder、BLOOM、GPT-NeoX、Llama 和 T5)的效能。

  2. 高效率資源使用
    — TGI 使用連續批次處理、最佳化程式碼和張量並行,能同時處理多個請求,同時將資源使用量降至最低。

  3. 靈活性與安全性
    — TGI 支援多種安全與防護功能,例如浮水印、logit 扭曲(透過注入偏差值修改特定 token 的 logits)以及停止序列,以確保 LLM 的使用負責任且受控。

Hugging Face 已針對部分 LLM 的架構進行最佳化,使其能透過 TGI 更快執行,包括 LLaMA、Falcon7B 和 Mistral 等熱門模型。完整的支援模型列表可在其文件中找到。

為什麼要使用 Hugging Face TGI?

Hugging Face 已成為開發具備自然語言能力之 AI 的首選平台。它託管了眾多領先的開源模型,是自然語言處理(NLP)創新的重鎮。過去,這些模型過於龐大無法在本機執行,必須依賴雲端服務。

然而,近來量化技術(如 QLoRa 和 GPTQ)的進展,已讓某些 LLM 能夠在一般裝置(包括本機電腦)上執行。

Hugging Face TGI 正是為了讓 LLM 能以服務形式在本機上執行而設計。這種做法解決了啟動 LLM 的挑戰:讓模型在背景保持就緒,以便快速回應,避免每次提示都需長時間等待。想像一下,你有一個端點,內含一系列頂尖語言模型,可以隨時按需求生成文字。

TGI 最令人印象深刻的是其實作方式直接明瞭。它支援多種精簡的模型架構,讓部署快速又簡單。

此外,TGI 已為多個實際專案提供支援。例如:

  • Hugging Chat:一個開放存取的模型開源介面。
  • OpenAssistant:一個訓練 LLM 的開源社群倡議。
  • nat.dev:一個探索和比較 LLM 的平台。

不過,有一個顯著的限制:TGI 尚不支援基於 ARM 的 GPU Mac(包括 M1 系列及後續型號)。

設定 Hugging Face TGI

首先,設定 Hugging Face TGI 端點。

若要在本機安裝並執行 Hugging Face TGI,首先安裝 Rust。接著,使用 Python 3.9 或更高版本設定 Python 虛擬環境,例如使用 conda:

#安裝 Rust
curl --proto ‘=https’ --tlsv1.2 -sSf https://sh.rustup.rs | sh

#建立 Python 虛擬環境
conda create -n text-generation-inference python=3.9
conda activate text-generation-inference

此外,也必須安裝 Protoc。Hugging Face 建議使用 21.12 版本以獲得最佳相容性。請注意,你需要 sudo 權限才能執行此安裝。

PROTOC_ZIP=protoc-21.12-linux-x86_64.zip
curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v21.12/$PROTOC\_ZIP
sudo unzip -o $PROTOC_ZIP -d /usr/local bin/protoc
sudo unzip -o $PROTOC_ZIP -d /usr/local ‘include/*’
rm -f $PROTOC_ZIP

首先,我將概述從頭安裝的流程,這可能不是那麼直觀。若在此過程中遇到任何問題,你可以跳過前面步驟,直接使用 Docker 映像,這會更簡單。兩種情況都會涵蓋。

一旦滿足所有先決條件,我們就可以開始設定 TGI。首先複製 GitHub 儲存庫:

git clone https://github.com/huggingface/text-generation-inference.git

接著,在本機上切換到 TGI 目錄,並使用以下指令安裝:

cd text-generation-inference/
BUILD_EXTENSIONS=False make install

現在,讓我們探討如何在使用或不使用 Docker 的情況下使用 TGI。為了示範,我將採用 Falcon-7B 模型,該模型採用 Apache 2.0 授權。

不使用 Docker 啟動模型

安裝過程已產生一個新指令「text-generation-launcher」,它會啟動 TGI 伺服器。若要使用 Falcon-7B 模型啟動端點,只需執行以下指令:

text-generation-launcher --model-id tiiuae/falcon-7b-instruct --num-shard 1 --port 8080 --quantize bitsandbytes

以下是每個輸入參數的說明:

  • model-id:這是模型在 Hugging Face Hub 上列出的具體名稱。以 Falcon-7B 為例,就是「tiiuae/falcon-7b-instruct」。
  • num-shard:將此參數調整為可供使用的 GPU 數量。預設值為 1。
  • port:指定伺服器監聽請求的通訊埠。預設通訊埠為 8080。
  • quantize:對於 VRAM 小於 24 GB 的 GPU 使用者,需要進行模型量化以避免記憶體超載。在上述指令中,選用「bitsandbytes」進行即時量化。另一個選項「GPTQ」(「gptq」)也可用,但其運作方式可能較不為人熟悉。

TGI 應用

有多種方式可將 Text Generation Inference(TGI)伺服器整合到你的應用程式中。一旦伺服器運作,你可以透過傳送 POST 請求到 /generate 端點來與它互動,以取得結果。

如果你選擇使用 TGI 進行連續 token 串流,請改用端點,如下一小節所示。這些請求可以使用你偏好的工具,例如 curl、Python 或 TypeScript。若要透過 Python 腳本查詢由 TGI 提供的模型,你需要安裝以下 text-generation 函式庫。你可以透過執行以下 pip 指令輕鬆安裝:

pip install text-generation

啟動 TGI 伺服器後,建立一個 InferenceClient() 實例,並將 URL 指向模型服務端點。然後,你可以呼叫 text_generation() 以透過 Python 傳送請求至端點。

from text_generation import Client
client = Client(“http://127.0.0.1:8080”)
client.text_generation(prompt=“Your prompt here!”)

若要啟用 InferenceClient 的串流功能,只需設定 stream=True。這將使你能夠即時接收伺服器生成的 token。以下是如何使用串流:

for token in client.text_generation(“Your prompt here!”, max_new_tokens=12, stream=True):
print(token)

透過 TGI 提示模型

請記住,你將與部署在端點上的模型互動,此處是 Falcon-7B。透過 TGI,我們建立一個即時端點,以便從所選的 LLM 取得回應。

因此,使用 Python 時,可以透過本機裝置上可存取的通訊埠 8080 的客戶端,直接將提示傳送給 LLM。因此,對應的 Python 腳本會類似這樣:

from text_generation import Client
client = Client(“http://127.0.0.1:8080”)
print(client.generate(“Translate the following sentence into spanish: ‘What does Large Language Model mean?’”, max_new_tokens=500).generated_text)

我們將從模型收到回應,而無需在環境中安裝它。除了使用 Python,我們也可以使用 CURL 查詢 LLM,如下例所示:

curl 127.0.0.1:8080/generate \
-X POST \
-d ‘{“inputs”:“Code in Javascript a function to remove all spaces in a string and then print the string twice.”,“parameters”:{“max_new_tokens”:500}}’ \
-H ‘Content-Type: application/json’

嘗試使用 TGI 後,它展現出驚人的速度。以 Falcon-7B(token 上限為 500)來說,只需幾秒鐘。相比之下,使用 transformers 函式庫的典型推論方法則需要大約 30 秒。

使用 novita.ai 的 LLM 進行整合

從 1.4.0 版開始,TGI 引入了與 novita.aiLLM API 相容的 API。這個新的 Messages API 讓客戶和使用者能夠無縫地從 novita.ai 模型轉換到開源 LLM。此 API 設計用於直接與 novita.ai 的客戶端函式庫整合,或與 LangChain 或 LlamaIndex 等第三方工具整合。

TGI 對 Messages 的支援確保其 Inference Endpoints 與 novita.ai LLM API 完全相容。這項相容性讓使用者可以輕鬆地將任何使用 novita.ai 模型的現有腳本,替換為託管在 TGI 端點上的開放 LLM,完全沒有麻煩。

這項升級讓切換毫不費力,使用者能立即獲得開放原始碼模型的廣泛優勢,包括:

  • 對模型和資料的完全控制與透明性。
  • 消除對速率限制的顧慮。
  • 靈活調整系統以滿足獨特需求。

以下是在 novita.ai 聊天完成協定中整合 TGI 的範例:

from openai import OpenAI

client = OpenAI(
base_url=“​https://api.novita.ai/v3/openai”,
# 取得 NovitaAI API 金鑰,請參考:​https://novita.ai/get-started/Quick\_Start.html#\_3-create-an-api-key
api_key=“”,
)

model = “meta-llama/llama-3-8b-instruct”
stream = True # or False
max_tokens = 512

chat_completion_res = client.chat.completions.create(
model=model,
messages=[
{
“role”: “system”,
“content”: “Act like you are a helpful assistant.”,
},
{
“role”: “user”,
“content”: “Hi there!”,
}
],
stream=stream,
max_tokens=max_tokens,
)

if stream:
for chunk in chat_completion_res:
print(chunk.choices[0].delta.content or “”, end=“”)
else:
print(chat_completion_res.choices[0].message.content)

如上所示,我們可以使用 novita.ai 函式庫來指定我們的 ENDPOINT 和 Hugging Face 密碼。關於此整合的更多深入資訊,請參閱 Hugging Face TGI 文件。

使用 TGI 時的實用技巧

LLM 的核心概念

在深入 HuggingFace TGI 之前,對大型語言模型有良好的理解很重要。熟悉關鍵概念,例如 tokenization、注意力機制和 Transformer 架構。這些基礎對於客製化模型和增強文字生成結果至關重要。

模型準備與最佳化 — 了解 Hugging Face

學習如何針對你的特定需求準備和最佳化模型。這包括選擇適當的模型、客製化 tokenizer,以及應用技術在不犧牲品質的前提下提升效能。

熟悉 HuggingFace 的運作方式以及如何使用其 HuggingFace Hub 進行 NLP 開發。一個好的起點是教學「An Introduction to Using Transformers and Hugging Face」。

了解微調(fine-tuning)的概念也很重要,因為模型通常需要針對特定目標進行最佳化。你可以透過指南「An Introductory Guide to Fine-Tuning LLMs」學習如何微調模型。

生成策略

探討不同的文字生成方法,包括貪婪搜尋(greedy search)、波束搜尋(beam search)和 top-k 取樣。每種方法都有其優缺點,會影響生成文字的連貫性、創造性和相關性。

結論

Hugging Face 的 TGI 工具包讓使用者能夠深入探索 AI 文字生成領域。它提供了一個親和的工具包,用於部署和代管 LLM,以實現需要人類化文字的進階 NLP 應用。

雖然自託管大型語言模型提供了資料隱私和成本控制,但它需要強大的硬體。儘管如此,近期該領域的進展已經讓較小的模型可以直接在本機上使用。

novita.ai 是您一站式無限創意平台,提供 100 多種 API。從影像生成、語言處理到音訊增強和影片編輯,價格低廉按量計費,讓您在建立自己的產品時無需煩惱 GPU 維護。立即免費試用。

推薦閱讀

What is the difference between LLM and GPT

LLM Leaderboard 2024 Predictions Revealed

Novita AI LLM Inference Engine: the largest throughput and cheapest inference available