Accelerate 文件
啟動 Accelerate 指令碼
並獲得增強的文件體驗
開始使用
啟動 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`)來開始您的多節點訓練執行。
建議使用主節點的內網 IP 而不是公網 IP 以獲得更好的延遲。這是您在主節點上執行 `hostname -I` 時看到的 `192.168.x.x` 或 `172.x.x.x` 地址。
要更好地瞭解多節點訓練,請檢視我們關於使用 FSDP 進行多節點訓練的示例。
< > 在 GitHub 上更新