Vertex AI のカスタム予測ルーチンでモデルの提供を簡素化
Google Cloud Japan Team
※この投稿は米国時間 2022 年 8 月 16 日に、Google Cloud blog に投稿されたものの抄訳です。
サービング時に受け取るデータがモデルで必要な形式になっていることはほぼありません。数値列の正規化、特徴の作成、画像バイトのデコード、入力値の確認が必要になります。データ変換は予測そのものと同じくらい重要になる場合があります。そこで今回発表するのが、コード処理前後の書き込みプロセスを簡素化する、Vertex AI のカスタム予測ルーチンです。
カスタム予測ルーチンを使用することで、データ変換を Python コードとして提供できます。バックグラウンドでは、ローカルでテストしてクラウドにデプロイできるカスタム コンテナが Vertex AI SDK によって構築されます。
カスタム予測ルーチンの概要
機械学習フレームワークの予測オペレーションを実行することで、Vertex AI の事前構築済みコンテナによって予測リクエストが処理されます。予測の実行前に入力を処理したり、結果を返す前にモデルの予測を後処理したりする場合、カスタム予測ルーチンが登場する前であれば、カスタム コンテナをゼロから構築する必要がありました。
カスタム サービング コンテナを構築するには、トレーニング済みモデルのラップ、HTTP リクエストからモデル入力への変換、モデル出力から応答への変換を行う HTTP サーバーを記述する必要があります。FastAPI でモデルサーバーを構築する方法をこちらの例で紹介しています。
カスタム予測ルーチンでは Vertex AI によってサービング関連コンポーネントが提供されるため、モデルとデータの変換に集中できます。
予測子
予測子クラスは予測リクエスト(モデルの読み込み、予測の取得、カスタムの前処理と後処理の適用)における ML 関連ロジックを処理します。カスタム予測ロジックを記述するには、Vertex AI Predictor インターフェースをサブクラス化します。大半のケースでは、必要なのは予測子のカスタマイズだけですが、リクエスト ハンドラのカスタマイズに関するサンプルを確認したい場合はこちらのノートブックをご覧ください。
カスタム予測ルーチンの今回のリリースには再利用可能な XGBoost 予測子と Sklearn 予測子が用意されていますが、別のフレームワークを使用する必要がある場合は、ベース予測子をサブクラス化することで独自の予測子を作成できます。
以下は再利用可能な Sklearn 予測子を使用した予測子の実装の例です。このカスタム モデル サーバーを構築するために記述する必要があるコードはこれだけです。
予測子は次の 4 つのメソッドを実装します。
読み込み: モデル アーティファクト、および pickle ファイルに保存したエンコーダなどのオプションの前処理アーティファクトを読み込みます。
前処理: 予測リクエストの前に入力データを前処理するロジックを実行します。デフォルトでは、JSON からシリアル化解除された後のリクエスト本文の全データを含むディクショナリを前処理メソッドが受け取ります。
予測: 予測を実行します。使用するフレームワークに応じて
model.predict(instances)
のようになります。後処理: エンドユーザーに結果を返す前に、予測結果を後処理します。デフォルトでは、後処理メソッドの出力が JSON オブジェクトにシリアル化され、応答の本文として返されます。
ユースケースの要件に応じて、必要な数だけ上記のメソッドをカスタマイズできます。予測子をサブクラス化し、新しいカスタム予測子を Python ファイルに保存するだけでカスタマイズできます。
ここからは、各メソッドのカスタマイズ方法について詳しく見ていきましょう。
読み込み
読み込みメソッドでは、Cloud Storage からアーティファクトを読み込みます。これにはモデルも含まれますが、カスタム プリプロセッサが含まれる場合もあります。
数値特徴をスケーリングする次のプリプロセッサを記述し、preprocessor.pkl
という名前の pickle ファイルとして Cloud Storage に格納したと仮定してみましょう。予測子をカスタマイズする際には、次と似たような、pickle ファイルを読み取る読み込みメソッドを記述します。artifacts_uri
はモデルと前処理アーティファクトへの Cloud Storage パスです。
前処理
前処理メソッドでは、提供データに必要な前処理を実行するロジックを記述します。次のように、読み込みメソッドに読み込んだプリプロセッサを適用するだけのシンプルなものにすることもできます。
プリプロセッサを読み込む代わりに、前処理メソッドに前処理を直接記述することもできます。入力が想定される形式になっていることをチェックする必要がある場合などが考えられます。インデックス 3 の特徴が省略形の文字列であると想定していると仮定しましょう。その特徴の値が省略されていることをサービング時にチェックする場合のコードは次のようになります。
他にもさまざまな方法で前処理ロジックをカスタマイズできます。言語モデルのテキストのトークン化、新しい特徴の生成、外部ソースからのデータの読み込みなどが例として挙げられます。
予測
このメソッドは通常、model.predict
を呼び出すだけです。再利用可能な予測子を使う代わりにゼロから予測子を構築する場合を除き、一般的にはカスタマイズ不要です。
後処理
モデルの予測が最初の一歩にすぎない場合もあります。モデルから予測を取得した後、エンドユーザーにとって価値のあるものに変換する必要がある場合などです。以下のように、モデルから返された数値クラスラベルを文字列ラベルに変換するだけのシンプルなものにすることもできます。
追加のビジネス ロジックを実装することもできます。モデルの信頼度が指定したしきい値を超えているときにのみ予測を返す場合などが考えられます。以下の場合には、代わりに人間に入力を送信してダブルチェックを行います。
前処理と同様、カスタム予測ルーチンではさまざまな方法でデータを後処理できます。言語モデルのテキストのトークン化解除、エンドユーザーが読みやすい形式へのモデル出力の変換、Vertex AI Matching Engine インデックス エンドポイントの呼び出しによる、埋め込みが類似するデータの検索などが例として挙げられます。
ローカルテスト
予測子を記述したら、クラスを Python ファイルに保存してください。以下のコマンドを使用してイメージを構築できます。LOCAL_SOURCE_DIR はカスタム予測子を保存した Python ファイルがあるローカル ディレクトリです。
イメージが構築されたら、ローカル エンドポイントにデプロイし、予測メソッドを呼び出してリクエスト データを渡すことでテストできます。前処理または後処理に必要なモデルとアーティファクトを保存した Cloud Storage のパスに artifact_uri
を設定します。テストにローカルパスを使用することもできます。
Vertex AI へのデプロイ
ローカルでモデルをテストして予測が想定どおりに動作することを確認したら、イメージを Artifact Registry に push してモデルを Vertex AI Model Registry にインポートします。オンラインでの予測が必要な場合には、エンドポイントにモデルをデプロイします。
Vertex AI へのモデルのアップロードとデプロイが完了すると、モデル レジストリにそのモデルが表示されます。その後、Vertex AI にデプロイした他のモデルと同じように、予測リクエストを実行できます。
次のステップ
モデルサーバーについて心配したり、Docker コンテナを構築したりすることなく、カスタム予測ルーチンを使用してサービング ワークフローをきめ細かくカスタマイズする方法の基本説明は以上となります。エンドツーエンドの例をハンズオンで体験する場合は、こちらの Codelab をご覧ください。独自のカスタム予測コードをぜひ記述してみてください。
- デベロッパー アドボケイト Nikita Namjoshi
- ソフトウェア エンジニア Sam Thrasher