HuggingFace Accelerate 0.12 : Tutorials : Accelerate への移行

HuggingFace Accelerate 0.12 : Tutorials : 🤗 Accelerate への移行 (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 10/02/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 : Tutorials : 🤗 Accelerate への移行

このチュートリアルは既存の PyTorch コードを 🤗 Accelerate を使用するためにどのように簡単に変換できるかを詳述します。数行のコードを変更するだけで、🤗 Accelerate はそのマジックを実行して、貴方のコードを分散システムで簡単に実行する方向に導くことがわかるでしょう!

 

ベース訓練ループ

始めに、非常に基本的な PyTorch 訓練ループを書き出します。

training_dataloader, model, optimizer, scheduler, そして loss_function はあらかじめ定義されているものと仮定します。

device = "cuda"
model.to(device)

for batch in training_dataloader:
    optimizer.zero_grad()
    inputs, targets = batch
    inputs = inputs.to(device)
    targets = targets.to(device)
    outputs = model(inputs)
    loss = loss_function(outputs, targets)
    loss.backward()
    optimizer.step()
    scheduler.step()

 

🤗 Accelerate を組み込む

🤗 Accelerate を使い始めるには、最初に Accelerator インスタンスをインポートして作成します :

from accelerate import Accelerator

accelerator = Accelerator()

Accelerator は分散訓練のために可能なオプションのすべてを活用する主要なフォースです。

 

正しいデバイスを設定する

Accelerator クラスはいつでも PyTorch オブジェクトを移動する正しいデバイスを知っていますので、デバイスの定義を Accelerator 由来に変更する必要があります :

- device = 'cuda'
+ device = accelerator.device
  model.to(device)

 

オブジェクトの準備

次に訓練に関連する重要なオブジェクトのすべてを prepare() 內に渡す必要があります。🤗 Accelerate は訓練を始めるために現在の環境內ですべてがセットアップされたことを確認します :

model, optimizer, training_dataloader, scheduler = accelerator.prepare(
    model, optimizer, training_dataloader, scheduler
)

これらのオブジェクトはそれらが一緒に送られたのと同じ順序で返されます。デフォルトでは device_placement=True を使用するとき、正しいデバイスに送ることができるすべてのオブジェクトはそのようになります。[~Accelerator.prepare] に渡されないけれどもアクティブなデバイスに在るべきデータで作業する必要がある場合、前もって作成したデバイスを渡す必要があります。

Accelerate は (torch.optim.Optimizer のように) それぞれの PyTorch クラスから継承したオブジェクトだけを準備します。

 

訓練ループの修正

最後に、訓練ループで 3 行のコードを変更する必要があります。🤗 Accelerate の DataLoader クラスはデフォルトでデバイス配置を自動的に処理し、backward() は backward パスを実行するために使用される必要があります :

-   inputs = inputs.to(device)
-   targets = targets.to(device)
    outputs = model(inputs)
    loss = loss_function(outputs, targets)
-   loss.backward()
+   accelerator.backward(loss)

そして、貴方の訓練ループは 🤗 Accelerate を使用する準備ができました!

 

完成したコード

以下は変換されたコードの最終版です :

from accelerate import Accelerator

accelerator = Accelerator()

model, optimizer, training_dataloader, scheduler = accelerator.prepare(
    model, optimizer, training_dataloader, scheduler
)

for batch in training_dataloader:
    optimizer.zero_grad()
    inputs, targets = batch
    outputs = model(inputs)
    loss = loss_function(outputs, targets)
    accelerator.backward(loss)
    optimizer.step()
    scheduler.step()

 

以上