HuggingFace Accelerate 0.12 : 概要

HuggingFace Accelerate 0.12 : 概要 (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 10/01/2022 (v0.12.0)

* 本ページは、HuggingFace Accelerate の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

クラスキャット 人工知能 研究開発支援サービス

クラスキャット は人工知能・テレワークに関する各種サービスを提供しています。お気軽にご相談ください :

◆ 人工知能とビジネスをテーマに WEB セミナーを定期的に開催しています。スケジュール
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。

お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

  • 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
  • sales-info@classcat.com  ;  Web: www.classcat.com  ;   ClassCatJP

 

 

HuggingFace Accelerate 0.12 : 概要

どのような種類のデバイスでも *raw* PyTorch 訓練スクリプトを実行できます。

 

統合が容易

🤗 Accelerate は PyTorch モデルの訓練ループを書きたいけれども、マルチ-GPUs/TPU/fp16 を使用するために必要なボイラープレートなコードを書いて保守することは気乗りしないような PyTorch ユーザのために作成されました。

🤗 Accelerate はマルチ-GPUs/TPU/fp16 に関連するボイラープレートなコードだけを正確に抽象化して残りの貴方のコードは変更しないでそのままにします。

ここにサンプルがあります :

  import torch
  import torch.nn.functional as F
  from datasets import load_dataset
+ from accelerate import Accelerator

+ accelerator = Accelerator()
- device = 'cpu'
+ device = accelerator.device

  model = torch.nn.Transformer().to(device)
  optimizer = torch.optim.Adam(model.parameters())

  dataset = load_dataset('my_dataset')
  data = torch.utils.data.DataLoader(dataset, shuffle=True)

+ model, optimizer, data = accelerator.prepare(model, optimizer, data)

  model.train()
  for epoch in range(10):
      for source, targets in data:
          source = source.to(device)
          targets = targets.to(device)

          optimizer.zero_grad()

          output = model(source)
          loss = F.cross_entropy(output, targets)

-         loss.backward()
+         accelerator.backward(loss)

          optimizer.step()

このサンプルで分かるように、任意の標準的な PyTorch 訓練スクリプトに 5-行追加することにより、どのような種類の単一あるいは分散ノード設定 (シングル CPU, シングル GPU, マルチ-GPUs と TPUs)で、更に混合精度 (fp16) あり/なしで実行できます。

そして特に、デバッグのためのローカルマシンや貴方の訓練環境で変更なしに同じコードが実行できます。

🤗 Accelerate はデバイス配置を処理さえしますので (これは貴方のコードに更に数行の変更を必要としますが、一般により安全です)、貴方の訓練ループを更に単純化することさえできます :

  import torch
  import torch.nn.functional as F
  from datasets import load_dataset
+ from accelerate import Accelerator

- device = 'cpu'
+ accelerator = Accelerator()

- model = torch.nn.Transformer().to(device)
+ model = torch.nn.Transformer()
  optimizer = torch.optim.Adam(model.parameters())

  dataset = load_dataset('my_dataset')
  data = torch.utils.data.DataLoader(dataset, shuffle=True)

+ model, optimizer, data = accelerator.prepare(model, optimizer, data)

  model.train()
  for epoch in range(10):
      for source, targets in data:
-         source = source.to(device)
-         targets = targets.to(device)

          optimizer.zero_grad()

          output = model(source)
          loss = F.cross_entropy(output, targets)

-         loss.backward()
+         accelerator.backward(loss)

          optimizer.step()

Want to learn more? Check out the documentation or have look at our examples.

 

スクリプトの起動

🤗 Accelerate はまたオプションの CLI ツールも提供しています、これはスクリプトを起動する前に訓練環境を素早く構成してテストすることを可能にします。torch.distributed.launch の使用方法を覚えたり TPU 訓練のために特定の launcher を書く必要はありません!貴方のマシン(s) 上で単に以下を実行します :

accelerate config

そして問われる質問に答えます。これは config ファイルを生成します、これは実行するときデフォルトのオプションを正しく設定するために自動的に使用されます。

accelerate launch my_script.py --args_to_my_script

例えば、ここに (レポジトリのルートからの) MRPC タスクでどのように GLUE サンプルを実行するかがあります :

accelerate launch examples/nlp_example.py

この CLI ツールはオプションで python my_script.py や python -m torch.distributed.launch my_script.py を貴方の都合で依然として使用することができます。

 

MPI を使用してマルチ CPU 実行を起動する

🤗 ここに MPI を使用してマルチ CPU 実行を起動する別の方法があります。このページ で Open MPI をインストールする方法を学習できます。Intel MPI や MVAPICH を使用することもできます。MPI を貴方のクラスタでセットアップしたら、単に次を実行します :

mpirun -np 2 python examples/nlp_example.py

 

DeepSpeed を使用して訓練を起動する

🤗 Accelerate は DeepSpeed を使用したシングル/マルチ GPU の訓練をサポートしています。それを使用ために、貴方の訓練コードでは何も変更する必要はありません ; accelerate config だけを使用して全てを設定できます。しかし、貴方の python スクリプトからの DeepSpeed 関連 args を調整したい場合には、DeepSpeedPlugin を提供しています。

from accelerator import Accelerator, DeepSpeedPlugin

# deepspeed needs to know your gradient accumulation steps before hand, so don't forget to pass it
# Remember you still need to do gradient accumulation by yourself, just like you would have done without deepspeed
deepspeed_plugin = DeepSpeedPlugin(zero_stage=2, gradient_accumulation_steps=2)
accelerator = Accelerator(fp16=True, deepspeed_plugin=deepspeed_plugin)

# How to save your 🤗 Transformer?
accelerator.wait_for_everyone()
unwrapped_model = accelerator.unwrap_model(model)
unwrapped_model.save_pretrained(save_dir, save_function=accelerator.save, state_dict=accelerator.get_state_dict(model))

Note : DeepSpeed サポートは現時点では実験的です。In case you get into some problem, please open an issue.

 

ノートブックから訓練を起動する

🤗 Accelerate はまた分散訓練を起動するためにノートブックで使用できる notebook_launcher 関数も提供しています。これは TPU バックエンドを装備する Colab or Kaggle ノートブックに対して特に有用です。training_function で貴方の訓練ループを定義してから、最後のセルで、以下を追加するだけです :

from accelerate import notebook_launcher

notebook_launcher(training_function)

サンプルは このノートブック で見つかります。Colab

 

何故 🤗 Accelerate を使用する必要があるのでしょう?

貴方は訓練スクリプトを、訓練ループに対する完全な制御を放棄することなく、分散環境で簡単に実行したいとき 🤗 Accelerate を使用するべきです。これは PyTorch の上位フレームワークではなく、単なる薄いラッパーですので、新しいライブラリを学習する必要はありません。実際、Accelerate の API 全体は一つクラス、Accelerator オブジェクトです。

 

何故 🤗 Accelerate を使用する必要がないのでしょう?

訓練ループを貴方自身で書くことを望まない場合には 🤗 Accelerate を使用する必要はありません。それを提供する PyTorch の多くの上位ライブラリがあり、🤗 Accelerate はそれらの一つではありません。

 

🤗 Accelerate を使用するフレームワーク

🤗 Accelerate の単純正を好むものの貴方の訓練ループ周りの高位抽象が好ましい場合、🤗 Accelerate の上に構築された幾つかのフレームワークが下にリストアップされます :

  • Animus は機械学習実験を実行するための最小限のフレームワークです。Animus は ML 実験内に共通の「ブレークポイント」をハイライトして、IExperiment 内にそれらのための統一インターフェイスを提供します。

  • Catalyst は深層学習の研究開発のための PyTorch フレームワークです。それは再現性、ラピッドな実験、そしてコードベースの再利用にフォーカスしていて、yet another 訓練ループを書くのではなく新しい何かを作成できます。Catalyst は実験の全てのパーツ : ハードウェアバックエンド, データ変換, モデル訓練, そして推論ロジック 等に接続する Runner を提供しています。

  • fastai は深層学習のための PyTorch フレームワークで、最新のベストプラクティスを使用して高速で正確なニューラルネットの訓練を単純化します。fastai は深層学習アルゴリズムの訓練、微調整、と推論を処理する Learner を提供しています。

  • Kornia は微分可能なライブラリで、従来のコンピュータビジョンを深層学習モデルに統合することを可能にします。Kornia はライブラリ內でサポートされる深層学習アルゴリズムを訓練して微調整する特定の目的で Trainer を提供します。

  • pytorch-accelerate は汎用目的の Trainer を中心に合理的な機能を持つ軽量の訓練ライブラリで、単純性と透過性に大きな重点を置いています : ユーザが內部で何が起きているかを正確に理解することを可能にし、ボイラープレートを彼ら自身で書いて保守する必要はありません!

 

サポートされるインテグレーション

  • CPU only
  • 1 ノード (マシン) 上のマルチ CPU
  • 複数ノード (マシン) 上のマルチ CPU
  • シングル GPU
  • 1 ノード (マシン) 上のマルチ GPU
  • 複数ノード (マシン) 上のマルチ GPU
  • TPU
  • native AMP (apex on the roadmap) による FP16
  • DeepSpeed サポート (実験的)
  • PyTorch Fully Sharded データ並列 (FSDP) サポート (実験的)

 

以上