1ノードでPostgreSQLを起動し、残りの計算ノードでOptunaを実行したい場合の手順を紹介します。4ノードを使用するジョブを動かすと、1ノードでPostgreSQL、3ノードでOptunaを実行します。こちらで紹介されている「Saving/Resuming Study with RDB Backend」をOCTOPUSの計算ノードで実施します。また、こちらで紹介されている「Share the Study among Multiple Nodes and Processes」を元に、複数ノードでの実行を行います。
1.PostgreSQLのインストール
1 2 3 4 5 6 7 |
tar zxvf postgresql-13.0.tar.gz cd postgresql-13.0 export WORK=/octfs/work/(グループ名)/(ユーザ名) export PGDATA=$WORK/data ./configure --prefix=$WORK/p13.0 --exec-prefix=$WORK/p13.0 --datarootdir=$WORK/p13.0 make make install |
2.PostgreSQLの初期設定
1 2 |
cd $WORK ./p13.0/bin/initdb --encoding=UTF8 --no-locale |
3.PostgreSQL設定ファイルの編集
#listen_addresses = 'localhost'
↓
listen_addresses = '*'
$PGDATA/pg_hba.confの末尾に以下を追加してください。
host all all 0.0.0.0/0 trust
4.PostgreSQLのユーザとデータベースの作成
* 重要 * PostgreSQLはサーバプロセスなので作業が終了したのち、必ず停止させてください。
1 |
./p13.0/bin/pg_ctl -D $PGDATA -l $WORK/p13.0/logfile start |
Postgresユーザ"pguser"を作成します。
1 2 3 4 5 6 |
./p13.0/bin/psql postgres psql (13.0) Type "help" for help. postgres=# create user pguser createdb; CREATE ROLE postgres=# \q |
データベース"optunadb"を作成します。
1 2 3 4 5 6 7 |
./bin/psql --username=pguser postgres psql (13.0) Type "help" for help. postgres=> create database optunadb; CREATE DATABASE postgres=> \q |
PostgreSQLを停止します。
1 |
./p13.0/bin/pg_ctl stop |
5.Optunaのインストール
1 2 3 4 |
export PATH=/octfs/apl/Anaconda3/bin:$PATH conda config --add envs_dirs $WORK/conda_env conda create --name optuna-env python=3.7 source activate optuna-env |
上記のコマンドを実行するとプロンプトの表示が
(optuna-env) [user@octopus01 ~]$
に変わります。以降はその状態で作業してください。
1 2 3 |
conda install -c conda-forge optuna conda install psycopg2 conda install pandas |
6.データベースのテーブルを作成
1 2 3 |
cd $WORK export LD_LIBRARY_PATH=$WORK/p13.0/lib:$LD_LIBRARY_PATH ./p13.0/bin/pg_ctl -D $PGDATA -l $WORK/p13.0/logfile start |
次にPython3を対話式コンソールを立ち上げ、手順4で作成したPostgreSQLのユーザ"pguser"を使ってデータベース"optunadb"上にOptunaのstudyを保存します。
1 2 3 4 |
python3 >>> import optuna >>> study = optuna.create_study(study_name='distributed-example', storage='postgresql://pguser@127.0.0.1:5432/optunadb') >>> quit() |
処理が終了したら、必ずPosgreSQLを終了してください。これでOptunaでの計算準備が整いました。
1 |
./p13.0/bin/pg_ctl stop |
7.Optunaの実行
7-1.ログインノードでの実行
OCTOPUSのログインノードで、OptunaのWEBページに公開されている手順を試行します。ログインノードは簡単な動作確認や実行結果の確認にのみご利用ください。負荷のかかる長時間の計算は、手順7-2をご参照のうえ、OCTOPUSの計算ノードをご利用ください。
PostgreSQLを起動します。
123
cd $WORKexport LD_LIBRARY_PATH=$WORK/p13.0/lib:$LD_LIBRARY_PATH./p13.0/bin/pg_ctl -D $PGDATA -l $WORK/p13.0/logfile start
Python3を対話式コンソールを立ち上げ、studyを呼び出し、学習を試行します。
12345678
python3>>> import optuna>>> study = optuna.study.load_study(study_name='distributed-example', storage='postgresql://pguser@127.0.0.1:5432/optunadb')>>> def objective(trial):... x = trial.suggest_uniform('x', -10, 10)... return (x - 2) ** 2>>> study.optimize(objective, n_trials=3)>>> quit()
Python3を対話式コンソールを立ち上げ、studyを呼び出し、学習を結果を出力します。
123456
>>> import optuna>>> import pandas>>> study = optuna.study.load_study(study_name='distributed-example', storage='postgresql://pguser@127.0.0.1:5432/optunadb')>>> df = study.trials_dataframe(attrs=('number', 'value', 'params', 'state'))>>> print(df)>>> quit()
処理が終了したら、必ずPosgreSQLを終了してください。
1
./p13.0/bin/pg_ctl stop
7-2.計算ノードでの実行
OCTOPUSの計算ノードで、OptunaのWEBページに公開されている手順を試行し、加えてこちらで紹介されている「Share the Study among Multiple Nodes and Processes」を元に、複数ノードでの実行を行います。
Pythonスクリプト"optuna_sample.py"と、OCTOPUSに投入するためのジョブスクリプト"nqs.sh"を以下に示します。
nqs.shをqsubして、OCTOPUSに投入してください。
123456789101112
import optunaimport sysimport psycopg2 def objective(trial): x = trial.suggest_uniform('x', -10, 10) return (x - 2) ** 2 if __name__ == '__main__': db_addr = sys.argv[1] study = optuna.load_study(study_name='distributed-example', storage='postgresql://pguser@'+ db_addr + ':5432/optunadb') study.optimize(objective, n_trials=100)
12345678910111213141516171819202122232425262728293031323334353637383940
#!/bin/sh#PBS -q OCTOPUS#PBS -b 4#PBS -l elapstim_req=00:10:00 JOBNUM="${PBS_JOBID%:*}"OPTUNA_TMP="optuna_tmp"export WORK=/octfs/work/(グループ名)/(ユーザ名)export PATH=/octfs/apl/Anaconda3/bin:$PATHexport PGDATA=$WORK/dataexport LD_LIBRARY_PATH=$WORK/p13.0/lib:$LD_LIBRARY_PATH cd $PBS_O_WORKDIR if [ $JOBNUM -eq 0 ];then #マスターノードでPostgreSQLのデータベースを起動 mkdir $OPTUNA_TMP echo $(ip --oneline --family inet address show dev ib0 ) | cut -d' ' -f4 | cut -d'/' -f1 > $OPTUNA_TMP/job-master $WORK/p13.0/bin/pg_ctl -D $PGDATA -l $WORK/p13.0/logfile startelse #マスターノード以外でoptuna_sample.pyを実行 while [ ! -e $OPTUNA_TMP/job-master ];do sleep 1 done RDBIP=`cat $OPTUNA_TMP/job-master` source activate optuna-env python3 ./optuna_sample.py $RDBIP HOST=`hostname` touch $OPTUNA_TMP/$HOSTfi num=0if [ $JOBNUM -eq 0 ];then while [ $((JOBNUM+1)) -ge $num ]; do num=`ls $OPTUNA_TMP |wc -l` sleep 1 done rm -fr $OPTUNA_TMP $WORK/p13.0/bin/pg_ctl stopfi
PostgreSQLを起動します。
1 2 3 |
cd $WORK export LD_LIBRARY_PATH=$WORK/p13.0/lib:$LD_LIBRARY_PATH ./p13.0/bin/pg_ctl -D $PGDATA -l $WORK/p13.0/logfile start |
Python3を対話式コンソールを立ち上げ、studyを呼び出し、学習を試行します。
1 2 3 4 5 6 7 8 |
python3 >>> import optuna >>> study = optuna.study.load_study(study_name='distributed-example', storage='postgresql://pguser@127.0.0.1:5432/optunadb') >>> def objective(trial): ... x = trial.suggest_uniform('x', -10, 10) ... return (x - 2) ** 2 >>> study.optimize(objective, n_trials=3) >>> quit() |
Python3を対話式コンソールを立ち上げ、studyを呼び出し、学習を結果を出力します。
1 2 3 4 5 6 |
>>> import optuna >>> import pandas >>> study = optuna.study.load_study(study_name='distributed-example', storage='postgresql://pguser@127.0.0.1:5432/optunadb') >>> df = study.trials_dataframe(attrs=('number', 'value', 'params', 'state')) >>> print(df) >>> quit() |
処理が終了したら、必ずPosgreSQLを終了してください。
1 |
./p13.0/bin/pg_ctl stop |
Pythonスクリプト"optuna_sample.py"と、OCTOPUSに投入するためのジョブスクリプト"nqs.sh"を以下に示します。
nqs.shをqsubして、OCTOPUSに投入してください。
1 2 3 4 5 6 7 8 9 10 11 12 |
import optuna import sys import psycopg2 def objective(trial): x = trial.suggest_uniform('x', -10, 10) return (x - 2) ** 2 if __name__ == '__main__': db_addr = sys.argv[1] study = optuna.load_study(study_name='distributed-example', storage='postgresql://pguser@'+ db_addr + ':5432/optunadb') study.optimize(objective, n_trials=100) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#!/bin/sh #PBS -q OCTOPUS #PBS -b 4 #PBS -l elapstim_req=00:10:00 JOBNUM="${PBS_JOBID%:*}" OPTUNA_TMP="optuna_tmp" export WORK=/octfs/work/(グループ名)/(ユーザ名) export PATH=/octfs/apl/Anaconda3/bin:$PATH export PGDATA=$WORK/data export LD_LIBRARY_PATH=$WORK/p13.0/lib:$LD_LIBRARY_PATH cd $PBS_O_WORKDIR if [ $JOBNUM -eq 0 ];then #マスターノードでPostgreSQLのデータベースを起動 mkdir $OPTUNA_TMP echo $(ip --oneline --family inet address show dev ib0 ) | cut -d' ' -f4 | cut -d'/' -f1 > $OPTUNA_TMP/job-master $WORK/p13.0/bin/pg_ctl -D $PGDATA -l $WORK/p13.0/logfile start else #マスターノード以外でoptuna_sample.pyを実行 while [ ! -e $OPTUNA_TMP/job-master ];do sleep 1 done RDBIP=`cat $OPTUNA_TMP/job-master` source activate optuna-env python3 ./optuna_sample.py $RDBIP HOST=`hostname` touch $OPTUNA_TMP/$HOST fi num=0 if [ $JOBNUM -eq 0 ];then while [ $((JOBNUM+1)) -ge $num ]; do num=`ls $OPTUNA_TMP |wc -l` sleep 1 done rm -fr $OPTUNA_TMP $WORK/p13.0/bin/pg_ctl stop fi |