Technical Articles
Leonardo MLFのTrainingでいろいろ試してみる
Leonardo MLFのTraining Service を使ってみました。
実行環境
- OS : Ubuntu18.0.4LTS(guest OS on VMWare)
- CF CLI : 6.46.1+4934877ec.2019-08-23
- CF CLI Leonardo MLF Plug-in : 1.1.5
- python環境: pyenv1.2.13を使ってPython 3.6.8
使い方
1. CLIインストール
私の実行環境はすでにCF CLIやLeonardo MLF Plug-inのインストール済みなのでチュートリアルのリンクだけ貼っておきます。
- Install the Cloud Foundry Command Line Interface (CLI)
- Install the Machine Learning foundation plugin for SAP Cloud Platform CLI
2. ジョブ実行
2.1. ジョブ設定ファイル
ジョブ設定ファイルをこんな感じで準備します(basic.yaml)。
特にGPUを使う必要もなく、imageはNon-GPUの”com.sap.mlf/tyom-tf-1.12.0-py36-cpu”環境を使います。使用可能なDocker Imageのリストはヘルプポータルに記載があります。
job:
name: "test-job-20190905"
execution:
image: "com.sap.mlf/tyom-tf-1.12.0-py36-cpu"
command: "python3 check_env.py"
completionTime: "1"
resourcePlanId: "starter"
2.2. 実行プログラム
実行環境のPythonとパッケージバージョンを出力するだけのプログラム(check_env.py)です。
from pip._internal.operations import freeze
import sys
print('python version:', sys.version)
x = freeze.freeze()
for p in x:
print(p)
2.3. ジョブ実行
実行します。直下の“code”ディレクトリを使っています。
# from top directory
cf sapml job submit -f basic.yaml code
2.4. ジョブ結果確認
ジョブのステータスを確認します。
$ cf sapml job status
NAME ID STATUS SUBMISSION TIME TIME IN QUEUE EXECUTION TIME REASON
test-job-20190905 42f431ae-05fb-4ab1-8a8a-ced4effdcb3f SUCCEEDED 05/09/2019 11:29 0s 5s -
“cf sapml job status”で取得したIDを使ってジョブのログを確認します。Python上で”print”によって出力した情報を見られるのがわかります。ヘルプポータル上ではPython3.6.までしかわからなかったですが、Python3.6.8を使っていることがわかります。
ちなみに”f”オプションを付加して”cf sapml job logs -f <ID>”とするとストリーミングしてくれるようです。機械学習は総じて処理時間が長いのでよく使うオプションです。
cf sapml job logs 42f431ae-05fb-4ab1-8a8a-ced4effdcb3f
python version: 3.6.8 (default, Jan 14 2019, 11:02:34)
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]]
absl-py==0.7.1
astor==0.8.0
attrs==19.1.0
bleach==3.1.0
certifi==2019.6.16
chardet==3.0.4
cycler==0.10.0
Cython==0.29
decorator==4.4.0
defusedxml==0.6.0
dsp-python-sdk==0.3.9
entrypoints==0.3
fasttext==0.8.3
future==0.17.1
gast==0.2.2
grpcio==1.22.0
h5py==2.8.0
hyperopt==0.1.1
idna==2.8
ipython-genutils==0.2.0
Jinja2==2.10.1
jsonschema==3.0.2
jupyter-core==4.5.0
Keras==2.2.4
Keras-Applications==1.0.8
Keras-Preprocessing==1.1.0
kiwisolver==1.1.0
lxml==4.2.5
Markdown==3.1.1
MarkupSafe==1.1.1
matplotlib==3.0.0
mistune==0.8.4
nbconvert==5.6.0
nbformat==4.4.0
networkx==2.3
nltk==3.3
numpy==1.15.2
opencv-python-headless==3.4.3.18
pandas==0.23.4
pandocfilters==1.4.2
parse==1.12.0
Pillow==6.1.0
pip==19.2.1
protobuf==3.9.1
Pygments==2.4.2
pymongo==3.8.0
pyparsing==2.4.2
pyrsistent==0.15.4
python-dateutil==2.8.0
pytz==2019.2
PyYAML==5.1.2
requests==2.21.0
sapdi==0.1.9
scikit-learn==0.20.0
scipy==1.1.0
sdi-notebook2operator==0.0.1
seaborn==0.9.0
setuptools==39.0.1
six==1.12.0
stop-words==2018.7.23
tensorboard==1.12.2
tensorflow==1.12.0
termcolor==1.1.0
testpath==0.4.2
traitlets==4.3.2
urllib3==1.24.3
vflow-swagger-client==0.3.6.1
webencodings==0.5.1
Werkzeug==0.15.5
wheel==0.33.4
xgboost==0.80
2.5. ログ削除
ログが溜まっていって見にくかったら削除します。これで”cf sapml job status”で得られる一覧から削除されます。
cf sapml job kill -c 42f431ae-05fb-4ab1-8a8a-ced4effdcb3f
3. 追加
3.1. パッケージ追加・変更
ジョブ設定ファイルの”command”にpipなどが使えます。これにより、使いたいパッケージをインストールしたり、ダウングレードすることができます。
job:
name: "with-pip-20190905"
execution:
image: "com.sap.mlf/tyom-tf-1.12.0-py36-cpu"
command: "pip3 install tensorflow==1.11 && python3 check_env.py"
completionTime: "1"
resourcePlanId: "starter"
わかりやすく上記のように書きましたが、現実的には”requirements.txt”を準備してあげてpipでインストールするかと思います。”requirements.txt”は“code”ディレクトリ置いています。TensorFlowのバージョンをpipで変更しかつGPUを使う場合、”tensorflow-gpu”をインストールするのを忘れないように注意してください。
job:
name: "with-pip-20190905"
execution:
image: "com.sap.mlf/tyom-tf-1.12.0-py36-cpu"
command: "pip3 install -r requirements.txt && python3 check_env.py"
completionTime: "1"
resourcePlanId: "starter"
3.2. ファイルI/O
ファイル読み書きはMLFのファイルシステムに対して可能です。非ASCII文字や半角ブランクをファイル名に入れると、読み込み失敗するので注意しましょう。
まずは”fs list”でファイル一覧を見てみます。
$ cf sapml fs list
jobs/
oilexplr-2019-08-22t0544z486562/
oilexplr/
同じことをPythonでやってみます。
from pathlib import Path
from pprint import pprint
pprint(list(Path('/data').iterdir()))
“data”ディレクトリ以下に同じものがあることを確認できます。
[PosixPath('/data/oilexplr-2019-08-22t0544z486562'),
PosixPath('/data/jobs'),
PosixPath('/data/oilexplr')]
3.3. シェル実行
直接Pythonプログラムを実行せずにシェル実行でもOKです。実行時のパラメータが多い場合はシェル実行の方がやりやすいかと思います。また、”pip install”もここに含めた方が管理しやすいと思います。
こんなシェルを準備して”code”ディレクトリに置いておく。
python check_env.py
で、ジョブ設定ファイルの”command”をシェル実行にする。
job:
name: "with-pip-20190905"
execution:
image: "com.sap.mlf/tyom-tf-1.12.0-py36-cpu"
command: "bash run.sh"
completionTime: "1"
resourcePlanId: "starter"
3.4. ジョブのリソース使用状況確認
以下のコードを実行することでジョブ実行時のコンテナのリソース使用状況を確認できます。OAuth URL等”<>”で囲んでいる部分を設定してください。
import os
import requests
def get_token():
OAUTH2_URL = '<OAuth URL>'
CLIENTID = '<client id>'
CLIENTSECRET = ',client secret>'
data = {"grant_type": "client_credentials"}
r = requests.post(OAUTH2_URL, data=data, auth=(CLIENTID, CLIENTSECRET))
bearer_token = r.json()["access_token"]
return {'Authorization': 'Bearer {}'.format(bearer_token), 'Accept': 'application/json'}
def get_resources(job_id):
training_svc_url = '<training>'
url = "https://{}/api/v2/jobs/{}/resources".format(training_svc_url, job_id)
response = requests.get(url=url, headers=get_token())
return response.json()
job_id = '<job id>'
print(get_resources(job_id))
Cant this be available in English language.
Yohei Fukuhara please in english ! 😀
Hi,
I'm sorry that I don't have enough time to translate.