mcpField
H
huggingface-accelerate

huggingface-accelerate

github.com/orchestra-research開発14.1k991 回インストール19 週間前に更新
リポジトリ

huggingface-accelerate について

huggingface-accelerateは、少ないコード変更でPyTorchの分散学習を行う開発者向けのリファレンススキルです。複数のバックエンド、混合精度、勾配累積を扱います。

主な機能

  1. 01PyTorch分散学習の簡素化
  2. 02DDP、DeepSpeed、FSDPの設定
  3. 03混合精度の有効化
  4. 04勾配累積
  5. 05コマンドラインから学習を起動

活用シーン

  1. 01単一GPU用スクリプトを複数GPUで実行
  2. 02マルチノード学習の設定
  3. 03学習時のメモリー要件を削減

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/orchestra-research/ai-research-skills --skill huggingface-accelerate

インストール後、Claude Code で/huggingface-accelerateを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
custom-plugins.md
megatron-integration.md
performance.md

詳細

HuggingFace Accelerate - 統合分散学習

クイックスタート

Accelerate を使うと、分散学習を 4 行のコードで実現できます。

インストール:

pip install accelerate

PyTorch スクリプトの変換(4 行):

import torch
+ from accelerate import Accelerator

+ accelerator = Accelerator()

  model = torch.nn.Transformer()
  optimizer = torch.optim.Adam(model.parameters())
  dataloader = torch.utils.data.DataLoader(dataset)

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

  for batch in dataloader:
      optimizer.zero_grad()
      loss = model(batch)
-     loss.backward()
+     accelerator.backward(loss)
      optimizer.step()

実行(単一コマンド):

accelerate launch train.py

よくあるワークフロー

ワークフロー 1: 単一 GPU からマルチ GPU へ

元のスクリプト:

# train.py
import torch

model = torch.nn.Linear(10, 2).to('cuda')
optimizer = torch.optim.Adam(model.parameters())
dataloader = torch.utils.data.DataLoader(dataset, batch_size=32)

for epoch in range(10):
    for batch in dataloader:
        batch = batch.to('cuda')
        optimizer.zero_grad()
        loss = model(batch).mean()
        loss.backward()
        optimizer.step()

Accelerate を使用(4 行追加):

# train.py
import torch
from accelerate import Accelerator  # +1

accelerator = Accelerator()  # +2

model = torch.nn.Linear(10, 2)
optimizer = torch.optim.Adam(model.parameters())
dataloader = torch.utils.data.DataLoader(dataset, batch_size=32)

model, optimizer, dataloader = accelerator.prepare(model, optimizer, dataloader)  # +3

for epoch in range(10):
    for batch in dataloader:
        # No .to('cuda') needed - automatic!
        optimizer.zero_grad()
        loss = model(batch).mean()
        accelerator.backward(loss)  # +4
        optimizer.step()

設定(対話形式):

accelerate config

質問項目:

  • どのマシンですか?(単一 GPU/マルチ GPU/TPU/CPU)
  • マシンは何台ですか?(1)
  • 混合精度ですか?(no/fp16/bf16/fp8)
  • DeepSpeed を使用しますか?(no/yes)

起動(どの環境でも動作):

# Single GPU
accelerate launch train.py

# Multi-GPU (8 GPUs)
accelerate launch --multi_gpu --num_processes 8 train.py

# Multi-node
accelerate launch --multi_gpu --num_processes 16 \
  --num_machines 2 --machine_rank 0 \
  --main_process_ip $MASTER_ADDR \
  train.py
ワークフロー 2: 混合精度学習

FP16/BF16 を有効化:

from accelerate import Accelerator

# FP16 (with gradient scaling)
accelerator = Accelerator(mixed_precision='fp16')

# BF16 (no scaling, more stable)
accelerator = Accelerator(mixed_precision='bf16')

# FP8 (H100+)
accelerator = Accelerator(mixed_precision='fp8')

model, optimizer, dataloader = accelerator.prepare(model, optimizer, dataloader)

# Everything else is automatic!
for batch in dataloader:
    with accelerator.autocast():  # Optional, done automatically
        loss = model(batch)
    accelerator.backward(loss)
ワークフロー 3: DeepSpeed ZeRO 連携

DeepSpeed ZeRO-2 を有効化:

from accelerate import Accelerator

accelerator = Accelerator(
    mixed_precision='bf16',
    deepspeed_plugin={
        "zero_stage": 2,  # ZeRO-2
        "offload_optimizer": False,
        "gradient_accumulation_steps": 4
    }
)

# Same code as before!
model, optimizer, dataloader = accelerator.prepare(model, optimizer, dataloader)

または設定ファイルで指定:

accelerate config
# Select: DeepSpeed → ZeRO-2

deepspeed_config.json:

{
    "fp16": {"enabled": false},
    "bf16": {"enabled": true},
    "zero_optimization": {
        "stage": 2,
        "offload_optimizer": {"device": "cpu"},
        "allgather_bucket_size": 5e8,
        "reduce_bucket_size": 5e8
    }
}

起動:

accelerate launch --config_file deepspeed_config.json train.py
ワークフロー 4: FSDP(Fully Sharded Data Parallel)

FSDP を有効化:

from accelerate import Accelerator, FullyShardedDataParallelPlugin

fsdp_plugin = FullyShardedDataParallelPlugin(
    sharding_strategy="FULL_SHARD",  # ZeRO-3 equivalent
    auto_wrap_policy="TRANSFORMER_AUTO_WRAP",
    cpu_offload=False
)

accelerator = Accelerator(
    mixed_precision='bf16',
    fsdp_plugin=fsdp_plugin
)

model, optimizer, dataloader = accelerator.prepare(model, optimizer, dataloader)

または設定ファイルで指定:

accelerate config
# Select: FSDP → Full Shard → No CPU Offload
ワークフロー 5: 勾配累積

勾配を累積:

from accelerate import Accelerator

accelerator = Accelerator(gradient_accumulation_steps=4)

model, optimizer, dataloader = accelerator.prepare(model, optimizer, dataloader)

for batch in dataloader:
    with accelerator.accumulate(model):  # Handles accumulation
        optimizer.zero_grad()
        loss = model(batch)
        accelerator.backward(loss)
        optimizer.step()

実効バッチサイズ: batch_size * num_gpus * gradient_accumulation_steps

使い分けと代替手段

Accelerate を使うべき場合:

  • 最もシンプルな分散学習を行いたい
  • どのハードウェアでも単一のスクリプトを使いたい
  • HuggingFace エコシステムを利用している
  • 柔軟性を求めている(DDP/DeepSpeed/FSDP/Megatron)
  • 素早いプロトタイピングが必要

主な利点:

  • 4 行: 最小限のコード変更
  • 統一 API: DDP、DeepSpeed、FSDP、Megatron で同じコード
  • 自動化: デバイス配置、混合精度、シャーディング
  • 対話型設定: 手動でのランチャー設定が不要
  • 単一の起動方法: どこでも動作

代わりに使うべきもの:

  • PyTorch Lightning: コールバックや高レベルの抽象化が必要な場合
  • Ray Train: マルチノードのオーケストレーションやハイパーパラメータチューニングが必要な場合
  • DeepSpeed: API を直接制御したい場合や高度な機能が必要な場合
  • Raw DDP: 最大限の制御と最小限の抽象化が必要な場合

よくある問題

問題: デバイス配置が誤っている

手動でデバイスへ移動しないでください:

# WRONG
batch = batch.to('cuda')

# CORRECT
# Accelerate handles it automatically after prepare()

問題: 勾配累積が機能しない

コンテキストマネージャーを使用してください:

# CORRECT
with accelerator.accumulate(model):
    optimizer.zero_grad()
    accelerator.backward(loss)
    optimizer.step()

問題: 分散環境でのチェックポイント保存

Accelerator のメソッドを使用してください:

# Save only on main process
if accelerator.is_main_process:
    accelerator.save_state('checkpoint/')

# Load on all processes
accelerator.load_state('checkpoint/')

問題: FSDP で結果が異なる

同じ乱数シードを設定してください:

from accelerate.utils import set_seed
set_seed(42)

応用トピック

Megatron 連携: テンソル並列、パイプライン並列、シーケンス並列の設定については references/megatron-integration.md を参照してください。

カスタムプラグイン: カスタム分散プラグインの作成と高度な設定については references/custom-plugins.md を参照してください。

パフォーマンスチューニング: プロファイリング、メモリ最適化、ベストプラクティスについては references/performance.md を参照してください。

ハードウェア要件

  • CPU: 動作します(低速)
  • 単一 GPU: 動作します
  • マルチ GPU: DDP(デフォルト)、DeepSpeed、または FSDP
  • マルチノード: DDP、DeepSpeed、FSDP、Megatron
  • TPU: サポート
  • Apple MPS: サポート

ランチャーの要件:

  • DDP: torch.distributed.run(組み込み)
  • DeepSpeed: deepspeed(pip install deepspeed)
  • FSDP: PyTorch 1.12 以降(組み込み)
  • Megatron: カスタムセットアップ

リソース

コメント