オッサンはDesktopが好き

自作PCや機械学習、自転車のことを脈絡無く書きます

Tensorflowのcheckpointをsambaで共有して,別PCから評価する

 Tensorflow 3Dが学習中の評価を別プロセスで行う仕組みになっていて,GPU消費を取り合わない様に別PCで評価したい. 良くあるシチュエーションでは無いが,sambaの使い方等で工夫が必要だったのでメモしておく.

1. ネットワーク設定

(1) 学習PCと評価PCをLANで繋ぐ

 学習用のパソコン(以後,学習PC)と評価用のパソコン(以後,評価PC)をLANケーブルで直接繋ぐ.ちなみに,今回使用しているパソコン2機はWifiでインタネットに接続しているため,LANポートは余っていた.

(2) 学習PCのIP設定

f:id:changlikesdesktop:20211226050020p:plain:w400
学習PCのLAN設定.DNSを使わないので,Gatewayは空欄

f:id:changlikesdesktop:20211226050119p:plain:w400
設定されたか確認.有線LANを再起動しないと設定が反映されない事がある

(3) 評価PCのIP設定

f:id:changlikesdesktop:20211226050401p:plain:w400
評価PCも同様に設定.

f:id:changlikesdesktop:20211226050630p:plain:w400
評価PCも同様に確認

2. ファイル共有

(1) sambaインストール

学習側PC,評価用のPCの双方にsambaをインストール

$ sudo apt install samba

(2) 学習側PC側に共有フォルダを設定

$ mkdir /home/***/samba_share
$ sudo chomd 777 /home/***/samba_share

エクスプローラーから上記のフォルダを右クリックして共有設定

f:id:changlikesdesktop:20211226051006p:plain:w400
フォルダの共有設定.検索するとsmb.confを編集するやり方が出てくるが,今回はUIを使ってみる

(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から見られることを確認

f:id:changlikesdesktop:20211226052148p:plain:w400
評価PCから学習PCの共有フォルダにアクセス.Other Locations→smb://192.168.---.---/→Connect

f:id:changlikesdesktop:20211226052431p:plain:w400
パスワードとかがないガバガバ設定なので,そのままConnect

f:id:changlikesdesktop:20211226052621p:plain:w400
train.pyが作ったフォルダを見られるようになった

Note:
この時点で評価PCから共有フォルダ直下でのフォルダ作成,ファイル編集が可能だが,train.pyが作ったtf3d_experimentの中では出来ない. smb.confの編集など色々試したが,結局,個々のフォルダやファイルの権限を手動で書き換えるしか術が見つからなかった.

3. 学習PCから評価PCにチェックポイントをコピー

評価PCの共有フォルダ内で右クリック→Open in Terminalでパスを取得

f:id:changlikesdesktop:20211226053150p:plain:w400
長ったらしいパスを取得できる.もっとスマートな方法があるかも

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

以上.