Optimum 文件
分散式訓練
並獲得增強的文件體驗
開始使用
分散式訓練
當單個 CPU 訓練速度過慢時,我們可以使用多個 CPU。本指南著重介紹基於 PyTorch 的 DDP,以高效地實現分散式 CPU 訓練。
多 CPU 分散式訓練透過 mpirun 啟動,它支援 Gloo 和 oneCCL 作為集合通訊後端。為了效能考慮,英特爾推薦使用 oneCCL 後端。
Intel® oneCCL (集合通訊庫) 是一個用於高效分散式深度學習訓練的庫,它實現了 allreduce、allgather、alltoall 等集合操作。有關 oneCCL 的更多資訊,請參閱 oneCCL 文件和 oneCCL 規範。
模組 oneccl_bindings_for_pytorch (1.12 版本之前為 torch_ccl) 實現了 PyTorch C10D ProcessGroup API,可以作為外部 ProcessGroup 動態載入,目前僅在 Linux 平臺執行。
有關 oneccl_bind_pt 的更多詳細資訊,請檢視。
我們將按照以下步驟展示如何使用 oneCCL 後端進行分散式訓練。
Intel® oneCCL Bindings for PyTorch 安裝
以下 Python 版本提供了 wheel 檔案
| 擴充套件版本 | Python 3.6 | Python 3.7 | Python 3.8 | Python 3.9 | Python 3.10 |
|---|---|---|---|---|---|
| 1.12.1 | √ | √ | √ | √ | |
| 1.12.0 | √ | √ | √ | √ | |
| 1.11.0 | √ | √ | √ | √ | |
| 1.10.0 | √ | √ | √ | √ |
pip install oneccl_bind_pt=={pytorch_version} -f https://software.intel.com/ipex-whl-stable其中 {pytorch_version} 應該是您的 PyTorch 版本,例如 1.12.0。oneCCL 和 PyTorch 的版本必須匹配。oneccl_bindings_for_pytorch 1.12.0 預構建的 wheel 檔案不適用於 PyTorch 1.12.1 (它適用於 PyTorch 1.12.0) PyTorch 1.12.1 應該與 oneccl_bindings_for_pytorch 1.12.1 配合使用
適用於 Intel® oneCCL 1.12.0 的 MPI 工具集
oneccl_bindings_for_pytorch_path=$(python -c "from oneccl_bindings_for_pytorch import cwd; print(cwd)")
source $oneccl_bindings_for_pytorch_path/env/setvars.sh適用於 Intel® oneCCL 版本 < 1.12.0
torch_ccl_path=$(python -c "import torch; import torch_ccl; import os; print(os.path.abspath(os.path.dirname(torch_ccl.__file__)))")
source $torch_ccl_path/env/setvars.sh以下命令可以在一個節點上啟用 2 個程序的訓練,每個套接字執行一個程序。OMP_NUM_THREADS/CCL_WORKER_COUNT 變數可以進行調整以獲得最佳效能。
export CCL_WORKER_COUNT=1
export MASTER_ADDR=127.0.0.1
mpirun -n 2 -genv OMP_NUM_THREADS=23 \
python3 run_qa.py \
--model_name_or_path distilbert-base-uncased-distilled-squad \
--dataset_name squad \
--apply_quantization \
--quantization_approach static \
--do_train \
--do_eval \
--verify_loading \
--output_dir /tmp/squad_output \
--no_cuda \
--xpu_backend ccl以下命令可以在兩個節點上(node0 和 node1,以 node0 為主程序)總共啟用四個程序的訓練,ppn(每個節點的程序數)設定為 2,每個套接字執行一個程序。OMP_NUM_THREADS/CCL_WORKER_COUNT 變數可以進行調整以獲得最佳效能。
在 node0 中,您需要建立一個包含每個節點 IP 地址的配置檔案(例如 hostfile),並將該配置檔案的路徑作為引數傳遞。
cat hostfile xxx.xxx.xxx.xxx #node0 ip xxx.xxx.xxx.xxx #node1 ip
現在,在 node0 中執行以下命令,node0 和 node1 將啟用 4DDP
export CCL_WORKER_COUNT=1
export MASTER_ADDR=xxx.xxx.xxx.xxx #node0 ip
mpirun -f hostfile -n 4 -ppn 2 \
-genv OMP_NUM_THREADS=23 \
python3 run_qa.py \
--model_name_or_path distilbert-base-uncased-distilled-squad \
--dataset_name squad \
--apply_quantization \
--quantization_approach static \
--do_train \
--do_eval \
--verify_loading \
--output_dir /tmp/squad_output \
--no_cuda \
--xpu_backend ccl