BigQuery MLで作成したモデルをVertex AIのModel Regstryにそのまま登録する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

2022/09/19現在この機能はプレビュー版となっていますのでご注意ください

こんにちは、小澤です。 BigQuery MLで作成したモデルはBigQuery内からの推論にそのまま利用できます。 BigQueryに蓄えられた大量のデータに対してモデル作成と推論双方をバッチ処理的に実行する範囲ではこの仕組みで不自由することはありません。 一方、作成したモデルを使ってリアルタイムに推論するAPIを作成する場合、 従来の方法では一度モデルをエクスポートして推論環境を別途用意する必要がありました。

今回紹介する仕組みを利用することでモデル作成のSQLにいくつかのオプションを追加するだけで、 作成したモデルをそのままVertex AIのModel Registryに登録し、エンドポイントの作成に利用できるようになります。

BigQuery MLとModel Regstryへの登録

BigQuery MLではCREATE MODEL文を使ってBigQuery内にあるデータから機械学習モデルを作成できます。 この仕組みを利用することで、SELECT文を使って取得したデータを学習やテストデータとしてそのまま単一のSQL文のみでモデル作成が可能です。

作成されたモデルはBigQuery内に保存され、 ML.PREDICT などの関数を使って推論も同様にSQLのみでSELECT文の結果の一部として付与できます。

機械学習の推論はBigQuery MLの利用シーンのようなバッチで推論を行うほかに、 リアルタイムでのレスポンスが求められるアプリケーションの一部として、その結果をユーザに返却するような処理の実装が必要になる場面があります。

BigQueryは役割はDWHやデータレイクとなるため、そういったアプリケーション側から直接クエリを発行して短時間で多数のリクエストを処理するには向きません。 こういった利用シーンにおいては、BigQuery ML以外でモデリングからAPIのエンドポイント作成までを実装するか、 BigQuery MLが作成したモデルをエクスポートしたものを使って推論を行う必要がありました。

それに対して、今回紹介する機能を利用するとBigQuery MLで作成したモデルをそのままVertex AIに連携することができます。

Vertex AIでは

  • AutoML, Pre-built container, Custom containerを使って学習済みモデルの作成
  • 作成されたモデルファイルと推論に利用するコンテナイメージのセットをModel Registyに登録
  • Model Registryに登録されたモデルをエンドポイントにデプロイ・バッチでの推論
  • それらの一連の流れをパイプライン化

などの仕組みを提供しています。 これらの仕組みは全てをセットで使う必要はなく、Vertex AIの外で学習させたモデルをModel Registryに登録して、 それをエンドポイントにデプロイすることも可能です。

BigQuery MLとVertex AIの連携では、この外部のモデルをそのままModel Registryに登録してVertex AIから使える仕組みを利用しています。 BigQuery MLでモデルを作成する際に、学習済みモデルをそのままVertex AIのMOdel Registryに登録する仕組みを提供することで、 エンドポイントの作成やそこへのデプロイとシームレスに連携が可能になっています。

利用方法は非常に簡単で、CREATE MODEL実行時にOPTIONで指定するのみです。

CREATE MODEL <モデル名>
options(
    ...
    model_registry="vertex_ai"
) as 
select
    ...
from
    ...

この model_registry="vertex_ai" の一行を足すだけで作成済みモデルがVertex AIのModel Registryにも登録されます。 もちろん、Vertex AIのコンソール上などからもモデルの存在を確認できます。

デフォルトでは、BigQuery MLのモデル名と同じ名前のものがModel Registryにも作成されます。 モデル登録の際に任意の値を指定することも可能ですし、既存のものを指定することで新しいバージョンとして保存することも可能です。 また、エイリアスの値を設定することも可能です。

CREATE MODEL <モデル名>
options(
    ...
    model_registry="vertex_ai",
    -- Model Registry側のモデル名
    -- 既存のものを指定することで新しいバージョンを作成する
    vertex_ai_model_id='<モデル名>', 
    -- defaultなどのバージョンに対するエイリアスを文字列で指定
    -- 複数指定可能なのでARRAY形式で渡す
    vertex_ai_model_version_aliases=['<alias1>', '<alias2>', ...] 
...

登録されたモデルは、そのままエンドポイントデプロイに利用できます。 コンソールから実行する場合は、以下のAutoMLでのやりかたなどと同様になります。

作成されたエンドポイントへのリクエストの仕方も同様に instances 以下にkey-value形式でカラム名と値を入れたものを配列形式で複数与えられます。

{
  "instances": [
    {
      "key1": value1,
      "key2": value2,
      ...
    },
    ...
  ]
}

レスポンスは以下のようにJSON形式で他と同様、 predictions 以下に instances で渡した値ごとの推論結果が返されます(この例では2値分類をしています)。

{
  "predictions": [
    {
      "label_col_values": [
        "1",
        "0"
      ],
      "predicted_label_col": "0",
      "label_col_probs": [
        0.0011214269325137141,
        0.998878538608551
      ]
    }
  ],
  ...
}

利用に際しての特徴と注意点

BigQueryとVertex AIでのモデルの紐づけに関して

この仕組みを利用するに際しての特徴として、 ユーザ側が明示的にモデルのエクスポート先を指定することはありません

Vertex AIのコンソール側でモデルのVERSION DETAILSを見ていただくとわかりますが、 データソースがBigQuery MLとなっており、リンクからBigQuery側のモデル情報にも直接行けるようになっています。

Model Registryにあるモデルの削除

連携されているモデルはVertex AI側から削除できません。 BigQuery側から、DROP MODEL文を発行してモデルを削除することでVertex AIのModel Registryからも削除されます。 そのため、BigQuery側を削除してVertex AI側のみを残すといった使い方もできません。

また、この仕組みに関連して、Vertex AI側でエンドポイントにデプロイされているモデルに関しては、BigQueryでDROP MODELで削除したり、CREATE OR REPLACE MODELでモデルを置き換えたりといった操作もできなくなります。 これらの操作をしたい場合は、先にエンドポイントからモデルのデプロイを解除する必要があります。

エンドポイントにデプロイできないモデルに関して

BigQuery MLの以下の機能を使っているモデルに関してはVertex AIのエンドポイントにデプロイできません。

  • TRANSFORM句を利用して特徴量の変換を行っている
  • MODEL_TYPEにAutoML(AUTOML_CLASSIFIER, AUTOML_REGRESSION)を利用している

これらはエンドポイントへのデプロイは出来ませんが、CREATE MODEL文の実行はできますし、Model Registryにも登録されますので、あらかじめ知っておくといいでしょう。

また、ハイパーパラメータチューニングを実施したモデルはエンドポイントへのデプロイが可能ですが、現状で複数生成されたモデルのうちどれを利用するかを明示的に選択はできないようです。

おわりに

今回はBigQuery MLで学習したモデルをVertex AIのModel Registryにシームレスに登録して利用する方法を解説しました。

現状ではまだプレビュー版の機能ではありますが、機械学習を実用的に使うためのハードルが大幅に下がる非常に便利な仕組みとなっています。