Falcon 已登陸 Hugging Face 生態系統

釋出於 2023 年 6 月 5 日
在 GitHub 上更新

Falcon 是由阿布扎比技術創新學院建立的一系列最先進的語言模型,並以 Apache 2.0 許可證釋出。**值得注意的是,Falcon-40B 是第一個“真正開放”的模型,其能力可與許多當前閉源模型媲美**。這對從業者、愛好者和行業來說是一個絕妙的訊息,因為它為許多令人興奮的用例打開了大門。

注意:此版本釋出幾個月後,Falcon 團隊釋出了一個更大的模型,包含1800 億個引數

2023 年 9 月更新:Falcon 180B 剛剛釋出!它是目前最大的公開可用模型,可以與 PaLM-2 等專有模型媲美。

在這篇部落格中,我們將深入探討 Falcon 模型:首先討論它們的獨特之處,然後**展示如何使用 Hugging Face 生態系統中的工具(推理、量化、微調等)輕鬆地在其基礎上進行構建**。

目錄

Falcon 模型

Falcon 系列由兩個基礎模型組成:Falcon-40B 及其“小弟”Falcon-7B。**釋出時,40B 引數模型位居開放 LLM 排行榜榜首,而 7B 模型則在其同類模型中表現最佳**。

注意:下表所示的效能分數已根據 2023 年 11 月引入的新方法(增加了新的基準測試)進行更新。更多詳細資訊請參見此帖子.

Falcon-40B 需要大約 90GB 的 GPU 記憶體——這很多,但仍然少於 Falcon 效能優於的 LLaMA-65B。另一方面,Falcon-7B 只需要大約 15GB,即使在消費級硬體上也可以進行推理和微調。(在本部落格的後面,我們將討論如何利用量化使 Falcon-40B 甚至在更便宜的 GPU 上也能使用!)

TII 還提供了模型的指令版本,Falcon-7B-InstructFalcon-40B-Instruct。這些實驗變體已在指令和對話資料上進行了微調;因此,它們更適合流行的助手式任務。**如果您只是想快速使用這些模型,它們是您的最佳選擇。** 還可以根據社群構建的大量資料集構建您自己的自定義指令版本——繼續閱讀以獲取分步教程!

Falcon-7B 和 Falcon-40B 分別在 1.5 萬億和 1 萬億個 token 上進行了訓練,這與為推理最佳化的現代模型一致。**Falcon 模型高質量的關鍵在於它們的訓練資料,主要(>80%)基於 RefinedWeb——一個基於 CommonCrawl 的新型大規模網路資料集**。TII 沒有收集零散的精選資源,而是專注於擴充套件和提高網路資料質量,利用大規模去重和嚴格過濾來匹配其他語料庫的質量。Falcon 模型在訓練中仍然包含一些精選資源(例如來自 Reddit 的對話資料),但遠少於 GPT-3 或 PaLM 等最先進的 LLM 通常使用的數量。最棒的是什麼?TII 已公開發布了 RefinedWeb 的 6000 億 token 提取物,供社群在其自己的 LLM 中使用!

Falcon 模型的另一個有趣特徵是它們使用了**多查詢注意力**。香草多頭注意力方案每個頭有一個查詢、一個鍵和一個值;而多查詢則在所有頭之間共享一個鍵和一個值。

mqa
多查詢注意力在注意力頭之間共享鍵和值嵌入。圖片來源:Harm de Vries。

這個技巧對預訓練沒有顯著影響,但它極大地提高了推理的可擴充套件性:實際上,**自迴歸解碼期間保留的 K、V 快取現在顯著更小**(根據架構的具體情況,小 10-100 倍),降低了記憶體成本並支援了有狀態性等新穎最佳化。

模型 許可證 商業用途? 預訓練長度 [令牌] 預訓練計算 [PF-天] 排行榜得分 2.048 上下文的 K,V 快取大小
StableLM-Alpha-7B CC-BY-SA-4.0 1,500B 700 34.37 800MB
LLaMA-7B LLaMA 許可證 1,000B 500 45.65 1,100MB
MPT-7B Apache 2.0 1,000B 500 44.28 1,100MB
Falcon-7B Apache 2.0 1,500B 700 44.17 20MB
LLaMA-33B LLaMA 許可證 1,500B 3200 - 3,300MB
LLaMA-65B LLaMA 許可證 1,500B 6300 61.19 5,400MB
Falcon-40B Apache 2.0 1,000B 2800 58.07 240MB

演示

您可以輕鬆地在此空間或嵌入式遊樂場中嘗試大型 Falcon 模型(400 億個引數!)

在底層,這個遊樂場使用了 Hugging Face 的 Text Generation Inference,這是一個可擴充套件的 Rust、Python 和 gRPC 伺服器,用於快速高效的文字生成。它與驅動 HuggingChat 的技術相同。

我們還構建了 7B 指令模型的 Core ML 版本,以下是它在 M1 MacBook Pro 上的執行情況

該影片展示了一個輕量級應用程式,它利用 Swift 庫進行繁重的工作:模型載入、分詞、輸入準備、生成和解碼。我們正在努力構建這個庫,以使開發人員能夠將強大的 LLM 整合到各種應用程式中,而無需重複造輪子。它仍然有點粗糙,但我們迫不及待地想與您分享。同時,您可以從倉庫下載 Core ML 權重,自己進行探索!

推理

您可以使用熟悉的 transformers API 在自己的硬體上執行模型,但需要注意幾個細節

  • 這些模型使用 bfloat16 資料型別進行訓練,因此我們建議您使用相同的資料型別。這需要最新版本的 CUDA,並且在現代顯示卡上效果最佳。您也可以嘗試使用 float16 執行推理,但請記住,這些模型是使用 bfloat16 進行評估的。
  • 您需要允許遠端程式碼執行。這是因為這些模型使用了一種新的架構,尚未包含在 `transformers` 中 - 相反,所需的程式碼由模型作者在倉庫中提供。具體來說,如果您允許遠端執行,以下檔案中的程式碼將被使用(以 `falcon-7b-instruct` 為例):configuration_RW.pymodelling_RW.py

考慮到這些因素,您可以使用 transformers `pipeline` API 載入 7B 指令模型,如下所示:

from transformers import AutoTokenizer
import transformers
import torch

model = "tiiuae/falcon-7b-instruct"

tokenizer = AutoTokenizer.from_pretrained(model)
pipeline = transformers.pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer,
    torch_dtype=torch.bfloat16,
    trust_remote_code=True,
    device_map="auto",
)

然後,您將使用以下程式碼進行文字生成:

sequences = pipeline(
   "Write a poem about Valencia.",
    max_length=200,
    do_sample=True,
    top_k=10,
    num_return_sequences=1,
    eos_token_id=tokenizer.eos_token_id,
)
for seq in sequences:
    print(f"Result: {seq['generated_text']}")

您可能會得到如下結果:

Valencia, city of the sun
The city that glitters like a star
A city of a thousand colors
Where the night is illuminated by stars
Valencia, the city of my heart
Where the past is kept in a golden chest

Falcon 40B 推理

執行 40B 模型具有挑戰性,因為它體積龐大:單個 80GB RAM 的 A100 無法容納。在 8 位模式下載入,可以在大約 45GB RAM 中執行,這適用於 A6000(48GB),但不適用於 40GB 版本的 A100。以下是操作方法:

from transformers import AutoTokenizer, AutoModelForCausalLM
import transformers
import torch

model_id = "tiiuae/falcon-40b-instruct"

tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    torch_dtype=torch.bfloat16,
    trust_remote_code=True,
    load_in_8bit=True,
    device_map="auto",
)

pipeline = transformers.pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer,
)

但請注意,混合 8 位推理將使用 `torch.float16` 而不是 `torch.bfloat16`,因此請務必徹底測試結果。

如果您有多張顯示卡並已安裝 `accelerate`,則可以利用 `device_map="auto"` 自動將模型層分佈到多張顯示卡上。如果需要,它甚至可以將某些層解除安裝到 CPU,但這會影響推理速度。

還可以使用最新版本的 `bitsandbytes`、`transformers` 和 `accelerate` 進行4 位載入。在這種情況下,40B 模型需要大約 27GB 的 RAM 才能執行。不幸的是,這比 3090 或 4090 等顯示卡上的可用記憶體略多,但足以在 30 或 40GB 顯示卡上執行。

文字生成推理

Text Generation Inference 是 Hugging Face 開發的生產就緒推理容器,可輕鬆部署大型語言模型。

其主要特點是

  • 連續批處理
  • 使用伺服器傳送事件 (SSE) 進行 token 流式傳輸
  • 張量並行化,可在多個 GPU 上實現更快推理
  • 使用自定義 CUDA 核心最佳化的 transformers 程式碼
  • 使用 Prometheus 和 Open Telemetry 進行生產就緒的日誌記錄、監控和跟蹤

自 v0.8.2 起,Text Generation Inference 原生支援 Falcon 7b 和 40b 模型,無需依賴 Transformers 的“信任遠端程式碼”功能,從而實現了嚴密部署和安全審計。此外,Falcon 實現包括自定義 CUDA 核心,可顯著降低端到端延遲。

tgi-hfe-screenshot.png
Inference Endpoints 現在支援文字生成推理。使用 Int-8 量化,在 1xA100 上輕鬆部署 Falcon 40B 指令模型

Text Generation Inference 現已整合到 Hugging Face 的 Inference Endpoints 中。要部署 Falcon 模型,請訪問模型頁面,然後單擊部署 -> Inference Endpoints 小部件。

對於 7B 模型,我們建議您選擇“GPU [中] - 1x Nvidia A10G”。

對於 40B 模型,您需要部署到“GPU [特大] - 1x Nvidia A100”並激活量化:高階配置 -> 服務容器 -> Int-8 量化。*注意:您可能需要透過電子郵件向 api-enterprise@huggingface.co 申請配額升級*

評估

那麼 Falcon 模型有多好呢?Falcon 作者的深入評估將很快釋出,因此在此期間,我們透過我們的 開放 LLM 基準測試了基礎模型和指令模型。該基準測試衡量了 LLM 的推理能力及其在以下領域提供真實答案的能力

  • AI2 推理挑戰賽 (ARC):小學多項選擇科學問題。
  • HellaSwag:圍繞日常事件的常識推理。
  • MMLU:57 個學科(專業和學術)的多項選擇題。
  • TruthfulQA:測試模型將事實與一組對抗性選擇的不正確陳述分離的能力。

結果顯示,40B 基礎模型和指令模型非常強大,目前在 LLM 排行榜上分別排名第一和第二 🏆!

leaderboard.png

正如 Thomas Wolf 指出,一個令人驚訝的見解是,40B 模型預訓練所需的計算量大約是 LLaMa 65B 的一半(2800 PF-天 vs 6300 PF-天),這表明我們還沒有完全達到 LLM 預訓練“最優”的極限。

對於 7B 模型,我們發現基礎模型優於 `llama-7b`,並略勝 MosaicML 的 `mpt-7b`,成為當前此規模下最佳的預訓練 LLM。下面列出了排行榜中的一些熱門模型以供比較:

模型 型別 平均排行榜分數
tiiuae/falcon-40b-instruct 指令 63.2
tiiuae/falcon-40b 基礎 60.4
llama-65b 基礎 58.3
TheBloke/dromedary-65b-lora-HF 指令 57
stable-vicuna-13b rlhf 52.4
llama-13b 基礎 51.8
TheBloke/wizardLM-7B-HF 指令 50.1
tiiuae/falcon-7b 基礎 48.8
mosaicml/mpt-7b 基礎 48.6
tiiuae/falcon-7b-instruct 指令 48.4
llama-7b 基礎 47.6

儘管開放 LLM 排行榜不衡量聊天能力(人類評估是金標準),但 Falcon 模型的這些初步結果非常令人鼓舞!

現在讓我們來看看如何微調您自己的 Falcon 模型——也許您的一個模型最終會登上排行榜榜首🤗。

使用 PEFT 進行微調

訓練 10B+ 規模的模型在技術和計算上都可能具有挑戰性。在本節中,我們將介紹 Hugging Face 生態系統中可用的工具,以便在簡單硬體上高效訓練超大型模型,並展示如何在單個 NVIDIA T4(16GB - Google Colab)上微調 Falcon-7b。

讓我們看看如何使用 PEFT 庫和最近的 QLoRA 方法在 Guanaco 資料集Open Assistant 資料集的高質量子集,包含約 10,000 個對話)上微調 Falcon,將介面卡放置在凍結的 4 位模型之上。您可以在這篇部落格文章中瞭解有關 4 位量化模型整合的更多資訊。

由於在使用低秩介面卡 (LoRA) 時,模型中只有一小部分是可訓練的,因此學習引數的數量和訓練工件的大小都顯著減小。如下圖所示,儲存的模型對於 7B 引數模型(15GB 浮點數)僅為 65MB。

repo-screenshot.png
最終倉庫只有 65MB 的權重——與原始模型相比,原始模型在半精度下大約有 15GB

更具體地說,在選擇要適配的目標模組(實際上是注意力模組的查詢/鍵層)後,小的可訓練線性層被附加到這些模組附近,如下圖所示。然後將介面卡產生的隱藏狀態新增到原始狀態以獲得最終隱藏狀態。

lora-gif
原始(凍結)預訓練權重(左側)的輸出啟用透過由權重矩陣 A 和 B(右側)組成的低秩介面卡進行增強。

訓練完成後,無需儲存整個模型,因為基礎模型保持凍結狀態。此外,只要這些模組的輸出隱藏狀態與介面卡的隱藏狀態具有相同的 dtype,就可以將模型保持在任何任意的 dtype(int8、fp4、fp16 等)中——bitsandbytes 模組(`Linear8bitLt` 和 `Linear4bit`)就是這種情況,它們返回與原始未量化模組具有相同 dtype 的隱藏狀態。

我們使用 Guanaco 資料集對 Falcon 模型的兩種變體(7B 和 40B)進行了微調。我們在單個 NVIDIA-T4 16GB 上微調了 7B 模型,在單個 NVIDIA A100 80GB 上微調了 40B 模型。我們使用了 4 位量化基礎模型和 QLoRA 方法,以及 TRL 庫中最新的 `SFTTrainer`。

使用 PEFT 重現我們實驗的完整指令碼可在此處獲取:這裡,但只需幾行程式碼即可快速執行 `SFTTrainer`(為簡單起見,不使用 PEFT)

from datasets import load_dataset
from trl import SFTTrainer
from transformers import AutoTokenizer, AutoModelForCausalLM

dataset = load_dataset("imdb", split="train")

model_id = "tiiuae/falcon-7b"

tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id, trust_remote_code=True)

trainer = SFTTrainer(
    model,
    tokenizer=tokenizer,
    train_dataset=dataset,
    dataset_text_field="text",
    max_seq_length=512,
)
trainer.train()

有關評估訓練模型的更多詳細資訊,請參閱原始 qlora 儲存庫

微調資源

結論

Falcon 是一個令人興奮的新型大型語言模型,可用於商業應用。在這篇部落格文章中,我們展示了它的功能、如何在您自己的環境中執行它以及在 Hugging Face 生態系統中輕鬆地對其進行自定義資料微調。我們很高興看到社群將用它構建什麼!

社群

註冊登入發表評論

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