跳转至
本文阅读量

大模型知识进阶

介绍

大模型的训练往往需要大量的计算资源,因此,如何有效地利用这些资源,提升模型的训练速度,是提升模型性能的关键。本章节将介绍如何使用大模型进行训练,以及如何使用大模型进行推理、以及如何进行模型压缩、加速训练、提升性能等。

准备工作

本章节将介绍一些常用的方法,来提升模型的训练速度。因此,在开始之前,请确保您已经安装了以下依赖:

  • 硬件环境:NVIDIA GPU,CUDA 9.2+,cuDNN 7.6+,NCCL 2.4+
  • 软件环境:Python 3.6+,PyTorch 1.0+,CUDA 9.2+,cuDNN 7.6+,NCCL 2.4+
  • 其他依赖:
    • 训练数据:需要准备好训练数据,并按照相应的格式组织好数据集。
    • 训练环境:需要准备好训练环境,包括安装 PyTorch、CUDA、cuDNN、NCCL、Apex、TensorRT、DeepSpeed、FairSeq、Ignite、Lightning、PyTorch Hub、TorchServe、TorchText、TorchAudio、TorchVision、TorchData、TorchModelHub 等依赖。
    • 训练脚本:需要准备好训练脚本,包括数据加载、模型定义、损失函数、优化器、训练循环、模型保存等。
    • 训练集群:需要准备好训练集群,包括集群管理系统、GPU 管理系统、分布式训练环境等。
    • 训练策略:需要选择合适的训练策略,包括学习率、权重衰减、模型大小、batch size、epoch 数、优化器、数据增强、模型架构、模型初始化、模型微调、模型蒸馏
    • 训练技巧:需要掌握一些训练技巧,包括模型并行、数据并行、混合精度训练、半精度训练、动态图、XLA、AMP、ONNX、TorchScript、TensorRT、DeepSpeed、FairSeq、Ignite、Lightning、PyTorch Hub、TorchServe、TorchText、TorchAudio、TorchVision、TorchData、TorchModelHub 等。
    • 训练注意事项:需要了解一些训练注意事项,包括模型保存、模型加载、模型微调、模型蒸馏、模型量化、模型剪枝

数据集

  • 数据集(Training Dataset)是指模型训练时,用于训练模型的数据集。
  • 验证集(Validation Set)是指模型训练时,用于验证模型性能的数据集。
  • 测试集(Test Set)是指模型训练后,用于评估模型性能的数据集。
  • 预处理(Preprocessing)是指对数据集进行预处理的方法,包括数据清洗、数据转换、数据归一化等。
  • 增广(Augmentation)是指对数据集进行数据增广的方法,包括数据增强、数据生成等。
  • 采样(Sampling)是指对数据集进行采样的方法,包括随机采样、分层采样、过采样、欠采样等。

数据集准备

  • 数据集准备(Dataset Preparation)是指对数据集进行准备的方法,包括数据集的下载、数据集的解压、数据集的划分、数据集的预处理等。
  • 数据集下载(Dataset Download)是指从公开数据集或第三方数据集中下载数据集的方法。
  • 数据集解压(Dataset Unzip)是指解压数据集的方法。
  • 数据集划分(Dataset Split)是指将数据集划分为训练集、验证集、测试集的方法。
  • 数据集预处理(Dataset Preprocessing)是指对数据集进行预处理的方法,包括数据清洗、数据转换、数据归一化等。

数据集增广

  • 数据集增广(Dataset Augmentation)是指对数据集进行数据增广的方法,包括数据增强、数据生成等。
  • 数据增强(Data Augmentation)是指通过对数据进行随机变换、扰动等方式,生成新的样本,增强数据集的规模。
  • 数据生成(Data Generation)是指通过生成模型所需的数据,生成新的样本,增强数据集的规模。

数据集采样

  • 数据集采样(Dataset Sampling)是指对数据集进行采样的方法,包括随机采样、分层采样、过采样、欠采样等。
  • 随机采样(Random Sampling)是指随机从数据集中抽取样本,生成新的样本集。
  • 分层采样(Stratified Sampling)是指根据样本的类别分布,将样本按照类别比例抽取,生成新的样本集。
  • 过采样(Oversampling)是指通过对少数类样本进行复制,生成新的样本集。
  • 欠采样(Undersampling)是指通过对多数类样本进行删除,生成新的样本集。

大模型训练

大模型训练是指使用大模型(如 Llama3、GPT-3、BERT、RoBERTa 等)进行训练,以提升模型的训练速度。大模型训练通常需要大量的计算资源,因此,如何有效地利用这些资源,提升模型的训练速度,是提升模型性能的关键。

训练模型

  • 模型(Model)是指机器学习中的一个概念 ,它是对输入数据进行预测或分类的算法或函数。模型的训练就是通过训练数据,使模型能够对未知数据进行预测或分类。
  • 超参数搜索(Hyperparameter Search)是指通过尝试不同超参数的组合,来找到最优的超参数组合,来提升模型的训练速度。
  • 多 GPU 训练(Multi-GPU Training)是指将模型分布到多个 GPU 上,并行计算,提升模型的训练速度。
  • 多机多卡训练(Multi-Machine Multi-Card Training)是指将模型分布到多个机器上,并行计算,提升模型的训练速度。
  • 异步数据加载(Asynchronous Data Loading)是指在模型训练时,使用多个线程或进程,异步加载数据,提升模型的训练速度。
  • 预处理(Preprocessing)是指对训练数据进行预处理,生成新的训练样本,提升模型的训练速度。
  • 内存优化(Memory Optimization)是指减少模型的内存占用,提升模型的训练速度。例如,减少模型的中间变量的大小,使用更小的激活函数等。
    - 使用更小的激活函数:使用更小的激活函数,可以减少模型的内存占用。例如,ReLU6 代替 ReLU。
    - 使用更小的模型:使用更小的模型,可以减少模型的内存占用。例如,使用更小的卷积核、更小的滤波器等。
    - 使用更小的 batch size:使用更小的 batch size,可以减少模型的内存占用。例如,使用更小的 batch size,可以减少内存的占用。
    - 使用更小的学习率:使用更小的学习率,可以减少模型的内存占用。例如,使用更小的学习率,可以减少内存的占用。
    - 使用更小的模型架构:使用更小的模型架构,可以减少模型的内存占用。例如,使用更小的模型架构,可以减少内存的占用。
    - 使用更小的模型初始化:使用更小的模型初始化,可以减少模型的内存占用。例如,使用更小的模型初始化,可以减少内存的占用。
    - 使用更小的模型微调:使用更小的模型微调,可以减少模型的内存占用。例如,使用更小的模型微调,可以减少内存的占用。
    - 使用更小的模型蒸馏:使用更小的模型蒸馏,可以减少模型的内存占用。例如,使用更小的模型蒸馏,可以减少内存的占用。
    - 使用更小的模型量化:使用更小的模型量化,可以减少模型的内存占用。例如,使用更小的模型量化,可以减少内存的占用。
    - 使用更小的模型剪枝:使用更小的模型剪枝,可以减少模型的内存占用。例如,使用更小的模型剪枝,可以减少内存的占用。
    

常用参数

  • 学习率:学习率(Learning Rate)是模型训练时,模型参数更新的速度,是一个非常重要的超参数。控制了模型参数在每次迭代中的更新幅度,是一个非常重要的超参数。
      作用:学习率决定了模型的训练速度,学习率过大或过小都会导致模型训练不稳定,收敛速度慢,模型效果不好。学习率过大可能导致震荡,学习率过小可能导致收敛速度过慢。需要根据具体情况进行调整。
      常用学习率:
      - 固定学习率:固定学习率(Fixed Learning Rate)是指模型训练时,使用固定的学习率。
      - 指数衰减学习率:指数衰减学习率(Exponential Decay Learning Rate)是指模型训练时,学习率随着训练轮数的增加而衰减。
      - 余弦退火学习率:余弦退火学习率(Cosine Annealing Learning Rate)是指模型训练时,学习率随着训练轮数的增加,在一定范围内进行线性衰减。
      - 余弦退火学习率:余弦退火学习率(Step Learning Rate)是指模型训练时,学习率在一定范围内进行线性衰减。
      - 自适应学习率:自适应学习率(Adaptive Learning Rate)是指模型训练时,学习率随着模型的训练效果而动态调整。
    
      学习率示例:
      1、固定学习率:
      lr = 0.01
    
      2、指数衰减学习率:
      lr = 0.01
      lr_decay = 0.9
      lr_min = 0.0001
      lr_scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=lr_decay, last_epoch=-1, verbose=False)
    
      3、余弦退火学习率:
      lr = 0.01
      T_max = 10
      lr_min = 0.0001
      lr_scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=lr_min, last_epoch=-1, verbose=False)
    
      4、余弦退火学习率:
      lr = 0.01
      T_max = 10
      lr_min = 0.0001
      lr_scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.1, last_epoch=-1, verbose=False)
    
      5、自适应学习率:
      lr = 0.01
      lr_scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=5, verbose=False)
    
  • 优化器:优化器(Optimizer)是指模型训练时,更新模型参数的算法。如随机梯度下降(SGD)、Adam、RMSprop等。

      作用:优化器决定了模型参数更新的方向,优化器的选择会影响模型的训练效果。
      常用优化器:
      - 动量优化器:动量优化器(Momentum Optimizer)是指模型训练时,使用动量(Momentum)来加速模型参数的更新。如 SGD、NAG、RMSprop 等。
      - 动量加权平均优化器:动量加权平均优化器(Nesterov Accelerated Gradient Descent)是指模型训练时,使用动量(Momentum)和加权平均(Nesterov)来加速模型参数的更新。如 SGD、NAG、RMSprop 等。
      - 自适应梯度优化器:自适应梯度优化器(Adagrad Optimizer)是指模型训练时,使用自适应梯度(Adagrad)来动态调整学习率。如 Adagrad、Adadelta、Adam 等。
      - 自适应矩形法优化器:自适应矩形法优化器(Adadelta Optimizer)是指模型训练时,使用自适应矩形法(Adadelta)来动态调整学习率。如 Adadelta、Adagrad、Adam 等。
      - RMSprop 优化器:RMSprop 优化器(RMSprop Optimizer)是指模型训练时,使用 RMSprop 来动态调整学习率。如 RMSprop、Adagrad、Adam 等。
      - Adam 优化器:Adam 优化器(Adam Optimizer)是指模型训练时,使用 Adam 来动态调整学习率。如 Adam、Adagrad、Adadelta 等。
      - AdamW 优化器:带权重衰减的自适应矩估计优化器(AdamW Optimizer)是指模型训练时,使用带权重衰减的自适应矩估计(AdamW)来动态调整学习率。如 AdamW、Adam、Adagrad 等。
      - LBFGS 优化器:局部最优优化器(LBFGS Optimizer)是指模型训练时,使用局部最优优化(LBFGS)来动态调整学习率。
      - Rprop 优化器:修正的随机梯度下降优化器(Rprop Optimizer)是指模型训练时,使用修正的随机梯度下降(Rprop)来动态调整学习率。
      - AdamP 优化器:带权重惩罚的自适应矩估计优化器(AdamP Optimizer)是指模型训练时,使用带权重惩罚的自适应矩估计(AdamP)来动态调整学习率。
      - 其他优化器:其他优化器(Other Optimizer)是指模型训练时,使用其他优化器来优化模型参数。
    
      优化器示例:
      1、动量优化器:
      optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
    
      2、动量加权平均优化器:
      optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9, nesterov=True)
    
      3、自适应梯度优化器:
      optimizer = torch.optim.Adagrad(model.parameters(), lr=0.01, lr_decay=0.001)
    
      4、自适应矩形法优化器:
      optimizer = torch.optim.Adadelta(model.parameters(), lr=1.0, rho=0.9, eps=1e-06, weight_decay=0)
    
      5、RMSprop 优化器:
      optimizer = torch.optim.RMSprop(model.parameters(), lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)
    
      6、Adam 优化器:
      optimizer = torch.optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=False)
    

  • 批大小:批大小(Batch Size)是指模型训练时,一次处理的数据量。每次迭代更新模型参数时所使用的样本数量。

      作用:批量大小决定了模型训练时的内存占用,批量大小过大或过小都会导致模型训练不稳定,甚至收敛速度慢。影响模型参数更新的频率和计算效率。通常,较大的批量大小可以提高计算效率,但可能会导致模型陷入局部最小值。较小的批量大小可以减少内存占用,但可能会导致模型收敛速度慢。
      常用批量大小:
      - 固定批量大小:固定批量大小(Fixed Batch Size)是指模型训练时,使用固定的批量大小。
      - 自适应批量大小:自适应批量大小(Adaptive Batch Size)是指模型训练时,批量大小随着模型的训练效果而动态调整。
    
      批大小示例:
      1、固定批量大小:
      batch_size = 128
    
      2、自适应批量大小:
      batch_size = 128
      batch_size_min = 32
      batch_size_max = 256
      batch_size_scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=5, verbose=False)
    

  • 迭代次数/训练轮数:轮数(Epoch)是指模型训练时,模型训练的次数。指定训练过程中数据集被完整遍历的次数。一个 epoch 代表了对整个数据集的一次完整训练。

      作用:训练轮数决定了模型的训练时间,训练轮数过多或过少都会导致模型训练不稳定,甚至收敛速度慢。控制训练过程的时长,需要根据模型和数据集的复杂程度进行调整。
      常用训练轮数:
      - 固定训练轮数:固定训练轮数(Fixed Number of Epochs)是指模型训练时,使用固定的训练轮数。
      - 自适应训练轮数:自适应训练轮数(Adaptive Number of Epochs)是指模型训练时,训练轮数随着模型的训练效果而动态调整。
    
      训练轮数示例:
      1、固定训练轮数:
      num_epochs = 10
    
      2、自适应训练轮数:
      num_epochs = 10
      num_epochs_min = 5
      num_epochs_max = 20
      num_epochs_scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=5, verbose=False)
    

  • 损失函数:损失函数(Loss Function)是指模型训练的目标函数,用于衡量模型的预测值与真实值之间的差距。

      描述:用于衡量模型预测与真实标签之间的差异,不同任务和模型可能需要选择不同的损失函数,如均方误差(MSE)、交叉熵等。
      常用损失函数:
      - 均方误差(MSE):均方误差(Mean Squared Error)是指预测值与真实值之间的差距的平方。
      - 交叉熵(Cross Entropy):交叉熵(Cross-Entropy)是指预测值与真实值之间的差距的对数。
      - 分类损失函数:分类损失函数(Classification Loss Function)是指用于分类任务的损失函数,如交叉熵、对数损失、KL 散度等。
      - 回归损失函数:回归损失函数(Regression Loss Function)是指用于回归任务的损失函数,如均方误差、Huber 损失、绝对损失等。
      - 多标签分类损失函数:多标签分类损失函数(Multi-Label Classification Loss Function)是指用于多标签分类任务的损失函数,如 F1 损失、多标签分类交叉熵等。
      - 多任务损失函数:多任务损失函数(Multi-Task Loss Function)是指用于多任务学习任务的损失函数,如联合损失、分割损失、对比损失等。
      - 标签平滑损失函数:标签平滑损失函数(Label Smoothing Loss Function)是指用于处理标签平滑问题的损失函数,如平滑交叉熵、标签平滑损失等。
      - 多分类损失函数:多分类损失函数(Multi-Class Loss Function)是指用于多分类任务的损失函数,如 Focal 损失、多分类交叉熵等。
      - 多尺度损失函数:多尺度损失函数(Multi-Scale Loss Function)是指用于多尺度学习任务的损失函数,如 FPN 损失、多尺度损失等。
      - 多样本损失函数:多样本损失函数(Multi-Sample Loss Function)是指用于多样本学习任务的损失函数,如 NCE 损失、多样本损失等。
      - 自监督损失函数:自监督损失函数(Self-Supervised Loss Function)是指用于自监督学习任务的损失函数,如对比损失、自监督学习损失等。
      - 序列到序列损失函数:序列到序列损失函数(Sequence-to-Sequence Loss Function)是指用于序列到序列学习任务的损失函数,如注意力损失、CTC 损失等。
      - 视频序列损失函数:视频序列损失函数(Video Sequence Loss Function)是指用于视频序列学习任务的损失函数,如视频损失、时序损失等。
      - 强化学习损失函数:强化学习损失函数(Reinforcement Learning Loss Function)是指用于强化学习任务的损失函数,如策略梯度损失、策略梯度更新损失等。
      - 其他损失函数:其他损失函数(Other Loss Function)是指用于其他任务的损失函数,如多任务损失、多尺度损失、多样本损失等。
    
      损失函数示例:
      1、均方误差(MSE):
      import torch.nn as nn
      loss_fn = nn.MSELoss()
    
      2、交叉熵(Cross Entropy):
      import torch.nn as nn
      loss_fn = nn.CrossEntropyLoss()
    
      3、分类损失函数:
      import torch.nn as nn
      loss_fn = nn.BCEWithLogitsLoss()
    
      4、回归损失函数:
      import torch.nn as nn
      loss_fn = nn.L1Loss()
    
      5、多标签分类损失函数:
      import torch.nn as nn
      loss_fn = nn.BCEWithLogitsLoss()
    
      6、多任务损失函数:
      import torch.nn as nn
      loss_fn = nn.MultiTaskLoss()
    
      7、标签平滑损失函数:
      import torch.nn as nn
      loss_fn = nn.KLDivLoss()
    
      8、多分类损失函数:
      import torch.nn as nn
      loss_fn = nn.CrossEntropyLoss()
    
      9、多尺度损失函数:
      import torch.nn as nn
      loss_fn = nn.MultiScaleLoss()
    
      10、多样本损失函数:
      import torch.nn as nn
      loss_fn = nn.NLLLoss()
    
      11、自监督损失函数:
      import torch.nn as nn
      loss_fn = nn.SupervisedLoss()
    
      12、序列到序列损失函数:
      import torch.nn as nn
      loss_fn = nn.CTCLoss()
    
      13、视频序列损失函数:
      import torch.nn as nn
      loss_fn = nn.VideoLoss()
    
      14、强化学习损失函数:
      import torch.nn as nn
      loss_fn = nn.PolicyGradientLoss()
    
      15、其他损失函数:
      import torch.nn as nn
      loss_fn = nn.Loss()
    

  • 正则化:正则化(Regularization)是指模型训练时,对模型参数进行约束,以防止模型过拟合。

    作用:防止模型过拟合,提升模型的泛化能力。
    常用正则化:
    - L1 正则化:L1 正则化(Lasso Regularization)是指模型训练时,对模型参数进行惩罚,使得模型参数的绝对值之和(L1 范数)小于某个阈值。
    - L2 正则化:L2 正则化(Ridge Regularization)是指模型训练时,对模型参数进行惩罚,使得模型参数的平方之和(L2 范数)小于某个阈值。
    - 弹性网络:弹性网络(Elastic Net)是指模型训练时,同时使用 L1 正则化和 L2 正则化。
    - 最大熵正则化:最大熵正则化(Max Entropy Regularization)是指模型训练时,对模型参数进行惩罚,使得模型参数满足最大熵原理。
    - 丢弃法:丢弃法(Dropout)是指模型训练时,随机将一部分神经元的输出设置为 0,以减少模型过拟合。
    - 最大池化:最大池化(Max Pooling)是指模型训练时,对模型参数进行约束,使得模型参数的最大值不超过某个阈值。
    - 最小池化:最小池化(Min Pooling)是指模型训练时,对模型参数进行约束,使得模型参数的最小值不小于某个阈值。
    - 局部响应归一化:局部响应归一化(Local Response Normalization)是指模型训练时,对模型参数进行约束,使得模型参数的局部响应值(局部激活)不小于某个阈值。
    - 归一化层:归一化层(Normalization Layer)是指模型训练时,对模型参数进行约束,使得模型参数的均值和方差不变。
    - 标签平滑:标签平滑(Label Smoothing)是指模型训练时,对模型标签进行平滑处理,使得模型的训练更加稳定。
    - 其他正则化:其他正则化(Other Regularization)是指模型训练时,对模型参数进行其他约束,如限制模型参数的范数、限制模型参数的范围等。
    

  • 学习率衰减:学习率衰减(Learning Rate Decay)是指模型训练时,学习率随着训练轮数的增加而衰减。
    作用:防止模型过拟合,提升模型的泛化能力。
    常用学习率衰减:
    - 指数衰减:指数衰减(Exponential Decay)是指学习率随着训练轮数的增加,逐渐衰减。
    - 余弦衰减:余弦衰减(Cosine Decay)是指学习率随着训练轮数的增加,在一定范围内,学习率以余弦函数的形式衰减。
    - 线性衰减:线性衰减(Linear Decay)是指学习率随着训练轮数的增加,逐渐衰减。
    - 多项式衰减:多项式衰减(Polynomial Decay)是指学习率随着训练轮数的增加,以多项式函数的形式衰减。
    - 其他学习率衰减:其他学习率衰减(Other Learning Rate Decay)是指学习率随着训练轮数的增加,以其他方式衰减。
    
  • 模型大小:模型大小(Model Size)是指模型的计算量。

    作用:影响模型训练的速度和内存占用。
    常用模型大小:
    - 小模型:小模型(Small Model)是指模型的计算量较小,适合于资源有限的场景。
    - 中型模型:中型模型(Medium Model)是指模型的计算量适中,适合于中等规模的场景。
    - 大型模型:大型模型(Large Model)是指模型的计算量较大,适合于大规模的场景。
    - 超大型模型:超大型模型(Huge Model)是指模型的计算量非常大,适合于超大规模的场景。
    

  • 模型初始化:模型初始化(Model Initialization)是指模型参数的初始值,用于控制模型的训练起点。

    作用:控制模型训练的起点。
    常用模型初始化:
    - 随机初始化:随机初始化(Random Initialization)是指模型参数的初始值随机生成。
    - 预训练初始化:预训练初始化(Pre-trained Initialization)是指模型参数的初始值使用预训练模型的权重。
    - 其他初始化:其他初始化(Other Initialization)是指模型参数的初始值使用其他方式。
    

  • 初始化方法:初始化方法(Initialization Method)是指模型参数的初始值生成方法。设置模型参数的初始值,如随机初始化、Xavier/Glorot 初始化等。

    作用:控制模型参数的初始值生成方法。影响模型训练的初始状态,有助于避免模型陷入局部最小值。
    常用初始化方法:
    - 常数初始化:常数初始化(Constant Initialization)是指模型参数的初始值全部设置为某个常数。
    - 正态分布初始化:正态分布初始化(Normal Initialization)是指模型参数的初始值服从正态分布。
    - 均匀分布初始化:均匀分布初始化(Uniform Initialization)是指模型参数的初始值服从均匀分布。
    - Xavier 正态分布初始化:Xavier 正态分布初始化(Xavier Normal Initialization)是指模型参数的初始值服从 Xavier 正态分布。
    - Kaiming 正态分布初始化:Kaiming 正态分布初始化(Kaiming Normal Initialization)是指模型参数的初始值服从 Kaiming 正态分布。
    - 其他初始化方法:其他初始化方法(Other Initialization Method)是指模型参数的初始值生成方法。
    

  • 验证集:验证集(Validation Set)是指模型训练时,使用一部分训练数据留出作为验证集,用于调参和评估模型性能。

    作用:帮助选择最佳的超参数,避免模型在测试集上过拟合。
    

  • 超参数:超参数(Hyperparameter)是指模型训练时,需要设置的参数,如学习率、权重衰减、模型大小、优化器等。
    作用:控制模型训练的超参数,影响模型的训练过程。
    - 超参数搜索(Hyperparameter Search)是指模型训练时,通过搜索超参数的组合,来优化模型的性能。
    - 随机搜索(Random Search)是指模型训练时,通过随机搜索超参数的组合,来优化模型的性能。
    - 贝叶斯优化(Bayesian Optimization)是指模型训练时,通过贝叶斯优化超参数的组合,来优化模型的性能。
    - 遗传算法(Genetic Algorithm)是指模型训练时,通过遗传算法搜索超参数的组合,来优化模型的性能。
    - 启发式搜索(Heuristic Search)是指模型训练时,通过启发式搜索超参数的组合,来优化模型的性能。
    - 其他超参数优化方法:其他超参数优化方法(Other Hyperparameter Optimization Method)是指模型训练时,用于优化超参数的其他方法。
    
  • 其他技巧:其他技巧(Other Tips)是指模型训练时,其他技巧,如模型蒸馏、模型微调等。
    - 批归一化:批归一化(Batch Normalization)是指模型训练时,对输入数据进行归一化处理,使得数据在各层之间具有相同的分布。
    - 动量:动量(Momentum)是指模型训练时,梯度下降时,对梯度的更新方向进行加权,以加快模型的收敛速度。
    - 模型微调:模型微调(Model Fine-tuning)是指在已有模型的基础上,微调模型参数,提升模型的性能。
    - 模型蒸馏:模型蒸馏(Model Distillation)是指将一个小模型的输出作为大模型的输入,训练大模型,提升模型的性能。
    - 数据增强:数据增强(Data Augmentation)是指通过对训练数据进行预处理,生成新的训练样本,提升模型的泛化能力。
    - 模型架构:模型架构(Model Architecture)是指模型的结构,包括网络结构、层数、激活函数、参数数量等。
    - 权重衰减:权重衰减(Weight Decay)是指模型训练时,更新模型参数时,对模型参数进行惩罚,以减少模型过拟合。
    

加速训练

  • 多卡训练:多卡训练(Multi-card Training)是指模型训练时,使用多个 GPU 进行并行训练。如DeepSpeed、DLRover 框架等提供了多卡训练的支持。
  • 模型微调(Model Fine-tuning)是指在已有模型的基础上,微调模型参数,提升模型的性能。例如,微调预训练模型的参数,提升模型的性能。
  • 裁剪梯度:裁剪梯度(Gradient Clipping)是指模型训练时,对梯度进行裁剪,以防止梯度爆炸。
  • 延迟更新:延迟更新(Delayed Update)是指模型训练时,更新模型参数的频率稍微低一些,以减少模型更新的影响。
  • 异步并行:异步并行(Asynchronous Parallel)是指模型训练时,使用异步方式进行并行训练,以提升训练速度。
  • 模型并行(Model Parallelism)是指将模型的不同部分分布到不同的 GPU 上,并行计算,提升模型的训练速度。包括切分并行、切分并行、网格并行、流水线并行、张量并行等。
  • 数据并行(Data Parallelism)是指将数据分布到不同的 GPU 上,并行计算,提升模型的训练速度。
  • 混合精度训练(Mixed Precision Training,简称 Mixed Precision,简写 MP)是指在训练过程中同时使用 FP16 和 FP32 两种数据类型,通过混合精度训练可以加速模型的训练,同时减少内存占用,提升模型的精度。
  • 半精度训练(Half Precision Training,简称 FP16,简写 FP16)是指在训练过程中使用 FP16 数据类型,通过半精度训练可以加速模型的训练,同时减少内存占用,提升模型的精度。
  • 延迟加载(Lazy Loading)是指模型训练时,仅加载部分数据到内存,以节省内存。
  • 内存优化:内存优化(Memory Optimization)是指模型训练时,减少模型的内存占用,提升模型的训练速度。
  • 其他技巧:
    - 优化器(Optimizer)是指模型训练的算法,用于更新模型的参数。
    - 数据增强(Data Augmentation)是指通过对训练数据进行预处理,生成新的训练样本,提升模型的泛化能力。
    - 模型架构(Model Architecture)是指模型的结构,包括网络结构、层数、激活函数、参数数量等。
    - 模型初始化(Model Initialization)是指模型参数的初始值,用于控制模型的训练起点。
    - 模型蒸馏(Model Distillation)是指将一个小模型的输出作为大模型的输入,训练大模型,提升模型的性能。
    - XLA(Accelerated Linear Algebra)是谷歌推出的一种编译器,可以加速线性代数运算,提升模型的训练速度。
    - AMP(Automatic Mixed Precision)是一种技术,可以自动将 FP32 计算的部分转换为 FP16 计算,以节省内存和提升模型的训练速度。
    

分布式训练方法

如今的大模型训练,离不开各种分布式的训练框架,一般来说,并行策略包含:数据并行、模型并行、流水线并行。

流水线性并行和张量并行都是对模型本身进行划分,目的是利用有限的单卡显存训练更大的模型。简单来说,流水线并行水平划分模型,即按照层对模型进行划分;张量并行则是垂直划分模型。3D并行则是将流行线并行、张量并行和数据并行同时应用到模型训练中。

数据并行

数据并行(Data Parallelism)是指将数据分布到不同的 GPU 上,并行计算,提升模型的训练速度。数据并行分为了两种模式:Data Parallel(DP)和 Distributed Data Parallel(DDP)。ZeRO-DP是一种显存高效的数据并行策略。

Data Parallel(DP),DP是一种单进程多线程的并行策略,Pytorch最早提供的一种数据并行方式,它基于单进程多线程进行实现的,它使用一个进程来计算模型权重,在每个批处理期间将数据分发到每个GPU。只能在单机上进行训练,步骤如下:
1、单进程控制多GPU,即本质上是单进程多线程;
2、首先将模型加载到主 GPU 上,再复制到各个指定从 GPU;
3、将输入数据按照 Batch 维度进行拆分,将数据切分成多个小批次,每个小批次在各个 GPU 独立进行 forward 计算;
4、每个进程分别计算小批次的梯度,并将梯度累加到一起;将结果同步给主 GPU 完成梯度计算和参数更新,将更新后的参数复制到各个 GPU。
5、由于其是单进程控制多个GPU,故会存在GPU之间负载不均衡的问题,主GPU负载较大。

Distributed Data Parallel(DDP):基于多进程进行实现的,每个进程都有独立的优化器,执行自己的更新过程。每个进程都执行相同的任务,并且每个进程都与所有其它进程通信,进程之间只传递梯度,这样网络通信就不再是瓶颈。DDP是一种多进程多线程的并行策略,可以跨多机进行训练,步骤如下:
1、多进程控制多GPU,即本质上是多进程多线程;DDP采用 AllReduce 架构,多进程的方式,突破锁的束缚。在单机和多机上都可以使用。
2、负载分散在每个 GPU 节点上,通信成本(时间)是恒定的,与 GPU 数量无关,等于V/B(参数量/带宽)。
3、DDP不需要通过主GPU分发全模型的参数到每个GPU上。
4、使用ring-all-reduce的方式进行通讯,随着 GPU 数量 N 增加,总传输量恒定。也就是理论上,随着GPU数量的增加,ring all-reduce有线性加速能力。
5、DDP可以实现多机多卡训练,只需要在不同机器上启动多个进程,每个进程指定不同的GPU,并设置环境变量。

DP 和 DDP 的主要差异有以下几点:
1、DP 是基于单进程多线程的实现,只用于单机情况,而 DDP 是多进程实现的,每个 GPU 对应一个进程,适用于单机和多机情况,真正实现了分布式训练。
2、参数更新的方式不同,DDP在各进程梯度计算完成之后,各进程需要将梯度进行汇总平均,然后再由 rank=0 的进程,将其广播到所有进程后,各进程用该梯度来独立的更新参数(而 DP是梯度汇总到 GPU0,反向传播更新参数,再广播参数给其他剩余的 GPU)。
3、DP 存在 GPU 之间负载不均衡的问题,主 GPU 负载较大。DDP 采用 AllReduce 架构,多进程的方式,突破锁的束缚。
4、相较于DP,DDP负载和通信开销较小,训练更高效。DP 和 DDP 还有个缺点是至少有一块显卡保存完整的参数和梯度

DDP 架构:
1、每个进程对应一个 GPU,进程之间通过网络通信;
2、每个进程只负责计算和梯度更新,不参与参数的更新;
3、每个进程都有完整的模型参数,可以并行计算梯度;

张量并行

张量并行(Tensor Parallelism 简称 TP)是指张量操作划分到多个设备上,以加速计算或增加模型大小;对模型每一层的层内参数进行切分,即对参数矩阵切片,并将不同切片放到不同GPU上;将原本在单卡中的矩阵乘法,切分到不同卡中进行矩阵乘法。训练过程中,正向和反向传播计算出的数据通过使用 All gather 或者 All reduce 的方法完成整合。张量并行的核心就是将矩阵乘法进行拆分(行并行、列并行),从而降低模型对单卡的显存需求,适用于模型单层网络参数较大的情况。

步骤:
1、将模型切分成多个子网络,每个子网络在不同的GPU上运行;
2、每个子网络的输入和输出张量被切分成多个子张量,并在不同GPU上并行计算;
3、每个子张量的梯度被累加到一起,并在主GPU上完成参数更新。

优点:
1、张量并行可以有效地利用多卡的计算资源,提升模型的训练速度;
2、张量并行可以有效地减少模型的内存占用,提升模型的训练效率;
3、张量并行可以有效地提升模型的并行度,进一步提升模型的训练速度。

transformer为例:该策略会把 Masked Multi Self Attention 和 Feed Forward 都进行切分以并行化。利用 Transformers 网络的结构,通过添加一些同步原语来创建一个简单的模型并行实现。Transformer中的主要部件是全连接层和注意力机制,其核心都是矩阵乘法。

缺点:
1、张量并行的实现难度较大,需要对模型架构进行改造,增加额外的计算和通信开销;
2、张量并行的实现依赖于硬件的支持,目前主流的张量并行硬件有 NVIDIA A100 和 NVIDIA A30 系列;
3、张量并行的实现依赖于特定的优化算法,目前主流的优化算法有 Adam、AdaGrad、AdaMax、AdamW、Nadam、RMSprop、SGD 等。
4、张量并行的实现需要对模型架构进行改造,增加额外的计算和通信开销,这会影响模型的可移植性,降低模型的可解释性,降低模型的可扩展性,增加模型的训练难度,因此,张量并行目前还处于实验阶段,并不是所有模型都适合张量并行。
5、若环境是多机多卡,张量并行所需的all-reduce通信需要跨服务器进行链接,这比单机多GPU服务器内的高带宽通信要慢;
6、高度的模型并行会产生很多小矩阵乘法,这可能会降低GPU的利用率。
7、需要保证输入一致,不能使用数据并行

流水线并行

流水线并行(Pipeline Parallelism 简称PP)目标是训练更大的模型,将不同的层(layer)分配给指定 GPU 进行计算,流水线并行只需其之间点对点地通讯传递部分激活 (activations)缓存,而不需要全局同步。

具体步骤包括:
1、在流水线并行之中,一个模型的各层会在多个GPU上做切分。
2、一个批次(batch)被分割成较小的微批(microbatches),并在这些微批上进行流水线式执行。
3、在每个GPU上,流水线式执行各层的前向传播和反向传播。通过流水线并行,一个模型的层被分散到多个设备上。
4、当用于具有相同transformer块重复的模型时,每个设备可以被分配相同数量的transformer层。
5、在流水线模型并行中,训练会在一个设备上执行一组操作,然后将输出传递到流水线中下一个设备,下一个设备将执行另一组不同操作。

流水线并行的方法解决了超大模型无法在单设备上装下的难题,也解决了机器之间的通信开销的问题,使得每台机器的数据传输量跟总的网络大小、机器总数、并行规模无关。

  • 常用的流水线方法有G-pipe、PipeDream等。
朴素层:
  1、并行的过程:在某一时刻仅有1个GPU工作。并且每个timesep花费的时间也比较长,因为GPU需要跑完整个minibatch的前向传播。
  2、缺点:
     - 低GPU利用率,在任意时刻,有且仅有一个GPU在工作,其他GPU都是空闲的。
     - 计算和通信没有重叠。在发送前向传播的中间结果(FWD)或者反向传播的中间结果(BWD)时,GPU也是空闲的。
     - 高显存占用,在训练过程中,GPU1需要保存整个小批量(minibatch)的所有激活,直至最后完成参数更新。如果batch size很大,这将对显存带来巨大的挑战。

GPipe:
   1、GPipe通过将minibatch划分为更小且相等尺寸的microbatch来提高效率。具体来说,让每个microbatch独立的计算前后向传播,然后将每个mircobatch的梯度相加,就能得到整个batch的梯度。由于每个层仅在一个GPU上,对mircobatch的梯度求和仅需要在本地进行即可,不需要通信。
   2、GPipe的调度中,每个timestep上花费的时间要比朴素层并行更短,因为每个GPU仅需要处理microbatch。每个GPU可以同时处理多个microbatch,因此可以提高GPU的利用率。
   3、GPipe的Bubbles问题,bubbles指的是流水线中没有进行任何有效工作的点。这是由于操作之间的依赖导致的。bubbles浪费时间的比例依赖于pipeline的深度 和mincrobatch的数量。因此,增大microbatch的数量m,可以降低bubbles的比例。
   4、GPipe的并行度较高,但通信开销较大。训练过程中,每个timestep上的计算时间比上一次要长,因为每个timestep上的计算时间都包含了一个microbatch的计算时间,以及一个microbatch的梯度求和时间。
   6、GPipe的通信开销较低,因为每个GPU仅需要发送和接收部分激活,而不是整个minibatch。
   7、GPipe的内存占用较低,因为每个GPU仅需要保存部分激活,而不是整个minibatch。
   8、GPipe的显存需求,增大batch size就会线性增大需要被缓存激活的显存需求。GPU需要在前向传播至反向传播这段时间内缓存激活(activations)。为了解决显存的问题,使用了gradient checkpointing。该技术不需要缓存所有的激活,而是在反向传播的过程中重新计算激活。这降低了对显存的需求,但是增加了计算代价。

PipeDream:
   1、GPipe需要等所有的microbatch前向传播完成后,才会开始反向传播。PipeDream则是当一个microbatch的前向传播完成后,立即进入反向传播阶段。 理论上,反向传播完成后就可以丢弃掉对应microbatch缓存的激活。由于PipeDream的反向传播完成的要比GPipe早,因此也会减少显存的需求。
   2、PipeDream在bubbles上与GPipe没有区别,但是由于PipeDream释放显存的时间更早,因此会降低对显存的需求。

合并数据并行和流水线并行:
   1、数据并行和流水线并行是正交的,可以同时使用。
   2、对于流水线并行:每个GPU需要与下个流水线阶段(前向传播)或者上个流水线阶段(反向传播)进行通信。
   3、对于数据并行:每个GPU需要与分配了相同层的GPU进行通信。所有层的副本需要AllReduce对梯度进行平均。
   4、将所有GPU上形成子组,并在子组中使用集合通信。任意给定的GPU都会有两部分的通信,一个是包含所有相同层的GPU(数据并行),另一个与不同层的GPU(流水线并行)。
   5、子组间的通信需要使用集合通信,比如AllReduce。
   6、子组内的通信可以使用点对点通信。比如每个GPU只需要与其子组内的其他GPU通信。
   7、子组内的通信需要使用异步通信,以提高训练速度。比如每个GPU可以同时发送和接收消息。
   8、子组间的通信需要使用同步通信,以保证模型的一致性。比如每个子组的梯度需要AllReduce之后,才能更新模型参数。

3D 并行

3D 并行(3D Parallelism)是指将数据并行(DP)、张量并行(TP)和流水线并行(PP)同时应用到模型训练中。3D 并行的核心是将模型切分成多个子网络,每个子网络在不同的 GPU 上运行,并行计算。

3D并行分析:
  1、3D并行的计算量是 DP、TP、PP 的组合,因此,3D并行的计算量是 DP、TP、PP 的乘积。
  2、模型并行是三种策略中通信开销最大的,所以优先将模型并行组放置在一个节点中,以利用较大的节点内带宽。
  3、流水线并行通信量最低,因此在不同节点之间调度流水线,这将不受通信带宽的限制。
  4、若张量并行没有跨节点,则数据并行也不需要跨节点;否则数据并行组也需要跨节点。

分析总结:流水线并行和张量并行减少了单个显卡的显存消耗,提高了显存效率。但是,模型划分的太多会增加通信开销,从而降低计算效率。ZeRO-DP不仅能够通过将优化器状态进行划分来改善显存效率,而且还不会显著的增加通信开销。

其他分布式训练方法

  • 半同步并行(Half-Synchronous Parallel):半同步并行(Half-Synchronous Parallel,简称 HSP)是指模型训练时,使用半同步的并行策略,即模型训练时,各个 GPU 之间同步参数的更新,但各个 GPU 之间不一定同步梯度的更新。
  • 异步并行(Asynchronous Parallel):异步并行(Asynchronous Parallel,简称 AP)是指模型训练时,使用异步的并行策略,即模型训练时,各个 GPU 之间不一定同步参数的更新,但各个 GPU 之间同步梯度的更新。
  • 聚合通信(Aggregation Communication):聚合通信(Aggregation Communication,简称 AC)是指模型训练时,使用聚合通信的策略,即模型训练时,各个 GPU 之间同步参数的更新,并使用聚合通信的方式同步梯度的更新。
  • 其他分布式训练方法:其他分布式训练方法(Other Distributed Training Method)是指模型训练时,用于分布式训练的其他方法。

训练框架

训练框架(Training Framework)是指模型训练的框架,包括 PyTorch、TensorFlow、DeepSpeed、DLRover 等常用框架。

TensorFlow

TensorFlow 是 Google 推出的深度学习框架,是目前最流行的深度学习框架。它被用来构建各种类型的机器学习模型,例如图像识别、语音识别、自然语言处理等。

TensorFlow的特点:
- 开源:TensorFlow 是一个开源项目,其代码可以免费获取。
- 跨平台:TensorFlow 可以运行在 Linux、Windows、macOS 等多种操作系统上。
- 灵活:TensorFlow 是一个灵活的框架,可以构建各种类型的模型,包括卷积神经网络(CNN)、循环神经网络(RNN)、递归神经网络(RNN)、深度置信网络(DCN)等。
- 高性能:TensorFlow 具有高性能,可以运行在 GPU 和 TPU 上,并提供分布式训练的支持。
- 易用:TensorFlow 提供了易用的 API,可以快速构建模型。

TensorFlow主要有以下几个基本概念:
- Tensor:TensorFlow中最基本的数据结构,是一个多维数组,可以表示向量、矩阵和高维数组等。
- Graph:TensorFlow计算图是一种数据流图,表示了计算中各个操作节点之间的数据依赖关系。
- Operation:Operation是TensorFlow中的一种操作,用于在计算图上执行各种操作,例如张量运算、赋值和变量初始化等。
- Session:Session是TensorFlow中的一种执行环境,用于在计算图上执行各种计算操作。
- Variable:Variable是TensorFlow中的一种特殊操作,用于存储模型参数,例如权重和偏置。
- Placeholder:Placeholder是TensorFlow中的一种占位符,用于在计算图上定义输入数据,等待实际数据输入。
- Feed:Feed是Session中的一种输入方式,用于向计算图提供输入数据。
- Saver:Saver是TensorFlow中的一种保存和加载模型参数的工具,用于保存和加载模型参数。
- TensorBoard:TensorBoard是TensorFlow中的一种可视化工具,用于可视化计算图、模型参数、训练过程等。
- Estimator:Estimator是TensorFlow中的一种高级API,用于简化模型训练和评估的过程。
- Dataset:Dataset是TensorFlow中的一种数据集,用于存储和管理数据。

TensorFlow的使用场景非常广泛,以下是一些常见的场景:
- 图像识别:使用TensorFlow可以构建卷积神经网络(CNN)等模型,用于图像识别和分类等任务。
- 语音识别:使用TensorFlow可以构建循环神经网络(RNN)等模型,用于语音识别和语音合成等任务。
- 自然语言处理:使用TensorFlow可以构建深度学习模型,例如循环神经网络(RNN)和长短期记忆网络(LSTM),用于自然语言处理任务,例如文本生成和情感分析等。
- 强化学习:使用TensorFlow可以构建强化学习模型,例如深度Q网络(DQN)和策略梯度方法,用于实现自主学习和决策等任务。
- 推荐系统:使用TensorFlow可以构建推荐系统模型,例如矩阵分解机(MF)和因子分解机(FFM),用于推荐系统任务,例如个性化推荐等。

TensorFlow的缺点:
- 学习曲线陡峭:TensorFlow 的学习曲线陡峭,需要花费大量时间和资源进行模型调参。
- 易用性差:TensorFlow 的易用性较低,需要编写大量代码,且代码可读性较差。
- 性能不足:TensorFlow 的性能较低,在某些任务上,其训练速度较慢。如:图像分类任务。

PyTorch

PyTorch是基于Python的一种开源机器学习库,具有灵活性和直观性,特别适合于动态计算图。PyTorch是Facebook的一个项目,旨在提供一种简单易用的深度学习框架。PyTorch的主要应用场景是:深度学习,自然语言处理,计算机视觉,强化学习等领域。

PyTorch的特点:
- 开源:PyTorch 是一个开源项目,其代码可以免费获取。
- 跨平台:PyTorch 可以运行在 Linux、Windows、macOS 等多种操作系统上。
- 灵活:PyTorch 是一个灵活的框架,可以构建各种类型的模型,包括卷积神经网络(CNN)、循环神经网络(RNN)、递归神经网络(RNN)、深度置信网络(DCN)等。
- 高性能:PyTorch 具有高性能,可以运行在 GPU 和 TPU 上,并提供分布式训练的支持。
- 易用:PyTorch 提供了易用的 API,可以快速构建模型。

PyTorch主要有以下几个基本概念:
- Tensor:PyTorch中的Tensor是一个多维数组(一个张量),用于存储和操作数据,类似于Numpy中的ndarray。
- Module:Module是PyTorch中的一种容器,用于封装神经网络层、损失函数等。
- Optimizer:Optimizer是PyTorch中的一种优化器,用于更新模型参数。
- DataLoader:DataLoader是PyTorch中的一种数据加载器,用于加载和预处理数据。
- Dataset:Dataset是PyTorch中的一种数据集,用于存储和管理数据。
- Loss Function:Loss Function是PyTorch中的一种损失函数,用于衡量模型的预测值和真实值之间的差距。
- Metric:Metric是PyTorch中的一种指标,用于评估模型的性能。
- Device:Device是PyTorch中的一种设备,用于指定模型运行的设备。
- Gradient:Gradient是PyTorch中的一种梯度,用于计算模型参数的梯度。
- Autograd:Autograd是PyTorch中的一种自动求导引擎,用于自动计算梯度。
- DistributedDataParallel:DistributedDataParallel是PyTorch中的一种分布式数据并行,用于在多台机器上并行训练模型。
- DistributedSampler:DistributedSampler是PyTorch中的一种分布式采样器,用于在多台机器上并行训练模型。
- DistributedTrainer:DistributedTrainer是PyTorch中的一种分布式训练器,用于在多台机器上并行训练模型。
- DistributedModel:DistributedModel是PyTorch中的一种分布式模型,用于在多台机器上并行训练模型。
- DistributedOptimizer:DistributedOptimizer是PyTorch中的一种分布式优化器,用于在多台机器上并行训练模型。
- DistributedLoss:DistributedLoss是PyTorch中的一种分布式损失函数,用于在多台机器上并行训练模型。
- DistributedMetric:DistributedMetric是PyTorch中的一种分布式指标,用于在多台机器上并行训练模型。
- DistributedSampler:DistributedSampler是PyTorch中的一种分布式采样器,用于在多台机器上并行训练模型。
- DistributedDataParallel:DistributedDataParallel是PyTorch中的一种分布式数据并行,用于在多台机器上并行训练模型。

与TensorFlow相比,PyTorch的的优点在于:
- 灵活性: PyTorch使用动态图(Dynamic Graph)是指在运行时,根据输入数据的大小,自动调整计算图的结构,以节省内存。使得代码更加简洁易懂,更加灵活,适合于小规模数据和尝试实验。
- 速度:PyTorch的计算速度更快,在相同的硬件上,PyTorch的训练速度通常比TensorFlow快。
- 易用性:PyTorch的接口和文档更加简单易懂,调试代码更加方便,并且有许多社区贡献的资源和工具。
- 可视化:PyTorch通过TensorBoard和Visdom等可视化工具,可视化神经网络训练过程中的结果,方便数据分析。
- 社区支持:PyTorch有大量的社区贡献的资源和工具,可以帮助开发者解决常见问题。

PyTorch的缺点:
- 易用性和灵活性带来的缺点是,PyTorch在大型数据集上需要额外的工作来优化它的计算效率,而且同时也影响了代码的可维护性。
- PyTorch缺乏安全性,因此有时可能会面临被恶意代码攻击的风险。
- 缺乏专业的深度学习库,导致其功能有限。

总的来说,PyTorch是一个优秀的深度学习框架,适用于小规模数据和尝试实验,但在大型数据集上需要额外的工作来优化它的计算效率。

DeepSpeed

DeepSpeed 是由微软推出的开源分布式工具,旨在提高大规模模型训练的效率和可扩展性。并提供分布式训练的支持其集合了分布式训练、推断、压缩等高效模块。它通过多种技术手段来加速训练,包括自动混合精度训练、自动并行、自动切分、自动混合精度优化器、本地模式混合精度等。 DeepSpeed还提供了一些辅助工具,如分布式训练管理、内存优化和模型压缩等,以帮助开发者更好地管理和优化大规模深度学习训练任务。

此外,deepspeed基于pytorch构建,只需要简单修改即可迁移。 DeepSpeed已经在许多大规模深度学习项目中得到了应用,包括语言模型、图像分类、目标检测等

DeepSpeed的特点:
- 开源:DeepSpeed 是一个开源项目,其代码可以免费获取。
- 跨平台:DeepSpeed 可以运行在 Linux、Windows、macOS 等多种操作系统上。
- 灵活:DeepSpeed 是一个灵活的框架,可以构建各种类型的模型,包括卷积神经网络(CNN)、循环神经网络(RNN)、递归神经网络(RNN)、深度置信网络(DCN)等。
- 高性能:DeepSpeed 具有高性能,可以运行在 GPU 和 TPU 上,并提供分布式训练的支持。
- 易用:DeepSpeed 提供了易用的 API,可以快速构建模型。

DeepSpeed主要有以下几个基本概念:
- ZeRO:ZeRO 是 DeepSpeed 中的一种优化器,可以实现模型并行和数据并行。
- Pipeline Parallelism:Pipeline Parallelism 是 DeepSpeed 中的一种并行策略,可以实现模型并行。
- Offload:Offload 是 DeepSpeed 中的一种技术,可以实现模型的卸载。
- ZeRO-Offload:ZeRO-Offload 是 DeepSpeed 中的一种优化器,可以实现模型并行、数据并行和模型的卸载。
- ZeRO-3:ZeRO-3 是 DeepSpeed 中的一种优化器,可以实现模型并行、数据并行和模型的卸载。
    ZeRO-3的原理:
      1、对优化器Optimizer、gradients、model parameter进行分片
         a. AllReduce操作可以被拆分为Reduce与allgather操作的结合。
         b. 模型的每一层拥有该层的完整参数,并且整个层能够直接被一个GPU装下。所以计算前向的时候,除了当前rank需要的层之外,其余的层的参数可以抛弃。
      2、每个rank计算forward过程
         a. 使用AllGather获取模型该层所需的前置的层的参数。
         b. 结束后释放掉不属于该rank分片的层的参数。
      3、每个rank计算backward过程
         a. 使用AllGather获取该层所需要的层之前过程的参数。
         b. 结束后释放掉不属于该rank分片的层的参数。
      4、使用Reduce对当前分片的参数的梯度进行累加。
      5、使用AllReduce对梯度进行同步,并更新模型参数。让每个rank根据聚合的梯度,独立更新参数。
    ZeRO-3的优点:
      1、减少了8倍显存,通信容量与数据并行相同。内存减少与数据并行度和复杂度成线性关系。

- ZeRO-2:ZeRO-2 是 DeepSpeed 中的一种优化器,可以实现模型并行、数据并行和模型的卸载。

    ZeRO-2的原理:
      1、对优化器Optimizer、gradients进行分片
      2、Optimizer参数被分片,并安排在不同的rank上
      3、在backward过程中,gradients在不同的rank上独自进行reduce操作(取代了all-reduce,以此减少了通讯开销),每个rank独自更新各自负责的参数。
      4、在更新操作之后,广播或AllGather,保证所有的ranks接受到更新后的参数。
    ZeRO-2的优点:
      1、减少了8倍显存,通信容量与数据并行相同

- ZeRO-1:ZeRO-1 是 DeepSpeed 中的一种优化器,可以实现模型并行、数据并行和模型的卸载。

    ZeRO-1的原理:
      1、只对优化器Optimizer进行分片(与DDP过程相似)
      2、每个rank(gpu)单独负责 forward和backward过程,在完成backward后,梯度通过AllReduce来同步。
      3、每个rank只负责更新当前优化器分片的部分,由于每个rank只有部分分片的优化器state,所以当前rank会忽略其余的state。
      4、在更新优化器state后,通过广播或者AllGather的方式,确保所有的rank都收到最新更新过后的模型参数。
    ZeRO-1的优点:
      1、适合使用类似Adam进行优化的模型训练
      2、因为Adam拥有额外的参数m(momentum)与v(variance),特别是FP16混合精度训练。
      3、减少了4倍显存,通信容量与数据并行相同
    ZeRO-1的缺点:
      1、不适合使用SGD类似的优化器进行模型训练
      2、因为SGD只有较少的参数内存,并且由于需要更新模型参数,导致额外的通讯成本。
      3、只是解决了Optimizer state的冗余。

- 其他优化器:DeepSpeed 还提供了其他优化器,例如 AdamOffload、Lamb、Larc、Lamb-Opt、Lamb-Opt-Offload、Lamb-Opt-ZeRO、Lamb-Opt-ZeRO-Offload、Lamb-Opt-ZeRO-3、Lamb-Opt-ZeRO-2、Lamb-Opt-ZeRO-1 等。

与其他框架相比,DeepSpeed 的优点在于:
- 灵活性:DeepSpeed 使用动态图(Dynamic Graph)是指在运行时,根据输入数据的大小,自动调整计算图的结构,以节省内存。使得代码更加简洁易懂,更加灵活,适合于小规模数据和尝试实验。
- 速度:DeepSpeed 的计算速度更快,在相同的硬件上,DeepSpeed 的训练速度通常比TensorFlow、PyTorch快。
- 易用性:DeepSpeed 的接口和文档更加简单易懂,调试代码更加方便,并且有许多社区贡献的资源和工具。
- 自动并行:DeepSpeed 可以自动实现模型并行和数据并行,并提供分布式训练的支持。
- 自动混合精度训练:DeepSpeed 可以自动实现混合精度训练,并提供分布式训练的支持。
- 自动切分:DeepSpeed 可以自动实现模型切分,并提供分布式训练的支持。
- 自动混合精度优化器:DeepSpeed 可以自动实现混合精度优化器,并提供分布式训练的支持。
- 自动混合精度梯度累积:DeepSpeed 可以自动实现混合精度梯度累积,并提供分布式训练的支持。
- 弹性训练:DeepSpeed 可以实现弹性训练,可以自动扩展/缩减资源,以提高稳定性、吞吐量和资源利用率。
- 弹性扩缩容:DeepSpeed 可以实现弹性扩缩容,可以根据需要动态增加/减少节点,以应对突发的工作负载。
- 弹性调度:DeepSpeed 可以实现弹性调度,可以根据需要动态调度任务,以优化资源利用率和任务间的负载平衡。

DeepSpeed的缺点:
- 易用性和灵活性带来的缺点是,DeepSpeed 在大型数据集上需要额外的工作来优化它的计算效率,而且同时也影响了代码的可维护性。
- DeepSpeed 缺乏安全性,因此有时可能会面临被恶意代码攻击的风险。
- 缺乏专业的深度学习库,导致其功能有限。

DeepSpeed 可以通过以下方式加速模型的训练:
- 自动混合精度训练:通过混合精度训练,可以同时使用 FP16 和 FP32 两种数据类型,加速模型的训练,同时减少内存占用,提升模型的精度。
- 自动并行:通过模型并行和数据并行,可以将模型的不同部分分布到不同的 GPU 上,并行计算,提升模型的训练速度。
- 自动切分:通过切分模型,可以将模型的不同部分切分到不同的 GPU 上,并行计算,提升模型的训练速度。
- 自动混合精度优化器:通过混合精度优化器,可以同时使用 FP16 和 FP32 两种数据类型,加速模型的训练,同时减少内存占用,提升模型的精度。
- 自动混合精度梯度累积:通过混合精度梯度累积,可以同时使用 FP16 和 FP32 两种数据类型,加速模型的训练,同时减少内存占用,提升模型的精度。

总的来说,DeepSpeed 是一个优秀的深度学习框架,适用于小规模数据和尝试实验,但在大型数据集上需要额外的工作来优化它的计算效率。

DLRover

DLRover 是一个开源分布式工具,使大型 AI 模型的分布式训练变得简单、稳定、快速、绿色。它可以在分布式集群上自动训练深度学习模型,并提供自动扩展、缩容、弹性调度等功能,帮助开发人员专注于模型架构提升,而无需关心硬件加速、分布式运行等任何工程内容。可以帮助开发者在 K8s/Ray 上的深度学习训练作业中自动化运维。

DLRover的特点:
- 开源:DLRover 是一个开源项目,其代码可以免费获取。
- 简单易用:DLRover 使大型 AI 模型的分布式训练变得简单、稳定、快速、绿色。
- 容错性:DLRover 能够自动处理节点故障,分布式训练在发生故障时可以继续运行,并在几秒内从内存检查点恢复故障。
- Flash Checkpoint:DLRover 分布式训练可以在几秒内从内存检查点恢复故障。
- 自动扩展:DLRover 可以自动扩展/缩减资源,以提高稳定性、吞吐量和资源利用率。
- 弹性训练:DLRover 可以实现弹性训练,可以自动扩展/缩减资源,以提高稳定性、吞吐量和资源利用率。
- 弹性扩缩容:DLRover 可以实现弹性扩缩容,可以根据需要动态增加/减少节点,以应对突发的工作负载。

DLRover 主要组件:
- 训练器(Trainer):训练器(Trainer)是 DLRover 的核心组件,负责模型的训练。
- 任务管理器(Task Manager):任务管理器(Task Manager)是 DLRover 的核心组件,负责任务的调度和管理。
- 资源管理器(Resource Manager):资源管理器(Resource Manager)是 DLRover 的核心组件,负责资源的管理。
- 存储管理器(Storage Manager):存储管理器(Storage Manager)是 DLRover 的核心组件,负责模型的存储和检索。
- 弹性调度器(Elastic Scheduler):弹性调度器(Elastic Scheduler)是 DLRover 的核心组件,负责弹性调度。
- 弹性扩缩容器(Elastic Scaler):弹性扩缩容器(Elastic Scaler)是 DLRover 的核心组件,负责弹性扩缩容。
- 弹性训练器(Elastic Trainer):弹性训练器(Elastic Trainer)是 DLRover 的核心组件,负责弹性训练。
- 弹性存储器(Elastic Storage):弹性存储器(Elastic Storage)是 DLRover 的核心组件,负责弹性存储。
- 弹性检查点(Elastic Checkpoint):弹性检查点(Elastic Checkpoint)是 DLRover 的核心组件,负责弹性检查点。
- 弹性恢复器(Elastic Recovery):弹性恢复器(Elastic Recovery)是 DLRover 的核心组件,负责弹性恢复。
- 弹性数据集(Elastic Dataset):弹性数据集(Elastic Dataset)是 DLRover 的核心组件,负责弹性数据集。
- 弹性模型(Elastic Model):弹性模型(Elastic Model)是 DLRover 的核心组件,负责弹性模型。
- 弹性优化器(Elastic Optimizer):弹性优化器(Elastic Optimizer)是 DLRover 的核心组件,负责弹性优化器。
- 弹性混合精度(Elastic Mixed Precision):弹性混合精度(Elastic Mixed Precision)是 DLRover 的核心组件,负责弹性混合精度。
- 弹性切分(Elastic Split):弹性切分(Elastic Split)是 DLRover 的核心组件,负责弹性切分。
- 弹性混合精度优化器(Elastic Mixed Precision Optimizer):弹性混合精度优化器(Elastic Mixed Precision Optimizer)是 DLRover 的核心组件,负责弹性混合精度优化器。
- 弹性混合精度梯度累积(Elastic Mixed Precision Gradient Accumulation):弹性混合精度梯度累积(Elastic Mixed Precision Gradient Accumulation)是 DLRover 的核心组件,负责弹性混合精度梯度累积。
- 弹性混合精度训练(Elastic Mixed Precision Training):弹性混合精度训练(Elastic Mixed Precision Training)是 DLRover 的核心组件,负责弹性混合精度训练。
- 弹性混合精度切分(Elastic Mixed Precision Split):弹性混合精度切分(Elastic Mixed Precision Split)是 DLRover 的核心组件,负责弹性混合精度切分。
- 弹性混合精度优化器(Elastic Mixed Precision Optimizer):弹性混合精度优化器(Elastic Mixed Precision Optimizer)是 DLRover 的核心组件,负责弹性混合精度优化器。
- 弹性混合精度梯度累积(Elastic Mixed Precision Gradient Accumulation):弹性混合精度梯度累积(Elastic Mixed Precision Gradient Accumulation)是 DLRover 的核心组件,负责弹性混合精度梯度累积。

DLRover 主要功能为:
- 自动化训练:DLRover 可以自动化地进行模型的训练,包括数据集的准备、模型的训练、模型的评估、模型的存储、模型的恢复等。
- 自动化运维:DLRover 可以自动化地进行模型的运维,包括模型的监控、模型的自动扩缩容、模型的自动调度等。
- 弹性训练:DLRover 可以实现弹性训练,可以自动扩展/缩减资源,以提高稳定性、吞吐量和资源利用率。
- 弹性扩缩容:DLRover 可以实现弹性扩缩容,可以根据需要动态增加/减少节点,以应对突发的工作负载。
- 弹性检查点:DLRover 可以实现弹性检查点,可以自动从故障中恢复训练状态。
- 弹性恢复:DLRover 可以实现弹性恢复,可以自动从故障中恢复训练状态。

LLaMa-Factory

LLaMA-Factory 是一个易于使用的大规模语言模型(Large Language Model, LLM)微调框架,它支持多种模型,包括 LLaMA、BLOOM、Mistral、Baichuan、Qwen 和 ChatGLM 等。该框架旨在简化大型语言模型的微调过程,提供了一套完整的工具和接口,使得用户能够轻松地对预训练的模型进行定制化的训练和调整,以适应特定的应用场景。

LLaMA-Factory优点:
- 多种模型:LLaMA、Mistral、Mixtral-MoE、Qwen、Yi、Gemma、Baichuan、ChatGLM、Phi 等等。
- 集成方法:(增量)预训练、指令监督微调、奖励模型训练、PPO 训练、DPO 训练和 ORPO 训练。
- 多种精度:32 比特全参数微调、16 比特冻结微调、16 比特 LoRA 微调和基于 AQLM/AWQ/GPTQ/LLM.int8 的 2/4/8 比特 QLoRA 微调。
- 先进算法:GaLore、DoRA、LongLoRA、LLaMA Pro、LoRA+、LoftQ 和 Agent 微调。
- 实用技巧:FlashAttention-2、Unsloth、RoPE scaling、NEFTune 和 rsLoRA。
- 实验监控:LlamaBoard、TensorBoard、Wandb、MLflow 等等。
- 极速推理:基于 vLLM 的 OpenAI 风格 API、浏览器界面和命令行接口
- 数据集:LLaMA-Factory 目前只支持指定名称,位置放在项目的data目录下
- 模型压缩:LLaMA-Factory 提供了基于 AQLM/AWQ/GPTQ/LLM.int8 的 2/4/8 比特 QLoRA 微调,以实现模型的压缩和加速。
- 模型评估:LLaMA-Factory 提供了多种模型评估指标,如 PPL、BLEU、ROUGE、METEOR、SQuAD、GLUE、SST-2、MNLI、QQP、QNLI、RTE、MRPC、CoLA、STS-B、QQP、MNLI、RTE、MRPC、CoLA、STS-B 等。

LLaMA-Factory缺点:
- 易用性:LLaMA-Factory 是一个易于使用的大规模语言模型微调框架,但仍然存在一些限制。
- 性能:LLaMA-Factory 目前的性能仍然不及原生框架,尤其是在大规模模型上。
- 稳定性:LLaMA-Factory 仍然存在一些限制,如内存泄漏、随机性、分布式训练等。

训练监控

  • 训练监控(Training Monitoring)是指模型训练过程中,对模型的训练状态进行监控,以便及时发现和解决问题。
  • 日志记录(Logging)是指记录模型训练过程中的信息,包括训练数据、模型参数、训练指标等。
  • 训练可视化(Training Visualization)是指通过可视化的方式,展示模型训练过程中的信息,如训练数据、模型参数、训练指标等。
  • 训练检查点(Training Checkpoint)是指保存模型训练过程中的信息,包括模型参数、训练指标等。
  • 训练恢复(Training Recovery)是指在训练过程中,根据检查点恢复模型的训练状态。

SwanLab

SwanLab(SwanLab)平台(SwanLab Platform)是由华为推出的模型训练监控平台,可以实时监控模型的训练状态,并提供日志记录、训练可视化、训练检查点等功能。

import swan
swan.init("my-project", "my-entity")
for epoch in range(10):
    # train
    #...
    # log metrics
    swan.log_metric("loss", loss)
    swan.log_metric("accuracy", accuracy)

Wandb

Wandb(Weights & Biases)平台(Wandb Platform)是由 Wandb 团队开发的模型训练监控平台,可以实时监控模型的训练状态,并提供日志记录、训练可视化、训练检查点等功能。

import wandb
wandb.init(project="my-project", entity="my-entity")
for epoch in range(10):
    # train
    #...
    # log metrics
    wandb.log({"loss": loss, "accuracy": accuracy})

TensorBoard

TensorBoard 是 TensorFlow 官方推出的可视化工具,可以实时监控模型的训练状态,并提供日志记录、训练可视化、训练检查点等功能。

import torch.utils.tensorboard
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter()
for epoch in range(10):
    # train
    #...
    # log metrics
    writer.add_scalar("loss", loss, epoch)
    writer.add_scalar("accuracy", accuracy, epoch)

评估模型

模型评估是机器学习中的一个重要环节,它指的是对训练好的模型进行性能评估,以了解模型在未见过的新数据上的表现。这通常包括使用一系列指标来量化模型的预测能力、泛化能力、稳定性等。模型评估方法不针对模型本身,只针对问题和数据,因此可以用来评价来自不同方法的模型和泛化能力,进行用于部署的最终模型的选择。

  • 评估指标:评估指标(Evaluation Metric)是指模型训练时,用于评估模型性能的指标。
    作用:帮助选择最佳的超参数,避免模型在测试集上过拟合。
    常用评估指标:
    - 准确率(Accuracy):准确率(Accuracy)是指模型预测正确的样本数与总样本数的比值。
    - 精确率(Precision):精确率(Precision)是指模型预测为正的样本中,真正为正的样本数与所有预测为正的样本数的比值。
    - 召回率(Recall):召回率(Recall)是指模型预测为正的样本中,真正为正的样本数与所有实际为正的样本数的比值。
    - F1 值:F1 值(F1 Score)是指精确率和召回率的调和平均值。
    - 损失函数值:损失函数值(Loss Value)是指模型训练过程中,损失函数计算得到的数值。
    - 其他评估指标:其他评估指标(Other Evaluation Metric)是指模型训练时,用于评估模型性能的其他指标。
    
  • 评估方法:评估方法(Evaluation Method)是指模型训练时,用于评估模型性能的方法。
    作用:帮助选择最佳的超参数,避免模型在测试集上过拟合。
    常用评估方法:
    - 交叉验证(Cross-Validation):交叉验证(Cross-Validation)是指模型训练时,将数据集划分为训练集和验证集,使用验证集来评估模型的性能。
    - 留出法(Hold-Out):留出法(Hold-Out)是指模型训练时,将数据集划分为训练集和测试集,使用测试集来评估模型的性能。
    - 其他评估方法:其他评估方法(Other Evaluation Method)是指模型训练时,用于评估模型性能的其他方法。
    
  • 评估标准:评估标准(Evaluation Standard)是指模型训练时,用于评估模型性能的标准。
    作用:帮助选择最佳的超参数,避免模型在测试集上过拟合。
    常用评估标准:
    - 准确率(Accuracy):准确率(Accuracy)是指模型预测正确的样本数与总样本数的比值。
    - 精确率(Precision):精确率(Precision)是指模型预测为正的样本中,真正为正的样本数与所有预测为正的样本数的比值。
    - 召回率(Recall):召回率(Recall)是指模型预测为正的样本中,真正为正的样本数与所有实际为正的样本数的比值。
    - F1 值:F1 值(F1 Score)是指精确率和召回率的调和平均值。
    - 其他评估标准:其他评估标准(Other Evaluation Standard)是指模型训练时,用于评估模型性能的其他标准。
    
  • 评估模型:评估模型(Evaluating Model)是指模型训练时,用于评估模型性能的方法。
    作用:帮助选择最佳的超参数,避免模型在测试集上过拟合。
    常用评估模型:
    - 分类模型:分类模型(Classification Model)是指模型训练时,用于分类任务的模型。
    - 回归模型:回归模型(Regression Model)是指模型训练时,用于回归任务的模型。
    - 序列模型:序列模型(Sequence Model)是指模型训练时,用于序列任务的模型。
    - 其他评估模型:其他评估模型(Other Evaluation Model)是指模型训练时,用于评估模型性能的其他模型。
    
  • 评估结果:评估结果(Evaluation Result)是指模型训练时,用于评估模型性能的结果。
    作用:帮助选择最佳的超参数,避免模型在测试集上过拟合。
    常用评估结果:
    - 准确率(Accuracy):准确率(Accuracy)是指模型预测正确的样本数与总样本数的比值。
    - 精确率(Precision):精确率(Precision)是指模型预测为正的样本中,真正为正的样本数与所有预测为正的样本数的比值。
    - 召回率(Recall):召回率(Recall)是指模型预测为正的样本中,真正为正的样本数与所有实际为正的样本数的比值。
    - F1 值:F1 值(F1 Score)是指精确率和召回率的调和平均值。
    - 损失函数值:损失函数值(Loss Value)是指模型训练过程中,损失函数计算得到的数值。
    - 其他评估结果:其他评估结果(Other Evaluation Result)是指模型训练时,用于评估模型性能的其他结果。
    
  • 评估过程:评估过程(Evaluation Process)是指模型训练时,用于评估模型性能的过程。
    作用:帮助选择最佳的超参数,避免模型在测试集上过拟合。
    常用评估过程:
    - 训练集验证(Training Set Validation):训练集验证(Training Set Validation)是指模型训练时,使用训练集来评估模型的性能。
    - 验证集验证(Validation Set Validation):验证集验证(Validation Set Validation)是指模型训练时,使用验证集来评估模型的性能。
    - 测试集验证(Test Set Validation):测试集验证(Test Set Validation)是指模型训练时,使用测试集来评估模型的性能。
    - 其他评估过程:其他评估过程(Other Evaluation Process)是指模型训练时,用于评估模型性能的其他过程。
    
  • 评估工具:评估工具(Evaluation Tool)是指模型训练时,用于评估模型性能的工具。
    作用:帮助选择最佳的超参数,避免模型在测试集上过拟合。
    常用评估工具:
    - 准确率(Accuracy):准确率(Accuracy)是指模型预测正确的样本数与总样本数的比值。
    - 精确率(Precision):精确率(Precision)是指模型预测为正的样本中,真正为正的样本数与所有预测为正的样本数的比值。
    - 召回率(Recall):召回率(Recall)是指模型预测为正的样本中,真正为正的样本数与所有实际为正的样本数的比值。
    - F1 值:F1 值(F1 Score)是指精确率和召回率的调和平均值。
    - 损失函数值:损失函数值(Loss Value)是指模型训练过程中,损失函数计算得到的数值。
    - 其他评估工具:其他评估工具(Other Evaluation Tool)是指模型训练时,用于评估模型性能的其他工具。
    

模型量化

  • 模型量化(Model Quantization)是指对模型进行量化的方法,包括模型的量化、量化训练、量化推理等。
  • 量化训练(Quantization Training)是指对模型进行量化训练的方法,包括量化训练的预处理、量化训练的训练、量化训练的评估等。
  • 量化推理(Quantization Inference)是指对量化后的模型进行推理的方法,包括量化推理的预处理、量化推理的推理等。
  • 量化(Quantization)是指对模型进行量化的方法,包括模型的量化、量化训练、量化推理等。

量化训练

  • 量化训练(Quantization Training)是指对模型进行量化训练的方法,包括量化训练的预处理、量化训练的训练、量化训练的评估等。
  • 量化训练的预处理(Quantization Training Preprocessing)是指对量化训练的数据进行预处理的方法,包括数据清洗、数据转换、数据归一化等。
  • 量化训练的训练(Quantization Training Training)是指对模型进行量化训练的方法,包括量化训练的训练、量化训练的评估等。
  • 量化训练的评估(Quantization Training Evaluation)是指对量化训练的结果进行评估的方法,包括量化训练的指标、量化训练的性能评估等。

量化推理

  • 量化推理(Quantization Inference)是指对量化后的模型进行推理的方法,包括量化推理的预处理、量化推理的推理等。
  • 量化推理的预处理(Quantization Inference Preprocessing)是指对量化推理的数据进行预处理的方法,包括数据清洗、数据转换、数据归一化等。
  • 量化推理的推理(Quantization Inference Inference)是指对量化后的模型进行推理的方法。

模型压缩

模型压缩(Model Compression)是指通过减少模型的大小,包括模型的剪枝、模型的量化、模型的蒸馏、模型的压缩等,来提升模型的推理速度和降低模型的存储空间。

  • 量化(Quantization)是指将模型的权重量化,减少模型的大小,包括量化训练的预处理、量化训练的训练、量化训练的评估等,提升模型的推理速度和降低模型的存储空间。
  • 剪枝(Pruning)是指通过裁剪模型的权重,减少模型的大小,包括模型的精度、模型的大小、模型的计算量等,提升模型的推理速度。
  • 蒸馏(Distillation)是指通过蒸馏模型的知识,减少模型的大小,包括模型的精度、模型的大小、模型的计算量等,提升模型的推理速度。例如:将大模型的知识迁移到小模型,将大模型去蒸馏小模型。
  • 量化-剪枝(Quantization-Pruning)是指将模型的权重量化,通过裁剪模型的权重,减少模型的大小,提升模型的推理速度。
  • 量化-蒸馏(Quantization-Distillation)是指将模型的权重量化,通过蒸馏模型的知识,减少模型的大小,提升模型的推理速度。
  • 剪枝-蒸馏(Pruning-Distillation)是指通过裁剪模型的权重,通过蒸馏模型的知识,减少模型的大小,提升模型的推理速度。
  • 其他模型压缩方法:其他模型压缩方法(Other Model Compression Method)是指模型训练时,用于压缩模型的其他方法。

加速推理

加速推理(Accelerate Inference)是指在模型推理过程中,通过优化模型结构、优化模型参数、优化模型运行环境,提升模型的推理速度。

  • DeepSpeed-MII 推理(DeepSpeed Model-Inference-Interface)是一种加速深度学习推理的技术,可以加速模型的推理。
  • VLLM 推理(Vector-Level Low-Memory)是一种加速深度学习推理的技术,可以加速模型的推理。
  • LightLLM 推理(Light-Level Low-Memory)是一种加速深度学习推理的技术,可以加速模型的推理。
  • TensorRT 推理(Tensor Runtine)是一种加速深度学习推理的技术,可以加速模型的推理。
  • ONNX 推理(Open Neural Network Exchange)是一种开源的模型格式,可以将 PyTorch 模型转换为其他框架,或用于模型推理。
  • TorchScript 推理(TorchScript)是一种将 PyTorch 模型转换为可执行代码的技术,可以加速模型的推理。
  • TensorFlow Lite 推理(TensorFlow Lite)是一种加速深度学习推理的技术,可以加速模型的推理。
  • 模型量化(Model Quantization)是指将模型的权重量化,减少模型的大小,提升模型的推理速度。
  • 模型剪枝(Model Pruning)是指通过裁剪模型的权重,减少模型的大小,提升模型的推理速度。
  • 模型压缩(Model Compression)是指通过减少模型的大小,提升模型的推理速度。
  • DeepSpeed压缩器(DeepSpeed Compressor)是一种加速深度学习训练的技术,可以压缩模型的大小。

参考资料

后续更新

本文档持续更新中,欢迎您持续关注,期待您的参与。