「PyTorchを一つのコードにより、CPU・GPU・TPUで動かしたい」
「PyTorchを動かす上で、CPU環境とGPU環境の切り替えを簡単に行いたい」
このような場合には、Accelerateがオススメです。
この記事では、Accelerateについて解説しています。
本記事の内容
- Accelerateとは?
- Accelerateのシステム要件
- Accelerateのインストール
- Accelerateの設定
- Accelerateの動作確認
それでは、上記に沿って解説していきます。
Accelerateとは?
Accelerateとは、様々な環境でPyTorchを実行するためのライブラリです。
Accelerateを使うと、プログラムの実行環境をコード修正なしで変更できます。
CPU、GPU、TPUのどのデバイスでPyTorchを動かすのか?
並列処理を行うのか?
マシンは複数台利用するのか?
実行環境とは、これらの組み合わせを指しています。
対象となるパターンは、以下。
- CPU only
- multi-CPU on one node (machine)
- multi-CPU on several nodes (machines)
- single GPU
- multi-GPU on one node (machine)
- multi-GPU on several nodes (machines)
- TPU
さらには、数値形式やDeepSpeedの利用について選択できます。
- FP16 with native AMP (apex on the roadmap)
- DeepSpeed support (Experimental)
- PyTorch Fully Sharded Data Parallel (FSDP) support (Experimental)
- Megatron-LM support (Experimental)
以上、Accelerateについて説明しました。
次は、Accelerateのシステム要件を説明します。
Accelerateのシステム要件
現時点(2022年11月末)でのAccelerateの最新バージョンは、0.14.0となります。
この最新バージョンは、2022年11月9日にリリースされています。
サポートOSに関しては、以下を含むクロスプラットフォーム対応です。
- Windows
- macOS
- Linux
サポート対象となるPythonのバージョンは、Python 3.7以降となります。
これは、Python公式開発サイクルに準じています。
バージョン | リリース日 | サポート期限 |
3.7 | 2018年6月27日 | 2023年6月27日 |
3.8 | 2019年10月14日 | 2024年10月 |
3.9 | 2020年10月5日 | 2025年10月 |
3.10 | 2021年10月4日 | 2026年10月 |
3.11 | 2022年10月25日 | 2027年10月 |
そして、Accelerateが動くための大前提にPyTorchがあります。
PyTorchのバージョンは、1.4.0以降が必要となっています。
PyTorchのインストールについては、次の記事で解説しています。
GPUが利用可能なマシンであれば、GPU版をインストールしましょう。
以上、Accelerateのシステム要件を説明しました。
次は、Accelerateのインストールを説明します。
Accelerateのインストール
検証は、次のバージョンのPythonで行います。
> python -V Python 3.10.4
そして、PyTorchはインストール済みとします。
> pip list Package Version ------------------ ------------ certifi 2022.9.24 charset-normalizer 2.1.1 idna 3.4 numpy 1.23.5 Pillow 9.3.0 pip 22.3.1 requests 2.28.1 setuptools 65.6.3 torch 1.13.0+cu116 torchaudio 0.13.0+cu116 torchvision 0.14.0+cu116 typing_extensions 4.4.0 urllib3 1.26.13 wheel 0.37.1
次にするべきことは、pipとsetuptoolsの更新です。
pipコマンドを使う場合、常に以下のコマンドを実行しておきましょう。
python -m pip install --upgrade pip setuptools
では、Accelerateのインストールです。
Accelerateのインストールは、以下のコマンドとなります。
pip install accelerate
Accelerateのインストールは、すぐに終わります。
処理が終了したら、どんなパッケージがインストールされたのかを確認します。
> pip list Package Version ------------------ ------------ accelerate 0.14.0 certifi 2022.9.24 charset-normalizer 2.1.1 idna 3.4 numpy 1.23.5 packaging 21.3 Pillow 9.3.0 pip 22.3.1 psutil 5.9.4 pyparsing 3.0.9 PyYAML 6.0 requests 2.28.1 setuptools 65.6.3 torch 1.13.0+cu116 torchaudio 0.13.0+cu116 torchvision 0.14.0+cu116 typing_extensions 4.4.0 urllib3 1.26.13 wheel 0.37.1
accelerate以外にも数個のパッケージが、追加されました。
以上、Accelerateのインストールを説明しました。
次は、Accelerateの設定を説明します。
Accelerateの設定
Accelerateの設定を行います。
プログラムを実行する環境情報を事前に登録しておきます。
次のコマンドにより、設定を開始します。
accelerate config
上記を実行すると、質問が始まります。
そして、それに回答していくという流れになります。
> accelerate config In which compute environment are you running? ([0] This machine, [1] AWS (Amazon SageMaker)): 0 Which type of machine are you using? ([0] No distributed training, [1] multi-CPU, [2] multi-GPU, [3] TPU [4] MPS): 0 Do you want to run your training on CPU only (even if a GPU is available)? [yes/NO]:NO Do you want to use DeepSpeed? [yes/NO]: NO What GPU(s) (by id) should be used for training on this machine as a comma-seperated list? [all]:0 Do you wish to use FP16 or BF16 (mixed precision)? [NO/fp16/bf16]: NO
上記は、GPU搭載マシン上でプログラムを実行する場合の回答例です。
では、設定ファイルが正しく機能するのかどうかを確認しましょう。
確認には、次のコマンドを実行します。
accelerate test
上記を実行すると、実際に動作検証をしてくれます。
stdout: **Initialization** stdout: Testing, testing. 1, 2, 3. stdout: Distributed environment: NO stdout: Num processes: 1 stdout: Process index: 0 stdout: Local process index: 0 stdout: Device: cuda stdout: Mixed precision type: no stdout: stdout: stdout: **Test random number generator synchronization** stdout: All rng are properly synched. stdout: stdout: **DataLoader integration test** stdout: 0 tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, stdout: 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31], stdout: device='cuda:0') <class 'accelerate.data_loader.DataLoaderShard'> stdout: Non-shuffled dataloader passing. stdout: Shuffled dataloader passing. stdout: Non-shuffled central dataloader passing. stdout: Shuffled central dataloader passing. stdout: stdout: **Training integration test** stdout: Model dtype: torch.float32, torch.float32. Input dtype: torch.float32 stdout: Model dtype: torch.float32, torch.float32. Input dtype: torch.float32 stdout: Training yielded the same results on one CPU or distributed setup with no batch split. stdout: Model dtype: torch.float32, torch.float32. Input dtype: torch.float32 stdout: Training yielded the same results on one CPU or distributes setup with batch split. stdout: FP16 training check. stdout: Model dtype: torch.float32, torch.float32. Input dtype: torch.float32 stdout: Legacy FP16 training check. stdout: Model dtype: torch.float32, torch.float32. Input dtype: torch.float32 stdout: BF16 training check. stdout: Model dtype: torch.float32, torch.float32. Input dtype: torch.float32 Test is a success! You are ready for your distributed training!
「success」を確認できれば、設定はOKです。
なお、accelerateコマンドのヘルプは以下で確認できます。
> accelerate -h usage: accelerate <command> [<args>] positional arguments: {config,env,launch,tpu-config,test} accelerate command helpers options: -h, --help show this help message and exit
以上、Accelerateの設定を説明しました。
次は、Accelerateの動作確認を説明します。
Accelerateの動作確認
CPUでの実行とGPUでの実行をAccelerateで切り替えてみましょう。
まずは、次のコードを用意します。
コードの内容は、複雑な計算処理にかかった時間を計測することです。
Accelerateを利用して、それをCPUでもGPUでも動くようにしています。
test.py
from accelerate import Accelerator import torch import time accelerator = Accelerator() device = accelerator.device input_data = torch.randn(128, 3, 224, 224, device=device) model = torch.hub.load('pytorch/vision:v0.11.0', 'resnet50', pretrained=True) model.to(device) torch.cuda.synchronize() start = time.time() with torch.no_grad(): output_data = model(input_data) torch.cuda.synchronize() elapsed_time = time.time() - start print(device) print(elapsed_time, 'sec.')
上記コードを普通に実行します。
その結果は、次のように表示されます。
(初回時は、モデルのダウンロードが始まります。)
> python test.py cuda 1.6820640563964844 sec.
GPU版のPyTorchをインストールしているから、「cuda」が表示されます。
この結果は、先ほどのAccelerateの設定とは関係がありません。
Accelerateの設定が関係するのは、次のように実行した場合です。
(Using cache found in ~は非表示)
> accelerate launch test.py cuda 1.6319539546966553 sec.
GPUで実行した際の処理時間は、十分にわかりました。
では、CPUで実行した場合はどれくらいの時間がかかるのでしょうか?
それをコード変更なしで行えるのが、Accelerateなのです。
CPU環境で実行するには、その環境に設定しましょう。
> accelerate config In which compute environment are you running? ([0] This machine, [1] AWS (Amazon SageMaker)): 0 Which type of machine are you using? ([0] No distributed training, [1] multi-CPU, [2] multi-GPU, [3] TPU [4] MPS): 0 Do you want to run your training on CPU only (even if a GPU is available)? [yes/NO]:yes Do you want to use DeepSpeed? [yes/NO]: NO Do you wish to use FP16 or BF16 (mixed precision)? [NO/fp16/bf16]: NO
この状況で、再度プログラムを実行します。
> accelerate launch test.py cpu 15.779152154922485 sec.
「cpu」と出ています。
そして、処理時間はGPUの15倍となっています。
以上、Accelerateの動作確認を説明しました。