引言
Falcon 是由位于阿布扎比的 技术创新研究院 (Technology Innovation Institute,TII) 创立的一系列的新语言模型,其基于 Apache 2.0 许可公布。值得注意的是,Falcon-40B 是首个“真正凋谢”的模型,其能力可与以后许多闭源模型相媲美。这对从业者、爱好者和行业来说都是个好消息,因为“真开源”使大家能够毫无顾忌地基于它们摸索百花齐放的利用。
本文,咱们将深入探讨 Falcon 模型: 首先探讨它们的独特之处,而后 展现如何基于 Hugging Face 生态提供的工具轻松构建基于 Falcon 模型的多种利用 (如推理、量化、微调等)。
目录
- Falcon 模型
- 演示
- 推理
- 评估
- 用 PEFT 微调模型
- 总结
Falcon 模型
Falcon 家族有两个根底模型: Falcon-40B 及其小兄弟 Falcon-7B。40B 参数模型目前在 Open LLM 排行榜 中名落孙山,而 7B 模型在等同参数量的模型中体现最佳。
运行 Falcon-40B 须要约 90GB 的 GPU 显存 —— 尽管还是挺多的,但比 LLaMA-65B 少了不少,况且 Falcon-40B 的性能还优于 LLaMA-65B。而 Falcon-7B 只须要约 15GB 显存,即便在消费类硬件上也能够进行推理和微调。(咱们将在后文探讨如何应用量化技术在便宜的 GPU 上应用 Falcon-40B!)
TII 还提供了通过指令微调的模型: Falcon-7B-Instruct 以及 Falcon-40B-Instruct。这两个实验性的模型变体经由指令和对话数据微调而得,因而更适宜以后风行的助理式工作。如果你只是想把 Falcon 模型疾速用起来,这两个模型是最佳抉择。 当然你也能够基于社区构建的大量数据集微调一个本人的模型 —— 后文会给出微调步骤!
Falcon-7B 和 Falcon-40B 别离基于 1.5 万亿和 1 万亿词元数据训练而得,其架构在设计时就充分考虑了推理优化。Falcon 模型品质较高的关键在于训练数据,其 80% 以上的训练数据来自于 RefinedWeb —— 一个新的基于 CommonCrawl 的网络数据集。TII 抉择不去收集扩散的精选数据,而是专一于扩大并进步 Web 数据的品质,通过大量的去重和严格过滤使所得语料库与其余精选的语料库品质相当。在训练 Falcon 模型时,尽管依然蕴含了一些精选数据 (例如来自 Reddit 的对话数据),但与 GPT-3 或 PaLM 等最先进的 LLM 相比,精选数据的使用量要少得多。你晓得最妙的是什么吗?TII 颁布了从 RefinedWeb 中提取出的含有 6000 亿词元的数据集,以供社区在本人的 LLM 中应用!
Falcon 模型的另一个乏味的个性是其应用了 多查问注意力 (multiquery attention)。原始多头 (head) 注意力计划每个头都别离有一个查问 (query)、键 (key) 以及值 (value),而多查问注意力计划改为在所有头上共享同一个键和值。
多查问注意力机制在注意力头之间共享同一个键嵌入和值嵌入。图片由 Harm de Vries 提供。 |
这个技巧对预训练影响不大,但它极大地 进步了推理的可扩展性: 事实上,该技巧大大减少了自回归解码期间 K,V 缓存的内存占用,将其缩小了 10-100 倍 (具体数值取决于模型架构的配置),这大大降低了模型推理的内存开销。而内存开销的缩小为解锁新的优化带来了可能,如省下来的内存能够用来存储历史对话,从而使得有状态推理成为可能。
模型 | 许可 | 是否商用? | 预训练词元数 | 预训练算力 [PF- 天] | 排行榜得分 | K,V 缓存大小 (上下文长度为 2048) |
---|---|---|---|---|---|---|
StableLM-Alpha-7B | CC-BY-SA-4.0 | ✅ | 1,500B | 700 | 38.3* | 800MB |
LLaMA-7B | LLaMA license | ❌ | 1,000B | 500 | 47.6 | 1,100MB |
MPT-7B | Apache 2.0 | ✅ | 1,000B | 500 | 48.6 | 1,100MB |
Falcon-7B | Apache 2.0 | ✅ | 1,500B | 700 | 48.8 | 20MB |
LLaMA-33B | LLaMA license | ❌ | 1,500B | 3200 | 56.9 | 3,300MB |
LLaMA-65B | LLaMA license | ❌ | 1,500B | 6300 | 58.3 | 5,400MB |
Falcon-40B | Apache 2.0 | ✅ | 1,000B | 2800 | 60.4 | 240MB |
- 上表中得分均为通过微调的模型的得分
演示
通过 这个 Space 或上面的利用,你能够很轻松地试用一下大的 Falcon 模型 (400 亿参数!):
请点击 浏览原文 查看交互式示例。
下面的利用应用了 Hugging Face 的 Text Generation Inference 技术,它是一个可扩大的、疾速高效的文本生成服务,应用了 Rust、Python 以及 gRPC 等技术。HuggingChat 也应用了雷同的技术。
咱们还构建了一个 Core ML 版本的 falcon-7b-instruct
模型,你能够通过以下形式将其运行至 M1 MacBook Pro:
请点击 浏览原文 观看视频。
该视频展现了一个轻量级应用程序,该应用程序利用一个 Swift 库实现了包含加载模型、分词、筹备输出数据、生成文本以及解码在内的很多沉重的操作。咱们正在快马加鞭构建这个库,这样开发人员就能基于它将弱小的 LLM 集成到各种应用程序中,而无需从新创造轮子。目前它还有点毛糙,但咱们急不可待地想让它早点面世。同时,你也能够下载 Core ML 的权重文件 本人摸索!
推理
在应用相熟的 transformers API 在你本人的硬件上运行 Falcon 模型时,你须要留神几个以下细节:
- 现有的模型是用
bfloat16
数据类型训练的,因而倡议你也应用雷同的数据类型来推理。应用bfloat16
须要你装置最新版本的 CUDA,而且bfloat16
在最新的卡 (如 A100) 上成果最好。你也能够尝试应用float16
进行推理,但请记住,目前咱们分享的模型成果数据都是基于bfloat16
的。 - 你须要容许近程代码执行。这是因为
transformers
尚未集成 Falcon 模型架构,所以,咱们须要应用模型作者在其代码库中提供的代码来运行。以falcon-7b-instruct
为例,如果你容许近程执行,咱们将应用下列文件里的代码来运行模型: configuration_RW.py,modelling_RW.py。
综上,你能够参考如下代码来应用 transformers 的 pipeline
API 加载 falcon-7b-instruct
模型:
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 的 A100 都放不下它。如果用 8 比特模型的话,须要大概 45GB 的空间,此时 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,
)
须要留神的是,INT8 混合精度推理应用的浮点精度是 torch.float16
而不是 torch.bfloat16
,因而请务必详尽地对后果进行测试。
如果你有多张 GPU 卡并装置了 accelerate
,你还能够用 device_map="auto"
将模型的各层主动散布到多张卡上运行。如有必要,甚至能够将某些层卸载到 CPU,但这会影响推理速度。
在最新版本的 bitsandbytes
、transformers
以及 accelerate
中咱们还反对了 4 比特加载。此时,40B 模型仅需约 27GB 的显存就能运行。尽管这个需要还是比 3090 或 4090 这些卡所能提供的显存大,但曾经足以在显存为 30GB 或 40GB 的卡上运行了。
Text Generation Inference
Text Generation Inference 是 Hugging Face 开发的一个可用于生产的推理容器。有了它,用户能够轻松部署大语言模型。
其次要特点有:
- 对输出进行流式 batch 组装 (batching)
- 流式生成词,次要基于 SSE 协定 (Server-Sent Events,SSE)
- 推理时反对多 GPU 张量并行 (Tensor Parallelism),推理速度更快
- transformers 模型代码由定制 CUDA 核函数深度优化
- 基于 Prometheus 和 Open Telemetry 的产品级日志记录、监控和跟踪机制
从 v0.8.2 起,Text Generation Inference 原生反对 Falcon 7b 和 40b 模型,而无需依赖 transformers 的 “信赖近程代码 (trust remote code)”
性能。因而,Text Generation Inference 能够反对密闭部署及平安审计。此外,咱们在 Falcon 模型的实现中退出了定制 CUDA 核函数优化,这可显著升高推理的端到端提早。
Hugging Face Inference Endpoint 现已反对 Text Generation Inference。你能够在单张 A100 上轻松部署 falcon-40b-instruct 的 Int8 量化模型。 |
Text Generation Inference 现已集成至 Hugging Face 的 Inference Endpoint。想要部署 Falcon 模型,可至 模型页面 并点击 Deploy -> Inference Endpoints 按钮。
如需部署 7B 模型,倡议抉择“GPU [medium] – 1x Nvidia A10G”。
如需部署 40B 模型,你须要在“GPU [xlarge] – 1x Nvidia A100”上部署且须要开启量化性能,门路如下: Advanced configuration -> Serving Container -> Int-8 Quantization
留神: 在此过程中,如果你须要降级配额,可间接发电子邮件至 api-enterprise@huggingface.co 申请。
评估
那么 Falcon 模型到底成果如何?Falcon 的作者们马上将会公布一个深刻的评估数据。这里,咱们仅在咱们的 Open LLM 排行榜 上对 Falcon 根底模型和指令模型进行一个初步评估。Open LLM 排行榜
次要掂量 LLM 的推理能力及其答复以下几个畛域的问题的能力:
- AI2 推理挑战 (ARC): 小学水平无关迷信的选择题。
- HellaSwag: 围绕日常事件的常识性问题。
- MMLU: 57 个科目 (蕴含职业科目及学术科目) 的选择题。
- TruthfulQA: 测试模型从一组谬误陈说中找出事实性陈说的能力。
结果显示,40B 根底模型和指令模型都十分强,目前在 Open LLM 排行榜 上分列第一和第二🏆!
正如 Thomas Wolf 所述,咱们惊喜地发现,目前预训练 40B 模型所用的计算量大概只有 LLaMa 65B 所用计算量的一半 (Falcon 40B 用了 2800 petaflop- 天,而 LLaMa 65B 用了 6300 petaflop- 天),这表明该模型甚至尚未齐全预训练至 LLM 的“最佳”极限。
对 7B 模型而言,咱们发现其根底模型体现优于 llama-7b
,并超过了 MosaicML 的 mpt-7b
,成为以后该规模上最好的预训练 LLM。上面摘录了排行榜中一些热门模型的排名状况,以供比拟:
模型 | 类型 | 排行榜均匀得分 |
---|---|---|
tiiuae/falcon-40b-instruct | instruct | 63.2 |
tiiuae/falcon-40b | base | 60.4 |
llama-65b | base | 58.3 |
TheBloke/dromedary-65b-lora-HF | instruct | 57 |
stable-vicuna-13b | rlhf | 52.4 |
llama-13b | base | 51.8 |
TheBloke/wizardLM-7B-HF | instruct | 50.1 |
tiiuae/falcon-7b | base | 48.8 |
mosaicml/mpt-7b | base | 48.6 |
tiiuae/falcon-7b-instruct | instruct | 48.4 |
llama-7b | base | 47.6 |
只管 Open LLM 排行榜
不能掂量聊天能力 (这方面目前次要还是依赖人类评估),但截至目前 Falcon 模型体现出的这些初步成果仍然十分鼓舞人心!
当初让咱们来看看如何微调一个你本人的 Falcon 模型 —— 或者你微调进去的某一个模型最终会登上榜首🤗。
用 PEFT 微调
训练 10B+ 大小的模型在技术和计算上都颇具挑战。在本节中,咱们将理解如何应用 Hugging Face 生态中软件工具在简略的硬件上高效地微调超大模型,并展现如何在单张英伟达 T4 卡 (16GB – Google Colab) 上微调 falcon-7b
。
咱们以在 Guanaco 数据集 上微调 Falcon 为例。Guanaco 数据集是 Open Assistant 数据集 的一个高质量子集,其中蕴含大概 1 万个对话。通过 PEFT 库,咱们能够应用最新的 QLoRA 办法用 4 比特来示意模型,并解冻它,再在其上加一个适配子模型 (adapter),并微调该适配子模型。你能够 从这篇博文中 理解无关 4 比特量化模型的更多信息。
因为在应用低阶适配器 (Low Rank Adapters,LoRA) 时只有一小部分模型权重是可训练的,所以可训练参数的数量和训得模型的尺寸都会显著减小。如下图所示,最终的训练产物 (trained artifact) 与原始的 7B 模型 (数据类型为 bfloat16 时占 15GB 存储空间) 相比,只占 65MB 存储空间。
与大概 15GB 的原始模型(半精度)相比,最终的训练产物只需存储 65MB 的权重 |
更具体地说,在选定须要微调的模块 (即注意力模块的查问映射层和键映射层) 之后,咱们在每个指标模块旁边增加两个小的可训练线性层 (如下图所示) 作为适配子模型。而后,将适配子模型输入的隐含状态与原始模型的隐含状态相加以取得最终隐含状态。
用由权重矩阵 A 和 B 组成的低秩适配器(右)的输入激活来加强原始(解冻)预训练模型(左)的输入激活。 |
一旦训练实现,毋庸保留整个模型,因为根底模型始终处于解冻状态。此外,原始模型能够示意为任意数据类型 (int8、fp4、fp16 等),只有在与适配器的输入隐含状态相加前,将其输入隐含状态的数据类型转换成与适配器雷同的数据类型即可 —— bitsandbytes 的模块 (Linear8bitLt
和 Linear4bit
) 就是这么做的,Linear8bitLt
和 Linear4bit
这两个模块的输入数据类型与原未量化模型的输入数据类型雷同。
咱们在 Guanaco 数据集上微调了 Falcon 模型的两个变体 (7B 和 40B)。其中,7B 模型是在单 NVIDIA-T4 16GB 上微调的,而 40B 模型是在单 NVIDIA A100 80GB 上微调的。在微调时,咱们应用了 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 代码库,以理解无关如何评估训练模型的更多详细信息。
对于微调的资源
- 应用 4 比特量化和 PEFT 在 Guanaco 数据集上微调 Falcon-7B 的 Colab notebook
- 训练代码
- 40B 模型的 LoRA 模型 (日志)
- 7B 模型的 LoRA 模型 (日志)
总结
Falcon 是最新的、令人兴奋的、可商用的大语言模型。在本文中,咱们展现了 Falcon 模型的性能、如何在你本人的环境中运行 Falcon 模型以及在 Hugging Face 生态中如何轻松地用自有数据微调它们。咱们期待看到社区如何应用 Falcon 模型!
英文原文: https://hf.co/blog/falcon
原文作者:Leandro von Werra,Younes Belkada,Sourab Mangrulkar,Lewis Tunstall,Olivier Dehaene,Pedro Cuenca,Philipp Schmid
译者: Matrix Yao (姚伟峰),英特尔深度学习工程师,工作方向为 transformer-family 模型在各模态数据上的利用及大规模模型的训练推理。
排版 / 审校: zhongdongy (阿东)