Runtime 投稿方法

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 に他のパッケージをインストールする事はできません。

添付ファイル (1)

この記事は役に立ちましたか?

それは素晴らしい!

フィードバックありがとうございます

お役に立てず申し訳ございません!

フィードバックありがとうございます

この記事に改善できることがあれば教えてください。

少なくとも一つの理由を選択してください
CAPTCHA認証が必要です。

フィードバックを送信しました

記事の改善におけるご協力ありがとうございます。