1块gpu+几行代码,大模型训练提速40%!无缝支持huggingface,来自国产开源项目

QbitAl QbitAl     2022-10-21     217

关键词:

明敏 发自 凹非寺
量子位 | 公众号 QbitAI

不得不说,为了让更多人能用上大模型,技术圈真是各出奇招!

模型不够开放?有人自己上手搞免费开源版。

比如最近风靡全网的DALL·E Mini,Meta开放的OPT-175B(Open Pretrained Transformer)

都是通过复刻的方式,让原本不够open的大模型,变成人人可用

还有人觉得模型太大,个人玩家很难承受起天价成本。

所以提出异构内存、并行计算等方法,让大模型训练加速又降本。

比如开源项目Colossal-AI,前不久刚实现了让一块英伟达3090就能单挑180亿参数大模型

而在这两天,他们又来了一波上新:

无缝支持Hugging Face社区模型,只需添加几行代码,就能实现大模型的低成本训练和微调。

要知道,Hugging Face作为当下最流行的AI库之一,提供了超过5万个AI模型的实现,是许多AI玩家训练大模型的首选。

而Colossal-AI这波操作,是让公开模型的训练微调变得更加切实可行。

并且在训练效果上也有提升。

单张GPU上,相比于微软的DeepSpeed,使用Colossal-AI的自动优化策略,最快能实现40%的加速。

而PyTorch等传统深度学习框架,在单张GPU上已经无法运行如此大的模型。

对于使用8张GPU的并行训练,仅需在启动命令中添加-nprocs 8就能实现。

这波下来,可以说是把个人AI玩家需要考虑的成本、效率、实操问题,都拿捏住了~

无需修改代码逻辑

光说不练假把式。

下面就以OPT为例,详细展开看看Colossal-AI的新功能到底怎么用。

OPT,全称为Open Pretrained Transformer。

它由Meta AI发布,对标GPT-3,最大参数量可达1750亿。

最大特点就是,GPT-3没有公开模型权重,而OPT开源了所有代码及权重。

因此,每一位开发者都能在此基础上开发个性化的下游任务。

下面的举例,就是根据OPT提供的预训练权重,进行因果语言模型(Casual Language Modelling)的微调。

主要分为两个步骤:

  • 添加配置文件

  • 运行启动

第一步,是根据想进行的任务添加配置文件。

比如在一张GPU上,以异构训练为例,只需在配置文件里加上相关配置项,并不需要更改代码的训练逻辑。

比如,tensor_placement_policy决定了异构训练的策略,参数可以为CUDA、CPU及auto。

每个策略的优点不同、适应的情况也不一样。

CUDA:将全部模型参数都放置于GPU上,适合不offload时仍然能进行训练的传统场景

CPU:将模型参数都放置在CPU内存中,仅在GPU显存中保留当前参与计算的权重,适合超大模型的训练。

auto:根据实时的内存信息,自动决定保留在GPU显存中的参数量,这样能最大化利用GPU显存,同时减少CPU-GPU之间的数据传输。

对于普通用户来说,使用auto策略是最便捷的。

这样可以由Colossal-AI自动化地实时动态选择最佳异构策略,最大化计算效率。

from colossalai.zero.shard_utils import TensorShardStrategy


zero = dict(model_config=dict(shard_strategy=TensorShardStrategy(),
                              tensor_placement_policy="auto"),
            optimizer_config=dict(gpu_margin_mem_ratio=0.8))

第二步,是在配置文件准备好后,插入几行代码来启动新功能。

首先,通过一行代码,使用配置文件来启动Colossal-AI。

Colossal-AI会自动初始化分布式环境,读取相关配置,然后将配置里的功能自动注入到模型及优化器等组件中。

colossalai.launch_from_torch(config='./configs/colossalai_zero.py')

然后,还是像往常一样定义数据集、模型、优化器、损失函数等。

比如直接使用原生PyTorch代码,在定义模型时,只需将模型放置于ZeroInitContext下初始化即可。

在这里,使用的是Hugging Face提供的OPTForCausalLM模型以及预训练权重,在Wikitext数据集上进行微调。

with ZeroInitContext(target_device=torch.cuda.current_device(), 
                    shard_strategy=shard_strategy,
                    shard_param=True):
    model = OPTForCausalLM.from_pretrained(
                'facebook/opt-1.3b'
                config=config
            )

接下来,只需要调用colossalai.initialize,便可将配置文件里定义的异构内存功能统一注入到训练引擎中,即可启动相应功能。

engine, train_dataloader, eval_dataloader, lr_scheduler = colossalai.initialize(model=model,
                                                                               optimizer=optimizer,
                                                                               criterion=criterion,
                                                                               train_dataloader=train_dataloader,
                                                                               test_dataloader=eval_dataloader,
                                                                               lr_scheduler=lr_scheduler)

还是得靠GPU+CPU异构

而能够让用户实现如上“傻瓜式”操作的关键,还是AI系统本身要足够聪明。

发挥核心作用的是Colossal-AI系统的高效异构内存管理子系统Gemini

它就像是系统内的一个总管,在收集好计算所需的信息后,动态分配CPU、GPU的内存使用。

具体工作原理,就是在前面几个step进行预热,收集PyTorch动态计算图中的内存消耗信息。

在预热结束后,计算一个算子前,利用收集的内存使用记录,Gemini将预留出这个算子在计算设备上所需的峰值内存,并同时从GPU显存移动一些模型张量到CPU内存。

Gemini内置的内存管理器给每个张量都标记一个状态信息,包括HOLD、COMPUTE、FREE等。

然后,根据动态查询到的内存使用情况,不断动态转换张量状态、调整张量位置。

带来的直接好处,就是能在硬件非常有限的情况下,最大化模型容量和平衡训练速度。

要知道,业界主流方法ZeRO (Zero Reduency Optimizer),尽管也利用CPU+GPU异构内存的方法,但是由于是静态划分,还是会引起系统崩溃、不必要通信量等问题。

而且,使用动态异构CPU+GPU内存的办法,还能用加内存条的办法来扩充内存。

怎么也比买高端显卡划算多了。

目前,使用Colossal-AI的方法,RTX 2060 6GB普通游戏本能训练15亿参数模型;RTX 3090 24GB主机直接单挑180亿参数大模型;Tesla V100 32GB连240亿参数都能拿下。

除了最大化利用内存外,Colossal-AI还使用分布式并行的方法,让训练速度不断提升。

它提出同时使用数据并行、流水并行、2.5维张量并行等复杂并行策略

方法虽复杂,但上手却还是非常“傻瓜操作”,只需简单声明,就能自动实现。

无需像其他系统和框架侵入代码,手动处理复杂的底层逻辑。

parallel = dict(
    pipeline=2,
    tensor=dict(mode='2.5d', depth = 1, size=4)
)

Colossal-AI还能做什么?

实际上,自开源以来,Colossal-AI已经多次在GitHub及Papers With Code热榜位列世界第一,在技术圈小有名气。

除了如上提到的用单张GPU训练大模型外,Colossal-AI在扩展至数十张甚至数百张GPU的大规模并行场景时,相比于英伟达Megatron-LM等现有系统,性能可以翻倍,使用资源可以降低至其十分之一之下。

换算一下,在预训练GPT-3等超大AI模型上,节省的费用可以达到数百万元。

据透露,Colossal-AI相关的解决方案已经被自动驾驶、云计算、零售、医药、芯片等行业的知名厂商用上了。

与此同时,他们也非常注重开源社区建设,提供中文教程、开放用户社群论坛,根据大家的需求反馈不断更新迭代。

比如我们发现,之前有粉丝留言询问,Colossal-AI能否直接加载Hugging Face上的一些模型?

好嘛,这次更新就来了。

所以,对于大模型训练,你觉得现在还有哪些难点亟需解决呢?

欢迎评论区留言讨论~

传送门

项目地址:https://github.com/hpcaitech/ColossalAI

参考链接:
[1]https://medium.com/@yangyou_berkeley/colossal-ai-seamlessly-accelerates-large-models-at-low-costs-with-hugging-face-4d1a887e500d
[2]https://arxiv.org/abs/2202.05924v2
[3]https://arxiv.org/abs/2205.11487
[4]https://github.com/features/copilot
[5]https://github.com/huggingface/transformers

pytorch在gpu上训练模型(代码片段)

PyTorch在GPU上训练模型为了真正利用Pytorch中Tensor的优秀属性,加速模型的训练,我们可以将训练过程转移到GPU上进行.1.首先要定义设备,如果CUDA是可用的则被定义成GPU,否则被定义成CPU.device=torch.device("cuda:0"iftorch.cuda.is_availabl... 查看详情

单机多gpu训练模型入门指南(torch.nn.dataparallel)(代码片段)

目录模型部分1.指定使用的GPU2.使用Torch的数据并行库(将模型搬到GPU上)3.保存模型数据部分1.选择GPU2.将数据搬到GPU上3.loss的反向传播修改查看效果本文将介绍模型和数据两部分的处理。模型部分1.指定使用的GPU1.1导入os库importos 1.... 查看详情

1个gpu几分钟搞定强化学习训练,谷歌新引擎让深度学习提速1000倍丨开源

...f1f;我们一般会基于强化学习,在仿真环境中进行模拟训练。这时,如果在一台机器的CPU环境下进行模拟训练,那么需要几个小时到几天。但现在,只需一个TPU/GPU,就能和数千个CPU或GPU的计算集群的速度一样快... 查看详情

TensorFlow 2.0 在单 GPU 上训练模型

...训练一个顺序tensorflow(版本2.3.0)模型。我正在使用以下代码sn-p来构建和训练模型。但是,每次运行此代码时,我都看不到任何GPU利用率。任何建议如何修改我的代码以便我可以在1 查看详情

tensorflow设置gpu训练模型(代码片段)

Tensorflow设置GPU训练模型添加以下代码添加以下代码importtensorflowastfgpus=tf.config.list_physical_devices("GPU")ifgpus:tf.config.experimental.set_memory_growth(gpus[0],True)加油!感谢!努力! 查看详情

mmdetection使用指定编号的gpu训练模型

参考技术Ammdetection使用指定编号的GPU训练模型。(Dataparallel用于多卡训练)修改mmdet/apis/train.py将(cfg.gpus为设置的使用gpus的数量,例如gpus=4,range(cfg.gpus)则指[0,1,2,3],使用编号为0,1,2,3的显卡,并且默认模型输出显卡:output_... 查看详情

训练千亿参数大模型,离不开四种gpu并行策略

...xff0c;需要协调GPU集群来执行单个同步计算。随着集群数和模型规模的增长,机器学习从业者开发了多项技术,在多个GPU上进行并行模型训练。乍一看,这些并 查看详情

单机多gpu训练模型入门指南(torch.nn.dataparallel)(代码片段)

...显卡的数量,一般为4or8张卡。选择一:写在python代码中os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"os.environ["CUDA_VISIBLE_DEVICES"]='0,1,2,3'选择二:在命令行设置CUDA_VISIBLE_DEVICES=0,1,2,3查看有没有设置... 查看详情

corr2018|horovod:fastandeasydistributeddeeplearningintensorflow(代码片段)

...:(1)训练框架必须支持GPU间的通信,(2)用户必须更改大量代码以使用多GPU进行训练。为了克服这些问题,本文提出了Horovod,它通过RingAllreduce实现高效的GPU间通信,而且仅仅更改少量代码就可以实现多GPU训练。TensorFlow中提供了一... 查看详情

pytorch训练技巧(代码片段)

Pytorch训练技巧文章目录Pytorch训练技巧1、指定GPU编号2、查看模型每层输出详情3、梯度裁剪(GradientClipping)4、扩展单张图片维度5、独热编码6、防止验证模型时爆显存7、学习率衰减8、冻结某些层的参数1、指定GPU编号设... 查看详情

你敢信!?几行代码让swift数组初始化提速440+倍!

功能需求在Swift中,我们有时需要初始化数组内容,这往往是一个耗时操作,数组越大时间越长。那么,如何最大限度的缩短数组的初始化时间呢?如上所示,在初始化1w个元素的数组时,我们的3种方法分别耗时为:53.855秒0.36秒... 查看详情

你敢信!?几行代码让swift数组初始化提速400多倍!

功能需求在Swift中,我们有时需要初始化数组内容,这往往是一个耗时操作,数组越大时间越长。那么,如何最大限度的缩短数组的初始化时间呢?如上所示,在初始化1w个元素的数组时,我们的3种方法分别耗时为:53.855秒0.36秒... 查看详情

512张gpu炼出10万亿巨模型!

...权,联系删除转载于:量子位超大规模的预训练模型的参数量级又双叒被刷爆了!100000亿!(没错,是10万亿)而且还是用512张GPU,训练了10天搞出来的!这就是达摩院最新推出的超大规模通用... 查看详情

在floyhub中训练模型时,如何充分利用gpu?(代码片段)

我正在使用JupyterNotebook在FloydHub上训练以下模型。但是,每当我训练模型时,都需要花费很多时间(1分钟)。笔记本下方的统计数据显示仅使用了2%的GPU。我试过运行命令torch.cuda.is_available()并返回True。importtorchfromtorchimportnn,opti... 查看详情

[深度学习]pytorch——多/单gpucpu,训练保存加载模型参数问题(代码片段)

[深度学习]Pytorch(三)——多/单GPU、CPU,训练保存、加载预测模型问题上一篇实践学习中,遇到了在多/单个GPU、GPU与CPU的不同环境下训练保存、加载使用使用模型的问题,如果保存、加载的上述三类环境不同,加载时会出错。... 查看详情

[pytorch]单多机下多gpu下分布式负载均衡训练(代码片段)

说明在前面讲模型加载和保存的时候,在多GPU情况下,实际上是挖了坑的,比如在多GPU加载时,GPU的利用率是不均衡的,而当时没详细探讨这个问题,今天来详细地讨论一下。问题在训练的时候,如果GPU资源有限,而数据量和模... 查看详情

githubyolov5开源代码项目系列讲解------使用云端gpu训练yolov5模型(代码片段)

...专栏将从安装到实例运用全方位系列讲解 GitHubYOLOv5开源代码。专栏地址:GitHubYOLOv5开源代码项目系列讲解 目录1登录云端GPU网站2传入文件到云端 3解压缩文件夹4进入文件路径 5安装装所需环境6添加tensorboard插件7打开tensorbo... 查看详情

mmaction2调用指定gpummaction2使用指定编号的gpu训练模型(代码片段)

...#xff0c;如何在mmaction2中调用指定的GPU呢?下面教你一行代码实现tools/train.py进入到/mmaction2/tools/train.py中找到如下代码:注释掉红色框中的代码,然后在下面添加如下代码:cfg.gpu_ids=range(1,2)这一行的意思是,ra... 查看详情