すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:DeepSpeed分散トレーニング

最終更新日:Jan 07, 2025

DeepSpeedは、モデルトレーニングを高速化するための分散トレーニングとモデル最適化を提供するオープンソースの深層学習最適化ソフトウェアスイートです。 このトピックでは、Arenaを使用してDeepSpeed分散トレーニングジョブをすばやく送信する方法と、TensorBoardを使用してトレーニングジョブを視覚化する方法について説明します。

目次

前提条件

使用上の注意

この例では、DeepSpeedを使用してマスク言語モデルをトレーニングします。 サンプルコードとデータセットがダウンロードされ、サンプルイメージregistry.cn-beijing.aliyuncs.com/acs/deepspeed:hello-deepspeedに追加されます。 サンプルイメージを使用する必要がない場合は、GitHub URLからソースコードとデータセットをダウンロードし、PVとPVCのペアを使用して作成された共有NASボリュームにデータセットを保存できます。 この例では、training-dataという名前のPVCが作成され、トレーニング結果を保存する共有NASボリュームを要求します。

カスタムイメージを使用する場合は、次のいずれかの方法を使用します。

  • Dockerfileを参照して、ベースイメージにOpenSSHをインストールします。

    説明

    トレーニングジョブには、パスワードなしでSSH経由でのみアクセスできます。 したがって、本番環境でのSecretsの機密性を確保する必要があります。

  • ACKで提供されるDeepSpeedベースイメージを使用します。

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

手順

  1. 次のコマンドを実行して、クラスターで使用可能なGPUリソースを照会します。

    アリーナトップノード

    期待される出力:

    名前IPADDRESS ROLE STATUS GPU (合計) GPU (割り当て済み)
    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
    ---------------------------------------------------------------------------------------------------
    クラスター内の割り当て済み /合計GPU:
    0/3 (0.0%) 

    出力は、3つのGPUアクセラレーションノードを使用してトレーニングジョブを実行できることを示しています。

  2. を実行します。Run theアリーナ送信deepspeedjob [-- falg] コマンドコマンドを実行してDeepSpeedジョブを送信します。

    • ACKで提供されるDeepSpeedベースイメージを使用する場合は、次のコードを実行して、1つのランチャーノードと3つのワーカーノードを使用するDeepSpeedジョブを送信します。

      アリーナ送信deepspeedjob \
          -- name=deepspeed-helloworld \
          -- gpus=1 \
          -- workers=3 \
          -- imag e=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

      選択可能

      トレーニングジョブが実行されるワーカーノードで使用されるGPUの数。

      0

      -- 労働者

      選択可能

      ワーカーノードの数。

      1

      -イメージ

      必須

      ランタイムのデプロイに使用されるイメージのアドレス。

      なし

      -- データ

      選択可能

      PVCをランタイムにマウントすることにより、トレーニングジョブがPVCに保存されているデータにアクセスできるようにします。 値は、コロン (:) で区切られた2つの部分で構成されます。

      • コロンの左側にあるPVCの名前を指定します。 arena data listコマンドを実行して、クラスターで使用可能なPVCを表示します。

      • コロンの右側にPVCをマウントするランタイムのパスを指定します。 トレーニングジョブは、指定されたパスからデータを取得します。

      使用可能なPVCがない場合は、PVCを作成できます。 詳細については、「共有NASボリュームの設定」をご参照ください。.

      なし

      -- tensorboard

      選択可能

      TensorBoardサービスを有効にして、トレーニングジョブを視覚化します。 このパラメーターと、TensorBoardがイベントファイルを読み取るパスを指定する -- logdirパラメーターの両方を設定する必要があります。 このパラメーターを指定しない場合、TensorBoardは使用されません。

      なし

      -- logdir

      選択可能

      TensorBoardがイベントファイルを読み取るパス。 このパラメーターと -- tensorboardパラメーターの両方を指定する必要があります。

      /training_logs

    • 非公開のGitリポジトリを使用する場合は、次のコマンドを実行してDeepSpeedジョブを送信できます。

      アリーナ送信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作成
    情報 [0007] ジョブdeepspeed-helloworldが正常に送信されました
    INFO[0007] 'arena get deepspeed-helloworld -- type deepspeedjob 'を実行してジョブステータス
    を確認できます
  3. 次のコマンドを実行して、Arenaを使用して送信されたすべてのトレーニングジョブを照会します。

    アリーナ一覧

    期待される出力:

    NAME STATUS TRAINER DURATION GPU (要求された) GPU (割り当てられた) ノード
    deepspeed-helloworldランニングDEEPSPEEDJOB 3m 3 3 192.168.9.69 
  4. 次のコマンドを実行して、ジョブで使用されるGPUリソースを照会します。

    アリーナトップの仕事

    期待される出力:

    名ステータストレーナー年齢GPU (要求された) GPU (割り当てられた) ノード
    deepspeed-helloworldランニングDEEPSPEEDJOB 4m 3 3 192.168.9.69
    
    トレーニングジョブの割り当て /要求されたGPUの合計: 3/3 
  5. 次のコマンドを実行して、クラスターで使用されているGPUリソースを照会します。

    アリーナトップノード

    期待される出力:

    名前IPADDRESS ROLE STATUS GPU (合計) GPU (割り当て済み)
    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
    ---------------------------------------------------------------------------------------------------
    クラスター内の割り当て済み /合計GPU:
    3/3 (100%) 
  6. 次のコマンドを実行して、ジョブに関する詳細情報とTensorBoard webサービスのアドレスを照会します。

    アリーナ取得deepspeed-helloworld

    期待される出力:

    名: deepspeed-helloworld
    ステータス: RUNNING
    名前空間: デフォルト
    優先順位: N/A
    トレーナー: DEEPSPEEDJOB
    期間: 6m
    
    インスタンス:
      名前ステータス年齢IS_CHIEF GPU (要求された) ノード
      ----                           ------   ---  --------  --------------  ----
      deepspeed-helloworld-launcher 6m true 0 cn-beijing.192.1xx.x.x
      deepspeed-helloworld-worker-0ランニング6m false 1 cn-beijing.192.1xx.x.x
      deepspeed-helloworld-worker-1ランニング6m false 1 cn-beijing.192.1xx.x.x
      deepspeed-helloworld-worker-2ランニング6m false 1 cn-beijing.192.1xx.x.x
    
    あなたのtensorboardは利用できます:
    http:// 192.1xx.x.xx:31870 

    この例ではTensorBoardが使用されています。 したがって、TensorBoardのURLは、ジョブ情報の最後の2行にあります。 TensorBoardを使用しない場合、最後の2行は返されません。

  7. ブラウザを使用してTensorBoardでトレーニング結果を表示します。

    1. 次のコマンドを実行して、TensorBoardをローカルポート9090にマッピングします。

      kubectl port-forward svc/deepspeed-helloworld-tensorboard 9090:6006
    2. webブラウザのアドレスバーにlocalhost:9090と入力し、TensorBoardにアクセスします。 次の図は例を示しています。

      效果图

  8. ジョブのログを印刷します。

    • 次のコマンドを実行して、ジョブのログを印刷します。

      アリーナログdeepspeed-helloworld

      期待される出力:

      deepspeed-helloworld-worker-0: [2023-03-31 08:38:11,201] [INFO] [logging.py:68:log_dist] [ランク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 | 情報 | __main _: log_dist:53 - [ランク0] 損失: 6.7574
      deepspeed-helloworld-worker-0: [2023-03-31 08:38:13,103] [INFO] [logging.py:68:log_dist] [ランク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 | 情報 | __main _: log_dist:53 - [ランク0] 損失: 6.7570
      deepspeed-helloworld-worker-0: [2023-03-31 08:38:14,924] [INFO] [logging.py:68:log_dist] [ランク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 | 情報 | __main _: log_dist:53 - [ランク0] 損失: 6.7565 
    • arena logs $job_name -fコマンドを実行してジョブログをリアルタイムで印刷し、arena logs $job_name -t Nコマンドを実行してログの下部からN行を印刷します。 arena logs -- helpコマンドを実行して、ログを印刷するためのパラメーターを照会することもできます。

      たとえば、次のコマンドを実行して、ログの下部から5行を出力できます。

      アリーナログdeepspeed-helloworld -t 5

      期待される出力:

      deepspeed-helloworld-worker-0: [2023-03-31 08:47:08,694] [INFO] [launch.py:318:main] プロセス80は正常に終了します。
      deepspeed-helloworld-worker-2: [2023-03-31 08:47:08,731] [INFO] [launch.py:318:main] プロセス44は正常に終了します。
      deepspeed-helloworld-worker-1: [2023-03-31 08:47:08,946] [INFO] [launch.py:318:main] プロセス44は正常に終了します。
      /opt/conda/lib/python3.8/site-packages/apex/pyprof/__init__.py:5: FutureWarning: pyprofは、2022年6月末までに削除されます。
        warnings.warn (「pyprofは6月末までに削除されます、2022」、FutureWarning)