Accelerate 文件

啟動 Accelerate 指令碼

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

啟動 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` 幫助您在系統中啟動程式碼。此命令封裝了在各種平臺上啟動指令碼所需的所有不同命令,而無需您記住每個命令是什麼。

如果您熟悉自己啟動 PyTorch 指令碼,例如使用 `torchrun`,您仍然可以這樣做。並非必須使用 `accelerate launch`。

您可以透過以下方式快速啟動指令碼:

accelerate launch {script_name.py} --arg1 --arg2 ...

只需在命令的開頭加上 `accelerate launch`,然後像往常一樣在後面傳遞額外的引數給您的指令碼!

由於這會執行各種 torch spawn 方法,所有預期的環境變數也可以在這裡修改。例如,以下是如何使用 `accelerate launch` 和單個 GPU:

# for cuda device:
CUDA_VISIBLE_DEVICES="0" accelerate launch {script_name.py} --arg1 --arg2 ...
# for xpu device:
ZE_AFFINITY_MASK="0" accelerate launch {script_name.py} --arg1 --arg2 ...

您也可以在不先執行 `accelerate config` 的情況下使用 `accelerate launch`,但您可能需要手動傳入正確的配置引數。在這種情況下,Accelerate 會為您做出一些超引數決策,例如,如果 GPU 可用,它將預設使用所有 GPU,並且不使用混合精度。以下是如何使用所有 GPU 並停用混合精度進行訓練:

accelerate launch --multi_gpu {script_name.py} {--arg1} {--arg2} ...

或者透過指定要使用的 GPU 數量:

accelerate launch --num_processes=2 {script_name.py} {--arg1} {--arg2} ...

為了更具體,您應該自己傳入所需的引數。例如,以下是如何在兩個 GPU 上使用混合精度啟動相同的指令碼,同時避免所有警告:

accelerate launch --multi_gpu --mixed_precision=fp16 --num_processes=2 {script_name.py} {--arg1} {--arg2} ...

要獲取可以傳入的完整引數列表,請執行:

accelerate launch -h

即使您在程式碼中沒有使用 Accelerate,您仍然可以使用啟動器來啟動您的指令碼!

為了直觀地展示這種差異,前面在多 GPU 上的 `accelerate launch` 命令使用 `torchrun` 看起來會是這樣:

MIXED_PRECISION="fp16" torchrun --nproc_per_node=2 --nnodes=1 {script_name.py} {--arg1} {--arg2} ...

您也可以將啟動 CLI 作為 python 模組來利用以啟動指令碼,這樣就可以傳入其他 python 特定的啟動行為。為此,請使用 `accelerate.commands.launch` 而不是 `accelerate launch`:

python -m accelerate.commands.launch --num_processes=2 {script_name.py} {--arg1} {--arg2}

如果您想用任何其他 python 標誌來執行指令碼,您也可以像 `-m` 一樣傳入它們,例如下面的例子啟用了非緩衝的 stdout 和 stderr:

python -u -m accelerate.commands.launch --num_processes=2 {script_name.py} {--arg1} {--arg2}

您也可以在 CPU 上執行您的程式碼!這對於在玩具模型和資料集上進行除錯和測試非常有用。

accelerate launch --cpu {script_name.py} {--arg1} {--arg2}

為什麼您應該總是使用 accelerate config

為什麼它如此有用,以至於您應該**總是**執行 `accelerate config`?

還記得前面那個呼叫 `accelerate launch` 和 `torchrun` 的命令嗎?配置之後,要執行帶有所需部分的指令碼,您只需要直接使用 `accelerate launch`,而無需傳入任何其他東西:

accelerate launch {script_name.py} {--arg1} {--arg2} ...

自定義配置

如前所述,`accelerate launch` 主要應透過結合使用 `accelerate config` 命令建立的配置來使用。這些配置被儲存到您的 Accelerate 快取資料夾中的 `default_config.yaml` 檔案中。此快取資料夾位於(按優先順序從高到低):

  • 您的環境變數 `HF_HOME` 的內容,字尾為 `accelerate`。
  • 如果不存在,則為您的環境變數 `XDG_CACHE_HOME` 的內容,字尾為 `huggingface/accelerate`。
  • 如果這也不存在,則為資料夾 `~/.cache/huggingface/accelerate`。

要擁有多個配置,可以將 `--config_file` 標誌與自定義 yaml 檔案的位置一起傳遞給 `accelerate launch` 命令。

一個示例 yaml 檔案可能如下所示,用於在單臺機器上使用兩個 GPU 並使用 `fp16` 進行混合精度訓練:

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

從該自定義 yaml 檔案所在位置啟動指令碼如下所示:

accelerate launch --config_file {path/to/config/my_config_file.yaml} {script_name.py} {--arg1} {--arg2} ...

多節點訓練

使用 Accelerate 進行多節點訓練類似於使用 torchrun 進行多節點訓練。啟動多節點訓練執行的最簡單方法是執行以下操作:

  • 將您的程式碼庫和資料複製到所有節點。(或將它們放在共享檔案系統上)
  • 在所有節點上設定您的 python 包。
  • 首先在主節點上執行 `accelerate config`。指定節點數後,系統會要求您指定每個節點的排名(主/主節點為0),以及主程序的 IP 地址和埠。這對於工作節點與主程序通訊是必需的。之後,您可以將此配置檔案複製或傳送到所有節點,將 `machine_rank` 更改為 1、2、3 等,以避免必須執行該命令(或者直接按照他們的指示使用 `torchrun` 啟動)。

完成此操作後,您可以透過在所有節點上執行 `accelerate launch`(或 `torchrun`)來開始您的多節點訓練執行。

需要在所有節點上執行該命令才能啟動所有程序,而不僅僅是在主節點上執行。您可以使用 SLURM 或其他程序執行器來包裝此要求,並從單個命令呼叫所有內容。

建議使用主節點的內網 IP 而不是公網 IP 以獲得更好的延遲。這是您在主節點上執行 `hostname -I` 時看到的 `192.168.x.x` 或 `172.x.x.x` 地址。

要更好地瞭解多節點訓練,請檢視我們關於使用 FSDP 進行多節點訓練的示例。

< > 在 GitHub 上更新

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