• The University of Tokyo / RIKEN
  • tsuzukums.k.u-tokyo.ac.jp

サーバ上でのpython環境構築

論文を通すために無理やり近似している部分もバウンドに変えていたけれど、主定理の仮定が強くなりすぎて嫌になってきちゃったな。

今日1日でサーバの環境構築と実行周りのpython環境に関して何人かから質問を受けたので、少し書く。

自分の場合、$HOMEにpyenvを入れて、そこにインストールしたpythonを使う。 これ、たまにビルドに失敗する環境もあって、その時はminiconda3を使う。 これらの上にプロジェクトごとにvenvを作る。 自分が使っているのは以下のshell script。

#!/bin/sh

. ./env.sh
rm -rf .venv
python -m venv .venv
. .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install --ignore-installed --no-cache-dir --requirement requirements.txt

requirements.txtはググって。 env.shというのは、環境変数とかを書いてるやつで、例えば下みたいな感じ。

#!/bin/sh

export HOME=/path/to/home
export PATH=/path/to:/bins

# Python venv
export PYENV_ROOT=$HOME/.pyenv
export PATH="${PYENV_ROOT}/bin:$PATH"
eval "$(pyenv init -)"
pyenv shell 3.7.2

# Python
export PYTHONIOENCODING=utf8
export PYTHONENCODING=utf8
export PYTHONPATH=.

# CUDA
export CUDA_ROOT=/path/to/cuda
export CUDA_HOME=$CUDA_ROOT
export CPATH=$CUDA_ROOT/include:$CPATH
export LD_LIBRARY_PATH=$CUDA_ROOT/lib64:/usr/lib64:$LD_LIBRARY_PATH
export PATH=$CUDA_ROOT/bin:$PATH
export LIBRARY_PATH=$CUDA_ROOT/lib64:$LIBRARY_PATH
export C_INCLUDE_PATH=$C_INCLUDE_PATH:$CUDA_ROOT/include
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:$CUDA_ROOT/include

# cuDNN
export CUDNN_ROOT=$CUDA_ROOT
export CPATH=$CUDNN_ROOT/include:$CPATH
export LD_LIBRARY_PATH=$CUDNN_ROOT/lib64:$LD_LIBRARY_PATH
export LIBRARY_PATH=$CUDNN_ROOT/lib64:$LIBRARY_PATH

# MVAPICH
export MV2_USE_CUDA=1
export MV2_SMP_USE_CMA=0
export MV2_CPU_MAPPING=0-3,8-11:0-3,8-11:4-7,12-15:4-7,12-15

# OpenMP
export OMP_NUM_THREADS=1

# Datasets
export DATASET_ROOT=/path/to/Datasets
export ILSVRC2015_DIR=${DATASET_ROOT}/ILSVRC2015

jobを投げる時はこんな感じ。

#!/bin/sh
#PBS -q queue_name
#PBS -l select=2:mpiprocs=4:ompthreads=1
#PBS -l walltime=96:00:00
#PBS -N resnet50
#PBS -o log
#PBS -e log
####################

cd $PBS_O_WORKDIR
. ./env.sh
. .venv/bin/activate
mpiexec -f ${PBS_NODEFILE} -n 8 python train_cnn_mn.py --model=resnet50 --loader_threads 16

ここでenv.shをもう一度ロードしているのは大事で、 cudaとかmpiに依存しているライブラリはインストール時のpathと実行時のpathが違うと壊れがち。

venv使わなくてよくない?とbashrcに書けばよくない?はみんなから言われたけれど、複数のプロジェクトをやるようになると再現性が壊れるのでやめたほうがいいと思う。 いや、本当はdockerとか使ったほうが良いのかな、みたいなことを考えると大きいことは言えない(そこまではやってみたことがない)。