跳至主要内容

DeepSpeed 多節點訓練設置教學(JupyterLab 版本)

DeepSpeed 多節點訓練設置教學(JupyterLab 版本)​

本教學旨在詳細說明如何在多節點環境中,利用 DeepSpeed 框架進行大規模模型的分散式訓練,並整合 JupyterLab 作為開發介面。

核心架構​

此設定的核心是建立一個包含所有必要依賴(CUDA, Python, OpenMPI, SSH, JupyterLab)的 Docker 環境。所有訓練節點都將運行此 Docker 映像檔。主節點 (Master Node) 會額外運行 JupyterLab 服務,並透過 OpenMPI 和無密碼 SSH 連線來啟動和協調所有從節點 (Worker Nodes) 上的訓練任務。

先決條件​

  • 多台具備 NVIDIA GPU 的主機: 所有主機的硬體和軟體環境(特別是驅動程式版本)應盡可能一致。
  • Docker 與 NVIDIA Container Toolkit: 所有主機都需安裝 Docker 和 NVIDIA Container Toolkit,以支援 GPU 容器。
  • 共享儲存 (建議): 一個所有節點都能存取的共享儲存(如 NFS),用於存放訓練資料、程式碼和模型檢查點,以簡化管理。
  • 網路連線: 所有節點之間需要有高速、低延遲的網路連線,並確保節點間的 SSH 端口 (22) 和 DeepSpeed 通訊端口 (預設 29500) 是開放的。

1. 配置文件準備​

1.1. requirements.txt​

此檔案列出了專案所需的 Python 套件。

--find-links https://download.pytorch.org/whl/cu126
torch>=2.0.0+cu126
torchvision>=0.15.0+cu126
torchaudio>=2.0.0+cu126
numpy>=1.24.0
pandas>=2.0.0
jupyterlab
jupyterlab-language-pack-zh-TW
jupyter-server-proxy
ipywidgets
jupyter-resource-usage
deepspeed

1.2. ds_config.json (DeepSpeed 配置檔案)​

此 JSON 檔案定義了 DeepSpeed 訓練的相關參數。

{
"train_micro_batch_size_per_gpu": 1,
"gradient_accumulation_steps": 8,
"optimizer": {
"type": "Adam",
"params": {
"lr": 1e-4,
"betas": [
0.9,
0.99
]
}
},
"scheduler": {
"type": "WarmupDecayLR",
"params": {
"total_num_steps": 500000,
"warmup_min_lr": 0,
"warmup_max_lr": 1e-4,
"warmup_num_steps": 1000
}
}
}

2. Docker 環境建構​

2.1. Dockerfile​

此 Dockerfile 用於建構包含所有必要依賴的訓練環境映像檔。

# 使用 NVIDIA CUDA 基礎映像
FROM nvidia/cuda:12.8.0-cudnn-devel-ubuntu22.04
WORKDIR /app

# 安裝系統依賴
RUN apt-get update && apt-get install -y \
git python3-pip openssh-server openssh-client nodejs npm openmpi-bin openmpi-common libopenmpi-dev \
&& rm -rf /var/lib/apt/lists/*

# 配置 SSH 服務
RUN mkdir /var/run/sshd
RUN echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config
RUN echo 'StrictHostKeyChecking no' >> /etc/ssh/ssh_config

# 設置 SSH 用戶和密碼 (!!! 警告:生產環境請使用 SSH 金鑰 !!!)
ENV SSH_USER=deepspeed
ENV SSH_PASSWORD=deepspeed123
RUN useradd -m -s /bin/bash ${SSH_USER} && \
echo "${SSH_USER}:${SSH_PASSWORD}" | chpasswd && \
echo "${SSH_USER} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
RUN mkdir -p /home/${SSH_USER}/.ssh && \
chmod 700 /home/${SSH_USER}/.ssh && \
chown -R ${SSH_USER}:${SSH_USER} /home/${SSH_USER}/.ssh

# 安裝 Python 依賴
COPY requirements.txt .
RUN pip3 install --no-cache-dir -r requirements.txt

# 設定環境變數
ENV CUDA_VISIBLE_DEVICES=all
ENV NCCL_DEBUG=INFO
ENV NOTEBOOK_FOLDER=/workspace
ENV JUPYTER_TOKEN=your_secure_token

# 複製訓練代碼
COPY . .
EXPOSE 8888 22

# 創建啟動腳本
RUN echo '#!/bin/bash\n\
/usr/sbin/sshd\n\
jupyter lab --ip=0.0.0.0 --port=8888 --allow-root --no-browser --ServerApp.token=${JUPYTER_TOKEN}' > /app/start.sh && \
chmod +x /app/start.sh

CMD ["/app/start.sh"]

2.2. 建立與部署映像​

在所有節點上建構或拉取此映像檔,確保環境一致。

# 建立映像
docker build -t deepspeed-training:jupyter .
# (可選) 推送到私有倉庫
# docker push your-registry/deepspeed-training:jupyter

3. 容器運行與 SSH 設定​

3.1. 啟動容器​

在所有節點上啟動容器。主節點需要映射 JupyterLab 的 8888 端口。

# 在主節點上運行
docker run --gpus all -d --network host -v /path/to/shared_storage:/workspace --name deepspeed-master deepspeed-training:jupyter

# 在從節點上運行
docker run --gpus all -d --network host -v /path/to/shared_storage:/workspace --name deepspeed-worker deepspeed-training:jupyter

3.2. 設定無密碼 SSH​

進入主節點的容器,產生 SSH 金鑰並分發到所有從節點(包括主節點自己)。

# 進入主節點容器
docker exec -it deepspeed-master bash

# 在容器內執行
ssh-keygen -t rsa -f ~/.ssh/id_rsa -N ""
# 將公鑰複製到所有節點
ssh-copy-id -i ~/.ssh/id_rsa.pub deepspeed@<worker1_ip>
ssh-copy-id -i ~/.ssh/id_rsa.pub deepspeed@<worker2_ip>
# ...
ssh-copy-id -i ~/.ssh/id_rsa.pub deepspeed@<master_ip> # 包括自己

4. 開始訓練​

4.1. hostfile 設定​

在主節點的共享儲存區建立一個 hostfile,列出所有參與訓練的節點及其 GPU 數量。

# /workspace/hostfile
<master_ip> slots=8
<worker1_ip> slots=8
<worker2_ip> slots=8

4.2. 訓練腳本 (train.py)​

準備您的 PyTorch 訓練腳本,並使用 DeepSpeed 進行初始化。

4.3. 啟動訓練​

從主節點的 JupyterLab 終端機或 docker exec 進入的 shell 中,執行以下命令啟動訓練。

deepspeed --hostfile=/workspace/hostfile \
--master_addr=<master_ip> \
train.py --deepspeed --deepspeed_config ds_config.json

總結​

本教學提供了一個在多節點環境中使用 DeepSpeed 和 JupyterLab 進行大規模模型訓練的完整流程。核心步驟包括:建立一個包含所有依賴的標準化 Docker 環境,設定節點間的無密碼 SSH 通訊,以及使用 deepspeed 啟動器和 hostfile 來協調分散式訓練。雖然設定過程較為複雜,但一旦完成,就能為大規模 AI 模型的研發提供一個強大且可擴展的平台。