Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
cancel
Showing results for 
Search instead for 
Did you mean: 
Fukuhara
Advisor
Advisor
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のインストール済みなのでチュートリアルのリンクだけ貼っておきます。

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))
3 Comments