Google Cloud ML Engine は機械学習のクラウドサービスとして提供されているが、一気にMLのチュートリアルをやっても構造が理解しにくい。まずは素のPythonをどうやって動かすのかというところから整理をする。

Google Cloud ML Engine の基本

  • Pythonコードとその他のデータなどの必要なファイルを Google Cloud Storage にアップロードし、マシンはそれを参照して学習を進める。
  • PythonコードはTensorFlowを使うものでなくてもよく、機械学習でなくてもよい。Hello world も実行可能。
  • Pythonコードはパッケージ化してからアップロードする(つまり__init__.pyが必要)。

パッケージ化の仕方

上述の通り、パッケージ化するディレクトリには__init__.pyがあることが前提である。検証済みなのは以下の2種類。

gcloudコマンドを使うやり方

実際に学習を開始させるコマンドは以下のような形式である。

gcloud ml-engine jobs submit training $JOB_NAME \ --package-path $PACKAGE_NAME \ --module-name $MODULE_NAME \ --region $REGION \ --job-dir $OUTPUT_PATH \ --staging-bucket $STAGING_BUCKET \ --scale-tier $SCALE_TIER \ -- \ --user-args $USER_ARGS

このコマンドの詳しい説明は公式ドキュメントに譲ることにする。$PACKAGE_PATHにパッケージ化したいディレクトリのパスを記述することで自動でパッケージ化される。このやり方は簡単であるが、パッケージ化するディレクトリ内の子ディレクトリはパッケージ化されない(ファイルのみパッケージ化される)ので、パッケージ化したいディレトリ内に子ディレクトリが存在する場合は次にやり方でやる必要がある。

手動でパッケージ化するやり方

パッケージ化したいディレクトリ下に以下のようなフォーマットのsetup.pyを作成する。

from setuptools import find_packages from setuptools import setup REQUIRED_PACKAGES = ['numpy>=1.14.0', 'scipy', 'scikit-learn', 'matplotlib', 'tensorflow>=1.7.0', 'bandmat>=0.5', 'theano>=1.0.1', 'keras>=2.0.5', 'h5py>=2.7.0', 'backports.functools-lru-cache'] setup( name='trainer', version='0.1', install_requires=REQUIRED_PACKAGES, packages=find_packages(), include_package_data=True, description='My trainer application package.' )

上は一例であり、REQUIRED_PACKAGESにはPythonコード内でimportするパッケージを適宜記述する。これを作成したのちに、以下のコマンドを実行する。

python setup.py sdist

そうするとディレクトリ内のすべての子ディレクトリがパッケージ化されたのちに圧縮され、され、その圧縮フォルダが入ったdistディレクトリが作成される。この際、先ほどのgcloudコマンドは以下のように記述する必要がある。

gcloud ml-engine jobs submit training $JOB_NAME \ --packages dist/trainer-0.1 \ --module-name $MODULE_NAME \ --region $REGION \ --job-dir $OUTPUT_PATH \ --staging-bucket $STAGING_BUCKET \ --scale-tier $SCALE_TIER \ -- \ --user-args $USER_ARGS

つまり、--package-pathオプションは--packagesオプションに書き換える。上は一例であり、その値は適宜変更する。

パッケージの構造について

  • gcloudコマンドを使ってパッケージ化する際、パッケージ直下にメインのPythonコードを置く必要がある。
  • 一例として、trainerという名前のディレクトリの下に、メインのコードtask.pyを置いたとする。その際、gcloudコマンドの--package-pathオプション、--module-nameオプションの値はそれぞれ、trainer/trainer.taskとなる。
  • 手動でパッケージ化する際も同様である。
  • gcloudコマンドはtrainerディレクトリの親ディレクトリで実行する。

引数について

  • メインのPythonコード(上の例ではtask.py)の引数はgcloudコマンド上で指定する。gcloudのデフォルトの引数を記述した後に、--を挟んで記述する(上の例を参照)。
  • ただし、--user-argsのような形式の位置引数のみ指定できるので、その他の形式の引数は位置引数に変更する必要がある。
  • また、出力ディレクトリを指定する--job-dirオプションはgcloudデフォルトのオプションであるが、自動的にPythonコードの引数にも追加されるので、コード側もそれに対応しなければならない。

Google Cloud Storage 上のファイルの扱いについて

  • Google Cloud Storage 上のファイルパスはgs://バケット名/バケット内パス/ファイル名とする。
  • Google Cloud ML Engine の重大な欠点と思われることとして、これらのファイルはPython組み込み関数のopenメソッドおよびそれを用いた派生メソッド(np.fromfileなど)でアクセスすることができない。openメソッドを用いてアクセスしている場合はコードを書き換える必要がある。openメソッドの代替案として便利なのは
from tensorflow.python.lib.io.file_io import FileIO as open

とコードの先頭に記述してしまうことである。ただし、FileIOmode(読み込みか書き込みかなどを指定するオプション)の記述が必須であり、省略していた場合はmode="r"を追記する必要がある。

シェルの環境変数について

シェルスクリプトはgcloudコマンドで投げることができないので、環境変数の設定などはosモジュールを用いてPythonコード上で行う必要がある。