基于vscode调试deepspeed,以及使用zeros3_offload
基于vscode调试deepspeed
新建并更改launch.json文件。
首先按照下图所示,新建lauch.json文件。
其中launch.json文件的内容设置为如下所示:
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"env": {"PYTHONPATH": "${workspaceFolder}${pathSeparator}${env:PYTHONPATH}"},
"cwd": "${fileDirname}",
"name": "Python:Current File",
"type": "python",
"request": "launch",
"program": "/home/user/anaconda3/envs/rl_py/bin/deepspeed",
"console": "integratedTerminal",
"justMyCode": true,
"args":[
"--num_nodes=1",
"--num_gpus=2" ,
"/deepspeed-example/deepspeed-example-master/practice.py",
"--isDeepSpeed",
"--deepspeed_config=deepspeed_zeros3_offload.json"
]
}
]
}
主要需要更改以下三行
- 根据自己的conda环境更改’program’。
- 更改args中第三行超参数,根据程序路径更改。
启动调试
deepspeed使用zeros3 offload
更改deepspeed_config.json文件
deepspeed不同于torch中自带的DDP等并行训练技术的最先进地方在于可以使用cpu的内存来减少gpu显存不够用的压力,只需要在deepspeed_config.json中简单的加入几行参数,更改后的deepspeed_config.json如下所示:
{
"train_batch_size": 100,
"zero_allow_untested_optimizer": true,
"zero_force_ds_cpu_optimizer": false,
"zero_optimization": {
"stage": 3,
"overlap_comm": true,
"offload_optimizer": {
"device": "cpu",
"pin_memory": true
},
"offload_param": {
"device": "cpu",
"pin_memory": true
},
"stage3_gather_16bit_weights_on_model_save": true
}
}
这里只给出了zero-3的使用方式,deepspeed还包括zero-1和zero-2等方法。
更改程序
使用其他优化器可能会报错,因此需要使用DeepSpeedCPUAdam针对cpu的优化器。程序中进行更改如下:
if args.isoffload:
optimizer = deepspeed.ops.adam.DeepSpeedCPUAdam(model.parameters(), lr=0.001,momentum=0.9)
else:
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)
参考链接
https://deepspeed.readthedocs.io/en/latest/zero3.html