マルチノードGPU環境のConda環境・重み同期ガイド

分散学習を行う際、複数の計算ノードで同一の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で緩和。

タグ: conda mamba conda-pack rsync SCP

7月22日 20:38 投稿