Transformers 文件

FullyShardedDataParallel

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

FullyShardedDataParallel

Fully Sharded Data Parallel (FSDP) 是一種結合了資料並行和模型並行優勢的並行化方法,用於分散式訓練。

DistributedDataParallel (DDP) 不同,FSDP 更節省記憶體,因為它不會在每個 GPU 上覆制模型。它將模型的引數、梯度和最佳化器狀態分片到各個 GPU 上。每個模型分片處理部分資料,並同步結果以加快訓練速度。

本指南介紹如何使用 FSDP 和 Accelerate(一個用於管理分散式訓練的庫)設定模型訓練。

pip install accelerate

配置選項

始終首先執行 accelerate config 命令,以幫助 Accelerate 設定正確的分散式訓練環境。

accelerate config

以下部分討論了一些重要的 FSDP 配置選項。您可以在 fsdp_config 引數中瞭解更多可用選項。

分片策略

FSDP 提供多種分片策略來分發模型。請參閱下表,以幫助您為您的設定選擇最佳策略。在配置檔案中使用 fsdp_sharding_strategy 引數指定策略。

分片策略 描述 引數值
FULL_SHARD 分片模型引數、梯度和最佳化器狀態 1
SHARD_GRAD_OP 分片梯度和最佳化器狀態 2
NO_SHARD 不分片模型 3
HYBRID_SHARD 在每個 GPU 內分片模型引數、梯度和最佳化器狀態 4
HYBRID_SHARD_ZERO2 在每個 GPU 內分片梯度和最佳化器狀態 5

CPU 解除安裝

當模型引數和梯度不被使用時,將其解除安裝到 CPU,以節省額外的 GPU 記憶體。這對於即使使用 FSDP,模型仍然過大的情況非常有用。

在配置檔案中指定 fsdp_offload_params: true 來啟用解除安裝。

封裝策略

FSDP 透過封裝網路中的每一層來應用。封裝通常以巢狀方式應用,即在每次前向傳播後丟棄完整的權重,以節省下一層的記憶體。

有幾種封裝策略可用,但*自動封裝*策略最簡單,不需要對您的程式碼進行任何更改。指定 fsdp_auto_wrap_policy: TRANSFORMER_BASED_WRAP 以封裝 Transformer 層,並指定 fsdp_transformer_layer_cls_to_wrap 以確定要封裝的層(例如,BertLayer)。

也提供基於大小的封裝。如果一層超過一定數量的引數,它將被封裝。指定 fsdp_wrap_policy: SIZED_BASED_WRAPmin_num_param 來設定要封裝的層的最小引數數量。

檢查點

中間檢查點應儲存為分片狀態字典,因為儲存完整狀態字典(即使有 CPU 解除安裝)也耗時且可能導致 `NCCL Timeout` 錯誤,原因是廣播期間無限期掛起。

在配置檔案中指定 `fsdp_state_dict_type: SHARDED_STATE_DICT` 以儲存分片狀態字典。現在您可以使用 load_state 從分片狀態字典恢復訓練。

accelerator.load_state("directory/containing/checkpoints")

但訓練完成後,您應該儲存完整狀態字典,因為分片狀態字典僅與 FSDP 相容。

if trainer.is_fsdp_enabled:
  trainer.accelerator.state.fsdp_plugin.set_state_dict_type("FULL_STATE_DICT")

trainer.save_model(script_args.output_dir)

TPU

PyTorch XLA 是一個用於在 XLA 裝置上執行 PyTorch 的軟體包,它在 TPU 上啟用了 FSDP。修改配置檔案以包含以下引數。有關 FSDP 可配置的其他 XLA 特定引數,請參閱 xla_fsdp_settings 引數。

xla: True # must be set to True to enable PyTorch/XLA
xla_fsdp_settings: # XLA specific FSDP parameters
xla_fsdp_grad_ckpt: True # enable gradient checkpointing

訓練

執行 accelerate config 後,您的配置檔案應該準備就緒。下面顯示了一個示例配置檔案,它在兩個 GPU 上完全分片了引數、梯度和最佳化器狀態。您的檔案可能因配置設定方式而異。

compute_environment: LOCAL_MACHINE
debug: false
distributed_type: FSDP
downcast_bf16: 'no'
fsdp_config:
  fsdp_auto_wrap_policy: TRANSFORMER_BASED_WRAP
  fsdp_backward_prefetch_policy: BACKWARD_PRE
  fsdp_cpu_ram_efficient_loading: true
  fsdp_forward_prefetch: false
  fsdp_offload_params: true
  fsdp_sharding_strategy: 1
  fsdp_state_dict_type: SHARDED_STATE_DICT
  fsdp_sync_module_states: true
  fsdp_transformer_layer_cls_to_wrap: BertLayer
  fsdp_use_orig_params: true
machine_rank: 0
main_training_function: main
mixed_precision: bf16
num_machines: 1
num_processes: 2
rdzv_backend: static
same_network: true
tpu_env: []
tpu_use_cluster: false
tpu_use_sudo: false
use_cpu: false

執行 accelerate launch 命令,以您在配置檔案中選擇的 FSDP 配置啟動訓練指令碼。

accelerate launch my-training-script.py

也可以直接在命令列中指定一些 FSDP 引數。

accelerate launch --fsdp="full shard" --fsdp_config="path/to/fsdp_config/" my-training-script.py

資源

與其他並行策略相比,FSDP 是一種用於使用更少 GPU 訓練大型模型的強大工具。請參閱以下資源以瞭解有關 FSDP 的更多資訊。

< > 在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.