この記事では、入門、インストールの詳細、CIFAR-10 チュートリアルの 3 つのチュートリアルを翻訳し、初心者でもモデル トレーニングに DeepSpeed をインストールして簡単に使用できるようにします。
0x0.プリアンブル
このシリーズは DeepSpeed のチュートリアルの翻訳であり、DeepSpeed のチュートリアルには 34 のチュートリアルが提供されています。これらのチュートリアルには、分散トレーニングを完了するために DeepSpeed を構成する標準プロセスが含まれているだけでなく、低ビット オプティマイザー、Zero など、DeepSpeed でサポートされているいくつかの機能も含まれています。最近、DeepSpeed を使用して簡単なモデルのトレーニング実験を行う必要があるため、このトピックを開いて、DeepSpeed のチュートリアルのほとんどを翻訳して、不定期に更新してみます。この記事では、まず「はじめに」、「インストールの詳細」、「CIFAR-10 チュートリアル」の 3 つのチュートリアルを翻訳します。PyTorch 2.0 バージョンに基づいて CIFAR-10 チュートリアルを実行すると、いくつかのエラーが発生し、解決策も示されました。
0x1。はじめる
- 原文に相当: https://www.deepspeed.ai/getting-started
インストール
- DeepSpeed のインストールは、コマンド pip install deepspeed を実行するだけで簡単です。詳細については、後で翻訳される公式ドキュメントを参照してください。
- AzureML で DeepSpeed の使用を開始するには、「AzureML Examples GitHub」を参照してください。ここのリンクは現在 404 です。
- DeepSpeed は、HuggingFace Transformers および PyTorch Lightning と直接統合されています。HuggingFace Transformers ユーザーは、単純なフラグと構成ファイルを使用して
--deepspeed
モデルを簡単に高速化できるようになりました。詳細については、公式ドキュメントを参照してください。PyTorch Lightning では、Lightning Trainer を通じて DeepSpeed に簡単にアクセスできます。詳細については、公式ドキュメントを参照してください。 - DeepSpeed は、ROCm イメージ (https://hub.docker.com/r/deepspeed/rocm501/tags) を介して AMD で利用できます
docker pull deepspeed/rocm501:ds060_pytorch110
。
DeepSpeedモデルを書く
モデルのトレーニングには DeepSpeed エンジンを使用します。このエンジンはあらゆるタイプのtorch.nn.module
モデルをラップでき、モデルのチェックポイントをトレーニングおよび保存するための最小限の API セットを備えています。詳細な例については、チュートリアルを参照してください。
DeepSpeed エンジンを初期化するには:
model_engine, optimizer, _, _ = deepspeed.initialize(args=cmd_args,
model=model,
model_parameters=params)
deepspeed.initialize
目的の分散データ並列処理または混合精度トレーニングに必要なすべての設定が内部で適切に行われていることを確認してください。DeepSpeed は、モデルのラッピングに加えて、deepspeed.initialize
渡されたパラメーターと DeepSpeed 構成ファイル (https://www.deepspeed.ai/getting-started/#deepspeed) に基づいて、トレーニング オプティマイザー、データ ローダー、学習率を構築および管理できます。 -configuration) スケジューラ。DeepSpeed は各トレーニング ステップで学習率のスケジューリングを自動的に実行することに注意してください。
すでに分散環境をセットアップしている場合は、次の置き換えを行う必要があります。
torch.distributed.init_process_group(...)
と置換する:
deepspeed.init_distributed()
デフォルトでは、DeepSpeed はすでに十分にテストされた NCCL バックエンドを使用しますが、デフォルトをオーバーライドすることもできます (https://deepspeed.readthedocs.io/en/latest/initialize.html#distributed-initialization)。ただし、deepspeed.initialize()
後でまで分散環境をセットアップする必要がない場合は、DeepSpeed が初期化中に分散環境を自動的に初期化するため、この機能を使用する必要はありません。いずれの場合も、 を削除する必要がありますtorch.distributed.init_process_group
。
電車
DeepSpeed エンジンが初期化されると、順伝播 (呼び出し可能オブジェクト)、逆伝播 ()、backward
および重み更新 ( step
) に 3 つの単純な API を使用してモデルをトレーニングできます。
for step, batch in enumerate(data_loader):
#forward() method
loss = model_engine(batch)
#runs backpropagation
model_engine.backward(loss)
#weight update
model_engine.step()
- 勾配平均化: 分散データ並列トレーニングでは、a のトレーニング後に、データ並列プロセス全体で勾配が平均化されるよう
backward
にします。train_batch_size
- 損失スケーリング: FP16/混合精度トレーニングでは、DeepSpeed エンジンが自動的にスケーリング損失を処理し、勾配での精度の損失を回避します。
- 学習率スケジューラ: DeepSpeed の学習率スケジューラ (
ds_config.json
ファイルで指定) を使用する場合、DeepSpeed はトレーニング ステップごとに (実行時)model_engine.step()
スケジューラのメソッドを呼び出します。step()
DeepSpeed の学習率スケジューラを使用しない場合:- スケジューラがすべてのトレーニング ステップで実行されることが期待される場合、ユーザーは DeepSpeed エンジンの初期化時にスケジューラを渡し、
deepspeed.initialize
DeepSpeed に管理、更新、または保存/復元をさせることができます。 - スケジュールを他の間隔 (トレーニング エポックなど) で実行する必要がある場合、ユーザーは初期化中にスケジュールを DeepSpeed に渡すべきではなく、明示的に管理する必要があります。
- スケジューラがすべてのトレーニング ステップで実行されることが期待される場合、ユーザーは DeepSpeed エンジンの初期化時にスケジューラを渡し、
モデルチェックポイント
DeepSpeed のAPIsave_checkpoint
を使用してトレーニング状態を保存およびロードするにはload_checkpoint
、チェックポイントを一意に識別するために 2 つのパラメーターを指定する必要があります。
ckpt_dir
: チェックポイントはこのディレクトリに保存されます。ckpt_id
: ディレクトリ内のチェックポイントを一意に識別する識別子。以下のコード スニペットでは、損失値をチェックポイント識別子として使用します。
#load checkpoint
_, client_sd = model_engine.load_checkpoint(args.load_dir, args.ckpt_id)
step = client_sd['step']
#advance data loader to ckpt step
dataloader_to_step(data_loader, step + 1)
for step, batch in enumerate(data_loader):
#forward() method
loss = model_engine(batch)
#runs backpropagation
model_engine.backward(loss)
#weight update
model_engine.step()
#save checkpoint
if step % args.save_interval:
client_sd['step'] = step
ckpt_id = loss.item()
model_engine.save_checkpoint(args.save_dir, ckpt_id, client_sd = client_sd)
DeepSpeed は、モデル、オプティマイザー、学習率スケジューラーの状態を自動的に保存および復元し、これらの詳細をユーザーから隠します。ただし、ユーザーは特定のモデルのトレーニングに関連する他のデータを保存したい場合があります。client_sd
これらの項目をサポートするために、save_checkpoint は保存用のクライアント状態の辞書を受け入れます。これらの要素は戻りパラメータload_checkpoint
として。上の例では、ステップ値 (step) は のclient_sd
一部として保存されます。
重要: ランク 0 のプロセスだけでなく、すべてのプロセスがこのメソッドを呼び出す必要があります。これは、各プロセスがマスター ノードの重みとスケジューラとオプティマイザの状態を保存する必要があるためです。このメソッドがランク 0 プロセスに対してのみ呼び出された場合、他のプロセスとの同期を待機してハングします。
DeepSpeed構成
DeepSpeed 機能は、有効化、無効化、または として指定する必要がある構成 JSON ファイルを使用して構成できますargs.deepspeed_config
。以下は設定ファイルの例です。完全な機能セットについては、API ドキュメント (https://www.deepspeed.ai/docs/config-json/) を参照してください。
{
"train_batch_size": 8,
"gradient_accumulation_steps": 1,
"optimizer": {
"type": "Adam",
"params": {
"lr": 0.00015
}
},
"fp16": {
"enabled": true
},
"zero_optimization": true
}
DeepSpeed トレーニングをロードする
DeepSpeed は、分散トレーニングを可能にするエントリ ポイントをインストールしますdeepspeed
。以下の前提のもと、DeepSpeed の使用例を説明します。
- DeepSpeed をモデルに統合しました。
client_entry.py
はモデル入力スクリプトです。client args
argparse
はコマンドライン引数です。ds_config.json
DeepSpeed の設定パラメータです。
資源の配分
DeepSpeed は、OpenMPI および Horovod と互換性のあるホストファイルを使用してマルチノード コンピューティング リソースを構成します。ホストファイルは、パスワードなしの SSH 経由でアクセスできるホスト名 (または SSH エイリアス) のリストであり、システムで使用可能な GPU の数を指定するスロット数も含まれています。例えば:
worker-1 slots=4
worker-2 slots=4
上の例では、worker-1 と worker-2 という名前の 2 つのマシンを指定しており、それぞれトレーニング用に 4 つの GPU を備えています。
ホストファイルはコマンドラインオプションを使用して指定できます--hostfile
。ホストファイルが指定されていない場合、DeepSpeed は検索します/job/hostfile
。ホストファイルが指定されていないか見つからない場合、DeepSpeed はローカル マシン上の GPU の数をクエリして、利用可能なローカル スロットの数を検出します。
次のコマンドは、myhostfile
で指定されたすべての利用可能なノードと GPU で PyTorch トレーニング ジョブを開始します。
deepspeed --hostfile=myhostfile <client_entry.py> <client args> \
--deepspeed --deepspeed_config ds_config.json
さらに、DeepSpeed を使用すると、モデルの分散トレーニングを利用可能なノードと GPU のサブセットに制限できます。--num_nodes
この機能は、と の2 つのコマンド ライン引数で有効になります--num_gpus
。たとえば、次のコマンドを使用して、分散トレーニングを制限して 2 つのノードのみを使用するようにできます。
deepspeed --num_nodes=2 \
<client_entry.py> <client args> \
--deepspeed --deepspeed_config ds_config.json
--include
フラグとフラグを使用して、特定のリソースを含めたり除外したりすることもできます--exclude
。たとえば、ノード worker-2 の GPU 0 とノード worker-3 の GPU 0 と 1 を除く、使用可能なすべてのリソースを使用するには、次のようにします。
deepspeed --exclude="worker-2:0@worker-3:0,1" \
<client_entry.py> <client args> \
--deepspeed --deepspeed_config ds_config.json
同様に、worker-2 では GPU 0 と 1 のみを使用することができます。
deepspeed --include="worker-2:0,1" \
<client_entry.py> <client args> \
--deepspeed --deepspeed_config ds_config.json
マルチノード環境変数
複数のノードでトレーニングする場合、ユーザー定義の環境変数の伝播をサポートすると便利であることがわかりました。デフォルトでは、DeepSpeed はすべての NCCL および PYTHON 関連の環境変数セットを伝播します。他の変数を伝播する場合は、行で区切られたエントリのリストを.deepspeed_env
含む名前のファイルで変数を指定できます。VAR=VAL
DeepSpeed Launcher は、ホーム ディレクトリ () だけでなく、実行するローカル パスも検索します~/
。
具体的な例で説明すると、一部のクラスターではトレーニング前に特別な NCCL 変数を設定する必要があります。.deepspeed_env
ユーザーは、これらの変数をホーム ディレクトリ内の次のようなファイルに追加するだけで済みます。
NCCL_IB_DISABLE=1
NCCL_SOCKET_IFNAME=eth0
DeepSpeed は、各プロセスの開始時にトレーニング ジョブ全体を通じてこれらの環境変数が各ノードに設定されるようにします。
MPI と AzureML の互換性
前述したように、DeepSpeed は、マルチノード/マルチ GPU トレーニング ジョブの起動を支援する独自の並列ランチャーを提供します。MPI (mpirun など) を使用してトレーニング ジョブを開始することを希望する場合、弊社はこれに対するサポートを提供します。DeepSpeed は引き続き、MPI バックエンドの代わりにトーチ分散 NCCL バックエンドを使用することに注意してください。
mpirun + DeepSpeed または AzureML (mpirun をランチャー バックエンドとして使用) を使用してトレーニング ジョブを開始するには、mpi4py Python パッケージをインストールするだけです。DeepSpeed はこれを使用して MPI 環境を検出し、必要な状態 (ワールド サイズ、ランクなど) をトーチ分散バックエンドに渡します。
モデル並列処理、パイプライン並列処理を使用している場合、または を呼び出す前に torch.distributed 呼び出しを使用する必要がある場合はdeepspeed.initialize(..)
、同じ MPI をサポートする追加の DeepSpeed API 呼び出しが提供されます。最初の通話を次のようにtorch.distributed.init_process_group(..)
置き換えてください。
deepspeed.init_distributed()
リソース構成(シングルノード)
(1 つ以上の GPU を備えた) 単一ノードでのみ実行している場合、DeepSpeed は上記のようにホストファイルを使用する必要はありません。ホストファイルが検出されないか渡されなかった場合、DeepSpeed はローカル マシン上の GPU の数をクエリして、利用可能なソケットの数を検出します。--include
および--exclude
パラメータは通常と同じように機能しますが、ユーザーはホスト名として「localhost」を指定する必要があります。
また、CUDA_VISIBLE_DEVICES
DeepSpeed を使用してどのデバイスを使用するかを制御することはできないことにも注意してください。たとえば、現在のノードの gpu1 のみを使用するには、次のようにします。
deepspeed --include localhost:1 ...
0x2。インストールの詳細
- 元のテキストに相当します: https://www.deepspeed.ai/tutorials/advanced-install/
インストールの詳細
DeepSpeed を使い始める最も簡単な方法は pip を使用することです。これにより、DeepSpeed の最新バージョンがインストールされ、特定の PyTorch または CUDA バージョンに関連付けられません。DeepSpeed には、通常「ops」と呼ばれるいくつかの C++/CUDA 拡張機能が含まれています。デフォルトでは、これらすべての拡張機能/操作は、動的リンクへの ninja に依存する torch の JIT C++ 拡張ローダー (https://pytorch.org/docs/stable/cpp_extension.html) を使用してジャスト イン タイム (JIT) でビルドされます。
pip install deepspeed
インストールしたら、ds_report
またはpython -m deepspeed.env_report
コマンドを使用して DeepSpeed 環境レポートを表示し、インストールを確認し、マシンがどの Ops と互換性があるかを確認できます。このレポートは、DeepSpeed のインストールまたは互換性の問題をデバッグするときに役立つことがわかりました。
ds_report
DeepSpeed がプリインストールされた Ops
注: DeepSpeed の c++/cuda 演算をプリコンパイルする前に、PyTorch をインストールする必要があります。ただし、ops のデフォルトの JIT コンパイル モードを使用する場合は、プリコンパイル インストールは必要ありません。
JIT コンパイル パスを使用せずに、DeepSpeed C++/CUDA 演算の一部またはすべてをプリインストールしておくと便利な場合があります。プレインストールをサポートするために、特定の ops のビルドをオン/オフにするビルド環境フラグを導入しました。
たとえば、環境変数を 1 に設定することで、すべての ops のインストールを試行するようDS_BUILD_OPS
にインストーラーに指示できます。install.sh
pip install
DS_BUILD_OPS=1 pip install deepspeed
DeepSpeed は、お使いのマシンと互換性のある ops のみをインストールします。システムの互換性の詳細については、ds_report
上記のツールを試してください。
特定の op (FusedLamb など) のみをインストールする場合は、DS_BUILD 環境変数を使用してインストール時に切り替えることができます。たとえば、FusedLamb
op を使用して DeepSpeed のみをインストールするには、次を使用します。
DS_BUILD_FUSED_LAMB=1 pip install deepspeed
利用可能なDS_BUILD
オプションは次のとおりです。
DS_BUILD_OPS
すべての操作を切り替えますDS_BUILD_CPU_ADAM
CPUAdam オペレーションをビルドするDS_BUILD_FUSED_ADAM
FusedAdam op をビルドする (apex から)DS_BUILD_FUSED_LAMB
FusedLamb オペレーションをビルドするDS_BUILD_SPARSE_ATTN
まばらな注意力を構築するDS_BUILD_TRANSFORMER
トランスオペレーターを構築するDS_BUILD_TRANSFORMER_INFERENCE
トランスフォーマー推論オペレーションの構築DS_BUILD_STOCHASTIC_TRANSFORMER
確率的変換演算を構築するDS_BUILD_UTILS
さまざまな最適化ツールを構築するDS_BUILD_AIO
非同期 (NVMe) I/O 操作を構築する
すべてビルドのプロセスを高速化するには、次のコマンドを使用して並列コンパイルできます。
DS_BUILD_OPS=1 pip install deepspeed --global-option="build_ext" --global-option="-j8"
これにより、ビルド プロセス全体が 2 ~ 3 倍高速化されます。-j
ビルド中に使用する CPU コアの数を指定するように調整できます。この例では、8 コアに設定されています。
バイナリ ホイールを構築し、同じタイプの GPU と同じソフトウェア環境 (CUDA ツールキット、PyTorch、Python など) を備えた複数のマシンにインストールすることもできます。
DS_BUILD_OPS=1 python setup.py build_ext -j8 bdist_wheel
これにより、たとえば dist ディレクトリに PyPI バイナリ ホイールが作成され、dist/deepspeed-0.3.13+8cd046f-cp38-cp38-linux_x86_64.whl
複数のマシンに直接インストールできます。この例では次のようになります。
pip install dist/deepspeed-0.3.13+8cd046f-cp38-cp38-linux_x86_64.whl
DeepSpeedをソースコードからインストールする
GitHub から DeepSpeed リポジトリのクローンを作成した後、pip 経由で DeepSpeed を JIT モードでインストールできます (下記を参照)。C++/CUDA ソース ファイルはコンパイルされないため、インストールはすぐに完了します。
pip install .
複数のノードにまたがるインストールの場合、github リポジトリの install.sh (https://github.com/microsoft/DeepSpeed/blob/master/install.sh) スクリプトを使用して DeepSpeed をインストールすると便利であることがわかりました。これにより、Python ホイールがローカルに構築され、ホスト ファイルにリストされているすべてのノードにコピーされます (--hostfile
経由で指定されるか、デフォルトで指定されます)。/job/hostfile
DeepSpeed を使用するコードが初めて実行されると、実行に必要な CUDA 拡張機能のみが自動的に構築され、~/.cache/torch_extensions/
デフォルトでディレクトリに配置されます。これらのプリコンパイルされた拡張機能は、次回同じプログラムが実行されるときにこのディレクトリからロードされます。
これは、複数の仮想環境を使用する場合に問題になる可能性があります。デフォルトではtorch_extensions
ディレクトリは 1 つだけですが、異なる仮想環境では異なる設定 (たとえば、異なる Python または cuda バージョン) が使用され、別の環境で構築された CUDA 拡張機能のロードが失敗する可能性があるためです。したがって、必要に応じて、環境変数を使用してデフォルトの場所をオーバーライドできますTORCH_EXTENSIONS_DIR
。したがって、各仮想環境で固有のディレクトリを指定すると、DeepSpeed はそれを使用して CUDA 拡張機能を保存およびロードします。
次を使用して、特定の実行時に変更することもできます。
TORCH_EXTENSIONS_DIR=./torch-extensions deepspeed ...
構築する適切なアーキテクチャを選択する
DeepSpeed の実行中に次のエラーが発生した場合:
RuntimeError: CUDA error: no kernel image is available for execution on the device
これは、使用しようとしているカード用に CUDA 拡張機能が構築されていないことを意味します。
DeepSpeed をソースからビルドする場合、DeepSpeed はさまざまなアーキテクチャをサポートしようとしますが、JIT モードではビルド時に表示されるアーキテクチャのみをサポートします。
TORCH_CUDA_ARCH_LIST
環境変数を設定することで、目的のアーキテクチャのセット専用に構築できます。
TORCH_CUDA_ARCH_LIST="6.1;7.5;8.6" pip install ...
これにより、少数のアーキテクチャでビルドする場合にもビルドが高速化されます。
これは、正確なアーキテクチャが使用されていることを確認するためにも推奨されます。さまざまな技術的な理由により、配布された PyTorch バイナリはすべてのアーキテクチャを完全にサポートしているわけではなく、互換性のあるバイナリをスキップすると、カードのコンピューティング能力が十分に活用されなくなる可能性があります。deepspeed ソース ビルドにどのアーキテクチャが含まれているかを確認するには、ログを保存し、-gencode
パラメーターを検索します。
NVIDIA GPU とそのコンピューティング機能の完全なリストは、ここ (https://developer.nvidia.com/cuda-gpus) でご覧いただけます。
CUDA バージョンの不一致
実行時に次のエラーが発生した場合:
Exception: >- DeepSpeed Op Builder: Installed CUDA version {
VERSION} does not match the version torch was compiled with {
VERSION}, unable to compile cuda/cpp extensions without a matching cuda version.
インストールした CUDA のバージョンは、torch のコンパイルに使用した CUDA のバージョンと一致しません。一致する必要があるのはメジャー バージョンのみです (たとえば、11.1 と 11.8 は問題ありません)。ただし、メジャー バージョンの不一致により、予期しない動作やエラーが発生する可能性があります。
このエラーを修正する最も簡単な方法は、インストールされている CUDA バージョンを変更する (nvcc --version
で確認する) か、インストールされている CUDA バージョンと一致するようにトーチのバージョンを更新する ( で確認するpython3 -c "import torch; print(torch.version)"
) ことです。
このチェックをスキップして、一致しない CUDA バージョンを引き続き使用する場合は、次の環境変数を使用します。
DS_SKIP_CUDA_CHECK=1
特定の機能の依存関係
一部の DeepSpeed 機能には、DeepSpeed の一般的な依存関係を超える特定の依存関係が必要です。
- 各機能/操作の Python パッケージの依存関係については、要件ディレクトリ (https://github.com/microsoft/DeepSpeed/tree/master/requirements) を参照してください。
- システム レベルの依存関係を最小限に抑えるよう最善を尽くしていますが、一部の機能には特別なシステム レベルのパッケージが必要です。
ds_report
ツールの出力を確認して、特定の関数のシステム レベルのパッケージが不足していないかどうかを確認してください。
0x3。CIFAR-10 チュートリアル
スタート ガイドをまだ読んでいない場合は、まずスタート ガイド (つまり、上記の 2 つのセクション) を読んでから、このチュートリアルにステップごとに従うことをお勧めします。
このチュートリアルでは、小型画像分類モデルである CIFAR-10 モデルに DeepSpeed を追加します。
まず、オリジナルの CIFAR-10 モデルを実行する方法について説明します。その後、このモデルを DeepSpeed で実行できるように段階的に対応していきます。
生の CIFAR-10 を実行する
CIFAR-10 チュートリアルの元のモデル コードを参照してください (https://github.com/pytorch/tutorials/blob/main/beginner_source/blitz/cifar10_tutorial.py)。これを DeepSpeedExamples/training/cifar/ (https://github.com/microsoft/DeepSpeedExamples/tree/master/training/cifar) にコピーし、サブモジュールとして利用できるようにしました。ダウンロードするには、次を実行します。
git clone git@github.com:microsoft/DeepSpeedExamples.git
CIFAR-10 モデルの要件をインストールします。
cd DeepSpeedExamples/training/cifar
pip install -r requirements.txt
を実行するpython cifar10_tutorial.py
と、最初の実行時にトレーニング データセットがダウンロードされます。
Downloading https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz to ./data/cifar-10-python.tar.gz
170500096it [00:02, 61124868.24it/s]
Extracting ./data/cifar-10-python.tar.gz to ./data
Files already downloaded and verified
cat frog frog frog
[1, 2000] loss: 2.170
[1, 4000] loss: 1.879
[1, 6000] loss: 1.690
[1, 8000] loss: 1.591
[1, 10000] loss: 1.545
[1, 12000] loss: 1.467
[2, 2000] loss: 1.377
[2, 4000] loss: 1.374
[2, 6000] loss: 1.363
[2, 8000] loss: 1.322
[2, 10000] loss: 1.295
[2, 12000] loss: 1.287
Finished Training
GroundTruth: cat ship ship plane
Predicted: cat ship plane plane
Accuracy of the network on the 10000 test images: 53 %
Accuracy of plane : 69 %
Accuracy of car : 59 %
Accuracy of bird : 56 %
Accuracy of cat : 36 %
Accuracy of deer : 37 %
Accuracy of dog : 26 %
Accuracy of frog : 70 %
Accuracy of horse : 61 %
Accuracy of ship : 51 %
Accuracy of truck : 63 %
cuda:0
ここではローカルで torch 2.0 を使用していますが、このスクリプトを実行するとエラーが報告されます。AttributeError: '_MultiProcessingDataLoaderIter' オブジェクトには属性 'next' がありません。通常、このエラーは PyTorch 1.7 以降を使用する場合に発生します。これは、これらのバージョンでは .next() メソッドが非推奨となり、 .next()
.__next__()
メソッドに置き換えられるためです。したがって、コード内の 2 つの場所を.next.next()
() に置き換えることで、このエラーを解決できます。
ディープスピードを有効にする
パラメータ分析
deepspeed.add_config_arguments()
DeepSpeed を有効にする最初のステップは、DeepSpeed パラメータを CIFAR-10 モデルに追加することです。この機能は次の方法で使用できます。
import argparse
import deepspeed
def add_argument():
parser=argparse.ArgumentParser(description='CIFAR')
# Data.
# Cuda.
parser.add_argument('--with_cuda', default=False, action='store_true',
help='use CPU in case there\'s no GPU support')
parser.add_argument('--use_ema', default=False, action='store_true',
help='whether use exponential moving average')
# Train.
parser.add_argument('-b', '--batch_size', default=32, type=int,
help='mini-batch size (default: 32)')
parser.add_argument('-e', '--epochs', default=30, type=int,
help='number of total epochs (default: 30)')
parser.add_argument('--local_rank', type=int, default=-1,
help='local rank passed from distributed launcher')
# Include DeepSpeed configuration arguments.
parser = deepspeed.add_config_arguments(parser)
args=parser.parse_args()
return args
初期化
次のように定義されたdeepspeed.initialize
createmodel_engine
およびoptimizer
を使用します。trainloader
deepspeed.initialize
def initialize(args,
model,
optimizer=None,
model_params=None,
training_data=None,
lr_scheduler=None,
mpu=None,
dist_init_required=True,
collate_fn=None):
ここでは、 CIFAR-10 モデル ( net
)、args
、parameters
およびを使用してtrainset
DeepSpeed を初期化します。
parameters = filter(lambda p: p.requires_grad, net.parameters())
args=add_argument()
# Initialize DeepSpeed to use the following features
# 1) Distributed model.
# 2) Distributed data loader.
# 3) DeepSpeed optimizer.
model_engine, optimizer, trainloader, _ = deepspeed.initialize(args=args, model=net, model_parameters=parameters, training_data=trainset)
DeepSpeed を初期化した後、元のdevice
と はoptimizer
削除されます。
#from deepspeed.accelerator import get_accelerator
#device = torch.device(get_accelerator().device_name(0) if get_accelerator().is_available() else "cpu")
#net.to(device)
#optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
トレーニングAPI
deepspeed.initialize
forward
返されたモデルは DeepSpeed モデル エンジンで、これを使用して、backward
とAPIを使用してモデルをトレーニングしますstep
。
for i, data in enumerate(trainloader):
# Get the inputs; data is a list of [inputs, labels].
inputs = data[0].to(model_engine.device)
labels = data[1].to(model_engine.device)
outputs = model_engine(inputs)
loss = criterion(outputs, labels)
model_engine.backward(loss)
model_engine.step()
DeepSpeed は、ミニバッチを使用して重みを更新した後、勾配のゼロ化を自動的に処理します。
構成
DeepSpeed を使用する次のステップは、構成 JSON ファイル (ds_config.json) を作成することです。このファイルは、batch2⃣️ サイズ、オプティマイザー、スケジューラー、その他のパラメーターなど、ユーザーが定義した DeepSpeed 固有のパラメーターを提供します。
{
"train_batch_size": 4,
"steps_per_print": 2000,
"optimizer": {
"type": "Adam",
"params": {
"lr": 0.001,
"betas": [
0.8,
0.999
],
"eps": 1e-8,
"weight_decay": 3e-7
}
},
"scheduler": {
"type": "WarmupLR",
"params": {
"warmup_min_lr": 0,
"warmup_max_lr": 0.001,
"warmup_num_steps": 1000
}
},
"wall_clock_breakdown": false
}
DeepSpeed を有効にして CIFAR-10 モデルを実行する
DeepSpeed を適用して CIFAR-10 モデルのトレーニングを開始するには、次のコマンドを実行します。これにより、検出されたすべての GPU がデフォルトで使用されます。
deepspeed cifar10_deepspeed.py --deepspeed_config ds_config.json
DeepSpeed は通常、トレーニング設定、パフォーマンス統計、損失傾向など、ユーザーが監視できるようにトレーニングの詳細をさらに出力します。
deepspeed.pt cifar10_deepspeed.py --deepspeed_config ds_config.json
Warning: Permanently added '[192.168.0.22]:42227' (ECDSA) to the list of known hosts.
cmd=['pdsh', '-w', 'worker-0', 'export NCCL_VERSION=2.4.2; ', 'cd /data/users/deepscale/test/ds_v2/examples/cifar;', '/usr/bin/python', '-u', '-m', 'deepspeed.pt.deepspeed_launch', '--world_info=eyJ3b3JrZXItMCI6IFswXX0=', '--node_rank=%n', '--master_addr=192.168.0.22', '--master_port=29500', 'cifar10_deepspeed.py', '--deepspeed', '--deepspeed_config', 'ds_config.json']
worker-0: Warning: Permanently added '[192.168.0.22]:42227' (ECDSA) to the list of known hosts.
worker-0: 0 NCCL_VERSION 2.4.2
worker-0: WORLD INFO DICT: {
'worker-0': [0]}
worker-0: nnodes=1, num_local_procs=1, node_rank=0
worker-0: global_rank_mapping=defaultdict(<class 'list'>, {
'worker-0': [0]})
worker-0: dist_world_size=1
worker-0: Setting CUDA_VISIBLE_DEVICES=0
worker-0: Files already downloaded and verified
worker-0: Files already downloaded and verified
worker-0: bird car horse ship
worker-0: DeepSpeed info: version=2.1, git-hash=fa937e7, git-branch=master
worker-0: [INFO 2020-02-06 19:53:49] Set device to local rank 0 within node.
worker-0: 1 1
worker-0: [INFO 2020-02-06 19:53:56] Using DeepSpeed Optimizer param name adam as basic optimizer
worker-0: [INFO 2020-02-06 19:53:56] DeepSpeed Basic Optimizer = FusedAdam (
worker-0: Parameter Group 0
worker-0: betas: [0.8, 0.999]
worker-0: bias_correction: True
worker-0: eps: 1e-08
worker-0: lr: 0.001
worker-0: max_grad_norm: 0.0
worker-0: weight_decay: 3e-07
worker-0: )
worker-0: [INFO 2020-02-06 19:53:56] DeepSpeed using configured LR scheduler = WarmupLR
worker-0: [INFO 2020-02-06 19:53:56] DeepSpeed LR Scheduler = <deepspeed.pt.deepspeed_lr_schedules.WarmupLR object at 0x7f64c4c09c18>
worker-0: [INFO 2020-02-06 19:53:56] rank:0 step=0, skipped=0, lr=[0.001], mom=[[0.8, 0.999]]
worker-0: DeepSpeedLight configuration:
worker-0: allgather_size ............... 500000000
worker-0: allreduce_always_fp32 ........ False
worker-0: disable_allgather ............ False
worker-0: dump_state ................... False
worker-0: dynamic_loss_scale_args ...... None
worker-0: fp16_enabled ................. False
worker-0: global_rank .................. 0
worker-0: gradient_accumulation_steps .. 1
worker-0: gradient_clipping ............ 0.0
worker-0: initial_dynamic_scale ........ 4294967296
worker-0: loss_scale ................... 0
worker-0: optimizer_name ............... adam
worker-0: optimizer_params ............. {
'lr': 0.001, 'betas': [0.8, 0.999], 'eps': 1e-08, 'weight_decay': 3e-07}
worker-0: prescale_gradients ........... False
worker-0: scheduler_name ............... WarmupLR
worker-0: scheduler_params ............. {
'warmup_min_lr': 0, 'warmup_max_lr': 0.001, 'warmup_num_steps': 1000}
worker-0: sparse_gradients_enabled ..... False
worker-0: steps_per_print .............. 2000
worker-0: tensorboard_enabled .......... False
worker-0: tensorboard_job_name ......... DeepSpeedJobName
worker-0: tensorboard_output_path ......
worker-0: train_batch_size ............. 4
worker-0: train_micro_batch_size_per_gpu 4
worker-0: wall_clock_breakdown ......... False
worker-0: world_size ................... 1
worker-0: zero_enabled ................. False
worker-0: json = {
worker-0: "optimizer":{
worker-0: "params":{
worker-0: "betas":[
worker-0: 0.8,
worker-0: 0.999
worker-0: ],
worker-0: "eps":1e-08,
worker-0: "lr":0.001,
worker-0: "weight_decay":3e-07
worker-0: },
worker-0: "type":"Adam"
worker-0: },
worker-0: "scheduler":{
worker-0: "params":{
worker-0: "warmup_max_lr":0.001,
worker-0: "warmup_min_lr":0,
worker-0: "warmup_num_steps":1000
worker-0: },
worker-0: "type":"WarmupLR"
worker-0: },
worker-0: "steps_per_print":2000,
worker-0: "train_batch_size":4,
worker-0: "wall_clock_breakdown":false
worker-0: }
worker-0: [INFO 2020-02-06 19:53:56] 0/50, SamplesPerSec=1292.6411179579866
worker-0: [INFO 2020-02-06 19:53:56] 0/100, SamplesPerSec=1303.6726433398537
worker-0: [INFO 2020-02-06 19:53:56] 0/150, SamplesPerSec=1304.4251022567403
......
worker-0: [2, 12000] loss: 1.247
worker-0: [INFO 2020-02-06 20:35:23] 0/24550, SamplesPerSec=1284.4954513975558
worker-0: [INFO 2020-02-06 20:35:23] 0/24600, SamplesPerSec=1284.384033658866
worker-0: [INFO 2020-02-06 20:35:23] 0/24650, SamplesPerSec=1284.4433482972925
worker-0: [INFO 2020-02-06 20:35:23] 0/24700, SamplesPerSec=1284.4664449792422
worker-0: [INFO 2020-02-06 20:35:23] 0/24750, SamplesPerSec=1284.4950124403447
worker-0: [INFO 2020-02-06 20:35:23] 0/24800, SamplesPerSec=1284.4756105952233
worker-0: [INFO 2020-02-06 20:35:24] 0/24850, SamplesPerSec=1284.5251526215386
worker-0: [INFO 2020-02-06 20:35:24] 0/24900, SamplesPerSec=1284.531217073863
worker-0: [INFO 2020-02-06 20:35:24] 0/24950, SamplesPerSec=1284.5125323220368
worker-0: [INFO 2020-02-06 20:35:24] 0/25000, SamplesPerSec=1284.5698818883018
worker-0: Finished Training
worker-0: GroundTruth: cat ship ship plane
worker-0: Predicted: cat car car plane
worker-0: Accuracy of the network on the 10000 test images: 57 %
worker-0: Accuracy of plane : 61 %
worker-0: Accuracy of car : 74 %
worker-0: Accuracy of bird : 49 %
worker-0: Accuracy of cat : 36 %
worker-0: Accuracy of deer : 44 %
worker-0: Accuracy of dog : 52 %
worker-0: Accuracy of frog : 67 %
worker-0: Accuracy of horse : 58 %
worker-0: Accuracy of ship : 70 %
worker-0: Accuracy of truck : 59 %
追加: --include localhost:1 および同様のコマンドを使用して、単一カード上でモデルを実行できます。さらに、 --num_gpus は実行に使用する GPU の数を指定できます。
0x4.概要
この記事では、入門、インストールの詳細、CIFAR-10 チュートリアルの 3 つのチュートリアルを翻訳し、初心者でもモデル トレーニングに DeepSpeed をインストールして簡単に使用できるようにします。