Accelerate documentation
Accelerator
Accelerator
Acceleratorは、あらゆるタイプの学習設定で分散学習を有効にするためのメインクラスです。Acceleratorをコードに追加するチュートリアルを読み、スクリプトにAcceleratorを追加する方法を詳しく学んでください。
Accelerator
クラス accelerate.Accelerator
< source >( device_placement: bool = Truesplit_batches: bool = <object object at 0x7fe7459895c0>mixed_precision: PrecisionType | str | None = Nonegradient_accumulation_steps: int = 1cpu: bool = Falsedataloader_config: DataLoaderConfiguration | None = Nonedeepspeed_plugin: DeepSpeedPlugin | dict[str, DeepSpeedPlugin] | None = Nonefsdp_plugin: FullyShardedDataParallelPlugin | None = Nonetorch_tp_plugin: TorchTensorParallelPlugin | None = Nonemegatron_lm_plugin: MegatronLMPlugin | None = Nonerng_types: list[str | RNGType] | None = Nonelog_with: str | LoggerType | GeneralTracker | list[str | LoggerType | GeneralTracker] | None = Noneproject_dir: str | os.PathLike | None = Noneproject_config: ProjectConfiguration | None = Nonegradient_accumulation_plugin: GradientAccumulationPlugin | None = Nonestep_scheduler_with_optimizer: bool = Truekwargs_handlers: list[KwargsHandler] | None = Nonedynamo_backend: DynamoBackend | str | None = Nonedynamo_plugin: TorchDynamoPlugin | None = Nonedeepspeed_plugins: DeepSpeedPlugin | dict[str, DeepSpeedPlugin] | None = Noneparallelism_config: ParallelismConfig | None = None )
パラメータ
- device_placement (
bool、任意、デフォルトはTrue) — アクセラレーターがオブジェクトをデバイスに配置するかどうか(dataloader が生成するテンソル、モデルなど)。 - mixed_precision (
str, 任意) — 混合精度学習を使用するかどうか。‘no’、‘fp16’、‘bf16’、‘fp8’ から選択します。デフォルトでは、環境変数ACCELERATE_MIXED_PRECISIONの値が使用されます。この変数は、現在のシステムの accelerate 設定のデフォルト値、またはaccelerate.launchコマンドに渡されたフラグを使用します。‘fp8’ を使用するには、transformers-engine のインストールが必要です。 - gradient_accumulation_steps (
int、任意、デフォルトは 1) — 勾配が蓄積される前に経過すべきステップ数です。1 より大きい値を指定する場合は、Accelerator.accumulateと組み合わせて使用してください。指定されない場合、環境変数ACCELERATE_GRADIENT_ACCUMULATION_STEPSの値がデフォルトとして使用されます。GradientAccumulationPluginを通しても設定できます。 - cpu (
bool, 任意) — スクリプトの CPU での実行を強制するかどうか。Trueに設定すると、利用可能な GPU を無視し、1 プロセスでのみ実行を強制します。 - dataloader_config (
DataLoaderConfiguration, 任意) — 分散シナリオにおいてdataloaderをどのように処理するかを設定するための設定です。 - deepspeed_plugin (DeepSpeedPlugin または
str— DeepSpeedPlugin の辞書、任意): この引数を使用して、DeepSpeed 関連の引数を調整します。この引数は任意であり、accelerate config を直接使用して設定することもできます。複数のプラグインを使用する場合は、各プラグインで設定されたkeyプロパティを使用して、accelerator.state.get_deepspeed_plugin(key)からアクセスします。deepspeed_pluginsの別名です。 - fsdp_plugin (FullyShardedDataParallelPlugin、任意) — この引数を使用して、FSDP 関連の引数を調整できます。この引数は任意であり、accelerate config を直接使用して設定することもできます。
- torch_tp_plugin(
TorchTensorParallelPlugin、任意)— 非推奨:tp_sizeを指定してparallelism_configを使用してください。 - megatron_lm_plugin (MegatronLMPlugin、任意) — この引数を使用して、MegatronLM 関連の引数を調整できます。この引数は任意であり、accelerate config を直接使用して設定することもできます。
- rng_types (のリスト
strまたは RNGType) — 準備済みのデータローダーの各イテレーションの開始時に同期する乱数生成器のリストです。以下の1つまたは複数に設定してください:"torch": 基本的な torch ランダム数生成器"cuda": CUDA乱数生成器(GPUのみ)"xla": XLA乱数生成器(TPUのみ)"generator": 基盤となるデータセットがそのタイプの場合、サンプラー(dataloader にサンプラーがない場合はバッチサンプラー)またはイテラブルデータセット(存在する場合)のtorch.Generator。
PyTorch バージョン 1.5.1 以下では
["torch"]、1.6 以上では["generator"]がデフォルトになります。 - log_with (のリスト
str, LoggerType または GeneralTracker, 省略可能) — 実験トラッキング用に設定するロガーのリストです。以下のいずれか、または複数にしてください:"all""tensorboard""wandb""trackio""aim""comet_ml""mlflow""dvclive""swanlab""all"が選択されている場合、環境内で利用可能なすべてのトラッカーを取得して初期化します。カスタムトラッカーにはGeneralTrackerの実装も受け入れられ、"all"と組み合わせることもできます。
- project_config (ProjectConfiguration、任意) — 状態の保存方法を処理するための設定です。
- project_dir (
str,os.PathLike, 省略可) — ローカル互換ロガーのログや、保存される可能性のあるチェックポイントなどのデータを格納するためのディレクトリへのパス。 - step_scheduler_with_optimizer (
bool、省略可能、デフォルトはTrue) — 学習率スケジューラがオプティマイザと同時にステップされる場合はTrue、特定の条件下でのみ実行される場合はFalseを設定します(例えば、各エポックの終了時など)。 - kwargs_handlers (KwargsHandler のリスト、任意) — 分散学習、プロファイリング、または混合精度に関連するオブジェクトの作成方法をカスタマイズするための KwargsHandler のリストです。詳細は kwargs を参照してください。
- dynamo_backend (
strまたは DynamoBackend、任意、デフォルトは"no") — torch dynamo を用いてトレーニングを最適化するために、利用可能な dynamo バックエンドのいずれかに設定します。 - dynamo_plugin (TorchDynamoPlugin、任意) —
backendやmodeだけでは不十分な場合、torch dynamo の処理方法を設定するための構成です。 - gradient_accumulation_plugin (GradientAccumulationPlugin、任意) —
gradient_accumulation_stepsだけでは不十分な場合、勾配の蓄積をどのように処理するかを設定するための構成です。
分散学習または混合精度学習用のacceleratorのインスタンスを作成します。
利用可能な属性:
- device (
torch.device) — 使用するデバイス。 - distributed_type (DistributedType) — 分散学習の設定です。
- local_process_index (
int) — 現在のマシン上のプロセスインデックス。 - mixed_precision (
str) — 設定された混合精度モード。 - num_processes (
int) — 学習に使用されるプロセスの総数。 - optimizer_step_was_skipped (
bool) — オプティマイザーの更新がスキップされたかどうか(混合精度での勾配オーバーフローが原因の場合)。この場合、学習率は変更すべきではありません。 - process_index (
int) — 全プロセスにおける現在のプロセスの全体インデックス。 - state (AcceleratorState) — 分散環境のセットアップ状態です。
- sync_gradients (
bool) — グラディエントが現在、すべてのプロセス間で同期されているかどうかを示します。 - use_distributed (
bool) — 現在の設定が分散学習用であるかどうかを示します。
accumulate
< source >( *models )
…を軽くラップし、勾配の蓄積を自動的に実行するコンテキストマネージャー
例:
>>> from accelerate import Accelerator
>>> accelerator = Accelerator(gradient_accumulation_steps=1)
>>> dataloader, model, optimizer, scheduler = accelerator.prepare(dataloader, model, optimizer, scheduler)
>>> for input, output in dataloader:
... with accelerator.accumulate(model):
... outputs = model(input)
... loss = loss_func(outputs)
... loss.backward()
... optimizer.step()
... scheduler.step()
... optimizer.zero_grad()このコンテキストマネージャー内のブロック内で、有効化されている場合、自動混合精度が適用されます。それ以外の場合は、何も変わりません。
autocast_handler を渡すことで、Accelerator オブジェクトに設定されたものを上書きできます。これは、autocast 内のブロックで fp32 に戻したい場合に便利です。
GradientAccumulationPlugin に従って勾配をスケーリングし、設定に基づいて適切な backward() を呼び出します。
loss.backward()の代わりに使用してください。
プロセスのいずれかにおいて、内部のトリガーテンソルが1に設定されているかどうかを確認します。設定されている場合、Trueを返し、トリガーテンソルを0にリセットします。
注:
wait_for_everyone()は不要です。
例:
>>> from accelerate import Accelerator
>>> accelerator = Accelerator()
>>> # Assume later in the training script
>>> # `should_do_breakpoint` is a custom function to monitor when to break,
>>> # e.g. when the loss is NaN
>>> if should_do_breakpoint(loss):
... accelerator.set_trigger()
>>> # Assume later in the training script
>>> if accelerator.check_trigger():
... breakAccelerate.free_memory の別名です。内部オブジェクトへのすべての参照を解放し、ガベージコレクタを呼び出します。異なるモデル/オプティマイザーで2回のトレーニングを行う間には、このメソッドを呼び出す必要があります。
clip_grad_norm_
< source >( parametersmax_normnorm_type = 2 ) → torch.Tensor
戻り値
torch.Tensor
パラメータの勾配(単一のベクトルとして見た場合)のノルムの合計。
torch.nn.utils.clip_grad_norm_の代わりに使用してください。
例:
>>> from accelerate import Accelerator
>>> accelerator = Accelerator(gradient_accumulation_steps=2)
>>> dataloader, model, optimizer, scheduler = accelerator.prepare(dataloader, model, optimizer, scheduler)
>>> for input, target in dataloader:
... optimizer.zero_grad()
... output = model(input)
... loss = loss_func(output, target)
... accelerator.backward(loss)
... if accelerator.sync_gradients:
... accelerator.clip_grad_norm_(model.parameters(), max_grad_norm)
... optimizer.step()torch.nn.utils.clip_grad_value_ の代わりに使用してください。
例:
>>> from accelerate import Accelerator
>>> accelerator = Accelerator(gradient_accumulation_steps=2)
>>> dataloader, model, optimizer, scheduler = accelerator.prepare(dataloader, model, optimizer, scheduler)
>>> for input, target in dataloader:
... optimizer.zero_grad()
... output = model(input)
... loss = loss_func(output, target)
... accelerator.backward(loss)
... if accelerator.sync_gradients:
... accelerator.clip_grad_value_(model.parameters(), clip_value)
... optimizer.step()通常、これはprepareの一部として呼び出されますが、dataloaderがモデルとは別に準備された場合(外部のaccelerator.prepare呼び出しの場合)、prepare(model)の後にこの追加の呼び出しを行う必要があります(使用例としてHF Trainerを参照してください)。
実験トラッキングを使用している場合、スクリプトの末尾で常に呼び出す必要があります。メインプロセスでのみトラッカーを停止したり、プロセスグループを破棄したりするなど、トレーニング終了時の特別な処理を実行します。
内部オブジェクトに保存されているすべての参照を解放し、ガベージコレクターを呼び出します。異なるモデル/オプティマイザーで2回のトレーニングを行う間には、このメソッドを呼び出す必要があります。また、Accelerator.stepを0にリセットします。
gather
< source >( tensor ) → torch.Tensor, or a nested tuple/list/dictionary of torch.Tensor
tensorの値をすべてのプロセスにわたって集約し、最初の次元で連結します。評価時にすべてのプロセスからの予測を再グループ化する場合に便利です。
Note: このgatherはすべてのプロセスで実行されます。
例:
>>> # Assuming four processes
>>> import torch
>>> from accelerate import Accelerator
>>> accelerator = Accelerator()
>>> process_tensor = torch.tensor([accelerator.process_index], device=accelerator.device)
>>> gathered_tensor = accelerator.gather(process_tensor)
>>> gathered_tensor
tensor([0, 1, 2, 3])gather_for_metrics
< source >( input_datause_gather_object = False )
パラメータ
- input_data (
torch.Tensor、object、torch.Tensorのネストされたタプル/リスト/辞書、またはobjectのネストされたタプル/リスト/辞書) — すべてのプロセスにわたってメトリクスを計算するためのテンソルまたはオブジェクト - use_gather_object(
bool) — gather(すべてのオブジェクトにテンソルが含まれない場合は既に実行されています)の代わりに、gather_objectを強制使用するかどうか。このフラグは、パディングと最初の次元に沿った連結を避けたい、サイズが異なるテンソルを集約する場合に有用です。GPUテンソルと併用することは適切にサポートされておらず、テンソルがピクルス化されるためGPU -> CPU転送が発生し、非効率です。
分散システムの場合、input_dataを集約し、最後のバッチから重複を削除する可能性があります。メトリクスの計算における入力とターゲットの集約に使用してください。
例:
>>> # Assuming two processes, with a batch size of 5 on a dataset with 9 samples
>>> import torch
>>> from accelerate import Accelerator
>>> accelerator = Accelerator()
>>> dataloader = torch.utils.data.DataLoader(range(9), batch_size=5)
>>> dataloader = accelerator.prepare(dataloader)
>>> batch = next(iter(dataloader))
>>> gathered_items = accelerator.gather_for_metrics(batch)
>>> len(gathered_items)
9get_state_dict
< source >( modelunwrap = True ) → dict
パラメータ
- model (
torch.nn.Module) — Accelerator.prepare() を通して渡された PyTorch モデル - unwrap (
bool、省略可能、デフォルトはTrue) —modelの元の基底のstate_dictを返すか、ラップされたstate_dictを返すかを指定します。
戻り値
dict
モデルのステートディクショナリ。完全な精度を有さない場合もあります。
Accelerator.prepare() を通して送信されたモデルの状態辞書を、完全な精度なしで返します。
get_tracker
< source >( name: strunwrap: bool = False ) → GeneralTracker
メインプロセスでのみ、name に基づいて self.trackers から tracker を返します。
join_uneven_inputs
< source >( joinableseven_batches = None )
パラメータ
- joinables (
list[torch.distributed.algorithms.Joinable]) —torch.distributed.algorithms.Joinableをサブクラスとするモデルまたはオプティマイザーのリストです。最も一般的なケースは、DistributedDataParallel 学習用にAccelerator.prepareで準備された PyTorch Module です。 - even_batches (
bool、省略可) — 設定されている場合、Acceleratorで設定されたeven_batchesの値を上書きします。指定されない場合、Acceleratorのデフォルト値が使用されます。
torch.distributed.algorithms.joinをラップして、不揃いな入力での分散学習または評価を容易にするコンテキストマネージャーです。これは、総バッチサイズがデータセットの長さを均等に割り切れない場合に有用です。
join_uneven_inputsは、複数 GPU での Distributed Data Parallel 学習のみサポートされています。その他の構成では、このメソッドは効果がありません。
even_batchesをオーバーライドしても、iterableスタイルのデータローダーには影響しません。
例:
>>> from accelerate import Accelerator
>>> accelerator = Accelerator(even_batches=True)
>>> ddp_model, optimizer, dataloader = accelerator.prepare(model, optimizer, dataloader)
>>> with accelerator.join_uneven_inputs([ddp_model], even_batches=False):
... for input, output in dataloader:
... outputs = model(input)
... loss = loss_func(outputs)
... loss.backward()
... optimizer.step()
... optimizer.zero_grad()load_state
< source >( input_dir: str | None = Noneload_kwargs: dict | None = None**load_model_func_kwargs )
パラメータ
- input_dir (
strまたはos.PathLike) — 関連するすべての重みと状態が保存されたフォルダの名前です。automatic_checkpoint_namingを使用している場合はNoneにでき、最新のチェックポイントから読み込まれます。 - load_kwargs (
dict, 任意) —load関数に渡す追加のキーワード引数。state_dict や optimizer に関する任意の引数などが含まれます。 - load_model_func_kwargs (
dict, 省略可) — モデルの読み込みに使用される、基盤となる読み込み関数に渡すことのできる追加のキーワード引数です。例えば、DeepSpeed のload_checkpoint関数のオプション引数や、モデルとオプティマイザを読み込むためのmap_locationなどです。
モデル、オプティマイザー、スケーラー、RNGジェネレーター、および登録済みオブジェクトの現在の状態を読み込みます。
Accelerator.save_state() と併せて使用してください。チェックポイント用に登録されていないファイルは、ディレクトリに保存されていても読み込まれません。
ローカルメインプロセスがwithブロック内に入ることを許可します。
他のプロセスは、メインプロセスが終了した後にwithブロックに入ります。
例:
>>> from accelerate import Accelerator
>>> accelerator = Accelerator()
>>> with accelerator.local_main_process_first():
... # This will be printed first by local process 0 then in a seemingly
... # random order by the other processes.
... print(f"This will be printed by process {accelerator.local_process_index}")LOMOオプティマイザーでバックワードパスを実行します。
withブロック内で、メインプロセスを先に実行させます。
他のプロセスは、メインプロセスが終了した後にwithブロックに入ります。
maybe_context_parallel
< source >( buffers: list[torch.Tensor] | None = Nonebuffer_seq_dims: list[int] | None = Noneno_restore_buffers: set[torch.Tensor] | None = None )
パラメータ
- buffers (
list[torch.Tensor],optional) — シーケンス次元に沿ってシャードされるバッファです。一般的な例としては、入力、ラベル、または位置埋め込みバッファが挙げられます。このコンテキストマネージャはこれらのバッファをインプレースで変更し、コンテキストを抜けた後、バッファは元の状態に復元されます。不要な復元を避けるために、no_restore_buffersを使用して、復元する必要のないバッファを指定できます。 - buffer_seq_dims (
list[int]、optional) —buffersのシーケンス次元。 - no_restore_buffers (
set[torch.Tensor]、optional) — このセットはbuffersの部分集合である必要があります。buffers引数から、コンテキスト終了後に復元されないバッファを指定します。これらのバッファは、シャード状態のまま保持されます。
コンテキスト並列トレーニングを有効にするコンテキストマネージャーです。
context_parallelは現在 FSDP2 でサポートされており、parallelism_config.cp_size>
- これらの条件のいずれかが満たされていない場合、このコンテキストマネージャーは効果を持ちませんが、コードの変更を最小限に抑えるため、例外を発生させません。
このコンテキストマネージャは、以下の例に示すように、各トレーニングステップごとに再作成する必要があります。
no_sync
< source >( model )
torch.nn.parallel.DistributedDataParallel.no_sync を呼び出して、DDP プロセス間で勾配の同期を無効にするためのコンテキストマネージャーです。
modelがDDPにない場合、このコンテキストマネージャーは何も実行しません
例:
>>> from accelerate import Accelerator
>>> accelerator = Accelerator()
>>> dataloader, model, optimizer = accelerator.prepare(dataloader, model, optimizer)
>>> input_a = next(iter(dataloader))
>>> input_b = next(iter(dataloader))
>>> with accelerator.no_sync():
... outputs = model(input_a)
... loss = loss_func(outputs)
... accelerator.backward(loss)
... # No synchronization across processes, only accumulate gradients
>>> outputs = model(input_b)
>>> accelerator.backward(loss)
>>> # Synchronization across all processes
>>> optimizer.step()
>>> optimizer.zero_grad()デコレータとして使用すると、デコレートされた関数は最後のプロセスでのみ実行されます。PartialStateクラスを介して呼び出すこともできます。
on_local_main_process
< source >( function: Callable[..., Any] | None = None )
デコレータとして使用すると、デコレートされた関数はローカル環境のメインプロセスでのみ実行されます。PartialStateクラスを介して呼び出すこともできます。
例:
# Assume we have 2 servers with 4 processes each.
from accelerate import Accelerator
accelerator = Accelerator()
@accelerator.on_local_main_process
def print_something():
print("This will be printed by process 0 only on each server.")
print_something()
# On server 1:
"This will be printed by process 0 only"
# On server 2:
"This will be printed by process 0 only"on_local_process
< source >( function: Callable[..., Any] | None = Nonelocal_process_index: int | None = None )
指定されたローカルプロセスインデックスでのみ装飾された関数を実行するデコレーターです。PartialStateクラスを使用して呼び出すこともできます。
例:
# Assume we have 2 servers with 4 processes each.
from accelerate import Accelerator
accelerator = Accelerator()
@accelerator.on_local_process(local_process_index=2)
def print_something():
print(f"Printed on process {accelerator.local_process_index}")
print_something()
# On server 1:
"Printed on process 2"
# On server 2:
"Printed on process 2"on_main_process
< source >( function: Callable[..., Any] | None = None )
デコレータとして使用すると、デコレートされた関数はメインプロセスでのみ実行されます。PartialStateクラスを介して呼び出すこともできます。
on_process
< source >( function: Callable[..., Any] | None = Noneprocess_index: int | None = None )
指定されたプロセスインデックスでのみ装飾された関数を実行するデコレーターです。PartialStateクラスを使用して呼び出すこともできます。
pad_across_processes
< source >( tensordim = 0pad_index = 0pad_first = False ) → torch.Tensor, or a nested tuple/list/dictionary of torch.Tensor
…
例:
>>> # Assuming two processes, with the first processes having a tensor of size 1 and the second of size 2
>>> import torch
>>> from accelerate import Accelerator
>>> accelerator = Accelerator()
>>> process_tensor = torch.arange(accelerator.process_index + 1).to(accelerator.device)
>>> padded_tensor = accelerator.pad_across_processes(process_tensor)
>>> padded_tensor.shape
torch.Size([2])prepare
< source >( *argsdevice_placement = None )
パラメータ
- *args (オブジェクトのリスト —
以下のいずれかの型のオブジェクト:
torch.utils.data.DataLoader: PyTorch Dataloadertorch.nn.Module: PyTorchモジュールtorch.optim.Optimizer: PyTorchのオプティマイザtorch.optim.lr_scheduler.LRScheduler: PyTorch LR スケジューラ
- device_placement (
list[bool], 任意) — 渡される各オブジェクトに対して自動デバイス配置を行うかどうかをカスタマイズするために使用します。argsと同じ長さのリストである必要があります。DeepSpeed や FSDP とは互換性がありません。
args に渡されたすべてのオブジェクトを分散学習と混合精度用に準備し、同じ順序で返します。
推論のみで、いかなる形の混合精度も使用しない場合は、モデルの準備は不要です。
例:
>>> from accelerate import Accelerator
>>> accelerator = Accelerator()
>>> # Assume a model, optimizer, data_loader and scheduler are defined
>>> model, optimizer, data_loader, scheduler = accelerator.prepare(model, optimizer, data_loader, scheduler)>>> from accelerate import Accelerator
>>> accelerator = Accelerator()
>>> # Assume a model, optimizer, data_loader and scheduler are defined
>>> device_placement = [True, True, False, False]
>>> # Will place the first two items passed in automatically to the right device but not the last two.
>>> model, optimizer, data_loader, scheduler = accelerator.prepare(
... model, optimizer, data_loader, scheduler, device_placement=device_placement
... )prepare_data_loader
< source >( data_loader: torch.utils.data.DataLoaderdevice_placement = Noneslice_fn_for_dispatch = None )
パラメータ
- data_loader (
torch.utils.data.DataLoader) — 準備用のバニラ PyTorch DataLoader - device_placement (
bool, 任意) — 準備済みのdataloaderでバッチを適切なデバイスに配置するかどうか。デフォルトではself.device_placementが使用されます。 - slice_fn_for_dispatch (
Callable, optional) -- If passed, this function will be used to slice tensors acrossnum_processes. Will default to [slice_tensors()](/docs/accelerate/main/en/package_reference/utilities#accelerate.utils.slice_tensors). This argument is used only whendispatch_batchesis set toTrue` and will be ignored otherwise.
分散環境でのトレーニング用にPyTorchのDataLoaderを準備します。代わりにAccelerator.prepare()の使用を推奨します。
prepare_model
< source >( model: torch.nn.Moduledevice_placement: bool | None = Noneevaluation_mode: bool = False )
パラメータ
PyTorchモデルを任意の分散環境での学習に準備します。Accelerator.prepare()の使用を推奨します。
prepare_optimizer
< source >( optimizer: torch.optim.Optimizerdevice_placement = None )
PyTorch Optimizerを任意の分散環境での学習に準備します。Accelerator.prepare()の使用を推奨します。
prepare_scheduler
< source >( scheduler: LRScheduler )
分散環境でのトレーニング用にPyTorch Schedulerを準備します。Accelerator.prepare()の使用を推奨します。
print()のドロップイン代替として、サーバーごとに1回だけ出力します。
プロファイル
< source >( profile_handler: ProfileKwargs | None = None )
コンテキストマネージャー内のコードをプロファイルします。profile_handler.output_trace_dirが設定されている場合、プロファイルはChrome Traceファイルに保存されます。
Acceleratorオブジェクトに設定されたものを上書きするために、別のprofile_handlerを渡すことができます。
例:
# Profile with default settings
from accelerate import Accelerator
from accelerate.utils import ProfileKwargs
accelerator = Accelerator()
with accelerator.profile() as prof:
train()
accelerator.print(prof.key_averages().table())
# Profile with the custom handler
def custom_handler(prof):
print(prof.key_averages().table(sort_by="self_cpu_time_total", row_limit=10))
kwargs = ProfileKwargs(schedule_option=dict(wait=1, warmup=1, active=1), on_trace_ready=custom_handler)
accelerator = Accelerator(kwarg_handler=[kwargs])
with accelerator.profile() as prof:
for _ in range(10):
train_iteration()
prof.step()
# Profile and export to Chrome Trace
kwargs = ProfileKwargs(output_trace_dir="output_trace")
accelerator = Accelerator(kwarg_handler=[kwargs])
with accelerator.profile():
train()reduce
< source >( tensorreduction = 'sum'scale = 1.0 ) → torch.Tensor, or a nested tuple/list/dictionary of torch.Tensor
パラメータ
- tensor (
torch.Tensor、またはtorch.Tensorのネストされたタプル/リスト/辞書) — すべてのプロセス間で集約するテンソル。 - reduction (
str、任意、デフォルトは “sum”) — 集約の種類です。‘sum’、‘mean’、‘max’、‘none’ のいずれかになります。‘none’ の場合は、何の操作も実行しません。 - scale (
float、省略可能、デフォルト値は 1.0) — reduce の後に適用されるデフォルトのスケーリング値です。XLA でのみ有効です。
戻り値
torch.Tensor、またはtorch.Tensorのネストされたタプル/リスト/辞書
縮小されたテンソル。
reductionに基づいて、tensorの値をすべてのプロセス間で集約します。
Note: すべてのプロセスが削減された値を取得します。
例:
>>> # Assuming two processes
>>> import torch
>>> from accelerate import Accelerator
>>> accelerator = Accelerator()
>>> process_tensor = torch.arange(accelerator.num_processes) + 1 + (2 * accelerator.process_index)
>>> process_tensor = process_tensor.to(accelerator.device)
>>> reduced_tensor = accelerator.reduce(process_tensor, reduction="sum")
>>> reduced_tensor
tensor([4, 6])objectsを記録し、save_stateまたはload_stateの実行時にそれらを保存または読み込みます。
これらは、同じスクリプト内で状態の読み込みまたは保存を行う際に使用されるべきです。異なるスクリプト間で使用するようには設計されていません。
保存するには、すべての
objectにload_state_dictとstate_dict関数が必要です。
register_load_state_pre_hook
< source >( hook: Callable[..., None] ) → torch.utils.hooks.RemovableHandle
パラメータ
- hook (
Callable) —load_checkpointの前に Accelerator.load_state() で呼び出される関数。
戻り値
torch.utils.hooks.RemovableHandle
handle.remove() を呼び出すことで、追加されたフックを削除するために使用できるハンドル
load_checkpoint が Accelerator.load_state() で呼び出される前に実行されるプリフックを登録します。
フックには、次のシグネチャが必要です:
hook(models: list[torch.nn.Module], input_dir: str) -> None
models 引数は、accelerator の状態内の accelerator._models に保存されているモデルであり、input_dir 引数は Accelerator.load_state() に渡される input_dir 引数です。
Accelerator.register_save_state_pre_hook() と併せて使用してください。モデルの重みに加えて設定を読み込む際に便利です。カスタマイズされたメソッドでモデルの読み込みを上書きする場合にも使用できます。この場合、すでに読み込まれたモデルをモデルのリストから削除することを忘れないでください。
register_save_state_pre_hook
< source >( hook: Callable[..., None] ) → torch.utils.hooks.RemovableHandle
パラメータ
- hook (
Callable) —save_checkpointの前に Accelerator.save_state() で呼び出される関数。
戻り値
torch.utils.hooks.RemovableHandle
handle.remove() を呼び出すことで、追加されたフックを削除するために使用できるハンドル
save_checkpoint が Accelerator.save_state() で呼び出される前に実行されるプリフックを登録します。
フックには、次のシグネチャが必要です:
hook(models: list[torch.nn.Module], weights: list[dict[str, torch.Tensor]], input_dir: str) -> None
models 引数は、accelerator の状態内の accelerator._models に保存されているモデルであり、weights 引数は models の state dict、input_dir 引数は Accelerator.load_state() に渡される input_dir 引数です。
Accelerator.register_load_state_pre_hook() と併せて使用してください。モデルの重みに加えて設定を保存する場合に便利です。カスタマイズされたメソッドでモデルの保存を上書きする場合にも使用できます。この場合、すでに読み込まれた重みを重みのリストから削除することを忘れないでください。
save
< source >( objfsafe_serialization = False )
torch.saveの代わりに、渡されたオブジェクトをマシンごとに1回ディスクに保存します。
Note:
save_on_each_nodeがProjectConfigurationとして渡された場合、メインノードでのみ1回保存するのではなく、ノードごとに1回ずつオブジェクトを保存します。
save_model
< source >( model: torch.nn.Modulesave_directory: Union[str, os.PathLike]max_shard_size: Union[int, str] = '10GB'safe_serialization: bool = True )
パラメータ
- model — (
torch.nn.Module): 保存するモデル。モデルはラップ済みでも、ラップ解除済みでも構いません。 - save_directory (
strまたはos.PathLike) — 保存先ディレクトリ。存在しない場合は作成されます。 - max_shard_size (
intまたはstr, 省略可能, デフォルトは"10GB") — シャーディングされる前のチェックポイントの最大サイズです。シャーディングされたチェックポイントは、それぞれこのサイズ未満になります。文字列で指定する場合は、数字の後に単位(例:"5MB").モデルの単一の重みが
max_shard_sizeより大きい場合、その重みはmax_shard_sizeを超える独自のチェックポイントシャードに格納されます。 - safe_serialization (
bool、任意、デフォルトはTrue) —safetensorsを使用してモデルを保存するか、従来のPyTorchの方式(pickleを使用)で保存するかどうかを指定します。
load_checkpoint_in_model を使用して再読み込みできるようにモデルを保存します
save_state
< source >( output_dir: str | None = Nonesafe_serialization: bool = True**save_model_func_kwargs )
モデル、オプティマイザー、スケーラー、RNGジェネレーター、および登録済みオブジェクトの現在の状態をフォルダーに保存します。
ProjectConfiguration が automatic_checkpoint_naming を有効にして Accelerator オブジェクトに渡された場合、チェックポイントは self.project_dir/checkpoints に保存されます。現在の保存数が total_limit を超えると、最も古い保存が削除されます。各チェックポイントは、checkpoint_<iteration> という名前の個別のフォルダに保存されます。
それ以外の場合は、output_dirに保存されるだけです。
トレーニング中にチェックポイントを保存し、同じ環境で状態を復元する場合にのみ使用すべきです。
現在のプロセスで内部トリガーテンソルを1に設定します。その後、この関数を用いて全プロセスにわたるチェックを実行する必要があります。
注:
wait_for_everyone()は不要です。
例:
>>> from accelerate import Accelerator
>>> accelerator = Accelerator()
>>> # Assume later in the training script
>>> # `should_do_breakpoint` is a custom function to monitor when to break,
>>> # e.g. when the loss is NaN
>>> if should_do_breakpoint(loss):
... accelerator.set_trigger()
>>> # Assume later in the training script
>>> if accelerator.check_breakpoint():
... breakskip_first_batches
< source >( dataloadernum_batches: int = 0 )
torch.utils.data.DataLoaderの新しいインスタンスを作成し、最初のnum_batchesを効率的にスキップするようにします。
例:
>>> from accelerate import Accelerator
>>> accelerator = Accelerator()
>>> dataloader, model, optimizer, scheduler = accelerator.prepare(dataloader, model, optimizer, scheduler)
>>> skipped_dataloader = accelerator.skip_first_batches(dataloader, num_batches=2)
>>> # for the first epoch only
>>> for input, target in skipped_dataloader:
... optimizer.zero_grad()
... output = model(input)
... loss = loss_func(output, target)
... accelerator.backward(loss)
... optimizer.step()
>>> # subsequent epochs
>>> for input, target in dataloader:
... optimizer.zero_grad()
... ...split_between_processes
< source >( inputs: list | tuple | dict | torch.Tensorapply_padding: bool = False )
inputをself.num_processesに素早く分割し、その後、そのプロセスで使用できます。異なるプロンプトなど、分散推論を行う場合に便利です。
dictを使用する場合、すべてのキーが同じ数の要素を持つ必要があります。
例:
# Assume there are two processes
from accelerate import Accelerator
accelerator = Accelerator()
with accelerator.split_between_processes(["A", "B", "C"]) as inputs:
print(inputs)
# Process 0
["A", "B"]
# Process 1
["C"]
with accelerator.split_between_processes(["A", "B", "C"], apply_padding=True) as inputs:
print(inputs)
# Process 0
["A", "B"]
# Process 1
["C", "C"]Accelerator.no_sync 下で複数のフォワードパスを実行した後、モデルの次のバックワードパスで勾配の同期をトリガーします(マルチGPUシナリオでのみ適用可能)。
スクリプトが分散モードで起動されていない場合、このコンテキストマネージャーは何も実行しません。
例:
>>> from accelerate import Accelerator
>>> accelerator = Accelerator()
>>> dataloader, model, optimizer = accelerator.prepare(dataloader, model, optimizer)
>>> with accelerator.no_sync():
... loss_a = loss_func(model(input_a)) # first forward pass
... loss_b = loss_func(model(input_b)) # second forward pass
>>> accelerator.backward(loss_a) # No synchronization across processes, only accumulate gradients
>>> with accelerator.trigger_sync_in_backward(model):
... accelerator.backward(loss_b) # Synchronization across all processes
>>> optimizer.step()
>>> optimizer.zero_grad()unscale_gradients
< source >( optimizer = None )
パラメータ
- optimizer (
torch.optim.Optimizerまたはlist[torch.optim.Optimizer]、省略可) — 勾配のスケール解除を行うオプティマイザです。設定されていない場合、prepare() に渡されたすべてのオプティマイザに対して勾配のスケール解除を行います。
AMPによる混合精度学習では、勾配をアンスケールします。その他の設定では、この操作は何もしません(noop)です。
Accelerator.clipgrad_norm() または Accelerator.clipgrad_value() を通じて呼び出すのが適切である可能性が高いです
unwrap_model
< source >( modelkeep_fp32_wrapper: bool = Truekeep_torch_compile: bool = True ) → torch.nn.Module
modelから、prepare()によって追加される可能性のある追加レイヤーを除去します。モデルを保存する前に使用すると便利です。
例:
>>> # Assuming two GPU processes
>>> from torch.nn.parallel import DistributedDataParallel
>>> from accelerate import Accelerator
>>> accelerator = Accelerator()
>>> model = accelerator.prepare(MyModel())
>>> print(model.__class__.__name__)
DistributedDataParallel
>>> model = accelerator.unwrap_model(model)
>>> print(model.__class__.__name__)
MyModelmodelが、autoに似たデバイスマップを持つ大規模モデル推論用に準備されていないことを確認します。
現在のプロセスの実行を停止し、他のすべてのプロセスがその地点に到達するまで待機します(スクリプトが1つのプロセスのみで実行されている場合は、何もしません)。モデルを保存する前に実行するのに便利です。
例:
>>> # Assuming two GPU processes
>>> import time
>>> from accelerate import Accelerator
>>> accelerator = Accelerator()
>>> if accelerator.is_main_process:
... time.sleep(2)
>>> else:
... print("I'm waiting for the main process to finish its sleep...")
>>> accelerator.wait_for_everyone()
>>> # Should print on every process at the same time
>>> print("Everyone is here")ユーティリティ
accelerate.utils.gather_object
< source >( object: Any )
…