sam_yusukeの日記

機械学習について書きます。

一人用簡単な機械学習の実験結果と実験スクリプトジョブ管理環境を構築

背景

機械学習アルゴリズムを開発していると、複数サーバーを使って学習したり検証したりすることになります。その際に、

  • 複数の異なる引数で同じスクリプトを空いているサーバで実行するのが手間。
  • サーバーが空いたか定期的に確認して、空いたサーバーでスクリプトを実行するのが手間
  • 過去のスクリプトの実行結果を探すのが手間

といったことがあったため、今回、暫定的に対処してみた。

解決法として挙げられるのは

  1. 実行したいスクリプトの数に応じて、AWSインスタンスを起動。AnsibleやDockerで自動的に環境構築して、その上で実行する。不要になったらインスタンスを落とす。
  2. インスタンス数固定で実行したいスクリプトをキューで待たせて、空いたインスタンスに自動的に割当てる。
  3. 1インスタンス数上限付き

今回は2にしました。2を選択することで最悪サーバの構築を手作業でできること、AWSインスタンス立ち上げやサーバ構築PlaybookやDockerfileのメンテナンスが最悪不要なことが挙げられます。また、機械学習の基盤に関して考える機会をもちたいので今回は自前で構築します。

 

簡単な説明

スクリプト実行状況と結果の確認

f:id:sam_yusuke:20181207134534p:plain

実行中のジョブやジョブの終了の確認ができるので少し便利になりました。

指定の辞書オブジェクトにキーを追加すると、詳細情報タブに追加されるので、

そこに、指定したパラメータや結果ファイルのパスなども入れれば少し便利になりそうです。検索周りが少し弱いですが、

スクリプトの実行

 f:id:sam_yusuke:20181207134559p:plain

 

Jupyterで実験ごとに実行スクリプトの定義とパラメータを書いて実行するようにしています。

結果の分析

f:id:sam_yusuke:20181207134647p:plain

Jupyterでpandasのデータフレーム形式で結果を取れるようにして、分析作業をするようにしています。

 

サーバの構成

f:id:sam_yusuke:20181207134615p:plain

実行用サーバが複数あり、管理サーバーがある。

管理サーバは

  • 実行用サーバから実験結果の収集
  • Jupyterによる分析環境の提供
  • 実行スクリプトCeleryによるキューイングと実行サーバへの割り当て
  • デバッグ環境

という感じです

 

このシステムは一人で分析に使うには十分ですが、複数人で利用するには、

  • サーバのリソース管理が非効率(1サーバ1スクリプト
  • ジョブキューの高速化・安定化
  • ユーザ管理、ユーザ作成時のユーザ用環境構築
  • セキュリティ(ユーザ間、サーバ管理者とユーザ)
  • Dockerとかである程度スケールするようにする。

などなど様々な課題はあります。