Tensorflow 3Dが学習中の評価を別プロセスで行う仕組みになっていて,GPU消費を取り合わない様に別PCで評価したい. 良くあるシチュエーションでは無いが,sambaの使い方等で工夫が必要だったのでメモしておく.
1. ネットワーク設定
(1) 学習PCと評価PCをLANで繋ぐ
学習用のパソコン(以後,学習PC)と評価用のパソコン(以後,評価PC)をLANケーブルで直接繋ぐ.ちなみに,今回使用しているパソコン2機はWifiでインタネットに接続しているため,LANポートは余っていた.
(2) 学習PCのIP設定
(3) 評価PCのIP設定
2. ファイル共有
(1) sambaインストール
学習側PC,評価用のPCの双方にsambaをインストール
$ sudo apt install samba
(2) 学習側PC側に共有フォルダを設定
$ mkdir /home/***/samba_share $ sudo chomd 777 /home/***/samba_share
エクスプローラーから上記のフォルダを右クリックして共有設定
(3) tensorflowのログを共有フォルダに作成
この部分はプログラムに依る.Tensorflow 3Dの場合,train.pyへの引数を編集する.
tf3d/semantic_segmentation/cad2point/srcipts/run_train_locally.sh
TRAIN_DIR="/home/***/samba_share/tf3d_experiment/${JOB_NAME}"
学習を実行して,checkpointを作ってみる.
$ cd ***/tensorflow $ source tf3d_env/bin/activate $ bash tf3d/semantic_segmentation/cad2point/srcipts/run_train_locally.sh
(4) 評価PCから見られることを確認
Note:
この時点で評価PCから共有フォルダ直下でのフォルダ作成,ファイル編集が可能だが,train.pyが作ったtf3d_experimentの中では出来ない.
smb.confの編集など色々試したが,結局,個々のフォルダやファイルの権限を手動で書き換えるしか術が見つからなかった.
3. 学習PCから評価PCにチェックポイントをコピー
評価PCの共有フォルダ内で右クリック→Open in Terminalでパスを取得
checkpointのコピー先を評価PC内に作成
$ mkdir /home/***/checkpoints $ mkdir /home/***/checkpoints/model
共有フォルダ内のcheckpointが更新されたら,評価PCにコピーするプログラムを作成.
copy_checkpoints.py
import os import shutil from time import sleep if __name__ == "__main__": directory = "/run/user/1000/gvfs/smb-share:server=192.168.***.***,share=samba_share/tf3d_experiment/seg_ABC_semantic_019/model" destination = "/home/***/checkpoints/model" counter = 0 while True: name0 = directory + "/ckpt-%d.data-00000-of-00001"%counter name1 = directory + "/ckpt-%d.index"%counter name0_ = destination + "/ckpt-%d.data-00000-of-00001"%counter name1_ = destination + "/ckpt-%d.index"%counter if os.path.exists(name0) and os.path.exists(name1): print("copying ckpt-%d.data-00000-of-00001 and ckpt-%d.data-00000-of-00001"%(counter, counter)) shutil.copyfile(name0, name0_) shutil.copyfile(name1, name1_) shutil.copyfile(directory + "/checkpoint", destination + "/checkpoint") counter += 1 sleep(1)
Note:
os.listdir()を試したが,変なファイル名が取得されるタイミングがあって失敗.
作られる筈のファイル名をズバリ指定する & checkpoint(テキストファイル)を最後にコピーするのがポイント.
4. 学習 & 推論
ここもプログラムによる.Tensorflow 3Dの場合,eval.pyへの引数を編集する.
tf3d/semantic/segmentation/srcipts/cad2point/run_eval_locally.sh
EVAL_DIR="/home/***/checkpoints" CKPT_DIR="/home/***/checkpoints/model/"
評価PC内でコピープログラムを実行
python3 copy_checkpoints.py
評価PC内の別プロセス(=別Termianl)から評価を実行
$ cd ***/tensorflow $ source tf3d_env/bin/activate $ bash tf3d/semantic_segmentation/cad2point/srcipts/run_eval_locally.sh
評価PC内の更に別のプロセスからTensorboardを実行
$ cd /home/***/checkpoints $ tensorboard --logdir eval_val
学習PCで学習開始
$ cd ***/tensorflow $ source tf3d_env/bin/activate $ bash tf3d/semantic_segmentation/cad2point/srcipts/run_train_locally.sh
以上.