Skip to content

アプリケーション内で をクリックすると、お使いのDataRobotバージョンに関する全プラットフォームドキュメントにアクセスできます。

非構造化カスタムモデルの構築

カスタムモデルがDataRobotでサポートされているターゲットタイプを使用していない場合、非構造化モデルを作成することができます。 非構造化モデルは、入出力に任意の(つまり、構造化されていない)データを使用でき、ターゲットのタイプに関係なくモデルをデプロイおよび監視することができます。 非構造化モデルのこの特性により、予測リクエストと応答からデータを読み取る方法をより細かく制御できます。ただし、正しく構築するには的確なコーディングが必要です。 非構造化入力データを処理するカスタムフックを実装して、有効な応答を生成する必要があります。

以下の2つのタイプのカスタムモデルの特性と機能を比較します。

モデルタイプ 特性 機能
構造化
  • DataRobotに既知のターゲットタイプ(連続値、二値分類、多クラス、異常検知など)を使用します。
  • リクエスト/レスポンススキーマに準拠する必要があります。
  • 構造化入力および出力データを受け入れます。
  • 完全なデプロイ機能
  • デプロイ後に、トレーニングデータを受け入れます。
非構造化
  • DataRobotに知られていないカスタムターゲットタイプを使用します。
  • リクエスト/レスポンススキーマに準拠する必要はありません。
  • 非構造化入出力データを受け入れます。
  • デプロイ機能には制約があります。 データドリフトや精度統計、チャレンジャーモデル、信頼性ルールはサポートしません。
  • デプロイ後はトレーニングデータを受け付けません。

推論モデルは、非構造化モードをサポートします。このモデルでは、入力と出力が検証されず、ほぼすべてのモードが可能です。 正確さを確認するのはユーザーの責任です。 非構造化カスタム推論モデルに固有の構築手順については、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 追加のキーワード引数。 二値分類モデルの場合、正および負のクラスラベルを以下のキーとして含めます。
  • mimetype: str:バッチモードでのリクエストContent-Typeヘッダーまたは--content-typeCLI引数から取得されたデータの性質と形式を示します。
  • charset: str:バッチモードでのリクエストContent-Typeヘッダーまたは--content-typeCLI引数から取得されたテキストデータのエンコーディングを示します。
  • query: dict:httpリクエストでクエリーパラメーターとして渡されたパラメーター、またはバッチモードでの--queryCLI引数。
  • headers: dict:httpリクエストで渡されたリクエストヘッダー。

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-typeCLI引数で提供できます。 Content-Typeヘッダー形式はtype/subtype;parameterです(たとえば、text/plain;charset=utf8)。 以下のルールが適用されます。

  • charsetが定義されていない場合、デフォルトのutf8文字セットが使用されます。定義されている場合、提供された文字セットがデータのデコードに使用されます。

  • Content-Typeが定義されていない場合、kwargs={"mimetype": "text/plain", "charset":"utf8"}が入力されるため、データはテキストとして扱われ、utf8文字セットでデコードされてstrとして渡されます。

  • mimetypetext/または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, kwargskwargsmimetype値が欠損している場合、デフォルトの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")
     

更新しました May 2, 2024