構造化カスタムモデルの構築¶
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の最大ヒープメモリーサイズ(-Xmxjavaパラメーター):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キーが各行と一緒に返されます。 このキーは、行内の各追加列の値を含むディクショナリです。
例:余分な列を返す
さまざまなターゲットタイプの次のスコアフックは、予測データと共に追加の列(説明を目的としたランダムデータを含む)を返します。
| Regression | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
| Multiclass | |
|---|---|
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()フックを使用すると、カスタムモデルにボルトオンのガバナンスAPIを実装して、チャット履歴やストリーミングレスポンスにアクセスできるようになります。 デプロイされたLLMブループリントでボルトオンのガバナンスAPIを使用する場合、modelパラメーターの推奨値については利用可能なLLMを参照してください。 あるいは、予約値 model="datarobot-deployed-llm" を指定して、LLMプロバイダーのサービスを呼び出すときに、LLMブループリントが関連するモデルIDを自動的に選択するようにします。
chat(completion_create_params: CompletionCreateParams, model: Any) -> ChatCompletion | Iterator[ChatCompletionChunk]
ワークベンチで、chat関数を実装したデプロイ済みLLMを追加する場合、プレイグラウンドは優先通信手段としてボルトオンのガバナンスAPIを使用します。 LLMブループリントに関連付けられたチャットモデルIDを入力して、プレイグラウンドからデプロイされたLLMへのリクエストにmodelパラメーターを設定します。 あるいは、datarobot-deployed-llmを入力して、LLMプロバイダーのサービスを呼び出すときに、LLMブループリントが関連するモデルIDを自動的に選択するようにします。
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]を返します。
引用の出力¶
chat()フックは、引用に関連し、カスタムモデルからアクセス可能な4つのキーを返します。
| 引用キー | 説明 |
|---|---|
content |
カスタムモデルの引用フィールドの内容。 |
metadata |
以下の情報を含むLangChainドキュメントのメタデータ:
|
link |
metadataキーのpageとsourceを組み合わせて、完全な引用を提供します。 |
vector |
引用の埋め込みベクトル。 このキーは、データ探索およびカスタム指標タブで監視するLLMコンテキストの一部としてカスタムモデルで使用されます。 |
例:
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になる必要があります。