【PyTorch】Accelerateのインストールと設定

【PyTorch】Accelerateのインストールと設定 機械学習

「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.72018年6月27日2023年6月27日
3.82019年10月14日2024年10月
3.92020年10月5日2025年10月
3.102021年10月4日2026年10月
3.112022年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の動作確認を説明しました。

タイトルとURLをコピーしました