大型语言模型 (LLM) 的兴起一直是自然语言处理 (NLP) 领域的一个决定性趋势,导致它们在各种应用程序中的广泛采用。然而,这种进步往往是排他性的,大多数由资源丰富的组织开发的 LLM 仍然无法向公众开放。
这种排他性提出了一个重要的问题:如果有一种方法可以使对这些强大的语言模型的访问民主化,那会怎样?这就是 BLOOM 出现的原因。
本文首先提供了有关其起源的更多详细信息,从而全面概述了 BLOOM 是什么。然后,它介绍了 BLOOM 的技术规范以及如何使用它,然后强调了它的局限性和道德考虑。
什么是BLOOM?
BigScience 大型开放科学开放获取多语言模型(简称 BLOOM)代表了语言模型技术民主化的重大进步。
BLOOM由来自39个国家的1200多名参与者共同开发,是全球努力的产物。该项目由 BigScience 与 Hugging Face 和法国 NLP 社区合作协调,超越了地理和机构的界限。
它是一个开源的、仅解码器的转换器模型,具有 176B 参数,在 ROOTS 语料库上训练,该语料库是 59 种语言的数百个来源的数据集:46 种口语和 13 种编程语言。
下面是训练语言分布的饼图。
训练语言的分布
该模型被发现在各种基准测试中都取得了显着的性能,并且在多任务提示微调后获得了更好的结果。
该项目在巴黎的Jean Zay超级计算机上进行了为期117天(3月11日至7月6日)的培训课程,并得到了法国研究机构CNRS和GENCI的大量计算资助。
BLOOM不仅是一个技术奇迹,也是国际合作和集体科学追求力量的象征。
BLOOM 模型架构
现在,让我们更详细地描述一下 BLOOM 的架构,它涉及多个组件。
Bloom 架构
如本文所述,BLOOM 模型的架构包括几个值得注意的方面:
- **设计方法:**该团队专注于支持公开可用工具和代码库的可扩展模型系列,并在较小的模型上进行了消融实验,以优化组件和超参数。零样本泛化是评估架构决策的关键指标。
- **架构和预训练目标:**BLOOM 基于 Transformer 架构,特别是仅因果解码器模型。与编码器-解码器和其他仅解码器架构相比,这种方法被验证为零样本泛化功能最有效的方法。
- 建模细节:
- **ALiBi 位置嵌入:**ALiBi 之所以选择传统的位置嵌入,是因为它根据按键和查询之间的距离直接削弱注意力分数。这导致了更顺畅的训练和更好的表现。
- **嵌入 LayerNorm:**在嵌入层之后立即包含额外的层归一化,这提高了训练稳定性。这一决定在一定程度上受到在最终训练中使用 bfloat16 的影响,它比 float16 更稳定。
这些组件反映了团队专注于平衡创新与成熟技术,以优化模型的性能和稳定性。
除了 BLOOM 的架构组件之外,让我们了解另外两个相关组件:数据预处理和提示数据集。
- **数据预处理:**这涉及重复数据删除和隐私编辑等关键步骤,特别是对于隐私风险较高的来源。
- **提示数据集:**BLOOM采用多任务提示微调,显示出强大的零样本任务泛化能力。
如何使用 BLOOM
在此示例中,我们将使用 BLOOM 生成创意故事。提供的代码结构用于设置环境、准备模型并根据给定提示生成文本。相应的源代码可在 GitHub 上找到,它在很大程度上受到了 amrrs 教程的启发。
配置工作区
BLOOM 模型是资源密集型的,因此正确配置工作区至关重要,主要步骤如下所述。
首先,Transformer 库用于提供用于处理 BLOOM 模型和其他基于 transformer 的节点的接口。
pip install transformers -q
使用 nvidia-smi,我们检查可用 GPU 的属性,以确保我们拥有运行模型所需的计算资源
nvidia-smi
我们从 transformers 和 torch 中导入所需的模块。torch 用于设置默认张量类型以利用 GPU 加速。
然后,由于我们使用的是 GPU,因此使用 set_default_tensor_type 函数设置 torch 库以确保使用 GPU。
from transformers import AutoModelForCausalLM, AutoTokenizer, set_seed
import torch
torch.set_default_tensor_type(torch.cuda.FloatTensor)
使用 BLOOM 模型
正在使用的目标模型是 70 亿参数的 BLOOM 模型,可以从 bigscience/bloom-1b7 下的 BigScience 的 Hubbing Face 存储库访问它,该存储库对应于模型的唯一标识符。
model_ID = “bigscience/bloom-1b7”
接下来,我们从 Hugging Face 加载预训练的 BLOOM 模型和分词器,并使用具有任意数字的 set_seed 函数为可重复性设置种子。数字本身的值并不重要,但使用非浮动值很重要。
model = AutoModelForCausalLM.from_pretrained(model_ID, use_cache=True)
tokenizer = AutoTokenizer.from_pretrained(model_ID)
set_seed(2024)
现在,我们可以定义要生成的故事的标题以及提示。
story_title = ‘An Unexpected Journey Through Time’
prompt = f’This is a creative story about {story_title}.\n’
最后,我们将提示标记化并映射到适当的模型设备,然后在解码后生成模型的结果。
input_ids = tokenizer(prompt, return_tensors=“pt”).to(0)
sample = model.generate(**input_ids,
max_length=200, top_k=1,
temperature=0, repetition_penalty=2.0)
generated_story = tokenizer.decode(sample[0], skip_special_tokens=True)
最终结果使用 textwrap 模块进行格式化,以确保每行的最大字符数为 80 个,以提高可读性。
import textwrap
wrapper = textwrap.TextWrapper(width=80)
import textwrap
wrapper = textwrap.TextWrapper(width=80)
最终结果如下:
使用 BLOOM 模型生成的故事
只需几行代码,我们就能够使用 BLOOM 模型生成有意义的内容。
预期用途和范围外用途
像所有技术进步一样,BLOOM也有自己的一套合适和不合适的应用程序。本节深入探讨了其适当和不适当的用例,重点介绍了哪些方面可以最好地利用其功能,哪些地方建议谨慎行事。了解这些界限对于负责任和有效地利用 BLOOM 的潜力至关重要。
BLOOM的预期用途
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Go语言工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Go语言全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Golang知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Go)
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
战项目、讲解视频,并且后续会持续更新**
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-cT5cmPAH-1713014616450)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!