DeepSpeed 配置 JSON

注意:train_batch_size 必须等于 train_micro_batch_size_per_gpu * gradient_accumulation_steps * GPU 数量。为简单起见,您可以选择仅指定三个参数中的两个,最后一个参数将由 DeepSpeed 自动推断。

train_batch_size: [整数]

示例
有效的训练批大小。这是导致模型更新一步的数据样本量。train_batch_size 由单个 GPU 在一次前向/反向传递中处理的批大小(也称为 train_micro_batch_size_per_gpu)、梯度累积步数(也称为 gradient_accumulation_steps)和 GPU 数量聚合而成。如果同时提供了 train_micro_batch_size_per_gpugradient_accumulation_steps,则可以省略。 32

train_micro_batch_size_per_gpu: [整数]

描述 默认值
一个 GPU 在一步中处理的批大小(不进行梯度累积)。如果同时提供了 train_batch_sizegradient_accumulation_steps,则可以省略。 train_batch_size

gradient_accumulation_steps: [整数]

描述 默认值
在平均和应用梯度之前累积梯度的训练步数。此功能有时有助于提高可扩展性,因为它会导致步骤之间更少地通信梯度。此功能的另一个影响是能够使用每个 GPU 更大的批大小进行训练。如果同时提供了 train_batch_sizetrain_micro_batch_size_per_gpu,则可以省略。 1

优化器参数

optimizer: [字典]

字段 示例
类型 优化器名称。DeepSpeed 本机支持 AdamAdamWOneBitAdamLambOneBitLamb 优化器(有关详细信息,请参阅 此处),并将从 torch 导入其他优化器。 "Adam"
参数 用于实例化优化器的参数字典。参数名称必须与优化器构造函数签名匹配(例如,对于 Adam)。 {"lr": 0.001, "eps": 1e-8}

使用 Adam 的optimizer 示例

"optimizer": {
    "type": "Adam",
    "params": {
      "lr": 0.001,
      "betas": [
        0.8,
        0.999
      ],
      "eps": 1e-8,
      "weight_decay": 3e-7
    }
  }

除了来自 torch.optim.Adam 的标准参数外,Adam 优化器还支持以下两个 params 键/值

“params” 键 描述 默认值
torch_adam 使用 torch 的 adam 实现而不是我们融合的 adam 实现 false
adam_w_mode 应用 L2 正则化(也称为 AdamW) true

另一个使用 1 比特 Adam 特定参数的optimizer 示例如下所示。

"optimizer": {
    "type": "OneBitAdam",
    "params": {
      "lr": 0.001,
      "betas": [
        0.8,
        0.999
      ],
      "eps": 1e-8,
      "weight_decay": 3e-7,
      "freeze_step": 400,
      "cuda_aware": false,
      "comm_backend_name": "nccl"
    }
  }

除了标准 Adam 之外,1 比特 Adam 优化器还支持以下三个 params 键/值(在我们的 教程 中了解更多信息)

“params” 键 描述 默认值
freeze_step 在将 1 比特压缩应用于通信之前进行预热步数 100000
cuda_aware 指示底层 MPI 库是否支持 CUDA 感知通信 false
comm_backend_name 指示要使用哪个后端实现 “nccl”

1 比特 Adam 的变体 optimizer 是 0/1 Adam,它通过自适应方差冻结和优化器状态上的 1 比特同步进一步优化 1 比特 Adam。

"optimizer": {
    "type": "ZeroOneAdam",
    "params": {
      "lr": 1e-3,
      "weight_decay": 0.01,
      "bias_correction": false,
      "var_freeze_step": 1000,
      "var_update_scaler": 16,
      "local_step_scaler": 1000,
      "local_step_clipper": 16,
      "cuda_aware": false,
      "comm_backend_name": "nccl"
    }
  }

除了标准 Adam 之外,0/1 Adam 还支持以下 params 键/值(在我们的 教程 中了解更多信息。)

“params” 键 描述 默认值
var_freeze_step 更新方差的最新步数 100000
var_update_scaler 更新方差的间隔 16
local_step_scaler 根据学习率策略缩放本地步数间隔的间隔 32678
local_step_clipper 具有学习率策略的本地步数的最大间隔 16
cuda_aware 指示底层 MPI 库是否支持 CUDA 感知通信 false
comm_backend_name 指示要使用哪个后端实现 “nccl”

另一个使用 1 比特 LAMB 的 optimizer 示例

"optimizer": {
    "type": "OneBitLamb",
    "params": {
      "lr": 11e-3,
      "weight_decay": 0.01,
      "bias_correction": false,
      "max_coeff": 0.3,
      "min_coeff": 0.01,
      "freeze_step": 1000,
      "cuda_aware": false,
      "comm_backend_name": "nccl",
      "coeff_beta": 0.9,
      "factor_max": 4.0,
      "factor_min": 0.5,
      "factor_threshold": 0.1
    }
  }

除了标准 LAMB 之外,1 比特 LAMB 优化器还支持以下 params 键/值(在我们的 教程 中了解更多信息)

“params” 键 描述 默认值
max_coeff 原始 LAMB 算法和 1 比特 LAMB 预热阶段的缩放系数上限 10.0
min_coeff 原始 LAMB 算法和 1 比特 LAMB 预热阶段的缩放系数下限 0.01
freeze_step 在将 1 比特压缩应用于通信之前进行预热步数 100000
cuda_aware 指示底层 MPI 库是否支持 CUDA 感知通信 false
comm_backend_name 指示要使用哪个后端实现 “nccl”
coeff_beta 用于计算 lamb 系数的运行平均值的系数 0.9
factor_max 压缩阶段冻结的 lamb 系数的缩放因子的最大值 4.0
factor_min 压缩阶段冻结的 lamb 系数的缩放因子的最小值 0.5
factor_threshold 缩放因子在步骤之间可以波动多少的阈值 0.1

调度程序参数

每当执行 model_engine.step() 时,DeepSpeed 都会在每个训练步骤中调用调度程序的 step() 方法。

scheduler: [字典]

字段 示例
类型 调度程序名称。有关支持的调度程序列表,请参阅 此处 "WarmupLR"
参数 用于实例化调度程序的参数字典。参数名称应与调度程序构造函数签名匹配。 {"warmup_min_lr": 0, "warmup_max_lr": 0.001}

scheduler 示例

 "scheduler": {
      "type": "WarmupLR",
      "params": {
          "warmup_min_lr": 0,
          "warmup_max_lr": 0.001,
          "warmup_num_steps": 1000
      }
  }

通信选项

communication_data_type: [字符串]

描述 默认值
在梯度平均期间,使用选定的数据类型执行通信。默认情况下,它将由选定的方案确定

prescale_gradients: [布尔值]

描述 默认值
在执行 allreduce 之前缩放梯度 false

gradient_predivide_factor: [浮点数]

描述 默认值
在梯度平均之前,按指定因子预先划分梯度,在扩展到大量 GPU 时,有时可以帮助提高 fp16 的稳定性 1.0

sparse_gradients: [布尔值]

描述 默认值
启用 torch.nn.Embedding 梯度的稀疏压缩。此功能基本上已弃用,因为我们不再看到它的用例。需要注意的是,此功能与 torch.sparse 相关的功能不兼容。 false

FP16 训练选项

注意:此模式不能与下面描述的 amp 模式结合使用。

fp16: [字典]

描述 默认值
使用混合精度/FP16 训练的配置,该训练利用了 NVIDIA 的 Apex 包。下面举例说明了一个示例,包括可用的字典键。注意:这不会使用 Apex 的 AMP 模式,该模式允许在混合精度训练模式中具有更大的灵活性,此模式类似于 AMP 的 O2 模式。如果您想使用更复杂的混合精度模式,请参阅下面的 AMP 支持。如果您想使用 ZeRO(目前),则必须使用此模式。
"fp16": {
    "enabled": true,
    "auto_cast": false,
    "loss_scale": 0,
    "initial_scale_power": 16,
    "loss_scale_window": 1000,
    "hysteresis": 2,
    "consecutive_hysteresis": false,
    "min_loss_scale": 1
}

fp16:enabled: [布尔值]

描述 默认值
enabled 是一个 fp16 参数,指示是否启用 FP16 训练。 false

fp16:auto_cast: [布尔值]

描述 默认值
auto_cast 自动将输入转换为 fp16 false

fp16:loss_scale: [浮点数]

描述 默认值
loss_scale 是一个 fp16 参数,表示 FP16 训练的损失缩放值。默认值为 0.0 会导致动态损失缩放,否则将使用该值进行静态固定损失缩放。 0.0

fp16:initial_scale_power: [整数]

描述 默认值
initial_scale_power 是一个 fp16 参数,表示初始动态损失缩放值的幂。实际损失缩放值计算为 2initial_scale_power 16

fp16:loss_scale_window: [整数]

描述 默认值
loss_scale_window 是一个 fp16 参数,表示提高/降低动态损失缩放值的窗口。 1000

fp16:hysteresis: [整数]

描述 默认值
hysteresis 是一个 fp16 参数,表示动态损失缩放中的延迟偏移。 2

fp16:consecutive_hysteresis: [布尔值]

描述 默认值
consecutive_hysteresis 是一个 fp16 参数,表示如果我们达到没有溢出的迭代,是否重新填充滞后。 false

fp16:min_loss_scale: [整数]

描述 默认值
min_loss_scale 是一个 fp16 参数,表示最小动态损失缩放值。 1

BFLOAT16 训练选项

注意:此模式不能与下面描述的 amp 模式结合使用。

注意:此模式不能与上面描述的 fp16 模式结合使用。

bf16: [字典]

描述 默认值
使用 bfloat16 浮点格式作为 FP16 替代方案的配置。BFLOAT16 需要硬件支持(例如,NVIDIA A100)。下面举例说明了一个示例,包括可用的字典键。使用 bfloat16 进行训练不需要损失缩放。
"bf16": {
   "enabled": true
 }

bf16:enabled: [布尔值]

描述 默认值
enabled 指示是否启用了 BFLOAT16 训练。 false

自动混合精度 (AMP) 训练选项

注意:此模式不能与上面描述的 fp16 模式结合使用。此外,此模式目前与 ZeRO 不兼容。

amp: [字典]

描述 默认值
使用自动混合精度 (AMP) 训练的配置,该配置利用了NVIDIA 的 Apex AMP 软件包。下面是一个示例,其中包括可用的字典键。与上述 fp16 模式或 ZeRO 不兼容。除了“enabled”之外的任何参数都将传递给 AMP 的 initialize 调用,请参阅此处 apex.amp.initialize 文档 中的 API 和描述。
"amp": {
    "enabled": true,
    ...
    "opt_level": "O1",
    ...
}

amp:enabled: [布尔值]

描述 默认值
enabled 是一个 amp 参数,指示是否启用 AMP 训练。 false

amp 参数: [各种]

描述 默认值
除了“enabled”之外的任何参数都将传递给 AMP 的 initialize 调用,请参阅此处 apex.amp.initialize 文档 中的 API 和描述。

梯度裁剪

gradient_clipping: [浮点数]

描述 默认值
使用指定值启用梯度裁剪。 1.0

用于 FP16 训练的 ZeRO 优化

启用和配置 ZeRO 内存优化

  "zero_optimization": {
    "stage": [0|1|2|3],
    "allgather_partitions": [true|false],
    "allgather_bucket_size": 5e8,
    "overlap_comm": false,
    "reduce_scatter": [true|false],
    "reduce_bucket_size": 5e8,
    "contiguous_gradients" : [true|false],
    "offload_param": {
      ...
    },
    "offload_optimizer": {
      ...
    },
    "stage3_max_live_parameters" : 1e9,
    "stage3_max_reuse_distance" : 1e9,
    "stage3_prefetch_bucket_size" : 5e8,
    "stage3_param_persistence_threshold" : 1e6,
    "sub_group_size" : 1e12,
    "elastic_checkpoint" : [true|false],
    "stage3_gather_16bit_weights_on_model_save": [true|false],
    "ignore_unused_parameters": [true|false]
    "round_robin_gradients": [true|false]
    "zero_hpz_partition_size": 1
    "zero_quantized_weights": [true|false]
    "zero_quantized_gradients": [true|false]
    }

zero_optimization: [字典]

描述 默认值
启用 ZeRO 内存优化,兼容 FP16/BF16/FP32 和 Adam 优化器。 false

stage: [整数]

描述 默认值
选择 ZeRO 优化器的不同阶段。阶段 0、1、2 和 3 分别表示禁用、优化器状态分区、优化器+梯度状态分区以及优化器+梯度+参数分区。 0

allgather_partitions: [布尔值]

描述 默认值
在 allgather 集体通信或一系列广播集体通信之间进行选择,以在每一步结束时从所有 GPU 收集更新的参数。 true

allgather_bucket_size: [整数]

描述 默认值
每次 allgather 的元素数量。限制了大型模型尺寸的 allgather 所需的内存。 5e8

overlap_comm: [布尔值]

描述 默认值
尝试将梯度的归约与反向计算重叠。 false

reduce_scatter: [布尔值]

描述 默认值
使用 reduce 或 reduce scatter 代替 allreduce 来平均梯度。 true

reduce_bucket_size: [整数]

描述 默认值
每次归约/allreduce 的元素数量。限制了大型模型尺寸的 allgather 所需的内存。 5e8

contiguous_gradients: [布尔值]

描述 默认值
在生成梯度时将其复制到连续缓冲区。避免在反向传播期间出现内存碎片。 True

load_from_fp32_weights: [布尔值]

描述 默认值
从检查点中的 fp32 副本(无精度损失)或模型的 fp16 副本(有精度损失)初始化 fp32 主权重。这可用于即使检查点缺少优化器状态时也初始化优化器状态。 True

grad_hooks: [布尔值]

描述 默认值
用于 ZeRO 阶段 1,启用反向钩子以在反向传播期间减少梯度或等到反向传播结束。 True

round_robin_gradients: [布尔值]

描述 默认值
阶段 1 和 2 的 CPU 卸载优化,通过细粒度梯度分区并行化梯度复制到 CPU 内存中的各个进程。性能优势随着梯度累积步数(优化器步骤之间更多的复制)或 GPU 数量(并行度增加)而增长。 False

offload_param: [字典]

描述 默认值
启用将模型参数卸载到 CPU 或 NVMe。这为更大的模型或批次大小释放了 GPU 内存。仅在阶段 3 中有效。有关更多详细信息,请参阅此处 False

offload_optimizer: [字典]

描述 默认值
启用将优化器状态卸载到 CPU 或 NVMe,并将优化器计算卸载到 CPU。这为更大的模型或批次大小释放了 GPU 内存。适用于 ZeRO 阶段 1、2、3。有关更多详细信息,请参阅此处 False

stage3_max_live_parameters: [整数]

描述 默认值
在释放之前每个 GPU 上驻留的最大参数数量。较小的值使用更少的内存,但执行更多的通信。 1e9

stage3_max_reuse_distance: [整数]

描述 默认值
如果参数将在该阈值内的参数内重新使用,则不要释放它。较小的值使用更少的内存,但执行更多的通信。 1e9

stage3_prefetch_bucket_size: [整数]

描述 默认值
用于预取参数的固定缓冲区的大小。较小的值使用更少的内存,但由于通信可能会增加停顿。 5e8

stage3_param_persistence_threshold: [整数]

描述 默认值
不要对小于此阈值的参数进行分区。较小的值使用更少的内存,但可以大大增加通信(尤其是延迟受限的消息)。 1e5

stage3_gather_16bit_weights_on_model_save: [布尔值]

描述 默认值
通过 save_16bit_model() 保存模型之前整合权重。由于权重在 GPU 上进行分区,因此它们不是 state_dict 的一部分,因此当启用此选项时,此函数会自动收集权重,然后保存 fp16 模型权重。 False

stage3_module_granularity_threshold: [整数] | 描述 | 默认值 | |——————————————————————————————————————————————————————————————————————————————————————————–| ——- | | 模块的粒度由 parameter_count / (1 + descendant_count) 的比率决定。ZeRO3 将粒度低于阈值的模块分类为细粒度模块,在参数获取期间将其视为整体单元。这减少了来自单独钩子的主机和通信开销。 | 0 |

zero_hpz_partition_size: [整数]

描述 默认值
分层分区 ZeRO (hpZ) ZeRO++ 的二级张量组中的进程数量,默认为 1,表示没有 hpZ,理想值为每个节点的进程(GPU)数量。 1

zero_quantized_weights: [布尔值]

描述 默认值
布尔值,指示是否启用 ZeRO++ 的通信高效量化权重。 False

zero_quantized_gradients: [布尔值]

描述 默认值
布尔值,指示是否启用 ZeRO++ 的通信高效量化梯度。 False

cpu_offload: [布尔值]

已弃用:cpu_offload 已弃用,将在未来版本中移除,请改用 offload_optimizer

描述 默认值
启用将优化器内存和计算卸载到 CPU。这为更大的模型或批次大小释放了 GPU 内存。适用于阶段 1 和 2。 False

参数卸载

启用和配置将参数卸载到 CPU/NVMe 的 ZeRO 优化。仅在 ZeRO 阶段 3 中可用。请注意,如果未指定或不支持“device”的值,则会触发断言。

  "offload_param": {
    "device": "[cpu|nvme]",
    "nvme_path": "/local_nvme",
    "pin_memory": [true|false],
    "buffer_count": 5,
    "buffer_size": 1e8,
    "max_in_cpu": 1e9
  }

device: [字符串]

描述 默认值
卸载模型参数的目标设备内存。支持的选项为 cpunvme cpu

nvme_path: [字符串]

描述 默认值
用于参数卸载的 NVMe 设备的文件系统路径。 /local_nvme

pin_memory: [布尔值]

描述 默认值
卸载到页面锁定 CPU 内存。这可能会以额外的内存开销为代价提高吞吐量。 false

buffer_count: [整数]

描述 默认值
用于参数卸载到 NVMe 的缓冲区池中的缓冲区数量。 5

buffer_size: [整数]

描述 默认值
用于参数卸载到 NVMe 的缓冲区池中缓冲区的大小。 1e8

max_in_cpu: [整数]

描述 默认值
启用卸载到 NVMe 时在 CPU 内存中维护的参数元素数量。 1e9

优化器卸载

启用和配置将优化器计算卸载到 CPU 和状态卸载到 CPU/NVMe 的 ZeRO 优化。CPU 卸载适用于 ZeRO 阶段 1、2、3。NVMe 卸载仅适用于 ZeRO 阶段 3。请注意,如果未指定或不支持“device”的值,则会触发断言。

  "offload_optimizer": {
    "device": "[cpu|nvme]",
    "nvme_path": "/local_nvme",
    "pin_memory": [true|false],
    "ratio": 0.3,
    "buffer_count": 4,
    "fast_init": false
  }

device: [字符串]

描述 默认值
卸载优化器状态的目标设备内存。支持的选项为 cpunvme。无论设备选项如何,优化器计算都卸载到 CPU。 cpu

nvme_path: [字符串]

描述 默认值
用于优化器状态卸载的 NVMe 设备的文件系统路径。 /local_nvme

pin_memory: [布尔值]

描述 默认值
卸载到页面锁定 CPU 内存。这可能会以额外的内存开销为代价提高吞吐量。 false

ratio: [浮点数]

描述 默认值
CPU 端更新参数(即优化器步骤)的比率。 1

buffer_count: [整数]

描述 默认值
用于优化器状态卸载到 NVMe 的缓冲区池中的缓冲区数量。这至少应为优化器每个参数维护的状态数量。例如,Adam 优化器有 4 个状态(参数、梯度、动量和方差)。 4

fast_init: [布尔值]

描述 默认值
启用卸载到 NVMe 时快速优化器初始化。 false

异步 I/O

配置异步 I/O 模块,用于将参数和优化器状态卸载到持久性(NVMe)存储。此模块使用 Linux 原生异步 I/O (libaio)。

  "aio": {
    "block_size": 1048576,
    "queue_depth": 8,
    "thread_count": 1,
    "single_submit": false,
    "overlap_events": true
  }

block_size: [整数]

描述 默认值
I/O 块大小(以字节为单位)。 1048576

queue_depth: [整数]

描述 默认值
I/O 队列深度。 8

thread_count: [整数]

描述 默认值
用户线程提交的每个读/写操作的请求内并行度。 1

single_submit: [布尔值]

描述 默认值
将请求提交到存储设备作为多个单独的请求,而不是一个请求块。 false

overlap_events: [布尔值]

描述 默认值
以重叠的方式将请求提交到存储设备,而无需等待先前请求完成。 true

ignore_unused_parameters: [布尔值]

描述 默认值
模块中未使用的参数在静态网络中可能是意外的,但在动态网络中可能是正常的。这控制了在检测到未使用的参数时训练是否应以错误消息终止。默认情况下将其设置为 True,这意味着忽略未使用的参数并继续训练。现在仅在阶段 2 中使用。 True

日志记录

steps_per_print: [整数]

描述 默认值
每隔 N 个训练步打印进度报告。该报告包括训练步数、跳过的优化器更新次数(可能是由于混合精度训练中的溢出)、当前学习率和当前动量。 10

wall_clock_breakdown: [布尔值]

描述 默认值
启用前向/反向/更新训练阶段延迟的计时。 false

dump_state: [布尔值]

描述 默认值
初始化后打印 DeepSpeed 对象的状态信息。 false

自动调整

{
  "autotuning": {
    "enabled": false,
    "results_dir": "autotuning_results",
    "exps_dir": "autotuning_exps",
    "overwrite": false,
    "metric": "throughput",
    "start_profile_step": 3,
    "end_profile_step": 5,
    "fast": true,
    "max_train_batch_size": null,
    "mp_size": 1,
    "num_tuning_micro_batch_sizes": 3,
    "tuner_type": "model_based",
    "tuner_early_stopping": 5,
    "tuner_num_trials": 50,
    "arg_mappings": null
  }
}

enabled: [布尔值]

描述 默认值
启用自动调整器。 false

results_dir: [字符串]

描述 默认值
自动调整实验结果目录的路径。默认路径出现在启动 Deepspeed 的工作目录中。 “autotuning_results”

exps_dir: [字符串]

描述 默认值
自动调整实验描述目录的路径。默认路径出现在启动 Deepspeed 的工作目录中。 “autotuning_exps”

overwrite: [布尔值]

描述 默认值
是否运行结果已存在的自动调整实验。将其设置为 true 将覆盖现有结果。 false

metric: [字符串]

描述 默认值
用于对自动调整实验进行排序的性能指标。目前支持 latencythroughputFLOPS,分别指训练步延迟、每秒训练样本数以及每个 GPU 达到的每秒浮点运算次数。 throughput

start_profile_step: [整数]

描述 默认值
开始在自动调整实验中进行分析的全局训练步数。请注意,需要预热才能进行准确的性能测量。 3

end_profile_step: [整数]

描述 默认值
结束在自动调整实验中进行分析的全局训练步数。不得小于 start_profile_step。 5

fast: [布尔值]

描述 默认值
启用快速模型自动调整,其中仅调整 Zero 阶段和每个 GPU 的微批次大小。 true

max_train_batch_size: [int]

描述 默认值
模型训练的最大训练批次大小(全局有效批次大小)。 null

mp_size: [int]

描述 默认值
模型并行度。 1

num_tuning_micro_batch_sizes: [整数]

描述 默认值
要探索的微批次大小的数量。 3

tuner_type: [字符串]

描述 默认值
该算法定义了在 ZeRO 阶段内自动调整空间探索的顺序。 基于模型

tuner_early_stopping: [整数]

描述 默认值
在当前最佳实验之外运行的实验次数。如果在此次数内未找到更好的实验,则自动调整器将停止探索。 5

tuner_num_trials: [整数]

描述 默认值
在 ZeRO 阶段内,在调整空间中探索的实验最大次数。 50

浮点运算计数分析器

{
  "flops_profiler": {
    "enabled": false,
    "profile_step": 1,
    "module_depth": -1,
    "top_modules": 1,
    "detailed": true,
    "output_file": null,
    }
}

enabled: [布尔值]

描述 默认值
启用浮点运算次数分析器。这也将启用 wall_clock_breakdown false

profile_step: [整数]

描述 默认值
执行分析的全局训练步骤。请注意,需要预热步骤才能进行准确的时间测量。 1

module_depth: [整数]

描述 默认值
打印聚合模块信息的模型深度。当设置为-1时,它会从顶部模块打印信息到最内部的模块(最大深度)。 -1

top_modules: [整数]

描述 默认值
将聚合的配置文件输出限制为指定的顶级模块数量。 1

detailed: [布尔值]

描述 默认值
是否打印详细的模型配置文件。 true

output_file: [字符串]

描述 默认值
输出文件的路径。如果为 None,则分析器会打印到标准输出。 null

激活检查点

  "activation_checkpointing": {
    "partition_activations": false,
    "cpu_checkpointing": false,
    "contiguous_memory_optimization": false,
    "number_checkpoints": null,
    "synchronize_checkpoint_boundary": false,
    "profile": false
    }

partition_activations: [布尔值]

描述 默认值
在与模型并行一起使用时启用分区激活。 false

cpu_checkpointing: [布尔值]

描述 默认值
如果启用了 partition_activations,则将分区激活卸载到 CPU。 false

contiguous_memory_optimization: [布尔值]

描述 默认值
复制分区激活,使其在内存中连续。 false

number_checkpoints: [整数]

描述 默认值
用于为 contiguous_memory_optimization 分配内存缓冲区的激活检查点的总数。

synchronize_checkpoint_boundary: [布尔值]

描述 默认值
在每个检查点边界插入 get_accelerator().synchronize()。 false

profile: [布尔值]

描述 默认值
记录每个检查点函数的前向和后向时间。 false

稀疏注意力

sparse_attention: [字典]

字段 示例
模式 确定稀疏结构类型的字符串。Deepspeed 目前支持"dense""fixed""bigbird""bslongformer""variable" "fixed"
确定块大小的整数。稀疏自注意力目前的实现是基于分块稀疏矩阵。其中此参数定义此类块的大小,Block X Block 16
different_layout_per_head 一个布尔值,确定每个 head 是否应该分配不同的稀疏布局;这将根据可用性得到满足。 false
num_local_blocks 一个整数,确定每个块行中随机块的数量;仅在"fixed"模式下使用。 4
num_global_blocks 一个整数,确定局部窗口中多少个连续块用作全局注意力的窗口代表;用于"fixed""bigbird"模式。 1
注意力 一个确定注意力类型的字符串。注意力可以是"unidirectional",例如自回归模型,其中标记仅关注上下文中出现在它们之前的标记。考虑到这一点,注意力矩阵的上三角为空。或者它可以是"bidirectional",例如 BERT,其中标记可以关注它们之前或之后的任何其他标记。然后,注意力矩阵的上三角部分是下三角的镜像;用于"fixed""variable"模式。 "bidirectional"
horizontal_global_attention 一个布尔值,确定作为局部窗口全局代表的块是否也关注所有其他块。仅当注意力类型为"bidirectional"时才有效。查看注意力矩阵,这意味着全局注意力不仅包括垂直块,还包括水平块;用于"fixed""variable"模式。 false
num_different_global_patterns 一个整数,确定不同全局注意力布局的数量。虽然全局注意力可以通过哪个块/块作为任何局部窗口的代表来固定,但由于存在多头,因此每个头可以使用不同的全局代表;仅在"fixed"模式下使用。 4
num_random_blocks 一个整数,确定每个块行中随机块的数量;用于"variable""bigbird"模式。 0
local_window_blocks 一个整数列表,确定每个局部注意力窗口中的块数。它假设第一个数字确定第一个局部窗口中的块数,第二个确定第二个窗口,……,最后一个数字确定剩余局部窗口中的块数;仅在"variable"模式下使用。 [4]
global_block_indices 一个整数列表,确定哪些块被视为全局注意力。给定索引,确定所有其他标记块关注的块以及它们关注所有其他标记块。请注意,如果设置了 global_block_end_indices 参数,则此参数将用作每个全局窗口的起始索引;用于"variable""bslongformer"模式。 [0]
global_block_end_indices 一个整数列表,确定全局窗口块的结束索引。默认情况下不使用此功能。但如果设置了它,它必须与 global_block_indices 参数具有相同的大小,并且结合这两个参数,对于每个索引 i,从 global_block_indices[i] 到 global_block_end_indices[i](不包括)的块被视为全局注意力;用于"variable""bslongformer"模式。
num_sliding_window_blocks 一个整数,确定滑动局部注意力窗口中的块数;用于"bigbird""bslongformer"模式。 3

sparse_attention示例

  "sparse_attention": {
    "mode": "fixed",
    "block": 16,
    "different_layout_per_head": true,
    "num_local_blocks": 4,
    "num_global_blocks": 1,
    "attention": "bidirectional",
    "horizontal_global_attention": false,
    "num_different_global_patterns": 4,
    "num_random_blocks": 0,
    "local_window_blocks": [4],
    "global_block_indices": [0],
    "global_block_end_indices": None,
    "num_sliding_window_blocks": 3
  }

数据效率

DeepSpeed 数据效率库包含两种技术:课程学习和随机分层标记丢弃(随机-LTD)。在我们的教程中阅读有关如何使用 DeepSpeed 数据效率库的更多信息。

"data_efficiency": {
  "enabled": true,
  "seed": 1234,
  "data_routing": {
    "enabled": true,
    "random_ltd":{
      "enabled": true,
      "total_layer_num": 24,
      "random_ltd_layer_num": 22,
      "random_ltd_layer_id": [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22],
      "model_mask_name": "attention_mask",
      "model_type": "decoder",
      "hidden_state_order": "seq_batch_dim",
      "random_ltd_schedule": {
        "min_value": 128,
        "max_value": 2048,
        "schedule_type":"fixed_linear",
        "schedule_config": {
          "require_steps": 200000,
          "seq_per_step": 16
        }
      }
    }
  },
  "data_sampling": {
    "enabled": true,
    "num_epochs": 1,
    "num_workers": 0,
    "curriculum_learning": {
      "enabled": true,
      "data_cluster_path": "/path/to/data_clusters",
      "curriculum_metrics": {
        "vocabularyrarity": {
          "index_to_sample_path": "/path/to/index_to_sample",
          "index_to_metric_path": "/path/to/index_to_metric",
          "difficulty_type": "percentile",
          "clustering_type": "schedule_based",
          "min_difficulty": 1,
          "max_difficulty": 100,
          "schedule_type": "fixed_root",
          "schedule_config": {
            "total_curriculum_step": 110000,
            "difficulty_step": 1,
            "root_degree": 2
          }
        }
      }
    }
  }
}

data_efficiency: [字典]

字段 默认值
enabled: [布尔值] 启用或禁用数据效率。 false
seed: [整数] 数据采样的随机种子。 1234
data_routing: [字典] 数据路由技术的配置。 N/A
data_sampling: [字典] 数据采样技术的配置。 N/A

data_routing: [字典]

字段 默认值
enabled: [布尔值] 启用或禁用数据路由技术。 false
random_ltd: [字典] 随机-LTD 技术的配置。 N/A

data_sampling: [字典]

字段 默认值
enabled: [布尔值] 启用或禁用数据采样技术。 false
num_epochs: [整数] 最多迭代原始数据集多少个 epoch。 1000
num_workers: [整数] 数据加载器的 worker 数量。 0
curriculum_learning: [字典] 课程学习技术的配置。 N/A

random_ltd: [字典]

字段 默认值
enabled: [布尔值] 启用或禁用随机-LTD 技术。 false
total_layer_num: [整数] 预训练/微调模型的层数(或深度)。 N/A
random_ltd_layer_num: [整数] 将应用随机-LTD 的层数。 N/A
random_ltd_layer_id: [列表] 将应用随机-LTD 的确切层 ID。此列表的长度必须与random_ltd_layer_num相同。 N/A
model_mask_name: [字符串] attention_mask 的变量名。不同的库有不同的名称,例如 att_mask。对于 huggingface 模型,它被命名为“attention_mask”。用户需要检查原始模型文件中的前向函数。如果原始模型前向函数中的 attention mask 输入不是关键字/命名参数(例如,attention_mask=None),用户需要将其更改为关键字/命名参数并提供该关键字作为model_mask_name N/A
model_type: [字符串] 用户需要识别模型是decoder还是encoder。目前我们只支持这两种。 N/A
hidden_state_order: [字符串] 用户需要知道隐藏状态张量的输入顺序。通常,它是批次、序列,然后是隐藏维度,即batch_seq_dim。有时,批次和序列之间的顺序会切换,例如seq_batch_dim。目前,我们支持这两种。 N/A
random_ltd_schedule: [字典] 标记丢弃后有效序列长度的计划。它是一个线性函数,其中随机-LTD 逐渐减少丢弃的标记并增加有效序列长度。 N/A
  min_value: [整数] 步骤/迭代 0 处的初始有效序列长度(标记丢弃后)。 N/A
  max_value: [整数] 最大有效序列长度(通常是没有标记丢弃的情况)。通常将其设置为基线的 seqlen。 N/A
  schedule_type: [字符串] 序列长度遵循从min_value开始并达到max_value的线性递增函数。我们目前只支持此类型。 N/A
  schedule_config: [字典] 线性递增函数的配置。 N/A
    require_steps: [整数] 从 min_value 到达 max_value 需要多少次迭代。 N/A
    seq_per_step: [整数] 在任何时候,有效序列长度都是此seq_per_step的倍数。将其设置为 8 的倍数(对于 FP16 数据)或 16 的倍数(对于 INT8 数据)以启用 NVIDIA Tensor Core 加速。 N/A

curriculum_learning: [字典]

字段 默认值
enabled: [布尔值] 启用或禁用课程学习技术。 false
data_cluster_path: [字符串] 课程学习将存储在同一难度范围内的数据样本索引的目录路径。 N/A
curriculum_metrics: [字典]

此字典包含所有所需的课程指标及其配置。每个指标都将是一个单独的子字典,其中键是指标名称,值是在其下面的配置。 N/A
  index_to_sample_path: [str] 离线数据分析期间生成的 index_to_sample 文件的路径。请注意,数据分析将生成两种 index_to_sample 文件:metric_name_index_to_sample_percentile_merged 文件是用于性能提升的合并索引,但仅在您将 difficulty_type 设置为 percentile 时才有效。如果您使用 difficulty_type=value,则需要更改此设置以使用 metric_name_index_to_sample 文件。 N/A
  index_to_metric_path: [str] 离线数据分析期间生成的 index_to_metric_path 文件的路径。 N/A
  difficulty_type: [str] 在训练期间,如何增加最大接受难度。目前支持 value(按绝对值增加)和 percentile(按难度百分位数增加)。 N/A
  clustering_type: [str] 目前支持 schedule_based(基于下面的难度计划(步调函数)对数据进行聚类)和 single_cluster(不需要聚类,并且 CL 可能通过数据后处理实现,例如序列长度截断)。 N/A
  min_difficulty: [integer] 第一步的起始难度。当 difficulty_type=value 时,min_difficulty 是一个绝对难度值。当 difficulty_type=percentile 时,min_difficulty 是一个难度百分位数。 N/A
  max_difficulty: [integer] 最终最大难度。当 difficulty_type=value 时,max_difficulty 是一个绝对难度值。当 difficulty_type=percentile 时,max_difficulty 是一个难度百分位数。 N/A
  schedule_type: [字符串] 难度计划(步调函数),定义在训练期间最大接受难度如何从 min_difficulty 增加到 max_difficulty。目前支持 fixed_linearfixed_rootfixed_discretecustom N/A
  schedule_config: [字典] 步调函数的配置。当 schedule_type=custom 时,此字典不是必需的。相反,用户需要提供一个回调函数(通过 deepspeed/runtime/engine.py 中的 set_custom_curriculum_learning_schedule API),该函数将在训练期间更新最大接受难度。以下配置都属于 schedule_config N/A
    total_curriculum_step: [integer] 课程学习从最小难度到最大难度需要多少步。用于 fixed_linearfixed_root 计划。 N/A
    difficulty_step: [integer] 每步确定的最大接受难度级别必须是此 difficulty_step 的倍数。这用于确保使用 NVIDIA Tensor Core 加速(需要 8 的倍数(FP16)或 16 的倍数(INT8))。用于 fixed_linearfixed_root 计划。 N/A
    root_degree: [integer] 根函数的次数。次数为 2 表示平方根,次数为 3 表示立方根。次数为 1 等效于线性。用于 fixed_root 计划。 N/A
    difficulty: [list] 计划期间要使用的最大接受难度级别的列表。用于 fixed_discrete 计划。 N/A
    max_step: [list] 更改最大接受难度级别的步骤列表。用于 fixed_discrete 计划。 N/A

课程学习

注意:在 2022 年 12 月 12 日,我们发布了 深度加速器数据效率库,该库提供了更通用的课程学习支持。以下旧版课程学习功能仍然受支持,但我们建议使用数据效率库。

  "curriculum_learning": {
    "enabled": true,
    "curriculum_type": "seqlen",
    "min_difficulty": 8,
    "max_difficulty": 1024,
    "schedule_type": "fixed_linear",
    "schedule_config": {
      "total_curriculum_step": 40000,
      "difficulty_step": 8
    }
  }

enabled: [布尔值]

描述 默认值
设置为 true 以启用课程学习 false

curriculum_type: [string]

描述 默认值
课程难度指标的类型。目前支持 seqlen N/A

min_difficulty: [integer]

描述 默认值
起始难度级别 N/A

max_difficulty: [integer]

描述 默认值
结束难度级别 N/A

schedule_type: [string]

描述 默认值
课程计划的类型。目前支持 fixed_linearfixed_rootfixed_discrete N/A

total_curriculum_step: [integer]

描述 默认值
课程学习的总步数。当使用 fixed_linearfixed_root 计划类型时,它是 schedule_config 中的一个。 N/A

difficulty_step: [integer]

描述 默认值
在任何时候,课程学习难度都必须是此 difficulty_step 的倍数。将其设置为 8 的倍数(对于 FP16 数据)或 16 的倍数(对于 INT8 数据)以启用 NVIDIA Tensor Core 加速。当使用 fixed_linearfixed_root 计划类型时,它是 schedule_config 中的一个。 N/A

root_degree: [integer]

描述 默认值
课程计划函数的根次数。当使用 fixed_root 计划类型时,它是 schedule_config 中的一个。 N/A

difficulty: [整数列表]

描述 默认值
计划期间要使用的难度级别的列表。当使用 fixed_discrete 计划类型时,它是 schedule_config 中的一个。 N/A

max_step: [整数列表]

描述 默认值
更改难度级别的步骤列表。当使用 fixed_discrete 计划类型时,它是 schedule_config 中的一个。 N/A

监控模块

注意:深度加速器通过 PyTorch 将日志记录到 TensorBoard。记录到 TensorBoard 需要安装 tensorboard 包(在 PyTorch 文档 中了解更多信息)。

注意:记录到 WandB 需要安装 wandb 包(在 WandB 文档 中了解更多信息)。

注意:记录到 Comet 需要安装 comet_ml 包(在 Comet 文档 中了解更多信息)。

深度加速器的 Monitor 模块可以将训练细节记录到与 Tensorboard 兼容的文件、WandBComet 或简单的 CSV 文件中。以下是深度加速器将自动记录的内容概述。

字段 描述 条件
Train/Samples/train_loss 训练损失。
Train/Samples/lr 训练期间的学习率。
Train/Samples/loss_scale 使用 fp16 进行训练时的损失缩放。 fp16 必须启用。
Train/Eigenvalues/ModelBlockParam_{i} 每个参数块的特征值。 eigenvalue 必须启用。
Train/Samples/elapsed_time_ms_forward 前向传递的全局持续时间。 flops_profiler.enabledwall_clock_breakdown
Train/Samples/elapsed_time_ms_backward 前向传递的全局持续时间。 flops_profiler.enabledwall_clock_breakdown
Train/Samples/elapsed_time_ms_backward_inner 不包括梯度规约时间的反向传播时间。仅在梯度规约不重叠的情况下,如果重叠,则内部时间应与整个反向传播时间大致相同。 flops_profiler.enabledwall_clock_breakdown
Train/Samples/elapsed_time_ms_backward_allreduce Allreduce 操作的全局持续时间。 flops_profiler.enabledwall_clock_breakdown
Train/Samples/elapsed_time_ms_step 优化器步骤时间 flops_profiler.enabledwall_clock_breakdown

tensorboard: [dictionary]

字段 默认值
enabled 是否启用记录到 Tensorboard false
output_path Tensorboard 日志将写入到的路径。如果为 None,则输出路径设置为训练脚本的启动路径下。 null
job_name 当前作业的名称。这将成为 output_path 内的新目录。 "DeepSpeedJobName"

tensorboard 配置示例

"tensorboard": {
    "enabled": true,
    "output_path": "output/ds_logs/",
    "job_name": "train_bert"
}

wandb: [dictionary]

字段 默认值
enabled 是否启用记录到 WandB false
group WandB 组的名称。这可用于将运行分组在一起。
team WandB 团队的名称。
project WandB 项目的名称。 deepspeed

wandb 配置示例

"wandb": {
    "enabled": true,
    "group": "my_group",
    "team": "my_team",
    "project": "my_project"
}

comet: [dictionary]

字段 默认值
enabled 是否启用记录到 Comet false
workspace Comet 工作区名称。
project Comet 项目名称。
samples_log_interval 处理完每 samples_log_intervas 个样本后,指标将提交到 Comet。 100
experiment_name 用于日志记录的 Comet 实验名称。
api_key Comet API 密钥。不建议在代码中保存 Comet API 密钥。
experiment_key 用于日志记录的 Comet 实验密钥。必须是长度在 32 到 50 个字符之间的字母数字字符串。
online 如果为 True,则数据将记录到 Comet 服务器,否则将存储在离线实验的本地。默认为 True
模式 控制 Comet 实验的启动方式。“get”:继续记录到由 experiment_key 值标识的现有实验。“create”:始终创建一个新实验,这对 HPO 扫描很有用。“get_or_create”(默认):在需要时启动一个新的实验,或持续记录到一个现有的实验。

comet 配置示例

"comet": {
    "enabled": true,
    "workspace": "my_workspace",
    "project": "my_project",
    "samples_log_interval": 50,
    "experiment_name": "llama-fine-tuning",
    "experiment_key": "0c4a1c4a90664f2a8084e600b19a9d7",
    "online": false,
    "mode": "get",
}

csv_monitor: [dictionary]

字段 默认值
enabled 是否启用记录到本地 CSV 文件。 false
output_path csv 文件写入的路径。如果为 None,则输出路径设置为训练脚本启动路径下的路径。 null
job_name 当前作业的名称。这将在 output_path 内部创建一个新目录。 "DeepSpeedJobName"

csv_monitor 配置示例

"csv_monitor": {
    "enabled": true,
    "output_path": "output/ds_logs/",
    "job_name": "train_bert"
}

弹性训练配置 (V0.1 和 V0.2)

  "elasticity": {
    "enabled": true,
    "max_train_batch_size": "seqlen",
    "micro_batch_sizes": 8,
    "min_gpus": 1024,
    "max_gpus": "fixed_linear",
    "min_time": "seqlen",
    "version": 8,
    "ignore_non_elastic_batch_info": 1024,
    "num_gpus_per_node": "fixed_linear",
    "model_parallel_size": MODEL_PARALLEL_SIZE
  }
字段 描述 默认值
enabled 启用弹性训练中全局批大小的计算。 false
最大训练批大小 训练中可接受的最大批大小。 2000
微批大小 可接受的微批大小,与 train_micro_batch_size_per_gpu 相同。 [2,4,6]
最小GPU数 在 v0.1 和 v0.2 中计算高度复合批大小时要搜索的最小 GPU 数。 1
最大GPU数 在 v0.1 和 v0.2 中计算高度复合批大小时要搜索的最大 GPU 数。 10000
最短时间 调度程序再次扩展之前最短运行时间(分钟)(仅在 v0.1 中使用)。0 表示未知 0
优先选择大批次 在找到合适的批大小时,尝试找到最接近给定最大训练批大小的批大小。 true
版本 要使用的弹性逻辑版本。 0.2
忽略非弹性批次信息 忽略弹性配置之外提供的所有批次信息。为了减少混淆,我们要求所有与批次相关的信息都仅在弹性配置中给出。 false
每个节点的GPU数 每个节点的 GPU 数。v0.2 使用此信息来支持模型并行训练(仅 v0.2 使用)。 1
模型并行大小 张量或模型并行大小(仅 v0.2 使用)。 1

通信日志记录

DeepSpeed 提供了一个灵活的通信日志记录工具,该工具可以自动检测和记录通过 deepspeed.comm 启动的通信操作。注意:所有记录通信调用都是同步的,以便提供准确的时间信息。如果您的模型大量使用异步通信操作,这可能会影响性能。

填充日志后,可以使用 deepspeed.comm.log_summary() 对其进行汇总。有关更多详细信息和使用示例,请参阅 教程

comms_logger: [字典]

字段 默认值
enabled 是否启用通信日志记录。 false
详细 是否立即打印每个通信操作。 false
分析所有操作 是否分析所有操作。 true
调试 将调用函数追加到每个通信操作的 log_name 中。 false
分析操作 要记录的通信操作列表(仅分析指定的操作)。 []

推荐的 comms_logger 配置示例

"comms_logger": {
  "enabled": true,
  "verbose": false,
  "prof_all": true,
  "debug": false
}

仅记录特定操作的 comms_logger 配置示例

"comms_logger": {
  "enabled": true,
  "verbose": false,
  "prof_all": false,
  "debug": false,
  "prof_ops": ["all_reduce", "all_gather"]
}

压缩

注意:压缩 包含七个不同的组件,包括层减少、权重量化、激活量化、稀疏剪枝、行剪枝、头部剪枝和通道剪枝。我们使用简单的 json 示例逐一解释它们。在我们的 教程 中了解更多关于如何使用 DeepSpeed 压缩库的信息。

层减少

注意:使用知识蒸馏时,层减少效果更好(在我们的 教程 中了解更多信息)。

"compression_training": {
    "layer_reduction": {
      "enabled": true,
      "keep_number_layer": 5,
      "module_name_prefix": "bert.encoder.layer",
      "teacher_layer": [
        2,
        4,
        6,
        8,
        10
      ],
      "other_module_name": [
        "bert.pooler",
        "bert.embeddings",
        "classifier"
      ]
    }
  }

layer_reduction: [字典]

字段 默认值
enabled: [布尔值] 是否启用层减少。 false
keep_number_layer: [列表] 要保留的模型中的层数。 N/A
module_name_prefix: [字符串] 模型模块的(统一)名称前缀,其关联的权重参数将被重新初始化。 N/A
teacher_layer: [列表] 要重新初始化的权重参数的层。列表的长度等于“keep_number_layer”。 N/A
other_module_name: [列表] 要重新初始化其关联权重参数的模块的名称。它是 module_name_prefix 的补充或替代。例如,“other_module_name”: [“bert.encoder.layer.2”,”bert.encoder.layer.4”] 等于 “module_name_prefix”:”bert.encoder.layer” 和 “teacher_layer”: [2,4]。 N/A

权重量化

  "compression_training": {
  "weight_quantization": {
    "shared_parameters":{
      "enabled": true,
      "quantizer_kernel": false,
      "schedule_offset": 0,
      "quantize_groups": 1,
      "quantize_verbose": false,
      "quantization_type": "symmetric",
      "rounding": "nearest",
      "quantize_weight_in_forward": false,
      "fp16_mixed_quantize":{
        "enabled": false,
        "quantize_change_ratio": 0.001
      }
    },
    "different_groups":{
      "wq1": {
        "params": {
            "start_bits": 8,
            "target_bits": 8,
            "quantization_period": 50
        },
        "modules": [
          "attention.self",
          "intermediate"
        ]
      },
      "wq2": {
        "params": {
            "start_bits": 4,
            "target_bits": 4,
            "quantization_period": 50
        },
        "modules": [
          "attention.output"
        ]
      }
    }
  }
  }

shared_parameters: [字典]

所有权重量化组的共享参数。

字段 默认值
enabled: [布尔值] 是否启用权重量化。 false
quantizer_kernel: [布尔值] 对于 >=4 位量化,使用 DeepSpeed 量化内核。只有在使用 DeepSpeed FP16 优化器时才能启用此功能。 false
schedule_offset: [整数] 在计划的步骤后启用权重量化(可以视为预热步骤)。 0
quantize_groups: [整数] 将权重矩阵分成不同的组数,每个组都有自己的缩放因子。 1
quantize_verbose: [布尔值] 打印与量化相关的日志。 false
quantization_type: [字符串] 选择量化算法,对称或非对称。 "对称"
rounding: [字符串] 与量化相关的舍入算法,最近邻或随机。 "最近邻"
quantize_weight_in_forward: [布尔值] 在优化器或前向步骤中量化权重,对于 FP32 优化器训练必须设置为 true。 false
fp16_mixed_quantize: [字典] 使用 FP16 值和量化值的混合值。 N/A
  enabled: [布尔值] 是否启用 FP16 混合量化。 false
  quantize_change_ratio: [浮点数] 初始量化值比率,将逐渐增加到 1。 0.001

different_groups: [字典]

不同的量化集,这用于不同的量化参数。在此示例中,我们给出了两个不同的集合。在实践中,您可以根据您的需求选择集合的数量。

字段 默认值
params: [字典]    
  start_bits: [整数] 量化起始位数,将逐渐减少到目标位数。 8
  target_bits: [整数] 量化目标位数,需要 <= start_bits。 8
  quantization_period: [整数] 每隔 n 步,量化位数将减少 1。 1
modules: [列表] 与 params 设置关联的权重参数的范围。 "所有线性层和 CONV2D 层"

激活量化

"compression_training": {
  "activation_quantization": {
    "shared_parameters":{
      "enabled": true,
      "quantization_type": "asymmetric",
      "range_calibration": "dynamic",
      "schedule_offset": 50
    },
    "different_groups":{
      "aq1": {
        "params": {
            "bits": 8
        },
        "modules": [
          "attention.output"
        ]
      }
    }
  }

shared_parameters: [字典]

所有激活量化组的共享参数。

字段 默认值
enabled: [布尔值] 是否启用激活量化。 false
quantization_type: [字符串] 选择量化算法,对称或非对称。 "对称"
range_calibration: [字符串] 使用动态(每个标记或每个图像)或静态(使用动量固定最小/最大值)进行推理。 "静态"
schedule_offset: [整数] 在计划的步骤后启用激活量化(可以视为预热步骤)。 0

different_groups: [字典]

不同的量化集,这用于不同的量化参数。在此示例中,我们给出了一个集合。在实践中,您可以根据您的需求选择集合的数量。

字段 默认值
params: [字典]    
  bits: [整数] 用于激活目标位数的位数,需要 >= 4。 8
modules: [列表] 与 params 设置关联的权重参数的范围。 "所有线性层和 CONV2D 层"

稀疏剪枝

"compression_training": {
  "sparse_pruning":{
    "shared_parameters":{
      "enabled": true,
      "schedule_offset": 30,
      "method": "l1"
    },
    "different_groups":{
      "sp1": {
        "params": {
            "dense_ratio": 0.5
        },
        "modules": [
          "attention.self"
        ]
      }
    }
  }
}
"compression_training": {
  "sparse_pruning":{
    "shared_parameters":{
      "enabled": true,
      "schedule_offset": 30,
      "schedule_offset_end": 90,
      "schedule_offset_stride": 15,
      "method": "snip_momentum",
      "block_pattern": "4x1",
      "dense_ratio": 0.4,
      "excluded_modules": ['classifier', 'pooler']
    },
    "different_groups":{
    }
  }
}

shared_parameters: [字典]

所有稀疏剪枝组的共享参数。

字段 默认值
enabled: [布尔值] 是否启用稀疏剪枝。 false
schedule_offset: [整数] 在计划的步骤后启用稀疏剪枝(可以视为预热步骤)。 0
schedule_offset_end: [整数] 在计划的步骤后禁用稀疏剪枝,对于 snip_momentum 来说是强制性的。 0
schedule_offset_stride: [整数] 剪枝在训练步骤上的步长,对于 snip_momentum 来说是强制性的。 "1"
method: [字符串] 选择不同的剪枝方法,l1(静态,基于幅度)、topk(动态,可学习)或 snip_momentum(结构化剪枝)。 "l1"
block_pattern: [字符串] 选择不同的结构化剪枝块模式,NxM 或 N:M(N 和 M 是整数)。例如,“4x1”或“2:4”是常见的块模式,对于 snip_momentum 来说是强制性的。 "4x1"
dense_ratio: [浮点数] 用于获取目标全局稀疏率,对于 snip_momentum 来说是强制性的。 "0.1"
excluded_modules: [列表] 在某些特殊模块(如输出层)上排除剪枝范围。 []

different_groups: [字典]

不同的剪枝集,这用于不同的剪枝参数。在此示例中,我们给出了一个集合。在实践中,您可以根据您的需求选择集合的数量。注意,对于 snip_momentum 方法,您可以将其保留为空。

字段 默认值
params: [字典]    
  dense_ratio: [浮点数] 剪枝后要保留的权重百分比。 0.5
modules: [列表] 与 params 设置关联的权重参数的范围。 "所有线性层和 CONV2D 层"

行剪枝

注意:行剪枝 是一项专为两个连续的线性层(例如,Transformer 中的前馈网络)设计的特性。因此,我们建议将行剪枝用于第一个线性层(即 BERT 的 intermediate.dense 层)。减少此矩阵的行维度有助于减少后续矩阵(即 BERT 的 layer.\\w+.output.dense 层)的列。它也应该适用于其他线性层。

"compression_training": {
  "row_pruning":{
    "shared_parameters":{
      "enabled": true,
      "schedule_offset": 20,
      "method": "topk"
    },
    "different_groups":{
      "rp1": {
        "params": {
            "dense_ratio": 0.5
        },
        "modules": [
          "intermediate.dense"
        ],
        "related_modules":[
          ["layer.\\w+.output.dense"]
        ]
      }
    }
  }
}

shared_parameters: [字典]

所有行剪枝组的共享参数。

字段 默认值
enabled: [布尔值] 是否启用行剪枝。 false
schedule_offset: [整数] 在计划的步骤后启用行剪枝(可以视为预热步骤)。 0
method: [字符串] 选择不同的剪枝方法,l1(静态,基于幅度)或 topk(动态,可学习)。 "l1"

different_groups: [字典]

不同的剪枝集,这用于不同的剪枝参数。在此示例中,我们给出了一个集合。在实践中,您可以根据您的需求选择集合的数量。

字段 默认值
params: [字典]    
  dense_ratio: [浮点数] 剪枝后要保留的权重百分比。 0.5
modules: [列表] 与 params 设置关联的权重参数的范围。 "所有线性层和 CONV2D 层"
related_modules: [列表[列表]] 与行剪枝模块相关的模块,可以对其执行列剪枝。

头部剪枝

注意:头部剪枝 是一项专为两个注意力层(例如,Transformer 中的多头注意力)设计的特性。目前,它只能应用于 Transformer 的输出矩阵(即 BERT 中的 attention.output.dense)。剪枝输出矩阵还可以导致查询/键/值矩阵的剪枝。

"compression_training": {
  "head_pruning":{
    "shared_parameters":{
      "enabled": true,
      "schedule_offset": 10,
      "method": "topk",
      "num_heads": 12
    },
    "different_groups":{
      "rp1": {
        "params": {
            "dense_ratio": 0.5
        },
        "modules": [
          "attention.output.dense"
        ],
        "related_modules":[
          ["self.query", "self.key", "self.value"]
        ]
      }
    }
  }
}

shared_parameters: [字典]

所有头部剪枝组的共享参数。

字段 默认值
enabled: [布尔值] 是否启用头部剪枝。 false
schedule_offset: [整数] 在计划的步骤后启用头部剪枝(可以视为预热步骤)。 0
method: [字符串] 选择不同的剪枝方法。目前,我们只支持 topk(动态,可学习)。 "topk"
num_heads: [整数] 头数(必须由用户提供)。 N/A

different_groups: [字典]

不同的剪枝集,这用于不同的剪枝参数。在此示例中,我们给出了一个集合。在实践中,您可以根据您的需求选择集合的数量。

字段 默认值
params: [字典]    
  dense_ratio: [浮点数] 剪枝后要保留的权重百分比。 0.5
modules: [列表] 与 params 设置关联的权重参数的范围。 "所有线性层和 CONV2D 层"
related_modules: [列表[列表]] 与头部剪枝模块(即输出矩阵)相关的模块(通常是 Q/K/V)。目前,此功能仅适用于 BERT。

通道剪枝

注意:通道剪枝 是一项专为两个连续的 CONV2d 层(例如,ResNet 中的残差连接)设计的特性。因此,我们建议将通道剪枝用于第一个 CONV2d 层。减少此层的输出通道数有助于减少后续层的输入通道数。它也应该适用于其他 CONV2d 层。

"compression_training": {
"channel_pruning":{
      "shared_parameters":{
        "enabled": true,
        "schedule_offset": 0,
        "method": "topk"
      },
      "different_groups":{
        "cp1": {
          "params": {
              "dense_ratio": 0.5
          },
          "modules": [
            "layer....conv1"
          ],
          "related_modules": [
            ["layer....conv2", "layer....bn1"]
          ]
        }
      }
    }
}

shared_parameters: [字典]

所有通道剪枝组的共享参数。

字段 默认值
enabled: [布尔值] 是否启用通道剪枝。 false
schedule_offset: [整数] 在计划的步骤后启用通道剪枝(可以视为预热步骤)。

0
method: [字符串] 选择不同的剪枝方法,l1(静态,基于幅度)或 topk(动态,可学习)。 "l1"

different_groups: [字典]

不同的剪枝集,这用于不同的剪枝参数。在此示例中,我们给出了一个集合。在实践中,您可以根据您的需求选择集合的数量。

字段 默认值
params: [字典]    
  dense_ratio: [浮点数] 剪枝后要保留的权重百分比。 0.5
modules: [列表] 与 params 设置关联的权重参数的范围。 "所有 CONV2D 层"
related_modules: [列表[列表]] 与通道剪枝模块相关的模块。

检查点选项

"checkpoint": {
    "tag_validation"="Warn",
    "load_universal"=false,
    "use_node_local_storage"=false,
    "parallel_write":{
        "pipeline_stage": false
    }
}
tag_validation: [“忽略” “警告” “失败”]
描述 默认值
启用检查级别以确保检查点标签在所有等级之间一致。在使用不同世界规模恢复时很有用。 “警告”

load_universal: [布尔值]

描述 默认值
加载所有最新检查点。 false

use_node_local_storage: [布尔值]

描述 默认值
如果 true,DeepSpeed 将根据本地排名存储模型参数状态和检查点状态,从而允许在没有访问共享文件系统的情况下加载检查点。 false

pipeline_stage: [布尔值]

描述 默认值
使用流水线阶段并行化检查点的写入。 false

数据类型选项

"data_types": {
    "grad_accum_dtype"=["fp32"|"fp16"|"bf16"]
    }
}
grad_accum_dtype: [“fp32” “fp16” “bf16”]
描述 默认值
指定执行梯度累积的数据类型。如果为 None,则默认为与模型类型匹配。