Merry Vertex AI Pipelines!!!
この記事は Google Cloud Japan Customer Engineer Advent Calendar 2021 の 24日目の記事です。
本記事では Google Cloud のサービスの1つである Vertex AI Pipelines の使い方についてご紹介します。
はじめに
Merry Vertex AI Pipelines!!!
皆さん、機械学習していますか?
あのサンタクロースも昨今は効率的なプレゼント配布のルート探索に
ディープニューラルネットワークを取り入れているとかいないとか。
ということで、今日は Vertex AI Pipelines のお話です。
機械学習や AI を既に用いているという企業様やユーザー様はいるかと思うのですが、増加するデータに対応して自動的にそのモデルを再トレーニングしていくパイプラインまでを管理しているという方は少ないのではないでしょうか?
先に出したサンタクロースの例ですが、子供が新しく生まれたり、成人したりするたびに、最適なプレゼント配布ルートは変化していきます。
そのたびに手動でモデルのトレーニングを実行したり、データを入れ替えたりしていたら大変な手間になってしまいます。
Vertex AI Pipelines はフルマネージドでこの機械学習におけるパイプライン(データの収集、モデルの構築、テスト、など)を一連の流れとして
管理するスケーリングな環境を提供しています。
元となっているのが Kubeflow という OSS であり、このインフラレイヤーを考慮しなくていいのが、Vertex AI Pipelines になります。
では、早速試してみましょう。
今回はこのドキュメントをベースにしていきます。
このドキュメントのシナリオは、花の画像を Upload すると名前を類推するモデルを作るというものとなっております。
パイプラインは以下の流れで実装されます。
- トレーニング用のデータセットとして Google Cloud Storage より
画像データを取り込む - Google Cloud Storage に取り込んだ画像データを対象に、
AutoML Vision を用いてトレーニングを実施しモデルを作成する - モデルをデプロイするためのエンドポイントを作成する
- エンドポイントに 2. で作成したモデルをデプロイする
Vertex AI Pipelines は、この一連の流れを json 形式で記載したものを
利用してパイプラインを作成するのですが、この json ファイルは Kubeflow Pipelines の SDK である kfp を利用すると、 python ファイルを
コンパイルすることでも作成することが出来ます。
こちらのほうが可読性も高まるため、今回も python でパイプラインを
記載し、その後 json 形式にコンパイルの流れで実装します。
ではまず、このコードを記載するのですが、せっかくなので
Vertex AI のワークベンチを使ってみます。
Google Cloud のコンソールにログインしてから、 Vertex AI のノートブックを開きます。
(この時点で Vertex AI の API が有効になっていない場合は、有効にするを選択して下さい)
ユーザー管理のノートブックの新しいノートブックより、TensorFlow Enterprise 2.3 を選択して、Without GPUs を選択します。
名前を付けてあとはデフォルトで”作成”を選択します。
環境が出来上がりましたら“JUPYTERLAB を開く(OPEN JUPYTERLAB)”を選択すると、別タブで JupyterLab が開きます。
Notebook から Python3 を選択します。
ノートブックを開いたらまずは先程出てきた Kubeflow Pipelines の SDK である kfp をインストールします。
以下のコマンドを貼り付けて、上部の▶ボタン、もしくは Shift + Enter で実行します。
!pip install — upgrade pip
!pip install — upgrade tfx==0.30.0 kfp==1.6.1
完了すると、コマンドの横に [1] と数字が出てきます。
この状態で kernel を再起動させます。■ボタンの右隣にある丸い矢印ボタンをクリックして、Restart を選択します。
数秒ほどで再起動が終了するので、次のボックスに以下のコードを貼り付けます。
この状態でコードの5、6、7行目の以下の3つの変数の値を変更します。
- PROJECT_ID
- REGION
- PIPELINE_ROOT
まず PROJECT_ID はコンソール右上の●が3つ縦に並んでいるところの Project settings から確認できます。
REGION はこの Pipeline をどこのリージョンで動作させるのかですが
現状は us-central1 として下さい。
最後に PIPELINE_ROOT として Vertex AI Pipelines を動かした際の途中経過などを保存するための置き場として Google Cloud Storage が必要になるので作成します。
コンソールから Cloud Storage を選択した後にバケットを作成を選択します。
“バケットに名前をつける” から名前を付け、”データの保存場所の選択” の ”ロケーション タイプ” を Region に、ロケーションを “us-central1” として
あとはデフォルトとして作成のボタンを選択します。
バケツ名の右の□が重なっているコピーボタンを選択して
バケツのファイルパスをコピーします。
このファイル名に gs:// を付けて、PIPELINE_ROOT として値に記載します。
これで3つの変数が揃ったので、ノートブックに戻り、コードの5、6、7行目を置き換えます。
以下に例を記載します。
project_id = “takumi-testproject-1”
region = “us-central1”
pipeline_root_path = “gs://takumi-testproject-1-bucket”
変更しましたら、ノートブックの上部の▶ボタン、もしくは Shift + Enter で実行します。
特に出力結果はないので、次に以下のコードを同様に実行してファイルのコンパイルを実行します。
from kfp.v2 import compiler
compiler.Compiler().compile(pipeline_func=pipeline,
package_path='image_classif_pipeline.json')
実行すると、左上の Name というファイルリストに image_classif_pipeline.json というファイルが出来ます。
これを左クリックすると Download ができるので、ローカルにファイルをダウンロードします。
これで、パイプラインの元となるファイルが出来上がりました。
では次に Vertex AI の ”パイプライン” を開き、”実行を作成” を選択します。
“選択” から、先程作った image_classif_pipeline.json を選択して
ランタイムの構成に先程調べた project_id を記載して送信を選択します。
実行すると、以下のような形でプロセス状況が見えます。
トレーニング時間は1〜2時間ほどなので、暫く放っておきます。
パイプラインの中で行われているデータセットのアップロードが終わると、データセットから flowers というデータセットを確認できます。
このモデルに花の画像を当てると、 sunflowers(ひまわり)、dandelion(たんぽぽ)、daisy(ひなぎく)、roses(バラ)、tulips(チューリップ) のどれに近いのかを予測してくれます。
次に、エンドポイントの作成が終わると ”エンドポイント” で create-endpoint が出来ています。
デフォルトではこのエンドポイントに対して流れるトラフィックが割り当たっていないため、”エンドポイントの編集” の ”モデル設定” から ”トラフィック分割” を100 % として更新を選択します。
パイプライン上でモデルのトレーニングが終わると、”モデル” に iris-classification-model-mbsdk というモデルが作成されます。
このモデルを選択し、”デプロイとテスト” というタブを開きます。
パイプラインの中で既にエンドポイントへのデプロイが済んでいるため
画像をアップロードしてモデルのテストをすることが出来ます。
画像のアップロードから花の画像をアップロードします。
ここではトレーニングに使用していない、以下の画像をアップロードしてみます。
roses (バラ)の予測の確率が1.000と出ましたので、無事に正しく予測がされました。
さて、今回は Vertex AI Pipelines を用いて、データの取り込み、モデルのトレーニング、エンドポイントの作成、モデルのデプロイが出来るパイプラインを作成しました。
あとは例えば、このドキュメントに記載があるように Cloud Pub/Sub を用いて、新しい画像データが Cloud Storage に入ってきたら、パイプラインを再実行するなどの改良をしてみてもいいかもしれません。
AI/ML のプロジェクトを実施する際に、ただの POC で終わるのではなく、実業務に組み込み本番環境で運用するためにも Vertex AI Pipelines を用いた MLOps を考えてみるのはいかがでしょうか?
それでは皆さん、良い MLOps ライフを!!!