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

社区

注册登录发表评论