非構造化カスタムモデルの構築¶
カスタムモデルがDataRobotでサポートされているターゲットタイプを使用していない場合、非構造化モデルを作成することができます。 非構造化モデルは、入出力に任意の(つまり、構造化されていない)データを使用でき、ターゲットのタイプに関係なくモデルをデプロイおよび監視することができます。 非構造化モデルのこの特性により、予測リクエストと応答からデータを読み取る方法をより細かく制御できます。ただし、正しく構築するには的確なコーディングが必要です。 非構造化入力データを処理するカスタムフックを実装して、有効な応答を生成する必要があります。
以下の2つのタイプのカスタムモデルの特性と機能を比較します。
モデルタイプ | 特性 | 機能 |
---|---|---|
構造化 |
|
|
非構造化 |
|
|
推論モデルは、非構造化モードをサポートします。このモデルでは、入力と出力が検証されず、ほぼすべてのモードが可能です。 正確さを確認するのはユーザーの責任です。 非構造化カスタム推論モデルに固有の構築手順については、DRUMのドキュメントに記載されているPythonおよびRのモデルテンプレートを参照してください。
データ形式
非構造化モデルで作業する場合、DataRobotはデータをテキストまたはバイナリファイルとしてサポートします。
非構造化カスタムモデルフック¶
必要な任意のフックを、Pythonモデルではcustom.py
、またはRモデルではcustom.R
と呼ばれるファイル内のモデルフォルダーにモデルアーティファクトとともに含めます。
フック署名でのタイプ注釈
次のフック署名は、Python 3タイプ注釈で記述されます。 Pythonタイプは以下のRタイプに一致します。
Pythonタイプ | Rタイプ | 説明 |
---|---|---|
None |
NULL |
なし |
str |
character |
文字列 |
bytes |
raw |
元のバイト数 |
dict |
list |
キーと値のペアのリスト。 |
tuple |
list |
データのリスト。 |
Any |
Rオブジェクト | 非シリアル化モデル。 |
*args , **kwargs |
... |
これらはタイプではなくキーワード引数であり、追加パラメーター用のプレースホルダーとして機能します。 |
********
init()
¶
init
フックは実行の開始時に1回だけ実行され、モデルが他のフックで使用するライブラリと追加のファイルをロードできるようにします。
init(**kwargs) -> None
init()
入力¶
入力パラメーター | 説明 |
---|---|
**kwargs |
追加のキーワード引数。 code_dir は、--code_dir パラメーターを介してモデルコードが保存されるフォルダーへのリンクを提供します。 |
init()
例¶
def init(code_dir):
global g_code_dir
g_code_dir = code_dir
init <- function(…) {
library(brnn)
library(glmnet)
}
init()
出力¶
init()
フックは何も返しません。
********
load_model()
¶
load_model()
フックは、複数のアーティファクトから1つ以上のトレーニング済みオブジェクトをロードするために、実行の開始時に1回だけ実行されます。 トレーニング済みのオブジェクトがサポートされていない形式を使用するアーティファクトに保存されている場合、または複数のアーティファクトが使用される場合にのみ必要です。 サポートされている形式の1つの形式のアーティファクトが1つだけある場合、load_model()
フックは必要ありません。
- Python:
.pkl
、.pth
、.h5
、.joblib
- Java:
.mojo
- R:
.rds
load_model(code_dir: str) -> Any
load_model()
入力¶
入力パラメーター | 説明 |
---|---|
code_dir |
モデルアーティファクトと追加のコードが提供されるディレクトリに、--code_dir パラメーターを介して渡されるリンク。 |
load_model()
例¶
def load_model(code_dir):
model_path = "model.pkl"
model = joblib.load(os.path.join(code_dir, model_path))
load_model <- function(input_dir) {
readRDS(file.path(input_dir, "model_name.rds"))
}
load_model()
出力¶
load_model()
フックは、トレーニング済みのオブジェクト(あらゆる型)を返します。
********
score_unstructured()
¶
score_unstructured()
フックは、カスタム推定器の出力を定義し、出力データに予測を返します。 変換モデルにこのフックは使用しないでください。
score_unstructured(model: Any, data: str/bytes, **kwargs: Dict[str, Any]) -> str/bytes [, Dict[str, str]]
score_unstructured()
入力¶
入力パラメーター | 説明 |
---|---|
data |
データは、提供されたmimetype に応じて、str またはbytes として表示されます。 |
model |
DataRobotによってアーティファクトからロードされるか、またはload_model フックを介してロードされるトレーニング済みオブジェクト。 |
**kwargs |
追加のキーワード引数。 二値分類モデルの場合、正および負のクラスラベルを以下のキーとして含めます。
|
score_unstructured()
例¶
def score_unstructured(model, data, query, **kwargs):
text_data = data.decode("utf8") if isinstance(data, bytes) else data
text_data = text_data.strip()
words_count = model.predict(text_data)
return str(words_count)
score_unstructured <- function(model, data, query, …) {
kwargs <- list(…)
if (is.raw(data)) {
data_text <- stri_conv(data, "utf8")
} else {
data_text <- data
}
count <- str_count(data_text, " ") + 1
ret = toString(count)
ret
}
score_unstructured()
出力¶
score_unstructured()
フックは次の値を返します。
- 単一の値
return data: str/bytes
。 - タプル
return data: str/bytes, kwargs: dict[str, str]
。ここでkwargs = {"mimetype": "users/mimetype", "charset": "users/charset"}
は、Content-Type
レスポンスヘッダーのmimetype
およびcharset
を返すために使用されます。
********
非構造化モデルに関する注意事項¶
入力データ型解像度¶
score_unstructured
フックは、str
またはbytes
タイプのdata
パラメーターを受け取ります。
タイプチェック方法を使用して、タイプを確認できます。
-
Python:
isinstance(data, str)
またはisinstance(data, bytes)
-
R:
is.character(data)
またはis.raw(data)
DataRobotは、Content-Type
ヘッダーを使用してdata
のキャスト先のタイプを決定します。 Content-Type
ヘッダーは、リクエストまたは--content-type
CLI引数で提供できます。
Content-Type
ヘッダー形式はtype/subtype;parameter
です(たとえば、text/plain;charset=utf8
)。 以下のルールが適用されます。
-
charset
が定義されていない場合、デフォルトのutf8
文字セットが使用されます。定義されている場合、提供された文字セットがデータのデコードに使用されます。 -
Content-Type
が定義されていない場合、kwargs={"mimetype": "text/plain", "charset":"utf8"}
が入力されるため、データはテキストとして扱われ、utf8
文字セットでデコードされてstr
として渡されます。 -
mimetype
がtext/
またはapplication/json
で始まる場合、データはテキストとして扱われ、提供された文字セットでデコードされてstr
として渡されます。 -
他のすべての
mimetype
値については、データは二値として扱われ、bytes
として渡されます。
送信データおよびkwargsパラメーター¶
上記のように、score_unstructured
は以下を返すことができます。
-
単一のデータ値:
return data
。 -
タプル(データおよび追加パラメーター:
return data, {"mimetype": "some/type", "charset": "some_charset"}
)。
サーバーモード¶
サーバーモードでは、次のルールが適用されます。
-
return data: str
:データはテキストとして扱われます。デフォルトのContent-Type="text/plain;charset=utf8"
ヘッダーがレスポンスに設定され、データはutf8
charset
でエンコードされて送信されます。 -
return data: bytes
:データは二値として扱われます。デフォルトのContent-Type="application/octet-stream;charset=utf8"
ヘッダーがレスポンスに設定されて、データはそのまま送信されます。 -
return data, kwargs
:kwargs
でmimetype
値が欠損している場合、デフォルトのmimetype
はデータ型str
/bytes
->text/plain
/application/octet-stream
に従って設定されます。charset
値が欠損している場合、デフォルトのutf8
文字セットが設定されます。データの型がstr
の場合、解決済みのcharset
を使用してエンコードされ、送信されます。
バッチモード¶
バッチモードでデバッグする最良の方法は、--output
ファイルを提供することです。 返されたデータは、返されたデータのタイプに従ってファイルに書き込まれます。
-
str
データはデフォルトのutf8
を使用してテキストファイルに書き込まれるか、kwargs
charset
で返されます。 -
bytes
データはバイナリファイルに書き込まれます。 返されたkwargs
はバッチモードでは表示されませんが、デバッグ中には出力できます。
補助¶
コード内のdatarobot_drum.RuntimeParameters
(たとえば、custom.py
)を使用して、実行されたカスタムモデルに配信されるランタイムパラメーターを読み取ることができます。 ランタイムパラメーターは、DataRobot UIで定義する必要があります。 以下は、資格情報ランタイムパラメーターの文字列を読み取る方法の簡単な例です。
from datarobot_drum import RuntimeParameters
def load_model(code_dir):
target_url = RuntimeParameters.get("TARGET_URL")
s3_creds = RuntimeParameters.get("AWS_CREDENIAL")
…