deepspeed的参数

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
          }
        }
      }
    }
  }
}

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
DeepSpeed命令参数是指在启动容器时使用的命令参数,用于配置DeepSpeed库和Megatron-Deepspeed的相关设置。根据引用的内容,以下是DeepSpeed命令参数的解释: - -d: 启用后台模式 (detached mode),容器将在后台运行。 - -t: 分配一个伪终端 (pseudo-TTY),使得用户可以与容器进行交互。 - --network=host: 使用主机网络模式,容器将共享主机的网络命名空间。 - --gpus all: 分配所有可用的GPU给容器使用。 - --privileged: 赋予容器完全的特权,使其可以访问主机的设备。 - --ipc=host: 使用与主机共享的IPC命名空间,用于进程间通信。 - --ulimit memlock=-1: 设置内存锁定的限制为无限制,以防止内存被交换出去。 - --ulimit stack=67108864: 设置栈的限制为67108864字节,用于控制进程的栈空间。 - --name megatron-deepspeed: 为容器指定一个名称。 - -v /etc/localtime:/etc/localtime: 将主机的时区信息挂载到容器内部,以保持时间同步。 - -v /root/.ssh:/root/.ssh: 将主机的SSH配置目录挂载到容器内部,以便容器可以访问SSH密钥。 - nvcr.io/nvidia/pytorch:21.10-py3: 指定使用的Docker镜像,这里使用了nvcr.io/nvidia/pytorch的21.10-py3版本。 综上所述,以上是DeepSpeed命令参数的解释。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [阿里云AIGC- 使用Megatron-Deepspeed训练GPT-2并生成文本](https://blog.csdn.net/qq_39970492/article/details/131090026)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值