BiqQuery MLでTensorFlowのモデルをインポートして予測やメタデータの確認などをしてみた
皆さん、こんにちは。 クルトンです。
今回のエントリーは『機械学習チームアドベントカレンダー2022』の17日目の記事になります。
前日(12/16)の記事は『Amazon SageMakerのガバナンス機能を使ってみる』でした。re:Invent2022発表の機能について紹介されているのでぜひご覧ください!
今回はチュートリアルの内容であるTensorFlowモデルのインポートやその先のステップとして紹介されているモデルのメタデータ確認、更新などをやってみました。
TensorFlowモデルをインポート
datasetを作成してからモデルをインポートします。
最初にすること
チュートリアルには明記されていませんが、実行にはdatasetが必要です。
モデルの作成時にdatasetがない場合はエラーが出てしまうので、datasetの作成を最初にしておきましょう。やり方が分からない場合は、前回私が執筆した記事や前々回に執筆した記事をご参考ください。(bqml_tutorialを作成している所です。)
モデルをインポート
モデルのインポートにはCREATE OR REPLACE MODEL
を実行します。
CREATE OR REPLACE MODEL <ここに事前に作成したdatasetのIDを入力>.imported_tf_model OPTIONS (MODEL_TYPE='TENSORFLOW', MODEL_PATH='gs://cloud-training-demos/txtclass/export/exporter/1549825580/*')
ここではチュートリアル通りにimported_tf_model
という名前でモデルの作成を行ないます。
OPTIONS句に注目してください。TensorFlowモデルをインポートするにはMODEL_TYPE
でTENSORFLOWと指定した上で、MODEL_PATH
にCloud StorageのModelを保存しているPATHを入力します。
今回は、モデルのURIが既に用意されていたのでそちらを使います。インポートするモデルはテキスト分類モデルになります。
インポートしたTensorFlowモデルを使って予測する
モデルで予測するためにML.PREDICT
句を使う次のSQL文を実行します。
SELECT * FROM ML.PREDICT(MODEL <ここに事前に作成したdatasetのIDを入力>.imported_tf_model, ( SELECT title AS input FROM `bigquery-public-data.hacker_news.stories` ) )
このSQL文では、サンプルとして用意されているデータセットを読み取り、titleというデータ(テキスト)をインプットとしたモデルの予測を表示しています。 インプットに使われているtitleというデータは、Hacker Newsというさまざまな方が自分の経験などを投稿できる海外サイトの一般公開データセットのものです。
データセットの概要についてはこちらをご確認ください。
また、今回触っているデータセットのスキーマは次のようになっています。
[ { "name": "id", "mode": "NULLABLE", "type": "INTEGER", "description": "Unique story ID", "fields": [] }, { "name": "by", "mode": "NULLABLE", "type": "STRING", "description": "Username of submitter", "fields": [] }, { "name": "score", "mode": "NULLABLE", "type": "INTEGER", "description": "Story score", "fields": [] }, { "name": "time", "mode": "NULLABLE", "type": "INTEGER", "description": "Unix time", "fields": [] }, { "name": "time_ts", "mode": "NULLABLE", "type": "TIMESTAMP", "description": "Human readable time in UTC (format: YYYY-MM-DD hh:mm:ss)", "fields": [] }, { "name": "title", "mode": "NULLABLE", "type": "STRING", "description": "Story title", "fields": [] }, { "name": "url", "mode": "NULLABLE", "type": "STRING", "description": "Story url", "fields": [] }, { "name": "text", "mode": "NULLABLE", "type": "STRING", "description": "Story text", "fields": [] }, { "name": "deleted", "mode": "NULLABLE", "type": "BOOLEAN", "description": "Is deleted?", "fields": [] }, { "name": "dead", "mode": "NULLABLE", "type": "BOOLEAN", "description": "Is dead?", "fields": [] }, { "name": "descendants", "mode": "NULLABLE", "type": "INTEGER", "description": "Number of story descendants", "fields": [] }, { "name": "author", "mode": "NULLABLE", "type": "STRING", "description": "Username of author", "fields": [] } ]
author
という誰が書いたかを著者を表すものや、投稿された内容の本文を表すtext
などもあります。text
とauthor
を同時に学習する事で、テキストの内容から誰が書いたか判断するというタスクを実行する事も出来そうですね。
TensorFlowモデルのメタデータ
メタデータの確認から更新まで行ないます。
メタデータの確認
メタデータにはモデルのIDやどのロケーションで作成されたモデルなのかが表示されます。
ロケーションについては注意が必要な場合があります。 こちらの公式ドキュメントに書かれている通り、BigQueryとCloud Storageは同じロケーションでないとバケットのデータを転送する事が出来ないです。
そのため、データ転送が最初から上手く出来ない時には確認すると良い項目になります。
他にもスキーマのタブをクリックすると、予測時のデータや出力時のカラムに関するメタデータ(型の情報やNullを許可しているものかどうか)を確認できます。
メタデータを更新
コンソール上で更新できるメタデータを紹介します。更新対象としては、モデルの説明とラベルです。 ラベルはkey-value型のもので、コスト計算をするときにリソースをフィルタリングする場合などで使用します。(例えば開発フェーズで分ける場合は、devとprodといった使い分けをします。) 今回、モデルのメタデータを更新してみます。他にも、Compute Engineなどにもラベルをつける事が可能です。
詳しくラベルについて確認してみたい方はこちらの公式ドキュメントをご覧ください。
それでは、モデルのメタデータを更新してみます。次の画像にある箇所をクリックしてみてください。
今回、説明には「チュートリアル用のTensorFlowモデル」と書きます。ラベルに、keyには開発環境の意味でenvironment
を、valueにはtutorial
と書きます。
ここまで書き終わったらSaveボタンをクリックします。
Saveが上手くいくと改めてモデルの詳細を表示してみてください。上手く表示できている事が確認できました。
TensorFlowモデルを削除
それではチュートリアル用として使っていたモデルを最後に削除します。削除をコンソールから行なう場合は、2種類の方法があります。
注意点として、削除したモデルは復元できないため、残しておきたい場合は別の場所への保存などが必要です。
削除方法その1
ナビゲーションペインにあるモデル名の⋮
をクリックして削除をクリックしてください。その後、出てくる画面の案内に従い、削除と書いてから削除ボタンをクリックすると削除できます。
削除方法その2
次のSQL文を実行します。
DROP MODEL <ここに事前に作成したdatasetのIDを入力>.imported_tf_model
これを実行すると、モデルの詳細を確認しようとすると次のような画面になり、削除できている事を確認できます。
終わりに
今回は、TensorFlowモデルをBiqQueryにインポートして予測した後に、モデルのメタデータ確認や更新をしてみました。自分が作ったTensorFlowモデルをCloud Storageに上げておけば、今回と同じ手順を実行する事で、BiqQuery上でも活用できるかと思います。
本記事では行なわなかったのですが、モデルのコピーも可能です。bqコマンド
やAPI
を使うとコピーが可能です。
今回はここまで。
それでは、また!