用了这个技术,我让模型训练和推理快了好几倍

简介: 用了这个技术,我让模型训练和推理快了好几倍

什么技术呢?就是量化,别激动,不是量化交易,这里是指模型精度上的int8量化

Transformer系列模型都在用吧?

Hugging Face都在用吧?

Fairseq都在用吧?

那你们训练和推理的时候没有觉得很慢吗?之前教过你们怎么用LightSeq来加速:

只用几行代码,我让模型训练加速了3倍

只用两行代码,我让模型推理加速了10倍

今天教你们一个更快的方法,用int8量化来进一步加速!

还是用一个有趣的GPT2文本生成模型来做例子,先来看一段AI生成的话解解闷(97-style,懂得都懂):

我有男朋友了,我们要是面基了,我会叫他们帮我介绍感情的,介绍不了,他们那些技术活,我不是很感兴趣呀,我都不想看他们那些,但是,我觉得有人靠得住,就不会被气着,但是,我不介意他们说我看不上他们,可能他们就是想我不错,然后我就不敢看他们了,我还有希望,一米八几的,我感觉搞金融的比做程序员有钱多了,因为我做金融的很多比我大很多,我不知道,然后每次听到他们讲什么,我就很想去学习

到底有多快?

废话不多说,先来看看到底有多快。

首先是在A100显卡上的训练总时间(秒):

可以看出,Hugging Face的int8训练(实则是伪量化)太慢了,比fp16还慢。而LightSeq的fp16和int8时间差不多,int8能快个2.3倍左右。

可能这时候有人要问了,你这int8训练比fp16还慢,我干嘛用int8呢?别急,看看int8训练完之后,推理的速度到底有多快。

下面在T4显卡上生成长度500的一句话的推理时间(毫秒):

可以看出,Hugging Face根本就不支持int8推理!而LightSeq int8推理比fp16还能快1.35倍左右,比起Hugging Face的fp16更是不知道快到哪里去了,5.9倍妥妥的!


源代码

我将GPT2模型的训练、导出和推理代码都从LightSeq源码中抽离出来了,删除了冗余的部分,只留下了最最最精华的部分。数据和训好的模型也都开源了,具体运行命令我放在文章最后了:

https://github.com/godweiyang/ls-gpt2-demo

如果想学习完整的使用方法和LightSeq实现原理,还是建议直接去看LightSeq源码:

https://github.com/bytedance/lightseq

基本原理

int8为什么这么快?我不做过多细节的介绍,最近会发布详细的技术博客,这里只简单说几点基本原理:

  • int8的矩阵乘法更快。
  • int8的数据读写更快。
  • int8的参数存储更小。

所以LightSeq的int8训练和推理都非常快,但为啥Hugging Face的int8就这么慢呢?因为它不支持int8的矩阵乘法,只能用插入伪量化结点的方法来模拟int8量化,所以反而会更慢。

目前LightSeq的int8量化不仅速度更快,还做到了大部分任务上效果基本无损,用起来还非常简单!

运行命令

如果你说不在乎时间,不在乎显卡贵,就是有钱任性。那好,有本事直接用fp16,别用int8好了。


用fp16精度pretrain模型

训练数据train.txt里面,一行一段话,大概500字左右。也可以替换成你自己的语料,我这里是某知名水友的群聊语录。

python3 -m torch.distributed.launch \
    --nproc_per_node=8 \
    train.py \
    --model_name_or_path uer/gpt2-chinese-cluecorpussmall \
    --train_file data/train.txt \
    --per_device_train_batch_size 16 \
    --per_device_eval_batch_size 8 \
    --num_train_epochs 150 \
    --learning_rate 1.5e-4 \
    --output_dir model/fp16 \
    --overwrite_output_dir \
    --fp16 \
    --logging_steps 10 \
    --enable_quant false

导出fp16模型

这里-l可以指定生成的最大长度。

python3 export.py \
    -m model/fp16/pytorch_model.bin \
    -l 500

用fp16模型生成句子

这里-p用来指定词表所在的路径。

python3 generate.py \
    -m model/fp16/pytorch_model.hdf5 \
    -i "我好难受" \
    -p "uer/gpt2-chinese-cluecorpussmall"

但是如果你没啥钱,就想快点训练和推理完,那就直接上int8量化吧!


用fp16精度pretrain模型

第一步跟刚刚fp16训练一样,先预训练一个fp16的模型,这样能避免int8效果损失。

python3 -m torch.distributed.launch \
    --nproc_per_node=8 \
    train.py \
    --model_name_or_path uer/gpt2-chinese-cluecorpussmall \
    --train_file data/train.txt \
    --per_device_train_batch_size 16 \
    --per_device_eval_batch_size 8 \
    --num_train_epochs 150 \
    --learning_rate 1.5e-4 \
    --output_dir model/fp16 \
    --overwrite_output_dir \
    --fp16 \
    --logging_steps 10 \
    --enable_quant false

用int8精度finetune模型

然后在刚刚预训练的fp16模型基础上,用int8再finetune一会儿。

python3 -m torch.distributed.launch \
    --nproc_per_node=8 \
    train.py \
    --model_name_or_path uer/gpt2-chinese-cluecorpussmall \
    --train_file data/train.txt \
    --per_device_train_batch_size 16 \
    --per_device_eval_batch_size 8 \
    --num_train_epochs 200 \
    --learning_rate 5e-6 \
    --output_dir model/int8 \
    --overwrite_output_dir \
    --resume_from_checkpoint model/fp16 \
    --fp16 \
    --logging_steps 10 \
    --enable_quant true

导出int8模型

导出int8模型,-q指定导出的是int8模型。

python3 export.py \
    -m model/int8/pytorch_model.bin \
    -l 500 \
    -q

用int8模型生成句子

这里-q指定用int8模型来推理。

python3 generate.py \
    -m model/int8/pytorch_model.hdf5 \
    -i "我好难受" \
    -p "uer/gpt2-chinese-cluecorpussmall" \
    -q
相关文章
|
28天前
|
机器学习/深度学习 人工智能 自然语言处理
人工智能与机器学习:探索未来的技术边界
【10月更文挑战第18天】 在这篇文章中,我们将深入探讨人工智能(AI)和机器学习(ML)的基础知识、应用领域以及未来趋势。通过对比分析,我们将揭示这些技术如何改变我们的生活和工作方式,并预测它们在未来可能带来的影响。文章旨在为读者提供一个全面而深入的理解,帮助他们更好地把握这一领域的发展趋势。
|
8天前
|
机器学习/深度学习 自然语言处理 语音技术
探索机器学习中的自然语言处理技术
【10月更文挑战第38天】在本文中,我们将深入探讨自然语言处理(NLP)技术及其在机器学习领域的应用。通过浅显易懂的语言和生动的比喻,我们将揭示NLP技术的奥秘,包括其工作原理、主要任务以及面临的挑战。此外,我们还将分享一些实用的代码示例,帮助您更好地理解和掌握这一技术。无论您是初学者还是有经验的开发者,相信您都能从本文中获得宝贵的知识和启示。
19 3
|
17天前
|
机器学习/深度学习 人工智能 自然语言处理
思通数科AI平台在尽职调查中的技术解析与应用
思通数科AI多模态能力平台结合OCR、NLP和深度学习技术,为IPO尽职调查、融资等重要交易环节提供智能化解决方案。平台自动识别、提取并分类海量文档,实现高效数据核验与合规性检查,显著提升审查速度和精准度,同时保障敏感信息管理和数据安全。
71 11
|
2月前
|
机器学习/深度学习 数据可视化 JavaScript
探索机器学习模型的可视化技术
【9月更文挑战第23天】在数据科学中,理解和解释机器学习模型的决策过程是至关重要的。本文将介绍几种流行的可视化工具和库,如TensorBoard、D3.js等,帮助读者更好地理解模型内部工作原理及其预测结果。通过实例演示如何使用这些工具进行模型可视化,增强模型的可解释性。
|
3月前
|
人工智能 Anolis
展示全栈式AI平台,探讨软硬件技术!英特尔分论坛议程来啦 | 2024 龙蜥大会
英特尔分论坛将依托英特尔云到端的全面产品组合,围绕至强可扩展处理器、AI 加速器、以及 oneAPI、OpenVINO 等软硬件技术展开探讨。
展示全栈式AI平台,探讨软硬件技术!英特尔分论坛议程来啦 | 2024 龙蜥大会
|
3月前
|
图形学 机器学习/深度学习 人工智能
颠覆传统游戏开发,解锁未来娱乐新纪元:深度解析如何运用Unity引擎结合机器学习技术,打造具备自我进化能力的智能游戏角色,彻底改变你的游戏体验——从基础设置到高级应用全面指南
【8月更文挑战第31天】本文探讨了如何在Unity中利用机器学习增强游戏智能。作为领先的游戏开发引擎,Unity通过ML-Agents Toolkit等工具支持AI代理的强化学习训练,使游戏角色能自主学习完成任务。文章提供了一个迷宫游戏示例及其C#脚本,展示了环境观察、动作响应及奖励机制的设计,并介绍了如何设置训练流程。此外,还提到了Unity与其他机器学习框架(如TensorFlow和PyTorch)的集成,以实现更复杂的游戏玩法。通过这些技术,游戏的智能化程度得以显著提升,为玩家带来更丰富的体验。
64 1
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
【机器学习】python之人工智能应用篇--代码生成技术
代码生成技术是人工智能与软件工程交叉领域的一项重要技术,它利用机器学习、自然语言处理和其他AI算法自动编写或辅助编写计算机程序代码。这一技术旨在提高编程效率、降低错误率,并帮助非专业开发者快速实现功能。以下是代码生成技术的概述及其典型应用场景。
52 6
|
3月前
|
机器学习/深度学习 数据采集 人工智能
揭秘大型机器学习模型背后的秘密:如何在技术深度与广度之间找到完美平衡点,探索那些鲜为人知的设计、训练与部署技巧,让你的作品脱颖而出!
【8月更文挑战第21天】大型机器学习模型是人工智能的关键方向,借助不断增强的计算力和海量数据,已实现在学术与产业上的重大突破。本文深入探讨大型模型从设计到部署的全过程,涉及数据预处理、模型架构(如Transformer)、训练技巧及模型压缩技术,旨在面对挑战时提供解决方案,促进AI技术的实用化进程。
71 1
|
3月前
|
机器学习/深度学习 数据挖掘
机器学习模型的选择与评估:技术深度解析
【8月更文挑战第21天】机器学习模型的选择与评估是一个复杂而重要的过程。通过深入理解问题、选择合适的评估指标和交叉验证方法,我们可以更准确地评估模型的性能,并选择出最适合当前问题的模型。然而,机器学习领域的发展日新月异,新的模型和评估方法不断涌现。因此,我们需要保持对新技术的学习和关注,不断优化和改进我们的模型选择与评估策略。
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
【机器学习】python之人工智能应用篇——3D生成技术
在Python中,人工智能(AI)与3D生成技术的结合可以体现在多个方面,比如使用AI算法来优化3D模型的生成、通过机器学习来预测3D模型的属性,或者利用深度学习来生成全新的3D内容。然而,直接通过AI生成完整的3D模型(如从文本描述中生成)仍然是一个活跃的研究领域。 3D生成技术是一种通过计算机程序从二维图像或文本描述自动创建三维模型的过程。这一技术在近年来得到了飞速的发展,不仅为游戏、动画和影视行业带来了革命性的变革,还在虚拟现实、增强现实以及工业设计等多个领域展现出了巨大的应用潜力
60 2