構造化カスタムモデルの構築¶
DataRobotは、従来のターゲットタイプを使用するモデルを作成するために、さまざまなライブラリのビルトインサポートを提供します。 モデルがこれらのライブラリのいずれかに基づいている場合、DataRobotでは、モデルアーティファクトに一致するファイル拡張子があることが期待されます。
ライブラリ | ファイル拡張子 | 例 |
---|---|---|
Scikit-learn | *.pkl | sklean-regressor.pkl |
Xgboost | *.pkl | xgboost-regressor.pkl |
PyTorch | *.pth | torch-regressor.pth |
tf.keras (tensorflow>=2.2.1) | *.h5 | keras-regressor.h5 |
ONNX | *.onnx | onnx-regressor.onnx |
pmml | *.pmml | pmml-regressor.pmml |
ライブラリ | ファイル拡張子 | 例 |
---|---|---|
Caret | *.rds | brnn-regressor.rds |
ライブラリ | ファイル拡張子 | 例 |
---|---|---|
datarobot-prediction | *.jar | dr-regressor.jar |
h2o-genmodel | *.java | GBM_model_python_1589382591366_1.java (pojo) |
h2o-genmodel | *.zip | GBM_model_python_1589382591366_1.zip (mojo) |
h2o-genmodel-ext-xgboost | *.java | XGBoost_2_AutoML_20,201,015_144158.java |
h2o-genmodel-ext-xgboost | *.zip | XGBoost_2_AutoML_20,201,015_144158.zip |
h2o-ext-mojo-pipeline | *.mojo | ... |
備考
-
DRUMは、DataRobotで生成された「スコアリングコード」を含むモデルと、DataRobot-predictionライブラリの
IClassificationPredictor
またはIRegressionPredictor
インターフェイスのいずれかを実装するモデルをサポートします。 モデルアーティファクトには、.jar
拡張子が必要です。 -
DRUM_JAVA_XMX
環境変数を定義し、JVMの最大ヒープメモリーサイズ(-Xmx
javaパラメーター):DRUM_JAVA_XMX=512m
を設定できます。 -
H2Oモデルを
POJO
としてエクスポートした場合、ファイル名は変更できません。ただし、MOJO
としてエクスポートされたモデルには、この制限は適用されません。任意の方法で名前を付けることができます。 -
h2o-ext-mojo-pipeline
にはh2o driverless AIライセンスが必要です。 -
DAI Mojoパイプラインのサポートは、
datarobot-drum
の構築のテストには組み込まれていません。
モデルで以下のライブラリのいずれかが使用されていない場合は、 非構造化カスタムモデルを作成する必要があります。
以下の2つのタイプのカスタムモデルの特性と機能を比較します。
モデルタイプ | 特性 | 機能 |
---|---|---|
構造化 |
|
|
非構造化 |
|
|
構造化カスタムモデルの要件¶
カスタムモデルでサポートされているライブラリのいずれかが使用されている場合は、次の要件を満たしていることを確認してください。
- モデルに送信されたデータは、追加の前処理なしで予測に使用できる必要があります。
- 連続値モデルは、予測データの行ごとに単一の浮動小数点を返す必要があります。
- 二値分類モデルは、1つの1.0以下の浮動小数点値、または合計が1.0になる2つの浮動小数点値を、予測データの行ごとに返す必要があります。
- 単一値の出力は、正のクラス確率と見なされます。
- 多価の場合、最初の値は負のクラス確率で、2番目の値は正のクラス確率であると想定されます。
- 単一の
pkl
/pth
/h5
ファイルが存在する必要があります。
データ形式
構造化モデルを操作する場合、DataRobotはcsv
、sparse
、またはarrow
形式のファイルとしてデータをサポートします。 DataRobotでは、欠損したまたは異常な(カッコ、スラッシュ、記号などを含む)列名はサニタイズされません。
構造化カスタムモデルフック¶
DataRobotのフレームワークを使用してカスタムモデルを定義するには、アーティファクトファイルには、モデルのトレーニング方法と新しいデータのスコアリング方法を定義するフック(または関数)が含まれている必要があります。 DataRobotは各フックを自動的に呼び出し、プロジェクトおよびブループリントの設定に基づいてパラメーターを渡します。 しかし、各フック内で実行するロジックを定義できる柔軟性があります。 必要に応じて、これらのフックを、Pythonモデルではcustom.py
、またはRモデルではcustom.R
と呼ばれるファイル内のモデルフォルダーにモデルアーティファクトとともに含めることができます。
備考
トレーニングフックと推論フックは、同じファイルで定義できます。
次のセクションでは、例とともに各フックについて説明します。
フック署名でのタイプ注釈
次のフック署名は、Python 3タイプ注釈で記述されます。 Pythonタイプは以下のRタイプに一致します。
Pythonタイプ | Rタイプ | 説明 |
---|---|---|
DataFrame |
data.frame |
numpy DataFrame またはR data.frame 。 |
None |
NULL |
なし |
str |
character |
文字列 |
Any |
Rオブジェクト | 非シリアル化モデル。 |
*args , **kwargs |
... |
これらはタイプではなくキーワード引数であり、追加パラメーター用のプレースホルダーとして機能します。 |
********
init()
¶
init
フックは実行の開始時に1回だけ実行され、モデルが他のフックで使用するライブラリと追加のファイルをロードできるようにします。
init(**kwargs) -> None
init()
入力¶
入力パラメーター | 説明 |
---|---|
**kwargs |
追加のキーワード引数。 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()
フックは、トレーニング済みのオブジェクト(あらゆる型)を返します。
********
read_input_data()
¶
read_input_data
フックは、モデルがデータを読み取る方法をカスタマイズします。例えば、エンコーディングや欠損値の処理などです。
read_input_data(input_binary_data: bytes) -> Any
read_input_data()
入力¶
入力パラメーター | 説明 |
---|---|
input_binary_data |
drum score モードで--input パラメーターによって渡されたデータ、またはdrum server /predict エンドポイントに送信されたペイロード。 |
read_input_data()
例¶
def read_input_data(input_binary_data):
global prediction_value
prediction_value += 1
return pd.read_csv(io.BytesIO(input_binary_data))
read_input_data <- function(input_binary_data) {
input_text_data <- stri_conv(input_binary_data, "utf8")
read.csv(text=gsub("\r","", input_text_data, fixed=TRUE))
}
read_input_data()
出力¶
read_input_data()
フックは、pandas DataFrame
またはR data.frame
を返すはずです。返さない場合は、独自のスコア方法を記述する必要があります。
********
transform()
¶
transform()
フックはカスタム変換の出力を定義し、変換されたデータを返します。 推定器モデルにこのフックを使用しないでください。 このフックは、トランスフォーマータスクと推定タスクの両方で使用できます。
-
トランスフォーマーの場合、このフックは提供されたデータに変換を適用し、下位のタスクに渡します。
-
推定器の場合、このフックは予測を行う前に予測データに変換を適用します。
transform(data: DataFrame, model: Any) -> DataFrame
transform()
入力¶
入力パラメーター | 説明 |
---|---|
data |
カスタムモデルが変換すべきデータを含むpandas DataFrame (Python)またはR data.frame 。 欠損値は、read_input_data フックによってオーバーライドされていない限り、PythonではNaN 、およびRではNA で示されます。 |
model |
アーティファクト(通常、トレーニング済みのトランスフォーマー)からDataRobotがロードする、またはload_model フックを介してロードされる、トレーニング済みのオブジェクト。 |
transform()
例¶
def transform(data, model):
data = data.fillna(0)
return data
transform <- function(data, model) {
data[is.na(data)] <- 0
data
}
transform()
出力¶
transform()
フックは、データが変換されたpandas DataFrame
またはR data.frame
を返します。
********
score()
¶
score()
フックは、カスタム推定器の出力を定義し、出力データに予測を返します。 変換モデルにこのフックは使用しないでください。
score(data: DataFrame, model: Any, **kwargs: Dict[str, Any]) -> DataFrame
score()
入力¶
入力パラメーター | 説明 |
---|---|
data |
カスタムモデルがスコアリングするデータを含むPandasのDataFrame(Python)またはR data.frame。 transform フックが使用されている場合、data は変換されたデータになります。 |
model |
DataRobotによってアーティファクトからロードされるか、またはload_model フックを介してロードされるトレーニング済みオブジェクト。 |
**kwargs |
追加のキーワード引数。 二値分類モデルの場合、正および負のクラスラベルを以下のキーとして含めます。
|
score()
例¶
def score(data: pd.DataFrame, model: Any, **kwargs: Dict[str, Any]) -> pd.DataFrame:
predictions = model.predict(data)
predictions_df = pd.DataFrame(predictions, columns=[kwargs["positive_class_label"]])
predictions_df[kwargs["negative_class_label"]] = (
1 - predictions_df[kwargs["positive_class_label"]]
)
return predictions_df
score <- function(data, model, …){
scores <- predict(model, newdata = data, type = "prob")
names(scores) <- c('0', '1')
return(scores)
}
score()
出力¶
score()
フックは、次の形式のpandas DataFrame
(またはR data.frame
またはtibble
)を返します。
-
連続値または異常検知プロジェクトの場合、出力に
予測
というの数値列が必要です。 -
二値または多クラスプロジェクトについては、出力にはクラスラベルごとに1つの列があり、クラス名を列名として使用する必要があります。 各セルには、それぞれのクラスの浮動小数点クラス確率を含んでいなければならず、各行の合計が1.0になる必要があります。
追加の出力列¶
本機能の提供について
カスタムモデルの予測レスポンスの追加出力は、デフォルトではオフになっています。 この機能を有効にする方法については、DataRobotの担当者または管理者にお問い合わせください。
機能フラグ:予測応答で追加のカスタムモデル出力を有効にする
score()
フックは、string
、int
、float
、bool
、またはdatetime
型のデータを含む追加の列を数に制限なく返すことができます。 追加の列がscore()
メソッドによって返される場合、予測応答は次のようになります。
- 表形式の応答(CSV)の場合、追加の列は応答テーブルまたはデータフレームの一部として返されます。
- JSON応答の場合、
extraModelOutput
キーが各行と一緒に返されます。 このキーは、行内の各追加列の値を含むディクショナリです。
例:余分な列を返す
さまざまなターゲットタイプの次のスコアフックは、予測データと共に追加の列(説明を目的としたランダムデータを含む)を返します。
連続値 | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
多クラス分類 | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
Generative AI | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
********
chat()
¶
chat()
フックを使用すると、カスタムモデルにOpenAIチャット補完APIを実装して、チャット履歴やストリーミングによる回答にアクセスできるようになります。
カスタムモデルのテスト要件
chat()
フックは、構造化されたカスタムモデルフックと一緒に定義できます。 カスタムモデルがモデルワークショップのテストに合格するためには、score()
フックをchat()
フックと一緒に定義して、/predictions/
エンドポイントへのアクセスを提供する必要があります。 chat()
フックが呼び出された場合、read_input_data()
、transform()
、およびpost_process()
フックは、score()
フックの場合とは異なり呼び出されません。
chat(completion_create_params: CompletionCreateParams, model: Any) -> ChatCompletion | Iterator[ChatCompletionChunk]
chat()
入力¶
入力パラメーター | 説明 |
---|---|
completion_create_params |
チャット補完の作成に必要なすべてのパラメーターを含むオブジェクト。 詳細については、OpenAI Python APIライブラリで次の型を確認してください:CompletionCreateParams 、ChatCompletion 、ChatCompletionChunk 。 |
model |
DRUMまたはload_model (指定した場合)によって読み込まれた逆シリアル化モデル。 |
chat()
例¶
def chat(completion_create_params, model):
openai_client = model
return openai_client.chat.completions.create(**completion_create_params)
chat()
出力¶
chat()
フックは、ストリーミングが無効な場合はChatCompletion
オブジェクトを返し、ストリーミングが有効な場合はIterator[ChatCompletionChunk]
を返します。
引用の出力¶
The chat()
hook returns four keys related to citations and accessible to custom models:
引用キー | 説明 |
---|---|
content |
カスタムモデルの引用フィールドの内容。 |
metadata |
The LangChain Document's metadata, containing the following information:
|
link |
The metadata key's page and source combined to provide a full citation. |
vector |
引用の埋め込みベクトル。 This key is used by the custom model as part of the LLM context for monitoring on the Data exploration and Custom metrics tabs. |
例:
completion.citations = [
{
"content": "Document 1",
"link": "path1.txt:0",
"vector": [186, 125, 222, 64, 98, 248, 48, 128, 217],
"metadata": {"page": 0, "source": "path1.txt"},
},
]
********
post_process()
¶
post_process
フックは、出力形式の期待値と一致しない場合にDataRobotまたはscore
フックによって返される予測データをフォーマットします。
post_process(predictions: DataFrame, model: Any) -> DataFrame
post_process()
入力¶
入力パラメーター | 説明 |
---|---|
predictions |
DataRobotまたはscore フックによって生成されたスコアリングデータを含むpandas DataFrame(Python)またはR data.frame。 |
model |
DataRobotによってアーティファクトからロードされるか、またはload_model フックを介してロードされるトレーニング済みオブジェクト。 |
post_process()
例¶
def post_process(predictions, model):
return predictions + 1
post_process <- function(predictions, model) {
names(predictions) <- c('0', '1')
}
post_process()
出力¶
post_process
フックは、次の形式のpandas DataFrame
(またはR data.frame
またはtibble
)を返します。
-
連続値または異常検知プロジェクトの場合、出力に
予測
という単一の数値列が必要です。 -
二値または多クラスプロジェクトについては、出力にはクラスごとに1つの列があり、クラス名を列名として使用する必要があります。 各セルには各クラスの確率が含まれている必要があります。また、各行の合計が1.0になる必要があります。