デバイス設定 & HPC セットアップ¶
ML/MM 計算機の ML と MM の部分をどのデバイス(GPU か CPU)で動かすかの設定と、PBS・Slurm のジョブスクリプトをまとめたページです。デフォルトでは、ML の推論は CUDA が使えれば GPU で、MM の力場(hessian_ff)は CPU で動きます。
デバイスパラメータ¶
デバイスは YAML ファイル(--config)の calc セクションで指定します。
パラメータ |
デフォルト |
説明 |
|---|---|---|
|
|
ML 推論のデバイス: |
|
|
CUDA で ML 推論を行うときの CUDA デバイス番号。 |
|
|
MM のエンジン: |
|
|
MM のエンジンのデバイス。 |
|
|
OpenMM を CUDA で動かすときの CUDA デバイス番号。 |
|
|
MM のエンジンの CPU スレッド数。 |
YAML 設定例¶
calc:
ml_device: cuda
ml_cuda_idx: 0
mm_backend: hessian_ff
mm_device: cpu
mm_threads: 16
OpenMM バックエンドを CUDA で使用¶
calc:
ml_device: cuda
ml_cuda_idx: 0
mm_backend: openmm
mm_device: cuda
mm_cuda_idx: 0
VRAM 管理¶
Hessian のデバイス(--hess-device)¶
freq と irc の --hess-device は cuda・cpu・auto を受け、デフォルトの auto は ml_device に従います。freq では、計算済みの Hessian を置いて対角化するデバイスを決めます。irc では、初期 Hessian を置くデバイスと IRC の演算を行うデバイスを決めます。
# デフォルト: ML のデバイス
mlmm freq -i r_complex_layered.pdb --parm7 real.parm7 -q -1
# 計算済み Hessian を CPU へ移して対角化
mlmm freq -i r_complex_layered.pdb --parm7 real.parm7 -q -1 --hess-device cpu
--hess-device cpu を使う場面:
Hessian を GPU に置いて対角化すると、計算に要る VRAM を使ってしまう場合
VRAM 節約のヒント¶
ML 領域を小さくする:
mlmm extractで小さい--radiusを使います。詳しくは モデルを削る を参照してください。hessian_ff(デフォルト)を使う: hessian_ff は CPU で動くため、GPU に MM の分のメモリを取りません。
VRAM を監視する:
print_vramはデフォルトでtrueで、Hessian の計算中に VRAM 使用量のピークを表示します。
ジョブでの精度¶
精度はバックエンドと用途で選び、割り当てられた GPU で計算時間を測ってください。詳しくは MLIP バックエンド › 精度 を参照してください。
HPC ジョブ投入¶
PBS 例¶
#!/bin/bash
#PBS -N mlmm_opt
#PBS -q default
#PBS -l nodes=1:ppn=32:gpus=1,mem=120GB,walltime=72:00:00
#PBS -o ${PBS_JOBNAME}.o${PBS_JOBID}
#PBS -e ${PBS_JOBNAME}.e${PBS_JOBID}
set -euo pipefail
hostname
cd "${PBS_O_WORKDIR}"
# hessian_ff は初回利用時に C++ カーネルを JIT ビルドします。システムの
# コンパイラがない、または C++20 モードでコンパイルできない場合は、サイトのコンパイラモジュールを読み込みます:
# module load <COMPILER_MODULE>
# conda 環境の有効化
source ~/miniconda3/etc/profile.d/conda.sh
conda activate <your-env>
command -v g++ >/dev/null || { echo "hessian_ff には g++ が必要です" >&2; exit 1; }
if ! g++ -std=c++20 -x c++ -fsyntax-only /dev/null; then
echo "hessian_ff には PyTorch の C++20 JIT フラグに対応するコンパイラが必要です" >&2
exit 1
fi
command -v ninja >/dev/null || { echo "hessian_ff には ninja が必要です" >&2; exit 1; }
# 最適化の実行
mlmm opt \
-i r_complex_layered.pdb \
--parm7 real.parm7 \
-q -1 -m 1 \
--opt-mode grad \
--out-dir opt_result
Slurm 例¶
#!/bin/bash
#SBATCH --job-name=mlmm_opt
#SBATCH --partition=gpu
#SBATCH --gres=gpu:1
#SBATCH --cpus-per-task=32
#SBATCH --mem=120G
#SBATCH --time=72:00:00
#SBATCH --output=%x_%j.out
#SBATCH --error=%x_%j.err
set -euo pipefail
hostname
# hessian_ff は初回利用時に C++ カーネルを JIT ビルドします。必要な場合:
# module load <COMPILER_MODULE>
source ~/miniconda3/etc/profile.d/conda.sh
conda activate <your-env>
command -v g++ >/dev/null || { echo "hessian_ff には g++ が必要です" >&2; exit 1; }
if ! g++ -std=c++20 -x c++ -fsyntax-only /dev/null; then
echo "hessian_ff には PyTorch の C++20 JIT フラグに対応するコンパイラが必要です" >&2
exit 1
fi
command -v ninja >/dev/null || { echo "hessian_ff には ninja が必要です" >&2; exit 1; }
mlmm opt \
-i r_complex_layered.pdb \
--parm7 real.parm7 \
-q -1 -m 1 \
--opt-mode grad \
--out-dir opt_result
重要なポイント¶
GPU: ML 推論用に GPU を 1 基要求します(PBS は
gpus=1、Slurm は--gres=gpu:1)。--uma-workersを 2 以上にする場合はワーカーごとに 1 基、OpenMM の MM バックエンドを別の CUDA デバイス(mm_device: cuda、mm_cuda_idx: 1)に置く場合はさらに 1 基を要求します。CPU スレッド: MM バックエンドのスレッド数(
mm_threads、デフォルト 16)に足りる CPU を要求します。上の例は余裕を見て 32(ppn=32、--cpus-per-task=32)を要求しています。メモリ: 代表的な試験計算と scheduler のピークメモリの記録から RAM を決めます。
CUDA ランタイム: 公式 PyTorch wheel には CUDA のユーザー空間ライブラリが含まれるため、通常は対応する NVIDIA ドライバーだけで足ります。CUDA toolkit のモジュールを読み込むのは、それを必要とする拡張を使う場合だけです。
GPU インデックスの指定¶
マルチ GPU ノードで特定の GPU を使う場合:
# 方法 A: 環境変数(全 CUDA プログラムに影響)
# scheduler の下では scheduler が設定した値をそのまま使い、自分で設定するのは scheduler の外だけ
export CUDA_VISIBLE_DEVICES=0
# 方法 B: YAML 設定(mlmm 固有)
# config.yaml に記述:
# calc:
# ml_cuda_idx: 0
mlmm opt -i r_complex_layered.pdb --parm7 real.parm7 -q -1 --config config.yaml
使用上の注意点¶
hessian_ff は CPU でだけ動く: デフォルトの
mm_backend: hessian_ffでは、mm_deviceはcpuかautoだけを受け、mm_device: cudaはエラーで止まります。MM を CUDA で動かすにはmm_backend: openmmを使ってください。ML 推論は GPU 1 基: デフォルトの
--uma-workers 1では、ML 推論はml_cuda_idxの GPU 1 基で動きます。--uma-workersを 2 以上にする場合は MLIP バックエンド › ワーカーと Hessian の計算方式 を参照してください。ML と MM を同じ GPU に置くとメモリを共有する: 両方を同じ CUDA デバイスで動かすときは、代表的な試験計算でピークメモリを測り、大きな系では
mm_device: cpuを使ってください。--hess-device cpuでもすべての out-of-memory は防げない: Hessian の計算中にバックエンドの中で起きる out-of-memory は、Hessian を移す前に起きます。モデルを小さくするか、メモリの少ない Hessian やバックエンドの設定を選んでください。各計算ノードに C++ コンパイラが要る: デフォルトの
hessian_ffMM バックエンドは、初回利用時に C++ カーネルを JIT ビルドします。これは CUDA とは関係なく行われます。各計算ノードに C++20 対応のコンパイラと Ninja が必要です(GCC 13.3 で検証済み)。システムのg++がない、または古い場合はコンパイラモジュールを読み込んでください。上のジョブスクリプトは両方を確かめます。
関連ドキュメント¶
インストール — インストール、CUDA、C++ コンパイラ
ML/MM 計算機 — 計算機の構成とパラメータ
MLIP バックエンド — 精度、ワーカー、Hessian の計算方式
YAML 設定の一覧 — 設定の全体
トラブルシューティング — よくあるエラーと対処法