「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の動作確認を説明しました。
 
  
  
  
  


