BigQuery でオブジェクトテーブルが GA になりました
はじめに
こんにちは、クラウドエース データ ML ディビジョン所属の大城です。
クラウドエースの IT エンジニアリングを担うシステム開発部の中で、特にデータ基盤構築・分析基盤構築からデータ分析までを含む一貫したデータ課題の解決を専門とするのがデータ ML ディビジョンになります。
データ ML ディビジョンでは活動の一環として、毎週 Google Cloud の新規リリースを調査・発表し、データ領域のプロダクトのキャッチアップをしています。その中でも重要と考えるリリースを本ページ含め記事として公開しています。
今回紹介するリリースは、BigQuery の「オブジェクトテーブル」が一般提供 (Generally Available: GA) になったことについてです。
オブジェクトテーブルの概要
オブジェクトテーブルとは、Cloud Storage に保存されている非構造化データのメタデータを保持している読み取り専用のテーブルのことです。
BigQuery ML や BigQuery リモート関数をあわせて使用することで、画像や音声ファイル、ドキュメント、その他のファイルタイプの分析および推論を行うことができます。
機能追加・更新された関数について
オブジェクトテーブルの 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ᵖ ノルムを計算する。ただし、ᵖ は次数を表す。
上記の 6 つの関数はいずれも、以前はプレビュー版として利用できていましたが、今回 GA となりました。
制限事項
オブジェクトテーブルを使用するにあたりいくつか制限事項がありますが、そのうち 2 つを紹介します。
- オブジェクトテーブルは読み取り専用のテーブルのため、オブジェクトテーブルが保持しているデータを変更することはできません。
- レガシー SQL や、AWS, Microsoft AZURE などの他のクラウド環境では利用できません。
その他の事項や詳細に関しては公式ドキュメントをご参照ください。
費用
以下の 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 つのフォルダ
mobilenet
とflowers
を作成します。それぞれ MobileNet V3 モデルと、花の画像用のフォルダになります。 - 接続
lake-connection
のサービスアカウントに Storage オブジェクトの閲覧者権限を付与します。 - ローカルマシンに花のデータセットをダウンロードし、ファイル
flower_photos.tgz
を解凍します。上で作成したフォルダflowers
にフォルダflower_photos
をアップロードします。 - BigQuery で予約を作成し、チュートリアルを実行したいプロジェクトのジョブタイプ
QUERY
に割り当てをします。
検証開始
- 以下のクエリを実行し、オブジェクトテーブル
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/*']);
クエリが成功すると、次の画像のようなオブジェクトテーブルが作成されます。
-
MobileNet V3 モデルをダウンロードすると、モデル用のファイル
saved_model.pb
とフォルダvariables
が取得できます。これら 2 つを事前準備で作成した Cloud Storage フォルダmobilenet
にアップロードします。 -
以下のクエリを実行し、モデルを 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
です。
- 以下のクエリを実行し、推論を実行します。
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_IMAGE
と ML.DECODE_IMAGE
を用いて花の画像データから特徴量 (inputs) を生成し、その特徴量をモデル mobilenet
に渡し、関数 ML.PREDICT
で推論を実行しています。
クエリが成功すると、以下の画像のような結果が得られます(結果の行が多いため、一部を表示しております)。モデルにより特徴ベクトル feature_vector
が出力されているのが確認できますね。
ちなみに今回の推論が完了するまでに約 7 分かかり、処理されたバイト数は 177 MB 程度でした。
まとめ
今回はオブジェクトテーブルの紹介と、それを用いて画像の推論を行いました。
オブジェクトテーブルに対して BigQuery ML が使えるのは嬉しいですね。
Discussion