Python3でGoogle Cloud ML Engineをローカルで動作する方法
はじめに
カブクで機械学習エンジニアをしている大串正矢です。今回はPython3でGoogle Cloud Machine Learning Engine(以下:ML Engineと略称)をローカルで動作する方法について書きます。
背景
機械学習モデルをサービスとして運用する場合、モデルが必要なタイミングに毎回、人手で環境を構築してモデルを作成するのは時間、人的リソースの観点もあり適切ではありません。
Googleから提供されているサービスであるML Engineを使用すれば環境構築の自動化、モデル作成に必要な時間だけインスタンス確保まで行ってくれます。
またクラウドで動作する前にローカルで動作を確認する機能もあるため、手元で確認してから動作確認も可能です。
ただしローカルで実行する場合は標準ではPython2で動作します。
Python3でローカル動作する方法は下記の公式ドキュメントに記載はありません。
Python3系の機能を利用したコードを書いておりML Engineを使用したい方に向けた記事になります。
手法
環境構築
今回は参考のためにシンプルなプロジェクトで動作確認をします。
Docker上でubuntu16.04の環境を構築して動作確認をします。
https://github.com/SnowMasaya/keras-cloud-ml-engine
下記で必要なファイルを取得し、docker環境をビルドし、docker環境の中に入ります。
git clone https://github.com/SnowMasaya/keras-cloud-ml-engine
cd keras-cloud-ml-engine/docker
make bash
Docker上での手順
Google Cloudのサービスを利用するためSDKを導入します。
Docker内ではGoogle Cloud SDKはダウンロード済みです。
Docker以外の環境で試される方は下記からインストールしてください。Macを使用されている場合はMacでの動作方法も後述しています。
- 初期設定をします。
gcloud init
下記でログインするか尋ねられるので
Y
にします。You must log in to continue. Would you like to log in (Y/n)?
アクセス用のリンクが表示されます。
Go to the following link in your browser:
リンクにアクセスしてクラウドsdkにアクセスを許可します。
認証コードが表示されるのでコピーして、下記に貼ります。Enter verification code:
プロジェクト選択画面になるのでプロジェクトを選択します。
Pick cloud project to use:
リージョン設定をするか聞かれるので設定する場合は
Y
にします。Do you want to configure a default Compute Region and Zone?
リージョン番号を選択します。
Please enter numeric choice or text value (must exactly match list item):
これで初期設定完了です。
-
認証処理をします。
gcloud auth application-default login
Google Auth Libraryへアクセスを許可するためのリンクが表示されます。
Go to the following link in your browser:
リンクにアクセスし認証コードが表示されるのでコピーして、下記に貼ります。
Enter verification code:
- ML Engineをローカルで動作する前の設定をします。
run_ml_engine_local.sh
の下記の該当箇所を修正します。export BUCKET_NAME={読者のGCSのパス}
動作コマンド
下記コマンドで動作確認をします。
bash run_ml_engine_local.sh
shellスクリプトの内部の下記コマンドでML Engineをローカルで動作しています。--package-path ./trainer
で動作させるコードのディレクトリパスを指定しています。
gcloud ml-engine local train \
--job-dir $JOB_DIR \
--module-name trainer.mnist_mlp \
--package-path ./trainer \
-- \
--train-file ./data/mnist.pkl
動作結果
コード内にPythonのバージョンを表示するようにしています。Python3で動作していることが確認できます。
Using TensorFlow backend.
Python version
3.6.2 |Continuum Analytics, Inc.| (default, Jul 20 2017, 13:51:32)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]
Version info.
sys.version_info(major=3, minor=6, micro=2, releaselevel='final', serial=0)
Using logs_path located at gs://{your backey path}/mnist_mlp_train_20190204_085027/logs/2019-02-04T08:50:29.295357
60000 train samples
10000 test samples
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_1 (Dense) (None, 512) 401920
_________________________________________________________________
dropout_1 (Dropout) (None, 512) 0
_________________________________________________________________
dense_2 (Dense) (None, 512) 262656
_________________________________________________________________
dropout_2 (Dropout) (None, 512) 0
_________________________________________________________________
dense_3 (Dense) (None, 10) 5130
=================================================================
Total params: 669,706
Trainable params: 669,706
Non-trainable params: 0
_________________________________________________________________
Train on 60000 samples, validate on 10000 samples
Epoch 1/2
2019-02-04 08:50:31.075674: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
60000/60000 [==============================] - 5s 92us/step - loss: 0.2487 - acc: 0.9235 - val_loss: 0.1047 - val_acc: 0.9667
Epoch 2/2
60000/60000 [==============================] - 5s 84us/step - loss: 0.1041 - acc: 0.9686 - val_loss: 0.0895 - val_acc: 0.9727
Test loss: 0.0895320583968889
Test accuracy: 0.9727
Python3系で動作させる方法
Docker環境でPython3系がpython
コマンドで動作する仮想環境を構築すれば動作します。
今回はdocker内にcondaで仮想環境を構築しました。
Mac上で動作する場合
pyenvとvirtualenvで仮想環境を構築して動作確認を行いました。
pyenv install 3.6.0
virtualenv -p ~/.pyenv/versions/3.6.0/bin/python my_env
source my_env/bin/activate
レポジトリにライブラリをインストールするためのrequirements.txt
を用意しているのでそちらを使用して必要なライブラリをインストールします。
https://github.com/SnowMasaya/keras-cloud-ml-engine
pip install -r requirements.txt
現状はgcloud
コマンドは2.7系しか公式サポートしていないのでPython2.7のパスをCLOUDSDK_PYTHON
に設定します。(3系は実験的な提供のみ)
Currently gcloud requires Python version 2.7.x and there is experimental support for 3.4 and up.
export CLOUDSDK_PYTHON=/usr/bin/python
これで同様のコマンドで動作可能になります。
bash run_ml_engine_local.sh
動作結果
Using TensorFlow backend.
Python version
3.6.0 (default, Feb 8 2017, 10:42:00)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]
Version info.
sys.version_info(major=3, minor=6, micro=0, releaselevel='final', serial=0)
:
Mac環境に関する考察
なぜ2.7系のPythonをCLOUDSDK_PYTHON
に設定するかですがgcloud
コマンドは2.7系のコマンドでしか公式サポートしていないためです。
2.7系のPythonをCLOUDSDK_PYTHON
設定しているのになぜ3.6の仮想環境で設定したpythonが動作するかについてですがソースコードを見れば分かります。
下記が該当の部分になりますがML Engineのコード内で指定したディレクトリ内のコードを実行するPython Interpreterを探して設定しています。ここでpython
コマンドで呼ばれるPython Interpreterが3系になっているとそちらを参照して動作します。
python_executable = exe_override or files.FindExecutableOnPath('python')
if not python_executable:
raise RuntimeError('No python interpreter found on local machine')
cmd = [python_executable, '-m', module_name] + args
結論としてはgoogle cloud sdkを動作するには2.7系が公式サポートなのでそちらを使用。内部で指定したディレクトリ内のコードを実行するPython Interpreterが呼ばれるのでそれを3系に変更すれば動作することになります。
最後に
クラウドサービスを使いこなして開発速度を向上したり運用負荷を減らすようなことが得意だというエンジニアの方がいましたら、是非カブクに応募してください。
参考
https://github.com/clintonreece/keras-cloud-ml-engine
https://cloud.google.com/sdk/gcloud/reference/ml-engine/local/train
https://cloud.google.com/icons/
https://cloud.google.com/sdk/gcloud/reference/topic/startup
その他の記事
Other Articles
関連職種
Recruit