Falcon 已登陸 Hugging Face 生態系統
Falcon 是由阿布扎比技術創新學院建立的一系列最先進的語言模型,並以 Apache 2.0 許可證釋出。**值得注意的是,Falcon-40B 是第一個“真正開放”的模型,其能力可與許多當前閉源模型媲美**。這對從業者、愛好者和行業來說是一個絕妙的訊息,因為它為許多令人興奮的用例打開了大門。
注意:此版本釋出幾個月後,Falcon 團隊釋出了一個更大的模型,包含1800 億個引數。
在這篇部落格中,我們將深入探討 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-Instruct 和 Falcon-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 模型的另一個有趣特徵是它們使用了**多查詢注意力**。香草多頭注意力方案每個頭有一個查詢、一個鍵和一個值;而多查詢則在所有頭之間共享一個鍵和一個值。
這個技巧對預訓練沒有顯著影響,但它極大地提高了推理的可擴充套件性:實際上,**自迴歸解碼期間保留的 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.py,modelling_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 核心,可顯著降低端到端延遲。
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 排行榜上分別排名第一和第二 🏆!
正如 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。
更具體地說,在選擇要適配的目標模組(實際上是注意力模組的查詢/鍵層)後,小的可訓練線性層被附加到這些模組附近,如下圖所示。然後將介面卡產生的隱藏狀態新增到原始狀態以獲得最終隱藏狀態。
訓練完成後,無需儲存整個模型,因為基礎模型保持凍結狀態。此外,只要這些模組的輸出隱藏狀態與介面卡的隱藏狀態具有相同的 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 生態系統中輕鬆地對其進行自定義資料微調。我們很高興看到社群將用它構建什麼!