1.この記事の内容
Webアプリケーション開発のお勉強 #4まででTensorFlowでGPUを用いた学習ができるところまでを実装しました.
しかし,#4の時点ではブラウザ上の操作で学習を中断することができず,使い勝手が悪い状態でした.
本記事では,ブラウザ上の操作でTensorFlowの学習を停止する方法を記載します.
実装例は筆者のGitHubに公開しています.コミットIDは05c065df417c08d3033b454591b886b970364912です.
2.実装方法
実装のポイントは下記の3点で,各々次節以降で解説します.
- 学習処理のマルチプロセス化
- TensorFlowの学習をコマンド操作で停止する仕組みの実装
- ブラウザから学習プロセスに対して停止コマンドを送信
2-1.学習処理のマルチプロセス化
Webアプリ(Djangoのワーカプロセス)から直接学習を実行すると,学習が完了するまでワーカプロセスがロックされ,Webページの応答性が悪くなります.
そこで,Webアプリから学習プロセスを分離し学習対象のモデルとPIDを関連付けてデータベースで管理することとしました.
2-2.TensorFlowの学習をコマンド操作で停止する仕組みの実装
TensorFlow側の実装は下記の記事で掲載した通りの方法となります.
バッチ毎にカスタムコールバック内でFIFOをチェックし,文字列stop
が書き込まれていれば学習を終了するように実装しました.
2-3.ブラウザから学習プロセスに対して停止コマンドを送信
今回は動作確認用に下記にFIFOを置くこととし,学習停止の文字列をstop
としました.
ブラウザから停止ボタンをクリックすることでFIFOにstop
を書き込み,学習を停止させます.
def _stop_trainer():
fifo = '/tmp/fifo_trainer_ctl'
with open(fifo, 'w') as f:
f.write('stop\n')
return
3.さいごに
TensorFlowの学習を外部プロセスから中断することに対して実装例が見つけられず,本記事に記載の方式を採用しました.
このあたりのスマートな実装方法があればコメントなどでご教示いただけますと幸いです.
なお,本記事の執筆時点では,ダッシュボードのレイアウトや状態管理はガバガバですが,この辺りも後々整備する予定です.