DeepSpeed分布式訓(xùn)練
DeepSpeed是一個(gè)開源的深度學(xué)習(xí)優(yōu)化庫,提供了分布式訓(xùn)練和模型優(yōu)化的功能,可以有效的加速訓(xùn)練過程。本文介紹如何使用Arena快速、方便地提交DeepSpeed的分布式訓(xùn)練作業(yè),并通過TensorBoard可視化查看訓(xùn)練作業(yè)。
索引
前提條件
已創(chuàng)建包含GPU的Kubernetes集群。具體操作,請參見創(chuàng)建GPU集群。
已安裝云原生AI套件,且機(jī)器學(xué)習(xí)命令行工具ack-arena的版本不低于0.9.10。具體操作,請參見部署云原生AI套件。
已安裝Arena客戶端,且版本不低于0.9.10。具體操作,請參見配置Arena客戶端。
已為集群配置了Arena使用的PVC。具體操作,請參見配置NAS共享存儲(chǔ)。
使用說明
本示例使用DeepSpeed訓(xùn)練一個(gè)掩碼語言模型(Masked Language Model)。為方便運(yùn)行,已將示例代碼和數(shù)據(jù)集下載至示例鏡像registry.cn-beijing.aliyuncs.com/acs/deepspeed:hello-deepspeed
中;若您無需使用示例鏡像,您也可以從Git URL下載源代碼,并將數(shù)據(jù)集存放在共享存儲(chǔ)系統(tǒng)(基于NAS的PV和PVC)中。本示例假設(shè)您已經(jīng)獲得了名稱為training-data
的PVC實(shí)例(一個(gè)共享存儲(chǔ)),用來存放訓(xùn)練結(jié)果。
如需自定義訓(xùn)練鏡像,可參見如下方式。
可參見Dockerfile,在基礎(chǔ)鏡像中安裝OpenSSH。
說明訓(xùn)練任務(wù)需要通過SSH免密訪問,生產(chǎn)環(huán)境中請您保障密鑰Secret的安全性。
或者使用ACK提供的DeepSpeed基礎(chǔ)鏡像。
registry.cn-beijing.aliyuncs.com/acs/deepspeed:v072_base
操作步驟
執(zhí)行如下命令,檢查可用的GPU資源。
arena top node
預(yù)期輸出:
NAME IPADDRESS ROLE STATUS GPU(Total) GPU(Allocated) cn-beijing.192.1xx.x.xx 192.1xx.x.xx <none> Ready 0 0 cn-beijing.192.1xx.x.xx 192.1xx.x.xx <none> Ready 0 0 cn-beijing.192.1xx.x.xx 192.1xx.x.xx <none> Ready 1 0 cn-beijing.192.1xx.x.xx 192.1xx.x.xx <none> Ready 1 0 cn-beijing.192.1xx.x.xx 192.1xx.x.xx <none> Ready 1 0 --------------------------------------------------------------------------------------------------- Allocated/Total GPUs In Cluster: 0/3 (0.0%)
預(yù)期輸出表明,有3個(gè)包含GPU的節(jié)點(diǎn)可用于運(yùn)行訓(xùn)練作業(yè)。
執(zhí)行
arena submit deepspeedjob [--falg] command
形式的命令,提交DeepSpeed作業(yè)。如果您使用ACK提供的DeepSpeed基礎(chǔ)鏡像,可執(zhí)行如下代碼,提交包含1個(gè)Launcher節(jié)點(diǎn),3個(gè)Worker節(jié)點(diǎn)的DeepSpeed訓(xùn)練任務(wù)。
arena submit deepspeedjob \ --name=deepspeed-helloworld \ --gpus=1 \ --workers=3 \ --image=registry.cn-beijing.aliyuncs.com/acs/deepspeed:hello-deepspeed \ --data=training-data:/data \ --tensorboard \ --logdir=/data/deepspeed_data \ "deepspeed /workspace/DeepSpeedExamples/HelloDeepSpeed/train_bert_ds.py --checkpoint_dir /data/deepspeed_data"
參數(shù)
是否必選
說明
默認(rèn)值
--name
必選
提交的作業(yè)名稱,全局唯一,不能重復(fù)。
無
--gpus
可選
作業(yè)Worker節(jié)點(diǎn)需要使用的GPU有卡數(shù)。
0
--workers
可選
作業(yè)Worker節(jié)點(diǎn)的數(shù)量。
1
--image
必選
訓(xùn)練環(huán)境的鏡像地址。
無
--data
可選
通過掛載共享存儲(chǔ)卷PVC到運(yùn)行環(huán)境中,使您的代碼可以訪問PVC的數(shù)據(jù)。它由兩部分組成,通過英文冒號(hào)(:)分割。
冒號(hào)左側(cè)是您已經(jīng)準(zhǔn)備好的PVC名稱。通過執(zhí)行
arena data list
命令,查看當(dāng)前集群可用的PVC列表。冒號(hào)右側(cè)是您想將PVC的掛載到運(yùn)行環(huán)境中的路徑,也是您訓(xùn)練代碼要讀取數(shù)據(jù)的本地路徑。
如果沒有可用的PVC,您可創(chuàng)建PVC。具體操作,請參見配置NAS共享存儲(chǔ)。
無
--tensorboard
可選
為訓(xùn)練任務(wù)開啟一個(gè)TensoBoard服務(wù),用作數(shù)據(jù)可視化。您可以結(jié)合--logdir指定TensorBoard要讀取的event路徑。不指定該參數(shù),則不開啟TensorBoard服務(wù)。
無
--logdir
可選
需要結(jié)合--tensorboard一起使用,該參數(shù)表示TensorBoard需要讀取event數(shù)據(jù)的路徑。
/training_logs
如果您使用非公開Git代碼庫。則可以使用如下命令,提交DeepSpeed作業(yè)。
arena submit deepspeedjob \ ... --sync-mode=git \ # 同步代碼的模式,您可以指定模式為git或rsync。 --sync-source=<非公開Git代碼庫地址> \ # 同步代碼的倉庫地址,需要和--sync-mode一起使用。如果--sync-mode=git,該參數(shù)可以為任何github項(xiàng)目地址。 --env=GIT_SYNC_USERNAME=yourname \ --env=GIT_SYNC_PASSWORD=yourpwd \ "deepspeed /workspace/DeepSpeedExamples/HelloDeepSpeed/train_bert_ds.py --checkpoint_dir /data/deepspeed_data"
arena命令使用git-sync同步源代碼。您可以設(shè)置在git-sync項(xiàng)目中定義的環(huán)境變量。
預(yù)期輸出:
trainingjob.kai.alibabacloud.com/deepspeed-helloworld created INFO[0007] The Job deepspeed-helloworld has been submitted successfully INFO[0007] You can run `arena get deepspeed-helloworld --type deepspeedjob` to check the job status
執(zhí)行如下命令,查看當(dāng)前通過Arena提交的所有作業(yè)。
arena list
預(yù)期輸出:
NAME STATUS TRAINER DURATION GPU(Requested) GPU(Allocated) NODE deepspeed-helloworld RUNNING DEEPSPEEDJOB 3m 3 3 192.168.9.69
執(zhí)行如下命令,檢查作業(yè)使用的GPU資源。
arena top job
預(yù)期輸出:
NAME STATUS TRAINER AGE GPU(Requested) GPU(Allocated) NODE deepspeed-helloworld RUNNING DEEPSPEEDJOB 4m 3 3 192.168.9.69 Total Allocated/Requested GPUs of Training Jobs: 3/3
執(zhí)行如下命令,檢查集群所使用的GPU資源。
arena top node
預(yù)期輸出:
NAME IPADDRESS ROLE STATUS GPU(Total) GPU(Allocated) cn-beijing.192.1xx.x.xx 192.1xx.x.xx <none> Ready 0 0 cn-beijing.192.1xx.x.xx 192.1xx.x.xx <none> Ready 0 0 cn-beijing.192.1xx.x.xx 192.1xx.x.xx <none> Ready 1 1 cn-beijing.192.1xx.x.xx 192.1xx.x.xx <none> Ready 1 1 cn-beijing.192.1xx.x.xx 192.1xx.x.xx <none> Ready 1 1 --------------------------------------------------------------------------------------------------- Allocated/Total GPUs In Cluster: 3/3 (100%)
執(zhí)行如下命令,獲取作業(yè)詳情,并獲取TensorBoard Web服務(wù)地址。
arena get deepspeed-helloworld
預(yù)期輸出:
Name: deepspeed-helloworld Status: RUNNING Namespace: default Priority: N/A Trainer: DEEPSPEEDJOB Duration: 6m Instances: NAME STATUS AGE IS_CHIEF GPU(Requested) NODE ---- ------ --- -------- -------------- ---- deepspeed-helloworld-launcher Running 6m true 0 cn-beijing.192.1xx.x.x deepspeed-helloworld-worker-0 Running 6m false 1 cn-beijing.192.1xx.x.x deepspeed-helloworld-worker-1 Running 6m false 1 cn-beijing.192.1xx.x.x deepspeed-helloworld-worker-2 Running 6m false 1 cn-beijing.192.1xx.x.x Your tensorboard will be available on: http://192.1xx.x.xx:31870
本示例已開啟了TensorBoard,因此上述作業(yè)詳情的最后兩行顯示TensorBoard的Web訪問地址;如果沒有開啟TensorBoard,最后兩行信息將不存在。
通過瀏覽器查看TensorBoard。
執(zhí)行如下命令,將集群中的TensorBoard映射到本地9090端口。
kubectl port-forward svc/deepspeed-helloworld-tensorboard 9090:6006
在瀏覽器中訪問
localhost:9090
,即可查看TensorBoard。如下圖所示。
獲取作業(yè)日志信息。
您可執(zhí)行如下命令,獲取作業(yè)日志信息。
arena logs deepspeed-helloworld
預(yù)期輸出:
deepspeed-helloworld-worker-0: [2023-03-31 08:38:11,201] [INFO] [logging.py:68:log_dist] [Rank 0] step=7050, skipped=24, lr=[0.0001], mom=[(0.9, 0.999)] deepspeed-helloworld-worker-0: [2023-03-31 08:38:11,254] [INFO] [timer.py:198:stop] 0/7050, RunningAvgSamplesPerSec=142.69733028759384, CurrSamplesPerSec=136.08094834473613, MemAllocated=0.06GB, MaxMemAllocated=1.68GB deepspeed-helloworld-worker-0: 2023-03-31 08:38:11.255 | INFO | __main__:log_dist:53 - [Rank 0] Loss: 6.7574 deepspeed-helloworld-worker-0: [2023-03-31 08:38:13,103] [INFO] [logging.py:68:log_dist] [Rank 0] step=7060, skipped=24, lr=[0.0001], mom=[(0.9, 0.999)] deepspeed-helloworld-worker-0: [2023-03-31 08:38:13,134] [INFO] [timer.py:198:stop] 0/7060, RunningAvgSamplesPerSec=142.69095076844823, CurrSamplesPerSec=151.8552037291255, MemAllocated=0.06GB, MaxMemAllocated=1.68GB deepspeed-helloworld-worker-0: 2023-03-31 08:38:13.136 | INFO | __main__:log_dist:53 - [Rank 0] Loss: 6.7570 deepspeed-helloworld-worker-0: [2023-03-31 08:38:14,924] [INFO] [logging.py:68:log_dist] [Rank 0] step=7070, skipped=24, lr=[0.0001], mom=[(0.9, 0.999)] deepspeed-helloworld-worker-0: [2023-03-31 08:38:14,962] [INFO] [timer.py:198:stop] 0/7070, RunningAvgSamplesPerSec=142.69048436022115, CurrSamplesPerSec=152.91029839772997, MemAllocated=0.06GB, MaxMemAllocated=1.68GB deepspeed-helloworld-worker-0: 2023-03-31 08:38:14.963 | INFO | __main__:log_dist:53 - [Rank 0] Loss: 6.7565
您還可以通過命令
arena logs $job_name -f
實(shí)時(shí)查看作業(yè)的日志輸出,通過命令arena logs $job_name -t N
查看尾部N行的日志,以及通過arena logs --help
查詢更多參數(shù)使用情況。例如,執(zhí)行如下命令,查看尾部5行的日志信息。
arena logs deepspeed-helloworld -t 5
預(yù)期輸出:
deepspeed-helloworld-worker-0: [2023-03-31 08:47:08,694] [INFO] [launch.py:318:main] Process 80 exits successfully. deepspeed-helloworld-worker-2: [2023-03-31 08:47:08,731] [INFO] [launch.py:318:main] Process 44 exits successfully. deepspeed-helloworld-worker-1: [2023-03-31 08:47:08,946] [INFO] [launch.py:318:main] Process 44 exits successfully. /opt/conda/lib/python3.8/site-packages/apex/pyprof/__init__.py:5: FutureWarning: pyprof will be removed by the end of June, 2022 warnings.warn("pyprof will be removed by the end of June, 2022", FutureWarning)