Elastic Algorithm Service (EAS) の組み込みプロセッサがモデルの要件を満たさない場合、カスタム Java プロセッサを実装することで、初期化と推論ロジックを直接制御できます。
プロセッサのライフサイクル
Java プロセッサは単一のクラスで、EAS が順番に呼び出す 3 つのライフサイクルフェーズがあります。
| フェーズ | メソッド | 呼び出しタイミング | 必須 |
|---|---|---|---|
| 初期化 | コンストラクター | サービスの起動時に1回 | はい |
| ロード | Load() |
構築後に1回 | はい |
| 推論 | Process(byte[] input) |
受信リクエストごとに1回 | はい |
| テスト | main(String[] args) |
ローカルマシンでのみ | いいえ |
EAS は次の順序でフェーズを呼び出します。
コンストラクター → Load() → Process() [リクエストごと] → ...
-
コンストラクター: デプロイ時に渡されたモデルファイルパス (
modelEntry) とサービス設定 JSON 文字列 (modelConfig) を受け取ります。 -
Load(): コンストラクターで受け取ったパスを使用して、モデルをメモリにロードします -
Process(byte[] input): 各リクエストで推論を実行し、結果をバイトとして返します
プロセッサクラスの実装
com.alibaba.eas パッケージ内に 1 つのクラスを定義します。コンストラクター、Load()、Process() は必須です。main() メソッドはオプションで、EAS にデプロイせずにローカルで単体テストを行う際に便利です。
package com.alibaba.eas;
import java.util.*;
public class TestProcessor {
// 起動時に1回呼び出されます。
// modelEntry: モデルファイルへのパス (ローカルまたは HTTP URL)。
// modelConfig: デプロイ時に渡されるサービス設定 JSON 文字列。
public TestProcessor(String modelEntry, String modelConfig) {
}
// モデルをメモリにロードします。構築後に1回呼び出されます。
public void Load() {
}
// 推論を実行します。生のバイト配列を受け取り、生のバイト配列を返します。
// 文字エンコーディングの問題を回避するため、String ではなく byte[] を使用します。
public byte[] Process(byte[] input) {
}
// オプション: EAS にデプロイせずにローカルでクラスをテストできます。
public static void main(String[] args) {
}
}
サポートされる入出力タイプ
Process() は byte[] と String をサポートします。文字エンコーディングの問題を回避するため、byte[] の使用を推奨します。
例外処理
Process() がキャッチされない例外をスローした場合、EAS はそれをキャプチャし、HTTP ステータスコード 400 で例外メッセージをクライアントに返します。
カスタムエラーメッセージを返すには、Process() 内で例外をキャッチし、クライアントに送信したいメッセージを含んだ RuntimeException をスローします。
try {
// 推論ロジック
} catch (com.alibaba.fastjson.JSONException e) {
throw new RuntimeException("bad json format, " + e.getMessage());
}
スタンドアロンモードでのローカルデバッグ
スタンドアロンモードを使用すると、クラスターにデプロイせずに、ローカルマシンでプロセッサを開発およびテストできます。ローカルのインターフェースはオンラインのクラスター環境と完全に互換性があるため、デプロイ前にプロセッサを検証できます。
スタンドアロンモードには Docker が必要です。モデルで GPU が必要な場合は、ローカルマシンに CUDA と Nvidia-Docker もインストールしてください。
前提条件
開始する前に、以下が準備されていることを確認してください。
-
EASCMD を実行するマシンにDocker がインストールされていること
-
(GPU モデルの場合) CUDA と Nvidia-Docker がインストールされていること
-
お使いのオペレーティングシステム用の EASCMD クライアントがダウンロードされていること
プラットフォーム ダウンロードリンク Windows 64 ビット http://eas-data.oss-cn-shanghai.aliyuncs.com/tools/eascmdwin64Linux 32 ビット http://eas-data.oss-cn-shanghai.aliyuncs.com/tools/eascmd32Linux 64 ビット http://eas-data.oss-cn-shanghai.aliyuncs.com/tools/eascmd64macOS 64 ビット http://eas-data.oss-cn-shanghai.aliyuncs.com/tools/eascmdmac64
スタンドアロンデバッグの実行
-
サービス設定ファイル (例:
service.json) を作成します。{ "name": "diy_test", "generate_token": "true", "model_path": "http://examplebucket.oss-cn-hangzhou-zmf.aliyuncs.com/scorecard.pmml", "processor_path": "./diy_processor_release.tar.gz", "processor_mainclass": "com.alibaba.eas.TestProcessor", "processor_type": "java", "metadata": { "resource": "eas-r-9lkbl2jvdm0puv****", "instance": 1, "cpu": 1, "memory": 2000 } }主なパラメーター:
パラメーター 説明 model_pathモデルファイルへの HTTP URL またはローカルパス。ローカルパスはスタンドアロンモードでのみ使用できます。 processor_pathプロセッサパッケージへの HTTP URL またはローカルパス。パッケージは .tar.gz形式で、展開するとコンパイル済みの JAR ファイルになります。ローカルパスはスタンドアロンモードでのみ使用できます。processor_mainclassLoad()とProcess()を実装するクラスの完全修飾名。processor_typeJava プロセッサの場合は javaに設定します。metadata.resource専用リソースグループのリソースグループ ID。 metadata.instanceサービスインスタンスの数。 metadata.cpuインスタンスあたりの CPU コア数。 metadata.memoryインスタンスあたりのメモリ (単位: MB)。 パラメーターの完全なリファレンスについては、「EASCMD クライアントを使用するためのコマンドの実行」をご参照ください。
-
スタンドアロンテストを実行します。
sudo eascmd test service.json