deepspeed的参数很多,都可以在ds_config里面配置,字典格式,但是英文文档让人看着总感觉不习惯,所以,看完英文文档的同时,将其部分翻译成中文文档,以供后续训练的时候观看。
deepspeed的参数
train_batch_size = train_micro_batch_size_per_gpu * gradient_accumulation *GPU train_batch_size:int 如果同时提供了train_micro_batch_size_per_gpu和gradient_accumulation_steps,则可以省略 train_micro_batch_size_per_gpu:int gradient_accumulation_steps:int 会累计梯度,降低通信频率,但是会造成更大的内存
优化器:
"optimizer": { "type": "Adam", "params": { "lr": 0.001, "betas": [ 0.8, 0.999 ], "eps": 1e-8, "weight_decay": 3e-7 } } #one bit Adam "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, 指示底层 MPI 库支持 CUDA-Aware 通信 "comm_backend_name": "nccl" 通讯后端名称 } } # 0/1Adam "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,指示底层 MPI 库支持 CUDA-Aware 通信 "comm_backend_name": "nccl"指示要使用哪个后端实现 } } 1 Bit Adam 的另一个例子 "optimizer": { "type": "OneBitLamb", "params": { "lr": 11e-3, "weight_decay": 0.01, "bias_correction": false, "max_coeff": 0.3, 原始 LAMB 算法的缩放系数上限和 1 位 LAMB 的预热阶段 "min_coeff": 0.01,原始 LAMB 算法和 1 位 LAMB 预热阶段的缩放系数下限 "freeze_step": 1000, 原始 LAMB 算法和 1 位 LAMB 预热阶段的缩放系数下限 "cuda_aware": false, "comm_backend_name": "nccl", "coeff_beta": 0.9, "factor_max": 4.0, "factor_min": 0.5, "factor_threshold": 0.1 } }
调度器
调度器的链接Learning Rate Schedulers — DeepSpeed 0.10.4 documentation
"scheduler": { "type": "WarmupLR", "params": { "warmup_min_lr": 0, "warmup_max_lr": 0.001, "warmup_num_steps": 1000 } }
通信时候的优化器
communication_data_type:在梯度平均期间,使用选定的数据类型执行通信。默认情况下,它将由选定的制度决定 prescale_gradients: [boolean]在进行 allreduce 之前缩放梯度 gradient_predivide_factor: [float] 在梯度平均之前按指定因子预除梯度,有时可以在扩展到大量 GPU 时帮助提高 fp16 稳定性 sparse_gradients: [boolean]
FP16训练
不能和混合精度训练amp一起使用
利用NVIDIA 的 Apex 包,使用混合精度/FP16 训练的配置,如果想使用ZERO必须使用
"fp16": { "enabled": true, "auto_cast": false, #自动将输入转换为fp16 "loss_scale": 0,#loss_scale是一个fp16参数,表示FP16训练的损失缩放值。默认值 0.0 会导致动态损失缩放,否则该值将用于静态固定损失缩放。 "initial_scale_power": 16, "loss_scale_window": 1000, loss_scale_window是一个fp16参数,表示升高/降低动态损失比例值的窗口 "hysteresis": 2,#表示动态损耗缩放中的延迟偏移 "consecutive_hysteresis": false, #表示如果我们达到不溢出的迭代,是否重新填充滞后 "min_loss_scale": 1#参数,表示最小动态损失比例值 }
BF16
需要硬件支持(比如NV A100)
"bf16": { "enabled": true }
自动混合精度训练(AMP)
会调用NV的Apex AMP包,和zero和fp16都不兼容
“启用”之外的任何参数都将传递给 AMP 的初始化调用,请参阅apex.amp.initialize 文档中的 API 和说明。
"amp": { "enabled": true, ... "opt_level": "O1", ... }
启用和配置 ZeRO 内存优化
启用ZeRO内存优化,兼容FP16/BF16/FP32和Adam优化器。
"zero_optimization": { "stage": [0|1|2|3], #阶段0,1,2,3 "allgather_partitions": [true|false],在所有收集集体或一系列广播集体之间进行选择,以在每个步骤结束时从所有 GPU 收集更新的参数 "allgather_bucket_size": 5e8,#一次聚集的元素数量。限制大模型大小的全聚集所需的内存 "overlap_comm": false, 尝试将梯度的减少与后向计算重叠 false "reduce_scatter": [true|false],#average gradients的时候使用reduce或 reduce scatter而不是allreduce "reduce_bucket_size": 5e8, #一次reduce/allreduce 的元素数量。限制allgather所需的内存对于大模型模型的大小 "contiguous_gradients" : [true|false], #在生成梯度时将其复制到连续的缓冲区。避免向后传递期间出现内存碎片 "offload_param": { ... #启用将模型参数卸载到 CPU 或 NVMe。这可以释放 GPU 内存以用于更大的模型或批量大小。仅对第 3 阶段有效。请参阅https://www.deepspeed.ai/docs/config-json/#parameter-offloading解更多详细信息。 }, "offload_optimizer": { ... #启用将优化器状态卸载到 CPU 或 NVMe,并将优化器计算卸载到 CPU。这可以释放 GPU 内存以用于更大的模型或批量大小。适用于 ZeRO 第 1、2、3 阶段 请参阅此处https://www.deepspeed.ai/docs/config-json/#optimizer-offloading了解更多详细信息 }, "stage3_max_live_parameters" : 1e9,释放前每个GPU驻留的最大参数数量。较小的值使用较少的内存,但执行更多的通信 "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],在保存模型之前合并权重save_16bit_model()。由于权重跨 GPU 进行分区,因此它们不是 的一部分state_dict,因此启用此选项时此函数会自动收集权重,然后保存 fp16 模型权重。 "ignore_unused_parameters": [true|false] "round_robin_gradients": [true|false] "zero_hpz_partition_size": 1 ZeRO++ 的分层分区 ZeRO (hpZ) 次级张量组中的等级数,默认为 1 表示没有 hpZ,理想的是每个节点的等级数 (GPU)。 "zero_quantized_weights": [true|false] #布尔值,指示是否启用 ZeRO++ 的通信高效量化权重 "zero_quantized_gradients": [true|false] #布尔值,指示是否启用 ZeRO++ 的通信高效量化梯度 } grad_hooks:为了与 ZeRO 阶段 1 一起使用,启用后向钩子以在后向传递过程中减少梯度或等到后向传递结束 round_robin_gradients:CPU 卸载的第 1 阶段和第 2 阶段优化,通过细粒度梯度分区并行地将梯度复制到 CPU 内存。性能优势随着梯度累积步骤(优化器步骤之间的更多复制)或 GPU 数量(并行度的增加)而增长。
优化器卸载
启用和配置 ZeRO 优化,将优化器计算卸载到 CPU 并将状态卸载到 CPU/NVMe。CPU 卸载适用于 ZeRO 阶段 1、2、3。NVMe 卸载仅适用于 ZeRO 阶段 3。请注意,如果未指定或不支持“device”的值,将触发断言。
"offload_optimizer": { "device": "[cpu|nvme]", 用于卸载优••化器状态的设备内存。支持的选项有cpu和nvme。无论设备选项如何,优化器计算都会卸载到 CPU。 "nvme_path": "/local_nvme",#用于优化器状态卸载的 NVMe 设备的文件系统路径。 /local_nvme "pin_memory": [true|false],#卸载到页锁定 CPU 内存。这可以提高吞吐量,但代价是额外的内存开销。false "buffer_count": 4,缓冲池中用于优化器状态卸载到 NVMe 的缓冲区数量。这至少应该是优化器为每个参数维护的状态数。例如,Adam 优化器有 4 个状态(参数、梯度、动量和方差)。 "fast_init": false 卸载到 NVMe 时启用快速优化器初始化。false }
配置异步 I/O 模块以将参数和优化器状态卸载到持久 (NVMe) 存储。该模块使用 Linux 本机异步 I/O (libaio)。
"aio": { "block_size": 1048576, "queue_depth": 8, "thread_count": 1, "single_submit": false, "overlap_events": true }
参数卸载
启用和配置参数卸载到 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 }
记录训练的过程
steps_per_print: [integer] 每 N 个训练步骤打印进度报告。该报告包括训练步骤数、跳过优化器更新的数量(可能是由于混合精度训练中的溢出)、当前学习率和当前动量。 wall_clock_breakdown : [布尔值] #启用前向/后向/更新训练阶段的延迟计时 dump_state: [boolean]:初始化后打印出DeepSpeed对象的状态信息
Autotuning
{ "autotuning": { "enabled": false, Enables the autotuner "results_dir": "autotuning_results", #自动调节实验结果目录的路径。默认值显示在启动 Deepspeed 的工作目录中 "exps_dir": "autotuning_exps", #自动调整实验描述目录的路径。默认值显示在启动 Deepspeed 的工作目录中 "overwrite": false, #是否运行结果已存在的自动调整实验。将其设置为 true 将覆盖现有结果 "metric": "throughput",#用于对自动调整实验进行排名的性能指标。latency目前支持、throughput、 和 ,FLOPS分别指每个 GPU 实现的训练步骤延迟、每秒训练样本和每秒浮点运算。 "start_profile_step": 3, 在自动调整实验中开始分析的全局训练步骤。请注意,为了准确测量性能,需要进行预热。 "end_profile_step": 5,在自动调整实验中结束分析的全局训练步骤。不得小于 start_profile_step。 "fast": true,启用快速模型自动调整,其中仅调整每个 GPU 的零级和微批量大小。 "max_train_batch_size": null,模型训练的最大训练批量大小(全局有效批量大小) "mp_size": 1,模型并行度。 "num_tuning_micro_batch_sizes": 3,要探索的微批量大小的数量。 "tuner_type": "model_based",该算法定义了 ZeRO 阶段内自动调整空间探索的顺序。 "tuner_early_stopping": 5,超出当前最佳实验的实验数量。如果在该数量内没有找到更好的实验,自动调谐器将停止探索。 "tuner_num_trials": 50,在 ZeRO 阶段的调整空间中探索的最大实验数量。 "arg_mappings": null } }
触发器分析器
{ "flops_profiler": { "enabled": false, 启用触发器分析器。这也将启用 wall_clock_breakdown "profile_step": 1, 进行概要分析的全局训练步骤。请注意,为了准确测量时间,需要进行预热步骤。 "module_depth": -1,打印聚合模块信息的模型深度。当设置为 时-1,它将打印从顶部模块到最里面模块(最大深度)的信息。 "top_modules": 1,将聚合配置文件输出限制为指定的顶级模块数 "detailed": true,是否打印详细的模型配置文件。 "output_file": null,输出文件的路径。如果没有,探查器将打印到标准输出。 } }
激活检查点
"activation_checkpointing": { "partition_activations": false, 与模型并行性一起使用时启用分区激活 "cpu_checkpointing": false,如果启用了partition_activations,则将分区激活卸载到CPU "contiguous_memory_optimization": false,复制分区激活,以便它们在内存中连续 "number_checkpoints": null,用于为连续内存优化分配内存缓冲区的激活检查点总数 "synchronize_checkpoint_boundary": false,在每个检查点边界插入 get_accelerator().synchronize()。 "profile": false记录每个检查点功能的前进和后退时间 }
稀疏注意力:[字典]
"sparse_attention": { "mode": "fixed",#确定稀疏结构类型的字符串。Deepspeed 目前支持"dense"、"fixed"、"bigbird"、"bslongformer"和"variable"。 "block": 16,确定块大小的整数。目前稀疏自注意力的实现是基于分块稀疏矩阵的。其中该参数定义了此类块的大小,Block X Block。 "different_layout_per_head": true, 一个布尔值,确定是否应为每个头分配不同的稀疏布局;这将根据可用性来满足。 "num_local_blocks": 4,一个整数,确定每个块行中随机块的数量;仅在"fixed"模式下使用 "num_global_blocks": 1,确定局部窗口中有多少个连续块的整数作为全局注意力窗口的代表;用于"fixed"和"bigbird"模式。 "attention": "bidirectional",确定注意力类型的字符串。注意力可以是"unidirectional",例如自回归模型,其中标记仅关注上下文中出现在它们之前的标记。考虑到这一点,注意力矩阵的上三角是空的。或者它可以是"bidirectional",例如 BERT,其中令牌可以关注它们之前或之后的任何其他令牌。那么,注意力矩阵的上三角部分是下三角的镜像;用于"fixed"和"variable"模式。 "horizontal_global_attention": false,一个布尔值,确定全局代表本地窗口的块是否也参与所有其他块。仅当注意力类型为 时这才有效"bidirectional"。看注意力矩阵,这意味着全局注意力不仅包括垂直块,还包括水平块;用于"fixed"和"variable"模式。 "num_different_global_patterns": 4,一个整数,确定不同全局注意力布局的数量。虽然全局注意力可以通过哪个块代表任何本地窗口来固定,但由于存在多头,每个头可以使用不同的全局代表;仅在"fixed"模式下使用。 "num_random_blocks": 0,一个整数,确定每个块行中随机块的数量;用于"variable"和"bigbird"模式。 "local_window_blocks": [4],确定每个局部注意力窗口中的块数量的整数列表。它假设第一个数字确定第一个本地窗口中的块数,第二个数字确定第二个窗口中的块数,...,最后一个数字确定剩余本地窗口中的块数;仅在模式下使用"variable"。 "global_block_indices": [0],确定哪些块被视为全局注意力的整数列表。给定索引,确定所有其他令牌块关注的块以及它们关注所有其他令牌块。注意,如果设置了global_block_end_indices参数,则该参数将用作每个全局窗口的起始索引;用于"variable"和"bslongformer"模式。 "global_block_end_indices": None,确定全局窗口块的结束索引的整数列表。默认情况下不使用此功能。但如果设置了,则必须具有相同大小的global_block_indices参数,并且结合这两个参数,对于每个索引i,从global_block_indices[i]到global_block_end_indices[i]的块,不包括,被认为是全局注意力;用于"variable"和"bslongformer"模式。 "num_sliding_window_blocks": 3一个整数,确定滑动局部注意力窗口中的块数量;用于"bigbird"和"bslongformer"模式。 }
数据效率data Efficiency
包含两个技术curriculum learning,random layerwise token dropping(LTD) ,不太懂???
data_efficiency": { "enabled": true, "seed": 1234, "data_routing": { #不适合在LTD下使用 "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, #不适合在curriculum learning下使用 "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 } } } } } }