全部產品
Search
文件中心

Container Service for Kubernetes:DeepSpeed分布式訓練

更新時間:Jun 19, 2024

DeepSpeed是一個開源的深度學習最佳化庫,提供了分布式訓練和模型最佳化的功能,可以有效加速訓練過程。本文介紹如何使用Arena快速、方便地提交DeepSpeed的分布式訓練作業,並通過TensorBoard可視化查看訓練作業。

索引

前提條件

  • 已建立包含GPU的Kubernetes叢集。具體操作,請參見建立GPU叢集

  • 已安裝雲原生AI套件,且機器學習命令列工具ack-arena的版本不低於0.9.10。具體操作,請參見部署雲原生AI套件

  • 已安裝Arena用戶端,且版本不低於0.9.10。具體操作,請參見配置Arena用戶端

  • 已為叢集配置了Arena使用的PVC。具體操作,請參見配置NAS共用儲存

使用說明

本樣本使用DeepSpeed訓練一個掩碼語言模型(Masked Language Model)。為方便運行,已將範例程式碼和資料集下載至樣本鏡像registry.cn-beijing.aliyuncs.com/acs/deepspeed:hello-deepspeed中;若您無需使用樣本鏡像,您也可以從Git URL下載原始碼,並將資料集存放在共用儲存系統(基於NAS的PV和PVC)中。本樣本假設您已經獲得了名稱為training-data的PVC執行個體(一個共用儲存),用來存放訓練結果。

如需自訂訓練鏡像,可參見如下方式。

  • 可參見Dockerfile,在基礎鏡像中安裝OpenSSH。

    說明

    訓練任務需要通過SSH免密訪問,生產環境中請您保障密鑰Secret的安全性。

  • 或者使用ACK提供的DeepSpeed基礎鏡像。

    registry.cn-beijing.aliyuncs.com/acs/deepspeed:v072_base

操作步驟

  1. 執行如下命令,檢查可用的GPU資源。

    arena top node

    預期輸出:

    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%)

    預期輸出表明,有3個包含GPU的節點可用於運行訓練作業。

  2. 執行arena submit deepspeedjob [--falg] command形式的命令,提交DeepSpeed作業。

    • 如果您使用ACK提供的DeepSpeed基礎鏡像,可執行如下代碼,提交包含1個Launcher節點,3個Worker節點的DeepSpeed訓練任務。

      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"

      參數

      是否必選

      說明

      預設值

      --name

      必選

      提交的作業名稱,全域唯一,不能重複。

      --gpus

      可選

      作業Worker節點需要使用的GPU有卡數。

      0

      --workers

      可選

      作業Worker節點的數量。

      1

      --image

      必選

      訓練環境的鏡像地址。

      --data

      可選

      通過掛載共用儲存卷PVC到運行環境中,使您的代碼可以訪問PVC的資料。它由兩部分組成,通過英文冒號(:)分割。

      • 冒號左側是您已經準備好的PVC名稱。通過執行arena data list命令,查看當前叢集可用的PVC列表。

      • 冒號右側是您想將PVC的掛載到運行環境中的路徑,也是您訓練代碼要讀取資料的本地路徑。

      如果沒有可用的PVC,您可建立PVC。具體操作,請參見配置NAS共用儲存

      --tensorboard

      可選

      為訓練任務開啟一個TensoBoard服務,用作資料視覺效果。您可以結合--logdir指定TensorBoard要讀取的event路徑。不指定該參數,則不開啟TensorBoard服務。

      --logdir

      可選

      需要結合--tensorboard一起使用,該參數表示TensorBoard需要讀取event資料的路徑。

      /training_logs

    • 如果您使用非公開Git程式碼程式庫。則可以使用如下命令,提交DeepSpeed作業。

       arena submit deepspeedjob \
              ...
              --sync-mode=git \ # 同步代碼的模式,您可以指定模式為git或rsync。
              --sync-source=<非公開Git程式碼程式庫地址>  \ # 同步代碼的倉庫地址,需要和--sync-mode一起使用。如果--sync-mode=git,該參數可以為任何github專案地址。
              --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同步原始碼。您可以設定在git-sync專案中定義的環境變數。

    預期輸出:

    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
  3. 執行如下命令,查看當前通過Arena提交的所有作業。

    arena list

    預期輸出:

    NAME                  STATUS   TRAINER         DURATION  GPU(Requested)  GPU(Allocated)  NODE
    deepspeed-helloworld  RUNNING  DEEPSPEEDJOB    3m        3               3               192.168.9.69
  4. 執行如下命令,檢查作業使用的GPU資源。

    arena top job

    預期輸出:

    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
  5. 執行如下命令,檢查叢集所使用的GPU資源。

    arena top node

    預期輸出:

    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%)
  6. 執行如下命令,擷取作業詳情,並擷取TensorBoard Web服務地址。

    arena get deepspeed-helloworld

    預期輸出:

    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,因此上述作業詳情的最後兩行顯示TensorBoard的Web訪問地址;如果沒有開啟TensorBoard,最後兩行資訊將不存在。

  7. 通過瀏覽器查看TensorBoard。

    1. 執行如下命令,將叢集中的TensorBoard映射到本地9090連接埠。

      kubectl port-forward svc/deepspeed-helloworld-tensorboard 9090:6006
    2. 在瀏覽器中訪問localhost:9090,即可查看TensorBoard。如下圖所示。

      效果圖

  8. 擷取作業日誌資訊。

    • 您可執行如下命令,擷取作業日誌資訊。

      arena logs deepspeed-helloworld

      預期輸出:

      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即時查看作業的日誌輸出,通過命令arena logs $job_name -t N查看尾部N行的日誌,以及通過arena logs --help查詢更多參數使用方式。

      例如,執行如下命令,查看尾部5行的日誌資訊。

      arena logs deepspeed-helloworld -t 5

      預期輸出:

      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)