Skip to Content
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のインストール済みなのでチュートリアルのリンクだけ貼っておきます。

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))
1 Comment
You must be Logged on to comment or reply to a post.