只用几行代码,我让模型『训练』加速了3倍以上!

简介: 只用几行代码,我让模型『训练』加速了3倍以上!

最近总有学妹问我,论文要截稿了,模型来不及跑怎么办?

还有学妹问我,有好多idea,验证一个就要跑一周怎么办?

这时候我想起了下面这张图,我想这句话反映了大多数从事人工智能的科研工作者们目前的状态。


于是我告诉学妹,想要快,找我就对了,我教你怎样让你的模型训练加速3倍以上!

这里我们需要用到的就是字节跳动AI Lab最近开源的「新版训练加速引擎」——LightSeq。

具体的原理这里就不做过多介绍了,过两天会专门发布一篇介绍技术细节的文章,敬请期待。今天我来教大家如何使用LightSeq。

安装步骤

源码安装

你可以从源码进行安装,使用如下命令:

git clone https://github.com/bytedance/lightseq.git
cd lightseq
pip install -e .

如果你想执行LightSeq提供的现成样例,或者使用它的单元测试工具,那最好从源码安装。

pip安装

当然如果你想直接调用LightSeq的接口,不需要它的样例或者单元测试工具,我更推荐你用下面pip的方式安装,更加方便:

pip install lightseq

使用教程

自定义模型

大多数同学可能想自己搭建一个Transformer模型,然后用来训练各种数据,那我这里就教大家如何快速搭建一个LightSeq版本的Transformer编码层。

你只需要创建一个配置对象,然后用它创建LightSeq的编码层即可。

我写了一份完整的训练代码,非常浅显易懂,看注释就行了,亲测可以直接运行哦:

import torch
from lightseq.training.ops.pytorch.transformer_encoder_layer import LSTransformerEncoderLayer
def train(model, inputs, masks):
    inputs = inputs.to(device="cuda:0")
    masks = masks.to(device="cuda:0")
    model.to(device="cuda:0")
    model.train()
    opt = torch.optim.Adam(model.parameters(), lr=1e-3)
    for epoch in range(1000):
        opt.zero_grad()
        outputs = model(inputs, masks)
        loss = torch.square(outputs).mean()
        loss.backward()
        opt.step()
        if epoch % 200 == 0:
            print("epoch {:>3d}: loss = {:>5.3f}".format(epoch, loss))
if __name__ == "__main__":
    # 定义LightSeq配置
    config = LSTransformerEncoderLayer.get_config(
        max_batch_tokens=4096,
        max_seq_len=256,
        hidden_size=1024,
        intermediate_size=4096,
        nhead=16,
        attn_prob_dropout_ratio=0.1,
        activation_dropout_ratio=0.1,
        hidden_dropout_ratio=0.1,
        pre_layer_norm=True,
        fp16=False,
        local_rank=0
    )
    # 随机生成输入
    bsz, sl = 10, 80
    inputs = torch.randn(bsz, sl, config.hidden_size)
    masks = torch.zeros(bsz, sl)
    # 定义LightSeq编码层并进行训练
    model = LSTransformerEncoderLayer(config)
    train(model, inputs, masks)


下面两个样例都放在了lightseq/training/examples目录下,推荐大家采用源码安装的方式安装LightSeq,这样可以直接运行样例。

Hugging Face

Hugging Face是目前用的最多的预训练模型库了吧,主要是用起来太方便了,模型也很全。直接pip install transformers安装即可。

以BERT在NER任务上微调为例,直接运行LightSeq提供的脚本就行:

sh lightseq/training/examples/huggingface/run_ner.sh

Fairseq

Fairseq是目前最主流的序列生成库之一,用来做机器翻译、文本生成等任务都是非常方便的。安装的话也很简单,直接pip install fairseq即可。

LightSeq同样提供了现成的运行脚本,如果想运行LightSeq加速后的模型,执行如下命令:

sh lightseq/training/examples/fairseq/ls_fairseq_wmt14en2de.sh

再来看看细节,一般如果我们想用Fairseq来训练一个机器翻译模型,通常首先会准备好数据集,然后执行如下命令:

fairseq-train DATA_DIR \
    --arch transformer_wmt_en_de_big_t2t \
    --optimizer adam \
    --criterion label_smoothed_cross_entropy \
    ...

注意这里我们只列出了同LightSeq有关的三个参数:--arch--optimizer--criterion,分别指定了模型结构、参数优化器和损失函数。

如果想用LightSeq进行加速,直接将上面的运行命令改为下面这样:

lightseq-train DATA_DIR \
    --arch ls_transformer_wmt_en_de_big_t2t \
    --optimizer ls_adam \
    --criterion ls_label_smoothed_cross_entropy \
    ...

注意改动的地方有4个。fairseq-train改成lightseq-train,这是为了导入LightSeq的目录。--arch--optimizer--criterion都加上了ls_前缀,这样就快速替换为了LightSeq的组件。

训练速度

说了这么多,实际速度到底怎么样?我用Fairseq测了一下训练的总耗时:

不同模型大小、不同批处理大小、不同显卡上加速效果都是有区别的,但总体上都能缩短一半左右的训练时间。

如果你的显卡比较老旧(我相信大多数学校实验室都是这样的),显存又比较小,那么批处理大小只能设置的很小,那加速比甚至能达到3倍以上。

项目地址

学妹试了直叫好,说用起来确实快。


你也别忘了点个star,让更多的人享受到极速的快乐。


相关文章
|
人工智能 搜索推荐 物联网
VeRA: 性能相当,但参数却比LoRA少10倍
2022年的LoRA提高了微调效率,它在模型的顶部添加低秩(即小)张量进行微调。模型的参数被冻结。只有添加的张量的参数是可训练的。
82 0
|
2天前
|
人工智能 物联网 C语言
SVDQuant:MIT 推出的扩散模型后训练的量化技术,能够将模型的权重和激活值量化至4位,减少内存占用并加速推理过程
SVDQuant是由MIT研究团队推出的扩散模型后训练量化技术,通过将模型的权重和激活值量化至4位,显著减少了内存占用并加速了推理过程。该技术引入了高精度的低秩分支来吸收量化过程中的异常值,支持多种架构,并能无缝集成低秩适配器(LoRAs),为资源受限设备上的大型扩散模型部署提供了有效的解决方案。
22 5
SVDQuant:MIT 推出的扩散模型后训练的量化技术,能够将模型的权重和激活值量化至4位,减少内存占用并加速推理过程
|
3月前
|
机器学习/深度学习 存储 人工智能
压缩大型语言模型(LLMs):缩小10倍、性能保持不变
尽管大规模语言模型(LLMs)在多种应用场景中表现出色,但其庞大的规模也带来了实际部署难题。本文探讨了通过模型压缩技术解决这些问题的方法,介绍了量化、剪枝和知识蒸馏三种主要压缩技术,并通过具体Python代码示例展示了如何将一个100M参数的文本分类模型压缩至52.8M参数,再通过4位量化进一步减小至原来的1/7,同时保持甚至提升性能。示例代码展示了从数据预处理、模型训练到评估的完整流程,证明了压缩技术的有效性。
152 6
|
2月前
|
人工智能 网络架构 开发者
第一个100%开源的MoE大模型,7B的参数,1B的推理成本
【10月更文挑战第1天】《OLMoE: Open Mixture-of-Experts Language Models》一文介绍了OLMoE,这是一个完全开源的Mixture-of-Experts(MoE)语言模型,具有70亿参数量,但每个输入令牌仅需10亿参数进行推理,有效平衡了性能与成本。OLMoE由Allen Institute for AI等机构的研究者共同开发,其开源特性促进了大规模语言模型领域的合作与创新,降低了资源浪费,同时具备良好的可扩展性和效率,为研究和应用开辟了新可能。然而,其复杂性也可能带来训练和调优上的挑战。
51 2
|
7月前
|
机器学习/深度学习 自然语言处理 测试技术
SUPRA:无须额外训练,将Transformer变为高效RNN,推理速度倍增
`Transformers`模型因其在多种任务上的优秀性能而广泛采用,但其内存需求和推理成本随词元数量指数增长。为解决这一问题,论文《Linearizing Large Language Models》提出`SUPRA`方法,将预训练的`Transformers`转换为递归神经网络(RNN),实现有效推理并降低训练成本至原来的5%。`SUPRA`通过将注意力机制线性化并用`GroupNorm`替代`softmax`,保持预训练模型的优势。经过微调,转换后的模型在标准语言理解和长上下文任务中保持高性能,展示了在长序列处理方面的潜力,但仍有改进空间。
156 2
|
6月前
|
算法 测试技术 异构计算
【SAM模型超级进化】MobileSAM轻量化的分割一切大模型出现,模型缩小60倍,速度提高40倍,效果不减
【SAM模型超级进化】MobileSAM轻量化的分割一切大模型出现,模型缩小60倍,速度提高40倍,效果不减
|
并行计算 Python
只用两行代码,我让Transformer推理加速了50倍
只用两行代码,我让Transformer推理加速了50倍
327 0
|
存储 编解码 算法
全新剪枝框架 | YOLOv5模型缩减4倍,推理速度提升2倍(二)
全新剪枝框架 | YOLOv5模型缩减4倍,推理速度提升2倍(二)
490 0
|
机器学习/深度学习 传感器 编解码
全新剪枝框架 | YOLOv5模型缩减4倍,推理速度提升2倍(一)
全新剪枝框架 | YOLOv5模型缩减4倍,推理速度提升2倍(一)
470 0
|
人工智能 自然语言处理 云计算
蒸馏也能Step-by-Step:新方法让小模型也能媲美2000倍体量大模型
蒸馏也能Step-by-Step:新方法让小模型也能媲美2000倍体量大模型
186 0