超大模型加载转换Trick
在深度学习领域,大模型的训练和推理通常需要消耗大量的计算和内存。如何高效地加载和使用大模型是一个相当关键的问题。在这篇博客中,我将分享一些关于更快加载大模型和减少内存的技巧.
问题分析假设现在我们有一个236B 超大模型的原始权重的 checkpoint.pth 文件, 比如 DeepSeek Chat V2, 以BF16 格式存储, 一个标准的加载流程如下
123456import torchstate_dict = torch.load(checkpoint_file)my_model = BigModelClass(...)my_model.load_state_dict(state_dict)
在这段代码的中, my_model = BigModelClass(...) 会初始化一个模型, torch.load(checkpoint_file)函数会将模型权重从磁盘加载到内存中。然后,my_model.load_state_dict(state_dict)函数会将权重从内存加载到模型的参数中。这两个步骤都可能会消耗大量的时间和内存。理想情况下, 一个236B BF16格式的模型 ...
ML system 入坑指南
ML system 入坑指南最近ChatGpt大火,越来越多开始关注大模型2,但对于大模型落地而言,除了先进的算法,其背后的MLsystem(机器学习系统), 从分布式训练到高效推理的完整链路同样重要, 好的基础设施是应用爆发的基础.
作为一个入坑MLsys快两年半的练习生, 本文主要围绕自己学习的经历来构筑,会持续更新,希望能给希望入坑的新人一个指引,也给非Mlsys背景但感兴趣的其他领域的同学一些启发.
Course首先是课程,入坑MLsys,基本的计算机背景知识比如数据结构就不多聊了,更多讲讲一些更加专业性的进阶课程,
Operating System南京大学JYY OS南京大学JYY老师开的操作系统课内容非常硬核, workload巨大,课程质量比肩四大
MIT 6.S081MIT经典OS课,资料,lab都非常全
课程主页
MIT 6.S081 中文 Tutorial Book
Parallel computingCMU15418 Parallel computing并行计算非常好的入门课,内容硬核,workload巨大,涉及现代多处理器,CPU加速比如SIMD,分布式通 ...
流水线并行论文总结
基础概念模型并行 模型并行分为两种:流水线并行和张量并行,也可以称作算子内并行(intra-operator parallelism)和算子间并行(interoperator parallelism)(Alpa 中的叫法)
流水线并行(pipeline model parallel)
把模型不同的层放到不同设备之上,比如前面几层放到一个设备之上,中间几层放到另外一个设备上,最后几层放到第三个设备之上。
张量并行
层内分割,把某一个层做切分,放置到不同设备之上,也可以理解为把矩阵运算分配到不同的设备之上,比如把某个矩阵乘法切分成为多个矩阵乘法放到不同设备之上。
添加图片注释,不超过 140 字(可选)
通讯开销对比
张量并行:
通信发生在每层的前向传播和后向传播过程之中,通信类型是all-reduce,不但单次通信数据量大,并且通信频繁。
通常适合节点内使用, 通过 NVLink 来进行加速
流水线并行
通信在流水线阶段相邻的切分点之上,通信类型是P2P通信,单次通信数据量较少但是比较频繁,而且因为流水线的特点,会产生GPU空闲时间,这里称为流水线气泡(Bubble)。
通常更适 ...
Mixed Precision Training
Mixed Precision Training2018年ICLR的文章,来自Nvidia,现在流行的混合精度训练的方案基本基于这篇文章,Nvidia针对Pytorch开发了Extension Apex,可以完美地在Pytorch中进行混合精度训练,在Pytorch 1.6的版本中,这个特性被Pytorch官方merge到Pytorch中,Pytorch原生支持了amp(自动混合精度训练),解决了apex经常和Pytorch版本不兼容的问题
apex文档
Pytorch.amp文档
论文地址
Absract提升神经网络的规模通常会提高模型预测的准确率,但同时也会有更高的内存和计算要求。这篇文章主要介绍了在不降低模型的准确性并不修改超参数的条件下,使用半精度浮点数训练深度神经网络的方法。半精度训练可以将模型在GPU上的内存需求减半,并且可以加快运算速度。权重、激活和梯度都以IEEE半精度格式存储。由于这种格式的范围比单精度的要窄,所以我们提出了三种技术来防止关键信息的丢失。首先,我们建议维护一个单精度的权重副本,在每个优化器步骤后积累每个优化器步骤后的梯度(这个副本对于正向和反 ...
论文解读:OPTIMIZER FUSION - EFFICIENT TRAINING WITH BETTER LOCALITY AND PARALLELISM
OPTIMIZER FUSION: EFFICIENT TRAINING WITH BETTER LOCALITY AND PARALLELISM论文地址
2021 ICLR的文章,来自德克萨斯奥斯汀,提出了一种针对大规模训练的优化器融合训练方法。
Absract机器学习框架采用迭代优化器的方式来训练神经网络。传统的Eager execution的训练方式将可训练参数的更新与前向和后向计算分开。然而,这样的方式由于缺乏对数据本地性(data locality)和计算并行性(computation parallelism)的利用,引入了不可忽视的训练时间开销。在这项工作中,我们通过将优化器与前向或后向计算融合在一起,来更好地利用训练中的数据本地性和计算并行性。通过重新安排前向传播、梯度计算和参数更新的顺序,我们可以在不同的配置上的减少高达20%训练时间。由于我们的方法没有改变优化器的算法。这个方法可以被用作训练过程中的一个一般 “插件 “来应用。
论文解决什么问题?随机梯度下降和其变种是现在深度学习框架中主流的优化算法,Pytorch,TensorFlow,MXnet等框架通过对各个计算 ...
Pytorch Distributed Data Parallal
目前有不少博客都有对pytorch Distirbuted data parallel的介绍和使用,但大多是针对实际代码的使用,本篇文章更侧重Pytorch DDP论文中提到的低层机制的实现以及目前存在的一些问题。
数据并行基本概念(Data Parallel)如果工作节点没有共享的公共内存,只有容量受限的本地内存,而训练数据的规模很大,无法存储于本地内存,我们就需要对数据集进行划分,分配到各个工作节点上,然后工作节点依据各自分配的局部数据对模型进行训练 我们称此种并行模式为“数据并行模式。
数据并行的两种基本方式随机采样把原始训练数据集作为采样的数据集,通过有放回的方式进行随机采样,然后根据每个工作节点的内存容量为其分配相应数目的训练样本。随机采样方法可以保证每台机器上的局部训练数据与原始训练数据是独立同分布的。
置乱切分将训练数据进行随机置乱,然后按照工作节点的个数将打乱后的数据顺序划分成相应的小份,随后将这些小份数据分配到各个工作节点上。每个工作节点在进行模型训练的过程中,只利用分配给向己的局部数据,并且会定期地(如每完成一个训练周期之后)将局部数据再打乱次 。 到一定阶段(如l ...
论文解读:Lite Transformer
LITE TRANSFORMER WITH LONG-SHORT RANGE ATTENTION论文地址
代码地址
本篇文章来袭MIT 韩松的团队,我们先看摘要
摘要Transformer网络结构在自然语言处理中已经被广泛应用(如机器翻译,回答等);然而,它需要大量的计算资源来实现高性能,硬件资源和电池容量的限制使得它很难在端侧设备部署。在本文中,我们提出了一个高效的移动NLP架构—Lite Transformer,以便于在边缘设备上部署基于Transformer的NLP模型。其关键点是 Long Short range attention(长短程注意力,LSRA),它由两部分组成,一部分走传统的self-attention,这部分可以得到长距离的关系;另一部分使用一个精简版本的卷积神经网络,这部分来获得短距离的关系长距离关系建模(通过注意)。在三个通用NLP任务:机器翻译、抽象概括和语言建模上,Lite Transformer相比普通的transformer都有明细的性能提升。在资源受限的情况下(500M/100M MACs),Lite Transformer在数据集WMT’14的英 ...
基于tfidf和xgboost文本分类
boost & bagging & stacking 区别
算法
模型
数据
作用
实现
Bagging
多个相同不稳定模型
对数据随机采样,每个模型不同
减少 variance
用多个模型平均或投票,并行
Boosting
多个相同弱模型
每次从样本分布不同的数据集采样,上个模型预测错误的数据有更大可能被选择
减少 bias
用多个相同弱模型不断拟合残差,减少方差。串行
Stacking
多个不同模型
全部数据
增强预测效果
用多个不同模型输出concat后生成一个新的数据后再通过一个分类器输出
baggingBagging是 bootstrap aggregation的缩写。bagging对于数据集进行取样,每个数据点有同等几率被采样,然后创建n个模型,每个模型进行m个数据采样,最后进行投票(voting)得出最后结果。
xgboost实现文本分类
导入相关文件
import xgboost as xgb
import pandas as pd
from sklearn.feature_extraction.text i ...
基于TF-IDF和线性回归的简单文本分类
在机器学习算法的训练过程中,假设给定N个样本,每个样本有 M个特征,这样组成了 N×M的样本矩阵,然后完成算法的训练和预测。同样的在计算机视觉中可以将图片的像素看作特征,每张图片看作hight×width×3的特征图,一个三维的矩阵来进入计算机进行计算。
但是在自然语言领域,上述方法却不可行:文本是不定长度的。文本表示成计算机能够运算的数字或向量的方法一般称为词嵌入(Word Embedding)方法。词嵌入将不定长的文本转换到定长的空间内,是文本分类的第一步。
Word Emdedding方法One-hotOne-hot是最简单的词嵌入方法,这里的One-hot与数据挖掘任务中的操作是一致的,即将每一个单词使用一个离散的向量表示。具体将每个字/词编码一个索引,然后根据索引进行赋值。
One-hot表示方法的例子如下:
句子1:我 爱 北 京 天 安 门句子2:我 喜 欢 上 海首先对所有句子的字进行索引,即将每个字确定一个编号:
{ ‘我’: 1, ‘爱’: 2, ‘北’: 3, ‘京’: 4, ‘天’: 5, ‘安’: 6, ‘门’: 7, ‘喜’: 8, ‘欢’: 9, ...
Cmake入门和MindsporeLite Cmake文件分析
对于没有接触Cmake的同学而言,刚接触Cmake难免一脸懵逼,我刚开始实习时也是第一次接触到Cmake,原来CPP开发也一直是在Visual Studio环境下进行,对Liunx环境下的CPP开发并不熟悉,对于Liunx环境的CPP开发而言,CMake和MakeFile是必须掌握的,本文将简单介绍Cmake的原理和使用方法,并以mindsporelite作为案例讲解一个大型项目的Cmake写法。
MakeFile和Cmake简介对于一个C++或者C程序的编译分为预处理、编译、汇编、链接四个过程,比如对于单文件"hello.cpp",生成hello(hello.exe)所需要执行的bash命令:
gcc -v -o hello hello.c
但当涉及多文件编译时,我们的命令会十分复杂,比如一个main.cpp文件依赖于Foo1.cpp,Foo2.cpp,…Foo10,我们需要先将这10个文件编译成.o文件,再将各.o文件和main.o进行链接,代码如下
g++ -std=c++17 -O2 -o Foo1.o -c Foo1.cpp
g++ -std=c++17 ...