Runtime 機能でできること
学習済モデルを投稿すると、アルゴリズム(推論プログラム)が実行され、推論時間・推論結果が出力されます。
出力された推論結果は、評価関数(既存の投稿機能)に自動で投稿されます。
なお、学習済みモデルは、下記の投稿ファイル規約に従って投稿してください。
投稿ファイルの作り方
1. 投稿テンプレートをDLする
こちらのテンプレートをダウンロードしてください。 ZIP DL
2. ディレクトリ構成を確認する
アップロードするディレクトリの構成は以下の通りです。
. ├── model 必須 学習済モデルを置くディレクトリ │ └── ... ├── src 必須 Python のプログラムを置くディレクトリ │ ├── predictor.py 必須 最初のプログラムが呼び出すファイル │ └── ... その他のファイル (ディレクトリ作成可能) └── requirements.txt 任意
3. test 学習済モデルを作成する
以下の環境を使用して、学習済モデルを作成してください。
- Python3 Anaconda3-2019.03(インストール方法はこちら)★
4. predictor.py を記述する
predictor.py には、以下のクラスとメソッドをご用意ください。
ScoringService
推論実行のためのクラスです。
以下のメソッドを実装してください。
get_model
モデルを取得するメソッドです。以下の条件があります。
- クラスメソッドであること
- 引数 model_path (str 型) を指定すること
- 正常終了時は返り値を true (bool 型) とすること
※ get_model 内での例外処理(try/except)は、エラー発生時に詳細が表示されなくなるため推奨しません。
predict
推論を実行するメソッドです。以下の条件があります。
- クラスメソッドであること
- 引数 input (str 型) を指定すること
※ 詳しくはテンプレート内の、同名ファイルをご確認ください。
5. zip で圧縮して投稿する。
zip で圧縮して、フォームへ投稿してください。
投稿例
練習問題「画像ラベリング(20種類)」での投稿例をご紹介します。
実行環境
練習問題「画像ラベリング(20種類)」の Runtime システムは以下の環境で実行されます。
- Docker: continuumio/anaconda3:2019.03 (Customized)
- vCPU: 1
- Memory: 2GiB
- WORKDIR: src
- 外部ネットワーク: アクセス不可
※ ディレクトリまたはファイルの場所を指定する場合は、相対パスで指定してください。
※ コンペにより実行環境が異なる場合があります。詳しくはコンペページをご確認ください。
投稿するファイルの例
通常 ZIP DL
ライブラリを使用する場合 ZIP DL
predictor.py ファイルの例
以下は predictor.py(通常)ファイルの内容です。
# -*- coding: utf-8 -*- import os import pickle import numpy as np from skimage import io from skimage.feature import hog class ScoringService(object): @classmethod def get_model(cls, model_path='../model'): """Get model method Args: model_path (str): Path to the trained model directory. Returns: bool: The return value. True for success, False otherwise. """ with open(os.path.join(model_path, 'my_model.pkl'), 'rb') as f: cls.model = pickle.load(f) return True @classmethod def predict(cls, input): """Predict method Args: input (str): path to the image you want to make inference from Returns: str: Inference for the given input. """ # load an image and get the file name image = io.imread(input) fname = os.path.basename(input) # do some preprocessing image_array = image/255 feature = hog(image_array, orientations=8, pixels_per_cell=(4,4), cells_per_block=(1,1), block_norm='L2-Hys') # make prediction y_pred = cls.model.predict_proba(np.array([feature]))[0] # make output output = '' for i in y_pred: output+=','+str(i) return fname + output
続いて、内容について解説します。
モジュールのインポート
import os import pickle import numpy as np from skimage import io from skimage.feature import hog
必要に応じてモジュールを import してください。
ScoringService クラス
class ScoringService(object)
このクラスのクラスメソッドを呼び出すことで推論が実行されます。
このクラス名の変更はできません。
モデルのクラス変数の宣言
model = None
モデルを代入するクラスの変数です。
別の変数名にしたり、複数にしても問題ありません。
モデルを取得するクラスメソッド
@classmethod def get_model(cls, model_path='../model'): """Get model method Args: model_path (str): Path to the trained model directory. Returns: bool: The return value. True for success, False otherwise. """ with open(os.path.join(model_path, 'my_model.pkl'), 'rb') as f: cls.model = pickle.load(f) return True
このクラスメソッドがないとエラーになります。
ファイルの読み込みはできるだけ model_path を使用してください(相対パスであれば問題ありません)。
成功すれば True を返却します(何も返却されないと、モデル取得失敗エラーになります)。
モデルの取得時間は推論時間に含まれません。
推論クラスメソッド
@classmethod def predict(cls, input): """Predict method Args: input (str): path to the image you want to make inference from Returns: str: Inference for the given input. """ # load an image and get the file name image = io.imread(input) fname = os.path.basename(input) # do some preprocessing image_array = image/255 feature = hog(image_array, orientations=8, pixels_per_cell=(4,4), cells_per_block=(1,1), block_norm='L2-Hys') # make prediction y_pred = cls.model.predict_proba(np.array([feature]))[0] # make output output = '' for i in y_pred: output+=','+str(i) return fname + output
このクラスメソッドがないとエラーになります。
Runtime は get_model クラスメソッドで指定されたモデルを使用して推論を行います。
推論時間は、このメソッドの処理時間となります。
(モデル読み込みも推論時間に含まれます)
input には str 型を入れ、文字列を返却してください。
input が画像ファイルの場合は、input にファイルパスを入れてください。
モジュールの追加
https://docs.anaconda.com/anaconda/packages/py3.7_linux-64/
この表の [In Installer] にチェックが入っているものが、すでにインストールされています(ただしバージョンは異なります)。
追加する場合は、requirements.txt に追記すると pip でインストールされます。
デバッグ方法
通常
$ pip install -r requirements.txt # モジュールが必要な場合は pip でインストールします $ cd src # ソースディレクトリに移動 $ python # python の実行 Python 3.7.3 (default, Mar 27 2019, 16:54:48) [Clang 4.0.1 (tags/RELEASE_401/final)] :: Anaconda, Inc. on darwin Type "help", "copyright", "credits" or "license" for more information. >>> from predictor import ScoringService # モジュール読み込み >>> ScoringService.get_model() # モデルの取得 True >>> ScoringService.predict('[推論入力データ]') # 推論の実行 '[推論結果]'
pyenv を使用
$ pyenv local anaconda3-2019.03
以降 通常のインストールの場合と同様のデバッグ方法です。
Docker を使用
$ docker run -it -v $(pwd):/opt/ml continuumio/anaconda3:2019.03 /bin/bash $ cd /opt/ml
Q&A
ローカル開発環境の構築方法は?
Runtime 機能と同じ環境で学習済モデルを作成してください。
環境の構築方法は以下の3通りがあります。
通常
https://repo.continuum.io/archive/ から、該当するアーキテクチャのバージョン 2019.03 のファイルをダウンロードして実行します。mac の場合は Anaconda3-2019.03-MacOSX-x86_64.pkg をダウンロードして実行してインストールします。
pyenv を使用
$ pyenv install anaconda3-2019.03
Docker を使用
$ docker pull continuumio/anaconda3:2019.03
モデルを複数使用する場合は?
model のクラス変数に配列を代入したり、辞書(dict)で代入したり、model1、model2 などに代入しても問題ありません。以下、具体的な例になります。
import os import pickle import glob class ScoringService(object): model = [] @classmethod def get_model(cls, model_path='../model'): for file in glob.glob(os.path.join(model_path, '*.pkl')): with open(os.path.join(file), 'rb') as inp: cls.model.append(pickle.load(inp)) return True
json ファイルなど学習モデルではないファイルを置く場所は?
src ディレクトリ内の適当な場所にファイルを置き、get_model クラスメソッドで読み込んでください。以下、具体的な例になります。
import os import pickle import json class ScoringService(object): model = None json_data = None @classmethod def get_model(cls, model_path='../model'): with open(os.path.join(model_path, 'decision-tree-model.pkl'), 'rb') as inp: cls.model = pickle.load(inp) with open('./data/hyperparameters.json', 'r') as inp: cls.json_data = json.load(inp) return True
他の実行環境は使用できますか?
現在、他の実行環境は非対応です。
※ コンペにより実行環境が異なる場合があります。詳しくはコンペページをご確認ください。
GPU は使用できますか?
基本的に非対応ですが、コンペによっては対応している場合もあります。詳しくはコンペページをご確認ください。
OS に他のパッケージをインストールする事は可能ですか?
現在、OS に他のパッケージをインストールする事はできません。
この記事は役に立ちましたか?
それは素晴らしい!
フィードバックありがとうございます
お役に立てず申し訳ございません!
フィードバックありがとうございます
フィードバックを送信しました
記事の改善におけるご協力ありがとうございます。