🐈‍⬛

BigQuery でオブジェクトテーブルが GA になりました

2023/06/26に公開

はじめに

こんにちは、クラウドエース データ ML ディビジョン所属の大城です。
クラウドエースの IT エンジニアリングを担うシステム開発部の中で、特にデータ基盤構築・分析基盤構築からデータ分析までを含む一貫したデータ課題の解決を専門とするのがデータ ML ディビジョンになります。

データ ML ディビジョンでは活動の一環として、毎週 Google Cloud の新規リリースを調査・発表し、データ領域のプロダクトのキャッチアップをしています。その中でも重要と考えるリリースを本ページ含め記事として公開しています。

今回紹介するリリースは、BigQuery の「オブジェクトテーブル」が一般提供 (Generally Available: GA) になったことについてです。

オブジェクトテーブルの概要

オブジェクトテーブルとは、Cloud Storage に保存されている非構造化データのメタデータを保持している読み取り専用のテーブルのことです。
BigQuery ML や BigQuery リモート関数をあわせて使用することで、画像や音声ファイル、ドキュメント、その他のファイルタイプの分析および推論を行うことができます。

https://cloud.google.com/bigquery/docs/object-table-introduction

機能追加・更新された関数について

オブジェクトテーブルの GA にともない、以下の関数の新規追加および更新がされています。
各関数の役割についても軽く記載しておきます。

  • ML.DECODE_IMAGE: 関数 ML.PREDICT への入力として使用できるように、画像をデコードする。
  • ML.CONVERT_COLOR_SPACE: 画像が持つ RGB 色空間(カラースペース)を別の色空間に変換する。
  • ML.CONVERT_IMAGE_TYPE: 画像のピクセル値のデータ型を変換する。
  • ML.RESIZE_IMAGE: 画像のサイズを変更する。
  • ML.DISTANCE: 2つのベクトル間の距離を計算する。
  • ML.LP_NORM: ベクトルの Lᵖ ノルムを計算する。ただし、ᵖ は次数を表す。

https://cloud.google.com/bigquery/docs/release-notes#May_11_2023

上記の 6 つの関数はいずれも、以前はプレビュー版として利用できていましたが、今回 GA となりました。

制限事項

オブジェクトテーブルを使用するにあたりいくつか制限事項がありますが、そのうち 2 つを紹介します。

  • オブジェクトテーブルは読み取り専用のテーブルのため、オブジェクトテーブルが保持しているデータを変更することはできません。
  • レガシー SQL や、AWS, Microsoft AZURE などの他のクラウド環境では利用できません。

その他の事項や詳細に関しては公式ドキュメントをご参照ください。

https://cloud.google.com/bigquery/docs/object-table-introduction#limitations

費用

以下の 2 つの場合に料金が発生します。

  • オブジェクトテーブルにクエリを実行する
  • メタデータキャッシュを更新する

ユースケース

他の BigQuery テーブルと同様に、オブジェクトテーブルに対しクエリを実行することができますが、主なユースケースは、分析をするために非構造化データにアクセスできるようにすることです。TensorFlow や TensorFlow Lite, PyTorch などのモデルを BigQuery ML で使用することにより、画像のオブジェクトテーブルに対し、推論を行うことができます。また、リモート関数を利用して非構造化データを分析することもできます。
次の「実際に試してみた」でどういうことができるのか確認していきましょう。

実際に試してみた

こちらのチュートリアルを参考にしたいと思います。
ここでは、花の画像のデータセットからオブジェクトテーブルを作成した後、MobileNet V3 というモデルを利用し、作成したオブジェクトテーブルに対し推論を実行したいと思います。MobileNet V3 モデルは画像ファイルを分析し、特徴ベクトルを配列で返してくれます。

事前準備

以下の準備が必要になります。

  • Google Cloud プロジェクトに対して課金を有効にします。
  • BigQuery API と BigQuery Connection API を有効にします。
  • データセット mobilenet_inference_test を作成します。
  • 接続 lake-connection を作成します。
  • Cloud Storage バケットを作成し、その中に 2 つのフォルダ mobilenetflowers を作成します。それぞれ MobileNet V3 モデルと、花の画像用のフォルダになります。
  • 接続 lake-connection のサービスアカウントに Storage オブジェクトの閲覧者権限を付与します。
  • ローカルマシンに花のデータセットをダウンロードし、ファイル flower_photos.tgz を解凍します。上で作成したフォルダ flowers にフォルダ flower_photos をアップロードします。
  • BigQuery で予約を作成し、チュートリアルを実行したいプロジェクトのジョブタイプ QUERY に割り当てをします。
    • 次の「検証開始」では、エンタープライズエディションのベースラインを 0 で、最大スロット数を 100 で予約したもとで検証を行っております。また、リージョンは「us (米国の複数のリージョン)」を指定しております。スタンダードエディションだと BigQuery ML が利用できないのでご注意ください。
    • この条件のもとだと、1 スロットあたり $0.06 / hr の従量課金が適用されます。詳しくはこちらをご参照ください。
    • BigQuery エディションにおける各エディションの機能に関してはこちらをご参照ください。

検証開始

  1. 以下のクエリを実行し、オブジェクトテーブル sample_images を作成します。BUCKET_NAME には事前準備で作成したバケット名に置き換えてください。
CREATE EXTERNAL TABLE mobilenet_inference_test.sample_images
WITH CONNECTION `us.lake-connection`
OPTIONS(
  object_metadata = 'SIMPLE',
  uris = ['gs://BUCKET_NAME/flowers/*']);

クエリが成功すると、次の画像のようなオブジェクトテーブルが作成されます。

  1. MobileNet V3 モデルをダウンロードすると、モデル用のファイル saved_model.pb とフォルダ variables が取得できます。これら 2 つを事前準備で作成した Cloud Storage フォルダ mobilenet にアップロードします。

  2. 以下のクエリを実行し、モデルを BigQuery ML に読み込みます。BUCKET_NAME には事前準備で作成したバケット名に置き換えてください。

CREATE MODEL mobilenet_inference_test.mobilenet
OPTIONS(
  model_type = 'TENSORFLOW',
  model_path = 'gs://BUCKET_NAME/mobilenet/*');

クエリが成功すると、モデル mobilenet がデータセット mobilenet_inference_test 配下に作成されます。

モデルのスキーマを確認してみましょう。

[ラベル]セクションには、モデルによって出力されるフィールドが表示されます。今回の場合だと feature_vector です。また、[機能]セクションにはモデルに入力するフィールドが表示されます。今回の場合だと inputs です。

  1. 以下のクエリを実行し、推論を実行します。
SELECT *
FROM ML.PREDICT(
  MODEL mobilenet_inference_test.mobilenet,
  (SELECT uri, ML.RESIZE_IMAGE(ML.DECODE_IMAGE(data), 224, 224, FALSE) AS inputs
  FROM mobilenet_inference_test.sample_images)
);

関数 ML.RESIZE_IMAGEML.DECODE_IMAGE を用いて花の画像データから特徴量 (inputs) を生成し、その特徴量をモデル mobilenet に渡し、関数 ML.PREDICT で推論を実行しています。
クエリが成功すると、以下の画像のような結果が得られます(結果の行が多いため、一部を表示しております)。モデルにより特徴ベクトル feature_vector が出力されているのが確認できますね。

ちなみに今回の推論が完了するまでに約 7 分かかり、処理されたバイト数は 177 MB 程度でした。

まとめ

今回はオブジェクトテーブルの紹介と、それを用いて画像の推論を行いました。
オブジェクトテーブルに対して BigQuery ML が使えるのは嬉しいですね。

関連記事

Discussion