LayerXにおけるVertex AI Pipelinesの導入と活用
株式会社LayerX / shimakoshi naoto
テックリード / 機械学習エンジニア / 従業員規模: 301名〜500名 / エンジニア組織: 51名〜100名
利用機能 | ツールの利用規模 | ツールの利用開始時期 | 事業形態 |
---|---|---|---|
Vertex AI Pipelines, Vertex AI CustomJob, Vertex AI Experiment | 10名以下 | 2024年4月 | B to B |
利用機能 | Vertex AI Pipelines, Vertex AI CustomJob, Vertex AI Experiment |
---|---|
ツールの利用規模 | 10名以下 |
ツールの利用開始時期 | 2024年4月 |
事業形態 | B to B |
アーキテクチャ
アーキテクチャの意図・工夫
特に大きな工夫はしていませんが、Pull Requestがマージされたら実験で使っているパイプラインが特に意識せずとも本番で動いているパイプラインが更新されるようにしました。パイプライン構築時の工夫については、Vertex AI PIpelinesでの実験を加速させるためのTIPSというブログでも紹介しています。
Schedulerを更新する際に、単純に更新しようとしても、デフォルトの機能では既にDeployされているSchedulerが参照しているKubeflow Pipelines Template (パイプラインの構造をコンパイルしたyaml)を更新することはできません。やり方としては、既存のSchedulerを一時停止して作り直すか、自作で更新できるような関数を作成するかの二択になります。前者だとPull Requestがマージされる度に新しいリソースが作成されてしまうので、UI上で秩序が失われていってしまいます。削除するのも一つの手ですが、過去の実行結果を手軽に参照できなくなってしまいます。後者だと公式のScheduler更新関数の中を解剖して、自作の更新APIを作成することになるので、割と手間がかかります。そのため、基本は前者の方法を取りつつ、公式の対応を待つのが良いように思います。少し管理コストが増えますが、Cloud SchedulerとCloud Functionを使った構成にするのも一つの手です。
開発効率化の工夫としては、新しいプロジェクトを始めたときに、すぐに同じ仕組みに載れるようにGithub Actionsのyamlを自動生成できるようにしたり、色々なプロジェクトで使えそうなComponentを共通ライブラリから使えるようにしています。
導入の背景・解決したかった問題
導入背景
ツール導入前の課題
既存の機械学習開発では、時間のかかる部分やGPUを使う部分だけ、Vertex AI CustomJobを使って、実験を行っていました。その際は、CustomJob内で作成したモデルや予測結果などはGCSやS3にアップロードし、CustomJobが終わったら手元に予測結果を持ってきて評価を行う、といった流れで行なっていました。このような開発を行っていた中で以下のような課題が出てきました。
- わざわざVertex AI CustomJobに渡す必要のない前処理・評価などの作業が、CustomJobの実行終了を待ってから手元で行うため、軽い作業の割にインスタンスなどを立ち上げる必要があり、心理的コストになっていた。
- 一度のCustomJobで訓練から予測まで一気に実行すると、途中で落ちた時に訓練からやり直す必要があり、開発速度の低下を招いていた。
- 依存関係のある複雑な処理を行おうとするとバグが起こりやすかったりと、複雑度を上げるようなモデル改善を行うことに対する心理的コストが高くなっていた。
- チームメンバーが改善を行った評価結果などがスプレッドシートで管理されており、手動での転記作業が面倒で行われなくなったり、コードレベルでの実験への紐付けなどが行えていなかったので、再現性が怪しくなっていた。
どのような状態を目指していたか
実験に対しての心理的障壁をなくし、改善を高速に回せるようになり、その結果が自動的に溜まってチームメンバーに知見として広まっていくような状態を目指しました。 また、今まで手動でモデルの再学習していたような作業も、この際定期実行できるようにしたいなと考えました。
比較検討したサービス
- Amazon SageMaker Pipelines
- Apache Airflow (Cloud Composer, AWS MWAA)
- gokart
- Prefect
比較した軸
コスト
少人数チームで専任のMLOpsエンジニアがいないため、インフラなどの管理コストなどのかからないツールであることを重視していました。また、フルマネージドのサービスであっても固定でインフラコストがかかってしまうようなツールやSaaSのようなツールは今のチーム規模ではまだ必要ではないと考えていました。
開発の活発度 (コミュニティの発達具合)
開発が活発であったり、技術発信が良くされているようなプロダクトであれば、詰まった時に問題が解決しやすく、すぐに解決できなくてもいずれ解消されるであろう、という考えから検討軸に入れていました。
機能面での充実
ざっくり普段の開発や今後の開発への拡張性として、以下のような機能が欲しいなと考えていました。
- 定期実行を行うことができるか。
- キャッシュ機能があるか。
- パイプラインの途中から再実行できるか。
- コンテナベースで実行ができ、かつk8sを持つ必要がない。
- 各プロジェクトのパイプラインをUI上で一元管理できる。
選定理由
私も全てのツールについて完全に調査できているわけではありませんが、ざっくり比較ポイントを表に整理しました。
Amazon SageMaker Pipelines | Apache Airflow (Cloud Composer, AWS MWAA) | gokart | Prefect | Vertex AI Pipelines | |
---|---|---|---|---|---|
インフラコスト | ⚪︎ | × (フルマネージドなものはあるが、GKEやECSなどの固定費がかかる) | ⚪︎ | △ (サーバーをセルフホスト or Prefect Cloudで課金する必要がある) | ⚪︎ |
開発の活発度 (コミュニティの発達具合) | △ (国内での導入事例記事などをあまり見ない) | ⚪︎ (歴史が長く知見が溜まってる) | △ | ⚪︎ (最近開発が活発) | ⚪︎ (元となっているKFPの開発が活発) |
定期実行を行うことができるか | ⚪︎ (EventBridgeと連携した機能) | ⚪︎ (標準搭載) | × (自前で実装が必要?) | ⚪︎ (標準搭載) | ⚪︎ (標準搭載 or Cloud Scheduler) |
キャッシュ機能があるか | ⚪︎ | × | ⚪︎ | ⚪︎ | ⚪︎ |
途中再実行 | ⚪︎ | ⚪︎ | △ (成功したものに対しての再実行は回避策が必要) | △ (成功したものに対しての再実行は回避策が必要) | △ (成功したものに対しての再実行は回避策が必要) |
コンテナベースで実行ができ、かつk8sを持つ必要がない。 | ⚪︎ (EstimatorやProcessing) | ⚪︎ (GCPやAWSのリソースを使うOperator) | △ (標準機能としては搭載していない) | ⚪︎ (prefect-gcpなどで連携可能) | ⚪︎ (標準でVertex AI CustomJobを利用) |
パイプラインの一元管理 | △ | ⚪︎ | × | ⚪︎ | △ |
こう見るとどのツールも一長一短で、悩ましいと考えていました。
そこで、チームに使い方を伝える際に一定肌感のあるものを使った方が利用を促進しやすいので、まず自分自身が使ったことのあるAirflowやVertex AI Pipelinesに絞りました。この二つだと、Airflowはチームで管理するプロジェクトが増えてきたときにUI上で色々なパイプラインを一元的に管理できたり、同じパイプラインの過去の実行履歴などに対しての横軸比較が簡単にできたりする部分が魅力的ではあったのですが、チーム規模やコストを考えてVertex AI Pipelinesを選択しました。
コスト面以外でのAirflowと比べたVertex AI Pipelinesの良い点としましては、GCSとのインテグレーションが強く、コンポーネントで生成したデータを特に意識せずにGCSに配置してくれる点です。Airflowだとデータの受け渡しをクラウドストレージ経由などで自前で実装する必要があったのですが、その部分を意識せず開発できる点は強みでした。
また、Airflowの場合は運用フェーズに載っている静的なパイプラインの運用を意識しているため、パラメータや構造などを頻繁に変えるような実験フェイズのパイプラインだと開発しにくいというデメリットもありました。
Prefectも元Airflow開発者によってAirflowにあった課題を解決したとされるツールなため、試したい気持ちはありましたが、今回は導入をスムーズにするため使い慣れているツールを選択しました。
導入の成果
改善したかった課題はどれくらい解決されたか
まず、重い処理も軽い処理も全てVertex AI Pipelinesに移行したことで、前処理、訓練、予測、後処理、評価まで全て自動化することができました。複雑な依存関係もDAGとして整理することで見通しが良くなりました。
評価結果はVertex AI Experimentに保存することで、チーム間での実験結果の共有も楽になりました。
一方で、パイプラインの途中で落ちてしまった場合にエラーが出て再度途中から実行したい場合や、他のメンバーの実験をパイプラインの途中から再現したい、といった場合には後述するような工夫が必要でした。
どのような成果が得られたか
精度改善の実験を手軽に行えるようになったことで、現状では平均にチームメンバー一人当たり週に1回以上の実験を回すことができるようになりました。その際に、実験結果とそれに対応するパイプライン実行URLも自動で貯まるようになり、結果の共有や実験の信頼性、再現性が高まりました。
また、単純な機械学習モデルだけでなく、弊社が最近リリースした「パーソナライズドAI-OCR」などの複雑な依存関係のある機械学習モデルも開発しやすくなりました。
Vertex AI Pipelinesで提供されているScheduler APIを使うことで、定期実行もCloud SchedulerやCloud Functionを使わずとも手軽にできるようになり、今まで手動で再学習や特徴更新していた部分を自動化することができるようになりました。
副次的な効果ではありますが、並列実行などもしやすくなったため、時間のかかるコンポーネントを並列化することによって高速に実験を回すことができるようになりました。
導入時の苦労・悩み
Vertex AI Pipelines自体の持っているキャッシュ機能が、チーム開発やデバッグなどを想定しているものではなく、キャッシュをかけたいのにかからない時があった点です。 例えば、他のチームメンバーが行った実験の後処理部分だけ修正したい、となったときに後処理以前の部分はキャッシュを効かせたいといった要件があります。Vertex AI Pipelinesのキャッシュ機能はinputのデータなどだけではなく、実行に使ったDockerのimageや環境変数などもみた上でキャッシュを判断するため、新しくimageをpushしたり、環境変数にユーザなどを使っていたりすると簡単にキャッシュが掛からなくなってしまいます。実験を効率化するために、途中から再実行させるといった機能はmustだと思っていたので、デフォルトのキャッシュ機能に振り回されないようにするような工夫が必要でした。この工夫については、Vertex AI PIpelinesでの実験を加速させるためのTIPSという記事で紹介しています。
導入に向けた社内への説明
上長・チームへの説明
まず、今まで個別にコマンド実行していたようなものをVertex AI Pipelinesにとりあえず移行してしまい、実行できる状態にしました。その上で、Notionに今までのワークフローがどう変わるか、どのように開発するか、などのDocumentを準備し、チームメンバーを集めてHands-onを行い、どれくらい便利になるかを体感してもらう方針で進めました。
活用方法
日常の精度改善の実験や、本番パイプラインの定期実行に使用しています。
よく使う機能
Vertex AIの機能群
- Vertex AI CustomJob: 依存関係の少ない単発の実験を動かすために使用しています。最近だとSPOTインスタンスも利用できるようになったので、単発だとコストを安く済ませられるメリットがあります。
- Vertex AI Pipelines: 機能改善のための実験を回すために使用しています。
- Vertex AI Experiments: 実験結果の評価指標を貯めるために使用しています。
Vertex AI Pipelines (Kubeflow Pipeline)の中での機能
- Scheduler API: 定期実行 (定期的な学習や特徴量更新)を管理するために使用。
dsl.container_component
: 基本的に共通のDockerfileを用いて、コンテナ化したComponentを使うことで、local環境との差分を小さくしています。dsl.importer
: 一度作成されたArtifactを再利用するのに意外と便利です。
ツールの良い点
- 固定のインフラコストがかからない点。
- コンポーネントの出力を特に意識せず、GCS へ出力できる点。
- UI上からログを簡単に確認できる点。
- HTMLで出力すれば、Notebookの実行結果などもUI上で確認することができます。
- Kubeflow PipelinesというOSSのSDKを用いてパイプライン構築ができる点。
- 後々、k8sなどが整備された場合にもスムーズに移行することができます。
- GCPの各サービスとの連携がスムーズにできる点。
- 特に追加で認証などの整備をする必要がなく、service_accountをパイプラインのパラメータとして渡すだけで、各種サービスをComponent内部で実行できます。
ツールの課題点
- キャッシュ機能の柔軟性
- ある程度自分で工夫しなければ、柔軟にキャッシュを行うことができません。
- パイプラインの管理
- 一つのチームで複数のパイプラインを管理しようとすると、GCPのプロジェクトを分けたり、ラベルなどでフィルタできるようにしたりといった方法が考えられますが、UXとしては良くありません。
- 定期実行パイプラインのパフォーマンス監視機能
- パイプラインを定期実行している際に、UI上で時系列方向のMetricを簡単に見ることができません。Airflowでは、ガントチャートやComponentごとのMetricの時系列遷移を簡単に見ることができるので、便利でした。
- Scheduler APIの柔軟性
- 既に作成したSchedulerの更新を行うAPIの機能が不十分で、一部分のパラメータしか更新することができません。例えば、パイプラインの構造が変わるといったことは頻繁に発生すると思いますが、そのような変更は現状では想定されていないようです。そのような場合は、一度Schedulerを削除して作り直すか、自分で更新するようなAPIを書くような必要があります。
ツールを検討されている方へ
k8sなどのインフラ管理のできない小規模なチームであれば、Vertex AI Pipelinesの導入は第一選択肢になると思います。特にKubeflow Pipelines v2が整備されたことで、以前のようにyamlでComponentを定義する必要がなくなり、PythonicにComponentを定義できるようになり、使い勝手が良くなったと思います。また、Scheduler APIは現状だと更新周りが不十分なので、現状だとCloud SchedulerとCloud Functionを使う構成も一つの手になると思います。
あまり依存関係のない単発の実験を動かすのであれば、Vertex AI CustomJobをとりあえず使うのも手です。
今後の展望
今後、機械学習プロジェクトが増えていく想定なので、パイプラインのパフォーマンス管理をどのようにしていくかが課題です。自作での監視ツールを作成か、Prefectなどの複数パイプラインを管理できるツールに移行するかを進めていく予定です。
株式会社LayerX / shimakoshi naoto
テックリード / 機械学習エンジニア / 従業員規模: 301名〜500名 / エンジニア組織: 51名〜100名
株式会社ディー・エヌ・エー 2019年~2023年 株式会社LayerX 2024年~
よく見られているレビュー
株式会社LayerX / shimakoshi naoto
テックリード / 機械学習エンジニア / 従業員規模: 301名〜500名 / エンジニア組織: 51名〜100名
株式会社ディー・エヌ・エー 2019年~...
レビューしているツール
目次
- アーキテクチャ
- 導入の背景・解決したかった問題
- 活用方法