DeepSpeedは、モデルトレーニングを高速化するための分散トレーニングとモデル最適化を提供するオープンソースの深層学習最適化ソフトウェアスイートです。 このトピックでは、Arenaを使用してDeepSpeed分散トレーニングジョブをすばやく送信する方法と、TensorBoardを使用してトレーニングジョブを視覚化する方法について説明します。
目次
前提条件
GPU高速化ノードを含むContainer Service for Kubernetes (ACK) クラスターが作成されます。 詳細については、「GPUアクセラレーションノードでのACKクラスターの作成」をご参照ください。
クラウドネイティブのAIスイートがインストールされています。 機械学習用のCLI ack-arenaのバージョンは0.9.10以降です。 詳細については、「クラウドネイティブAIスイートのデプロイ」をご参照ください。
Arenaクライアントがインストールされ、Arenaのバージョンは0.9.10以降です。 詳細については、「Arenaクライアントの設定」をご参照ください。
永続ボリュームクレーム (PVC) がクラスターに作成されます。 詳細については、「共有NASボリュームの設定」をご参照ください。.
使用上の注意
この例では、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
手順
次のコマンドを実行して、クラスターで使用可能な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アクセラレーションノードを使用してトレーニングジョブを実行できることを示しています。
を実行します。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 'を実行してジョブステータス次のコマンドを実行して、Arenaを使用して送信されたすべてのトレーニングジョブを照会します。
アリーナ一覧期待される出力:
NAME STATUS TRAINER DURATION GPU (要求された) GPU (割り当てられた) ノード deepspeed-helloworldランニングDEEPSPEEDJOB 3m 3 3 192.168.9.69次のコマンドを実行して、ジョブで使用されるGPUリソースを照会します。
アリーナトップの仕事期待される出力:
名ステータストレーナー年齢GPU (要求された) GPU (割り当てられた) ノード deepspeed-helloworldランニングDEEPSPEEDJOB 4m 3 3 192.168.9.69 トレーニングジョブの割り当て /要求されたGPUの合計: 3/3次のコマンドを実行して、クラスターで使用されている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%)次のコマンドを実行して、ジョブに関する詳細情報と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行は返されません。
ブラウザを使用してTensorBoardでトレーニング結果を表示します。
次のコマンドを実行して、TensorBoardをローカルポート9090にマッピングします。
kubectl port-forward svc/deepspeed-helloworld-tensorboard 9090:6006webブラウザのアドレスバーに
localhost:9090と入力し、TensorBoardにアクセスします。 次の図は例を示しています。
ジョブのログを印刷します。
次のコマンドを実行して、ジョブのログを印刷します。
アリーナログ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.7565arena 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)