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 生态系统中轻松地对其进行自定义数据微调。我们很高兴看到社区将用它构建什么!