Falcon 登陆 Hugging Face 生态

news2024/10/7 20:29:24

引言

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),而多查询注意力方案改为在所有头上共享同一个键和值。

1e772620ea05275d52c7c7f3bf5d4909.png
多查询注意力机制在注意力头之间共享同一个键嵌入和值嵌入。图片由 Harm de Vries 提供。

这个技巧对预训练影响不大,但它极大地 提高了推理的可扩展性: 事实上, 该技巧大大减少了自回归解码期间 K,V 缓存的内存占用,将其减少了 10-100 倍 (具体数值取决于模型架构的配置),这大大降低了模型推理的内存开销。而内存开销的减少为解锁新的优化带来了可能,如省下来的内存可以用来存储历史对话,从而使得有状态推理成为可能。

模型许可能否商用?预训练词元数预训练算力 [PF-天]排行榜得分K,V 缓存大小 (上下文长度为 2048)
StableLM-Alpha-7BCC-BY-SA-4.01,500B70038.3*800MB
LLaMA-7BLLaMA license1,000B50047.61,100MB
MPT-7BApache 2.01,000B50048.61,100MB
Falcon-7BApache 2.01,500B70048.820MB
LLaMA-33BLLaMA license1,500B320056.93,300MB
LLaMA-65BLLaMA license1,500B630058.35,400MB
Falcon-40BApache 2.01,000B280060.4240MB
  • 上表中得分均为经过微调的模型的得分

演示

通过 这个 Space 或下面的应用,你可以很轻松地试用一下大的 Falcon 模型 (400 亿参数!):

19800da494b8199d025af92f1e2e0d9b.png
请点击 阅读原文 查看交互式示例。

上面的应用使用了 Hugging Face 的 Text Generation Inference 技术,它是一个可扩展的、快速高效的文本生成服务,使用了 Rust、Python 以及 gRPC 等技术。HuggingChat 也使用了相同的技术。

我们还构建了一个 Core ML 版本的 falcon-7b-instruct 模型,你可以通过以下方式将其运行至 M1 MacBook Pro:

a96defff5e130756e4d34235c96e37bc.png
请点击 阅读原文 观看视频。

该视频展示了一个轻量级应用程序,该应用程序利用一个 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,但这会影响推理速度。

在最新版本的 bitsandbytestransformers 以及 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 核函数优化,这可显著降低推理的端到端延迟。

d19cb9f711bce850f1ee1c6ec1e11981.png
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 排行榜 上分列第一和第二🏆!

68037aecd310af77d65f5ffe73da532e.png

正如 Thomas Wolf 所述,我们惊喜地发现,目前预训练 40B 模型所用的计算量大约只有 LLaMa 65B 所用计算量的一半 (Falcon 40B 用了 2800 petaflop- 天,而 LLaMa 65B 用了 6300 petaflop- 天),这表明该模型甚至尚未完全预训练至 LLM 的“最佳”极限。

对 7B 模型而言,我们发现其基础模型表现优于 llama-7b,并超过了 MosaicML 的 mpt-7b,成为当前该规模上最好的预训练 LLM。下面摘录了排行榜中一些热门模型的排名情况,以供比较:

模型类型排行榜平均得分
tiiuae/falcon-40b-instructinstruct63.2
tiiuae/falcon-40bbase60.4
llama-65bbase58.3
TheBloke/dromedary-65b-lora-HFinstruct57
stable-vicuna-13brlhf52.4
llama-13bbase51.8
TheBloke/wizardLM-7B-HFinstruct50.1
tiiuae/falcon-7bbase48.8
mosaicml/mpt-7bbase48.6
tiiuae/falcon-7b-instructinstruct48.4
llama-7bbase47.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 存储空间。

8b6bf15ae46d4f56fef5339d05ad84f5.png
与大约 15GB 的原始模型(半精度)相比,最终的训练产物只需存储 65MB 的权重

更具体地说,在选定需要微调的模块 (即注意力模块的查询映射层和键映射层) 之后,我们在每个目标模块旁边添加两个小的可训练线性层 (如下图所示) 作为适配子模型。然后,将适配子模型输出的隐含状态与原始模型的隐含状态相加以获得最终隐含状态。

006204a45b49318d44127ed33e9cd148.gif
用由权重矩阵 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 (阿东)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/644678.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL | 深入了解如何最大化利用 MySQL 函数(一)

前言 ✨欢迎来到小K的MySQL专栏,本节将为大家带来MySQL字符串函数和数学函数的讲解✨ 目录 前言一、字符串函数二、数学函数三、总结 一、字符串函数 函数作用UPPER(列|字符串)将字符串每个字符转为大写LOWER(列|字符串)将字符串每个字符转为小写CONCAT(str1,str2,…

AI 写作,30 秒上手,可别再说写作没思路了

你经常要与文字打交道吗,是不是也会有以下困惑? 写作难下笔写不好?课程制作难缺灵感?营销文案没吸引力?PPT制作耗时费力?短视频脚本没创意? ChatGPT 出现以后,嗅觉灵敏的先行者&…

线程同步(三)

目录 条件变量 条件变量操作函数函数原型: 线程阻塞函数: 唤醒阻塞线程: 生产者和消费者模型 信号量函数 生产者和消费者模型 总结 条件变量 条件变量是一种线程间同步的机制,用于协调线程之间的操作。当一个线程正在等待某…

浅谈银桥乳业局域网设计与实现_kaic

摘 要 迈入二十一世纪,在互联网智能制造的加持下。各公司企业不断提升管理制造能力。云计算、新基建、大数据等技术日新月异。不断冲击着管理方式。企业局域网作为企业基建基础到越来越变得重要的。伴随着企业财务业务一体化的需求。ERP系统、CRM系统、HR系统、MES…

动态域名服务 DDNS,YYDS(四)

来源:公众号【鱼鹰谈单片机】 作者:鱼鹰Osprey ID :emOsprey 前面的笔记《如何像访问百度一样访问家里的服务器?(三)》已经通过公网 IP 桥接,完成了基本功能,已经可以通过公网 IP…

面试问题总结---SLAM部分

1、本栏用来记录社招找工作过程中的内容,包括基础知识学习以及面试问题的记录等,以便于后续个人回顾学习; 暂时只有2023年3月份,第一次社招找工作的过程; 2、个人经历: 研究生期间课题是SLAM在无人机上的应用,有接触SLAM、Linux、ROS、C/C++、DJI OSDK等; 3、参加工作后…

嵌入式软件开发岗位----求职过程记录(基础知识和面经总结)

1、本栏用来记录社招找工作过程中的内容,包括基础知识以及面试问题等,以便于后续个人回顾学习; 暂时只有2023年3月份,第一次社招找工作的过程; 2、个人经历: 研究生期间课题是SLAM在无人机上的应用&#xf…

深入理解 JavaScript Promise

1. 引言 JavaScript中的Promise是一种处理异步操作的机制,它提供了一种优雅的方式来处理回调函数地狱和异步代码的流程控制。本文将深入介绍JavaScript中的Promise,帮助读者更好地理解和应用Promise。 2. Promise的基本概念 Promise是一个代表异步操作…

唯一客服系统(独立部署无限多开)-知识库ChatGPT-支持微信公众号小程序-钉钉-PC和H5全渠道客服系统...

产品介绍 唯一客服系统是基于Golang语言自主开发的在线客服系统。创立于2019年初,是一款连接企业与客户的即时通讯项目,遵循快速、简洁的开发原则,是为中小企业量身定制的全渠道客服系统,致力于帮助广大开发者/公司快速部署整合私…

第四十七章 液态网络

如弗洛格老师所料,巴哥奔果真倒头睡掉了一夜一昼又一夜。 再次醒来,浑身酸痛仍在,却是以鸡皮疙瘩的形式存在于皮肤上。临鸾连续弹出两个数字,其一是时间,其二是任务量。 时间很快得到室友们的确认,没错&…

Vue中如何进行移动端手势操作?

Vue中如何进行移动端手势操作? 在移动端开发中,手势操作是非常常见的功能,例如滑动、缩放、旋转等操作。在Vue.js中,我们可以使用第三方插件或者自己编写指令来实现手势操作。本文将介绍如何在Vue.js中实现移动端手势操作。 使用…

OpenGL蓝宝书第十章学习笔记:计算着色器

前言 本篇在讲什么 OpenGL蓝宝书第十章学习笔记计算着色器 本篇适合什么 适合初学OpenGL的小白 本篇需要什么 对C语法有简单认知 对OpenGL有简单认知 最好是有OpenGL超级宝典蓝宝书 依赖Visual Studio编辑器 本篇的特色 具有全流程的图文教学 重实践,轻…

Idea+maven+springboot项目搭建系列--2 整合Rabbitmq完成客户端服务器端消息收发

前言:本文通过springBoot -maven 框架,对Rabbitmq 进行整合,完成客户端消息的发送和消费; 1 为什么要使用Rabbitmq: RabbitMQ 是一个可靠的、灵活的、开源的消息中间件,具有以下优点: 异步通信…

【C++】C++前言

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员,2024届电子信息研究生 目录 1.什么是C 2.C的发展史 3.C的重要性 a.使用广泛 b.C/C的应用 1.操作系统以及大型系统软件开发 2.服务器端开发 3.游戏开发 4.嵌入式和物联网领域 5.数字图像处理 6.人工智…

AVL树的解析

我们在之前的学习里面已经发现了,搜索二叉树是有一些问题的。它可能会存在单边树的问题,如果你插入的值是有序的话,就会导致这个问题。 那我们肯定是要来解决一下的,如何解决呢? 》一种解决方案是AVL树,还有…

【云原生 | 54】Docker三剑客之Docker Compose应用案例二:大数据Spark集群

🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 🏅阿里云ACE认证高级工程师 🏅阿里云开发者社区专…

天下苦 Spring 久矣,Solon v2.3.3 发布

Solon 是什么框架? 一个,Java 新的生态型应用开发框架。它从零开始构建,有自己的标准规范与开放生态(全球第二级别的生态)。与其他框架相比,它解决了两个重要的痛点:启动慢,费资源。…

HarmonyOS学习路之开发篇—Java UI框架(PositionLayoutAdaptiveBoxLayout)

PositionLayout 在PositionLayout中,子组件通过指定准确的x/y坐标值在屏幕上显示。(0, 0)为左上角;当向下或向右移动时,坐标值变大;允许组件之间互相重叠。 PositionLayout示意图 布局方式 PositionLayout以坐标的形式控制组件的…

基于Hexo和Butterfly创建个人技术博客,(4) 使用通用的Markdown语法编写博客文章

Hexo官司网查看 这里 hexo的博文建议是用markdown语法来写,原因markdown简单通用,比如很多博客平台都会提供md编辑器,这样如果我们想把同一篇文章发到多个博客平台上(事实上很多人也是这样做的),md应该是最好的编写方法了&#xf…

目标检测数据集---交通信号数据集

✨✨✨✨✨✨目标检测数据集✨✨✨✨✨✨ 本专栏提供各种场景的数据集,主要聚焦:工业缺陷检测数据集、小目标数据集、遥感数据集、红外小目标数据集,该专栏的数据集会在多个专栏进行验证,在多个数据集进行验证mAP涨点明显,尤其是小目标、遮挡物精度提升明显的数据集会在该…