分散学習を行う際、複数の計算ノードで同一のPython環境と重みファイルを素早く揃える方法をまとめる。
Conda環境を丸ごとレプリケートする
環境ディレクトリを丸コピーするとパス依存で失敗するため、conda env exportでYAML定義を生成し、対象マシンで再構築するのが最も確実。
# 1. 環境をYAMLに書き出す
mamba activate qwen2-57b
conda env export --no-builds | grep -v "^prefix:" > qwen2_env.yml
# 2. 対象ノードへ転送
rsync -avP qwen2_env.yml gpu004:/opt/conda/envs/
# 3. 対象ノードで環境作成
ssh gpu004 'mamba env create -f /opt/conda/envs/qwen2_env.yml -n qwen2-57b'
PyTorchはCUDA 11.8対応のwheelを明示的に指定してインストールしておくと、conda env exportでバージョンが固定される。
mamba install pytorch==2.2.0 cudatoolkit=11.8 \
-c pytorch -c nvidia --strict-channel-priority
環境丸ごとアーカイブで高速転送(オプション)
OSとPythonバージョンが同一ならconda-packでバイナリ丸ごと固めて転送すると高速。
# 送信側
conda install conda-pack
conda pack -n qwen2-57b -o qwen2.tar.gz --compress-level 9
# 受信側
mkdir -p ~/miniconda3/envs/qwen2-57b
tar -xzf qwen2.tar.gz -C ~/miniconda3/envs/qwen2-57b
~/miniconda3/envs/qwen2-57b/bin/conda-unpack
重みファイルの一括配布スクリプト
以下のsync_weights.shを使えば、任意のホストリストへ並列転送できる。
#!/usr/bin/env bash
# Usage: ./sync_weights.sh /data/models/Qwen2-57B-A14B gpu004 gpu005 gpu009
set -euo pipefail
SRC_PATH="$1"
shift
HOSTS=("$@")
USER="${USER:-$(whoami)}"
SSH_OPTS="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
for h in "${HOSTS[@]}"; do
echo "[$(date '+%H:%M:%S')] Sync to $h"
ssh $SSH_OPTS "$USER@$h" "mkdir -p $SRC_PATH" &
done
wait
for h in "${HOSTS[@]}"; do
rsync -azh --info=progress2 "$SRC_PATH/" "$USER@$h:$SRC_PATH/" &
done
wait
echo "[$(date '+%H:%M:%S')] All sync finished"
並列転送を避けたい場合はscp版も用意しておく。
#!/bin/bash
# Usage: ./scp_weights.sh /data/models/Qwen2-57B-A14B /data/models gpu004 gpu009
SRC=$1
DEST=$2
shift 2
HOSTS=("$@")
USER="${USER:-$(whoami)}"
for h in "${HOSTS[@]}"; do
ssh "$USER@$h" "mkdir -p $DEST"
scp -r "$SRC" "$USER@$h:$DEST"
done
トラブルシュート
- 環境再構築時に
Solving environment: failedが出る →--no-buildsオプションを付けて再エクスポート。 - 重み転送で
stalledが頻発 →rsync --bwlimit=50000で帯域制限。 - パーミッションエラー → 事前に
umask 002で緩和。