HuggingFace Accelerate 0.12 : Tutorials : 🤗 Accelerate スクリプトの起動 (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 10/03/2022 (v0.12.0)
* 本ページは、HuggingFace Accelerate の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
- Tutorials : Launching your 🤗 Accelerate scripts
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- 人工知能研究開発支援
- 人工知能研修サービス(経営者層向けオンサイト研修)
- テクニカルコンサルティングサービス
- 実証実験(プロトタイプ構築)
- アプリケーションへの実装
- 人工知能研修サービス
- PoC(概念実証)を失敗させないための支援
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
- 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
- sales-info@classcat.com ; Web: www.classcat.com ; ClassCatJP
HuggingFace Accelerate 0.12 : Tutorials : 🤗 Accelerate スクリプトの起動
前のチュートリアルで、🤗 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()
しかしこのコードをどのように実行するのでしょう?そしてそれに利用可能な特別なハードウェアを活用させるには?
最初に上のコードを関数內に書き直して、スクリプトとして呼び出し可能にする必要があります。例えば:
from accelerate import Accelerator
+ def main():
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()
+ if __name__ == "__main__":
+ main()
次にそれを “accelerate launch” で起動する必要があります。
“accelerate launch” を使用する前に、貴方の好みに合わせて環境を構成するために “accelerate config” を実行することが推奨されます。そうでないと 🤗 Accelerate はシステムセットアップに依存した非常に基本的なデフォルトを使用します。
accelerate launch の使用
🤗 Accelerate は特別な CLI コマンドを持ち、”accelerate launch” でシステム內でコードを起動するのに役立ちます。このコマンドは、様々なプラットフォームでその各々が何かを覚える必要なしに、スクリプトを起動するために必要な様々なコマンドのすべてをラップしています。
torchrun によるような PyTorch のスクリプトを自身で起動することに馴染みがあるのであれば、依然としてこれを行なうことができます。accelerate launch を使用する必要はありません。
以下を使用してスクリプトを素早く起動できます :
accelerate launch {script_name.py} --arg1 --arg2 ...
コマンドの最初に “accelerate launch” を単に置いて、その後に通常のようにスクリプトに渡す追加引数とパラメータを渡します。
これは幾つかの torch spawn メソッドを実行しますので、想定される環境変数のすべてもここで変更可能です。例えば、ここにシングル GPU で “accelerate launch” を使用する方法があります :
CUDA_VISIBLE_DEVICES="0" accelerate launch {script_name.py} --arg1 --arg2 ...
“accelerate config” を最初に実行することなく “accelerate launch” を使用することもできますが、正しい configuration パラメータを手動で渡す必要があるかもしれません。この場合、🤗 Accelerate は幾つかのハイパーパラメータを決定します、例えば、GPU が利用可能であればデフォルトではそれら混合精度なしにすべてを使用します。ここにすべての GPU を使用して混合精度を無効にして訓練する方法があります :
accelerate launch --multi_gpu {script_name.py} {--arg1} {--arg2} ...
より具体的には必要なパラメータを自身で渡す必要があります。例えば、ここに、同じスクリプトをすべての警告を回避しながら混合精度を使用して 2 つの GPU で起動する方法もあります :
accelerate launch --multi_gpu --mixed_precision=fp16 --num_processes=2 {script_name.py} {--arg1} {--arg2} ...
For a complete list of parameters you can pass in, run:
accelerate launch -h
この違いの視覚化のためには、マルチ gpu 上の先の “accelerate launch” は torchrun によるもののように見えます :
MIXED_PRECISION="fp16" torchrun --nproc_per_node=2 --num_machines=1 {script_name.py} {--arg1} {--arg2} ...
何故 accelerate config を常に使う必要があるのでしょう?
“accelerate config” を何故常に使用するほとに有用なのでしょう?
torchrun と同様に “accelerate launch” への先の呼び出しを覚えていますか?configuration の後、必要なパーツとともにスクリプトを実行するには、何も渡さずに、単に “accelerate launch” をそのまま使用する必要があります :
accelerate launch {script_name.py} {--arg1} {--arg2} ...
カスタム Configurations
簡単に前述したように、”accelerate launch” は”accelerate config” コマンドにより作成された設定構成と組み合わせて使用される場合が殆どです。これらの設定は 🤗 Accelerate のキャシュフォルダの default_config ファイルにセーブされます。このキャッシュフォルダは以下に位置します (優先度の高い順に) :
- accelerate でサフィックスされる、環境変数 HF_HOME の項目。
- それが存在しない場合、huggingface/accelerate でサフィックスされる環境変数 XDG_CACHE_HOME の項目。
- これも存在しない場合、フォルダ ~/.cache/huggingface/accelerate
複数の configurations を持つためには、カスタム yaml の位置とペアリングして “accelerate launch” コマンドにフラグ –config_file を渡すことができます。
yaml の例は、混合精度のために fp16 を使用するシングルマシン上の 2 つの GPU に対しては、以下のようになるかもしれません :
compute_environment: LOCAL_MACHINE
deepspeed_config: {}
distributed_type: MULTI_GPU
fsdp_config: {}
machine_rank: 0
main_process_ip: null
main_process_port: null
main_training_function: main
mixed_precision: fp16
num_machines: 1
num_processes: 2
use_cpu: false
Launching a script from the location of that custom yaml file looks like the following:
accelerate launch --config_file {path/to/config/my_config_file.yaml} {script_name.py} {--arg1} {--arg2} ...
以上