MAGAZINE
ルーターマガジン
Google Cloud ML Engine 上でPythonを実行する時のコツ
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
とコードの先頭に記述してしまうことである。ただし、FileIO
はmode
(読み込みか書き込みかなどを指定するオプション)の記述が必須であり、省略していた場合はmode="r"
を追記する必要がある。
シェルの環境変数について
シェルスクリプトはgcloud
コマンドで投げることができないので、環境変数の設定などはos
モジュールを用いてPythonコード上で行う必要がある。
CONTACT
お問い合わせ・ご依頼はこちらから