2024 年版 BQML だけで MLOps

免責事項：この記事の内容は個人の意見・見解の表明であり、所属組織の意見・見解を代表しません。

2024 年MLOpsアドベントカレンダー 12/20 の記事です（すみません！遅れました....）

# 背景
BQML で MLOps ができるという話をなんどか目にしたけど、自分もわかっていなかったのと私の知る限りであまり記事をみたことがない (すでにあったらすみません) ので確認したかったです。

# この記事の全体の構成
この記事でカバーする MLOps の範囲です。
- Modeling
- Prediction
- Monitoring 

前処理は BigQuery で行っている人も多いと思うので説明は省きます。

# Modeling
リーリスしてから時間がたっているので知っている人も多いとは思いますが、BigQuery ML (以下、BQML）の機能からモデリングが可能です。実際、 SQL でモデリングができるので私の周りでは好んで使う人が多いです。Regression, Binary、Time series etc. が対応しております。Matrix Factorization（レコメンデーション）は2024/12時点では、reservation が必要なので他と pricing が異なるので注意です (以前、on-demand で使えるように SQL で使っている人をネットで見かけました)。

実際に、公式のチュートリアルに記載されているペンギンの体重を予測するモデルを作成するクエリは下記になります。データはどなたでも使える public データを使っています。
```
CREATE OR REPLACE MODEL `bqml_tutorial.penguins_model`
OPTIONS
  (model_type='linear_reg',
  input_label_cols=['body_mass_g']) AS
SELECT
  *
FROM
  `bigquery-public-data.ml_datasets.penguins`
WHERE
  body_mass_g IS NOT NULL;
```
引用: [Use BigQuery ML to predict penguin weight](https://cloud.google.com/bigquery/docs/linear-regression-tutorial)

イベントトリガーを行いたい場合 pipeline などを構築しないといけないですが、スケジューラーであれば、BigQuery のUI 上に標準で設定されているスケジューラーを使って時間指定で動作はできますので、Continuous Training も時間指定で可能と言えます。

# Prediction
こちらもご存知な方は多いかもしれないですが、Modeling ができるということは予測もできます。さきほどの公式チュートリアルのペンギンの体重の予測するモデルから予測するクエリはこちらになります。

```
SELECT
*
FROM
ML.PREDICT(MODEL `bqml_tutorial.penguins_model`,
  (
  SELECT
    *
  FROM
    `bigquery-public-data.ml_datasets.penguins`
  WHERE island = 'Biscoe'));
```

引用：[Use BigQuery ML to predict penguin weight](https://cloud.google.com/bigquery/docs/linear-regression-tutorial#use_the_model_to_predict_outcomes)

Modeling と同じく、BQ 上のスケジューラーを用いて時間指定で予測を行うことができる。

# Monitoring
### データドリフト
 個人的にはこちらが本記事で確認したかったことのメインになります。Evalute はもちろんモデリングがでた当初からでていたのでご存知の方は多いかもしれません。今年 2024 年にデータドリフトに関して新しい関数がリリースされたので確認します。個人的には嬉しい update でした。

- [The ML.VALIDATE_DATA_SKEW function](https://cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-validate-data-skew)
- [The ML.VALIDATE_DATA_DRIFT function](https://cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-validate-data-drift)

VALIDATE_DATE_SKEWは、トレーニングデータと比較したいデータ（予測したいデータ）でデータドリフトが起こっているか確認できる。VALIDATE_DATA_DRIFT だと２つのデータセット間で比較できるので、例えばモデル作成後の１日後の予測、１週間後の予測の間で比較ができます。

使える指標は、2024/12時点で下記になります。
- L-infinity distance /Chebyshev distance - チェビシェフの距離 (カテゴリタイプのデータだとデフォルト）
- Jensen–Shannon divergence (数値タイプだとJS divergence しか選べない)

L-infinity distanceはカテゴリタイプのデータだけ使えて、その場合デフォルトになります。数値データは、JS divergenceだけ選べます。このあたりは TFDV と同じかなと思いました (参考: [TensorFlow データ検証を開始する](https://www.tensorflow.org/tfx/data_validation/get_started?hl=ja))。

実際の VALIDATE_DATA_SKEW のクエリはこちらです。
```
SELECT *
FROM ML.VALIDATE_DATA_SKEW(
    MODEL `bqml_model_monitoring.classify_species_logistic`,
    (
        SELECT *
        FROM `bqml_model_monitoring.serving`
        WHERE DATE(instance_timestamp) = CURRENT_DATE()
    )
);
```

たとえば、予測した結果がすぐに得られる場合などはデータドリフトの確認を行うよりすぐに予測精度を確認したほうが有益でしょう。そのようなケースだらけではないのが事実ですので、個人的には 1 日以上実際の結果の取得に時間がかかるならデータドリフトを計算し、想定した分布/数値よりずれていないか検知するとビジネスへのネガティブインパクトを抑えられるのではないかと思います。


# まとめ
BigQuery 上でデータが来てから Modeling, Prediction, Monitoring ができることを確認しました。特に、2024 年にリリースされた VALIDATE_DATA_SKWE, VALIDATE_DATA_DRIFT は実行結果がすぐに取得できない場合において非常に有用なデータドリフトの確認手法になりえます。Python などで実行できる環境があればもちろんそちらのほうが自由度は高く実行できるかと思います。Python が使えず、SQL しか使えませんという状況ももちろんありますのでその際には有用な手法となりうると思います。
もちろん、ここで紹介していない可視化などを行いたいを言い出せばきりがないですが、最低限の実施はできるのでデータドリフトの機能は周りにも紹介していきたいと思います。


# 参考
- [BigQuery ML チュートリアル（英語）](https://cloud.google.com/bigquery/docs/create-machine-learning-model)

- [BigQuery ML (BQML) - Model Monitoring Tutorial](https://github.com/GoogleCloudPlatform/bigquery-ml-utils/blob/master/notebooks/bqml-model-monitoring-tutorial.ipynb)

- [BigQuery に新しい ML モデルのモニタリング機能を導入](https://cloud.google.com/blog/ja/products/data-analytics/monitor-ml-model-skew-and-drift-in-bigquery?hl=ja)