Google CloudのサーバーレスプラットフォームCloud Runを使って迅速かつ効率的に構築|デプロイから実行までのガイド
現在開催中のGoogle I/Oでは、たくさんのワクワクする新技術やツールが紹介されています。今回の記事は、その中でもGoogle Cloudについての下記のYouTubeを取り上げたいと思います。
AIアプリケーションの開発者などにとって、Cloud Runは迅速かつ効率的にデプロイメントを行える強力なサーバーレスプラットフォームです。本記事では、Cloud Runの基本から実践的な利用方法までを詳しく解説し、AIアプリケーションを加速するための具体的なステップを紹介します。初心者から上級者まで、すべての開発者に役立つ内容となっていますので、ぜひご一読ください。
(1) Cloud Runとは?
Cloud Runの概要
Cloud Runは、Google Cloudのサーバーレスコンピューティングプラットフォームです。これは、ユーザーがインフラストラクチャの管理から解放され、コードの実行に専念できる環境を提供します。Cloud Runを利用することで、どのような言語で書かれたバックエンドコードでもコンテナとしてデプロイし、簡単にスケーラブルなサービスを構築できます。
サーバーレスの概念
サーバーレスとは、開発者が物理サーバーの管理を不要とし、アプリケーションの開発に集中できるコンピューティングモデルです。クラウドプロバイダが自動的にスケーリング、インフラの管理、パフォーマンス監視を行います。これにより、開発者はサーバーのプロビジョニングや管理の煩わしさから解放されます。
Cloud Runの利点
言語やフレームワークに依存しない: Cloud Runは、任意のプログラミング言語で書かれたコンテナをサポートしています。そのため、開発者は自身の得意な言語でアプリケーションを開発できます。
オートスケーリング: トラフィックに応じて自動的にスケールアップ・ダウンを行います。これにより、予期しないトラフィックの急増にも柔軟に対応できます。
課金モデルの柔軟性: 使用した分だけ支払う「Pay as you go」モデルを採用しており、無駄なリソースコストを削減できます。
高可用性: Googleが管理するインフラ上で動作するため、高い可用性と信頼性が保証されています。
(2) サーバーレスの利点
サーバーレスの概念とその利点
サーバーレスコンピューティングは、クラウドプロバイダーがバックエンドのインフラストラクチャを管理し、スケーリング、パッチ適用、メンテナンスなどの作業を自動化することで、開発者がアプリケーションのコードに集中できるようにするモデルです。サーバーレスの主な利点は以下の通りです。
インフラ管理の負担軽減
従来のサーバー管理では、物理サーバーのプロビジョニング、設定、監視、スケーリングなど多くの作業が必要でした。サーバーレス環境では、これらの作業がクラウドプロバイダーによって自動化されるため、開発者はこれらの管理作業から解放されます。
自動スケーリング
サーバーレスプラットフォームは、アプリケーションのトラフィックに応じて自動的にスケールアップまたはスケールダウンします。例えば、突然のアクセス増加時にも自動で対応でき、負荷に応じたリソースの最適化が図られます。これにより、ピーク時のパフォーマンスを維持しつつ、閑散期にはコストを削減することが可能です。
コスト効率
サーバーレスでは「Pay as you go」モデルが採用されており、実際に使用したリソースに対してのみ課金されます。これにより、未使用のリソースに対する無駄なコストが発生しません。特に、予期せぬトラフィック増加に対しても柔軟に対応できるため、効率的なコスト管理が可能です。
アプリケーションの迅速な開発とデプロイ
サーバーレス環境では、インフラ管理に費やす時間を削減できるため、開発者はアプリケーションの機能開発に集中できます。また、自動化されたデプロイメントプロセスにより、新しい機能や修正を迅速にリリースできます。これにより、製品の市場投入までの時間を短縮することができます。
(3) Cloud Runのリソース: サービスとジョブ
Cloud Runサービス
Cloud Runには2種類のリソースがあり、それぞれが異なる用途に応じて使用されます。まず、Cloud Runサービスについて説明します。
サービスの概要
Cloud Runサービスは、HTTPリクエストに応じてスケーリングするリソースです。具体的には、サービスはリクエストに応じて自動的にインスタンスをスピンアップし、リクエストがないときはインスタンスを縮小します。これにより、リソースの効率的な利用とコスト削減が可能です。
特徴と利点
リクエスト駆動のスケーリング: インスタンスはリクエストに応じて自動的にスケーリングされます。これにより、予期せぬトラフィックの急増にも対応できます。
ロードバランシング: Googleが管理するロードバランサーを通じて、リクエストが複数のインスタンスに分散されます。これにより、高可用性と高性能が保証されます。
トリガーソースの多様性: HTTP/2、gRPC、イベント、WebSocketsなど、さまざまなトリガーソースに対応しています。
トラフィックスプリットと段階的なロールアウト: 新しいバージョンのコードを段階的にリリースし、トラフィックを徐々に移行することで、リリース時のリスクを低減できます。
Cloud Runジョブ
次に、Cloud Runジョブについて説明します。
ジョブの概要
Cloud Runジョブは、HTTPリクエストに依存せず、特定のタスクを完了するまで実行されるリソースです。ジョブは手動で実行することも、スケジュールに従って自動的に実行することもできます。
特徴と利点
コンテナの完了まで実行: ジョブは特定のタスクを完了するまで実行され、その後自動的に終了します。これにより、長時間実行されるバッチ処理や一時的なタスクに適しています。
手動またはスケジュール実行: ジョブは手動で実行することも、Cloud Schedulerなどを使用して定期的に実行することもできます。
課金モデル: ジョブの実行中のみ課金されるため、効率的なコスト管理が可能です。
(4) Cloud Runのオートスケーリング
オートスケーリングの仕組み
Cloud Runのオートスケーリングは、アプリケーションのトラフィックに応じて自動的にインスタンスの数を増減させる機能です。これにより、必要なリソースを効率的に使用しながら、トラフィックの急増や減少に柔軟に対応できます。
基本的なスケーリング
Cloud Runはリクエストがある場合にインスタンスをスピンアップし、リクエストがない場合にはインスタンスを縮小します。デフォルトでは、リクエストが処理されない状態が15分間続くと、インスタンスは自動的にスケールダウンされます。
同時実行数とCPU使用率
同時実行数(Concurrency): Cloud Runの各インスタンスは、デフォルトで最大80リクエストを同時に処理できます。この設定はカスタマイズ可能であり、アプリケーションの特性に応じて調整できます。
CPU使用率: インスタンスのスケーリングは、リクエスト数だけでなく、CPU使用率にも基づいて行われます。これにより、リクエストの処理に必要なリソースを適切に確保し、高負荷時のパフォーマンスを維持します。
最小インスタンス数
特定のワークロードや高トラフィックイベントを予測して、応答時間を改善するために、一定数のインスタンスを常に稼働させておくことができます。この機能は「最小インスタンス数」として設定でき、設定したインスタンス数は常に「ウォーム」状態に保たれます。最小インスタンス数に設定されたインスタンスは、リクエストがないときにも低料金で維持されます。
高トラフィックイベントの対応
予測される高トラフィックイベントに対して、事前にスケーリング設定を調整することで、スムーズなサービス提供が可能です。例えば、プロモーション期間や大規模なイベント開催時には、必要なインスタンス数を増やしておくことで、突発的なアクセス増加に対応できます。
(5) Cloud Runの課金モデル
課金の基本モデル
Cloud Runは「Pay as you go」モデルを採用しており、使用したリソースに対してのみ課金されます。これにより、効率的なコスト管理が可能であり、無駄なリソースコストを削減できます。
リクエストベースの課金
Cloud Runサービスは、リクエストが処理されている間だけ課金されます。具体的には、以下の要素に対して課金が発生します:
CPU時間: インスタンスがリクエストを処理している間のCPU使用時間に対して課金されます。
メモリ使用量: リクエスト処理中のメモリ使用量に対して課金されます。
リクエスト数: 処理されたリクエストの数に基づいて課金されます。
アイドル状態の課金
Cloud Runはリクエストがない場合でも、インスタンスを一定時間(デフォルトでは15分間)アイドル状態に保ちます。この間、CPUは低消費電力モードになり、コストは削減されます。ただし、最小インスタンス数を設定した場合は、そのインスタンスがアイドル状態でも低料金で課金されます。
CPU常時割り当て
デフォルトでは、インスタンスはリクエストを処理していない間、CPUの使用が制限されます。しかし、CPUを常時割り当てる設定も可能です。この設定を有効にすると、インスタンスはアイドル状態でもCPUを使用できます。これは、一定の負荷が常にかかっているサービスや、レイテンシーを改善するために有効です。常時割り当てが有効な場合、料金は通常の使用料金よりも割引されます。
Cloud Runジョブの課金
Cloud Runジョブは、ジョブが実行されている間のみ課金されます。ジョブが完了すると、自動的に終了し、課金も停止されます。これにより、長時間実行されるバッチ処理や一時的なタスクに対しても効率的なコスト管理が可能です。
課金オプションのまとめ
リクエストベース課金: 使用したCPU時間、メモリ使用量、リクエスト数に基づいて課金。
アイドル状態の課金: 一定時間アイドル状態を維持する場合の低料金課金。
CPU常時割り当て: CPUを常に使用する設定による割引課金。
ジョブの課金: ジョブ実行中のみ課金。
(6) デモ1: Geminiを使ったチャットアプリのデプロイ
デモの概要
このデモでは、Geminiを利用したチャットアプリをCloud Run上にデプロイする方法について説明します。このアプリはNode.jsで構築されており、Googleのクライアントライブラリを使用してGoogle APIに認証します。
アプリの構成
このチャットアプリは、以下の技術とツールを使用しています:
Node.js: サーバーサイドの実装
Express: ウェブアプリケーションフレームワーク
WebSockets: リアルタイムの通信
HTMX: フロントエンドの動的なDOM操作
Googleのクライアントライブラリ: Google APIへの認証とアクセス
アプリの起動
まず、アプリケーションをローカルで起動します。以下は、そのステップです:
ローカルサーバーの起動: npm run startコマンドを使用して、ローカルでサーバーを起動します。
チャットボットのテスト: ローカルで動作するチャットボットにGeminiを追加し、動作確認を行います。
Google APIへの認証
このデモでは、Googleのクライアントライブラリを使用してAPIにアクセスします。認証は「Application Default Credentials (ADC)」を使用して行われ、これは実行環境に基づいて認証情報を自動的に取得します。
認証の流れ
クライアントライブラリのインポート: Vertex AIクライアントライブラリをインポートします。
Geminiモデルの初期化: アプリが起動する際にGeminiモデルを初期化し、グローバルスコープに保存します。
プロジェクトIDとリージョンの取得: Googleのメタデータサービスを使用してプロジェクトIDとリージョンを取得します。ローカル環境では、ハードコーディングされた値を使用します。
認証情報の設定: ローカルで実行する場合は、OAuthフローを通じて認証トークンを取得します。
デプロイ手順
次に、アプリケーションをCloud Runにデプロイします。以下は、その手順です:
Cloud Runにデプロイ: gcloud run deployコマンドを使用して、アプリケーションをCloud Runにデプロイします。必要なフィールドはプロンプトで入力します。
サービスアカウントの設定: 最小限の権限で動作するように、Vertex AIユーザーロールを持つサービスアカウントを設定します。
デプロイ後の確認
デプロイが完了すると、Cloud Runの管理画面で以下のポイントを確認します:
メトリクス: パフォーマンスモニタリングの確認
ネットワーキング: インバウンドおよびアウトバウンドトラフィックの設定確認
認証: 公開URLの確認
統合: Cloud SQLなどのリソース統合の確認
デモの結果
デプロイされたアプリケーションにアクセスし、Geminiを使ったチャットアプリが正常に動作することを確認します。ユーザーが「C#はプログラミング言語か音楽の音か」と尋ねると、Geminiが適切な回答を返すことを確認します。
(7) デモ2: 関数呼び出し機能を使ったリアルタイムデータの利用
デモの概要
このデモでは、Geminiの関数呼び出し機能を使用して、リアルタイムデータを取得し、チャットアプリケーションに統合する方法を紹介します。特に、現在の天気情報を取得するAPIを使用して、チャットボットが最新の情報を提供できるようにします。
背景
大規模言語モデル(LLM)は、トレーニングデータ以降の情報にアクセスできないため、リアルタイムの情報提供が困難です。関数呼び出し機能を利用することで、最新の情報を外部APIから取得し、ユーザーに提供することができます。
実装手順
APIの準備
まず、天気情報を提供するCloud Runサービスを準備します。このサービスは、特定の場所の現在の天気情報を返します。
チャットアプリの改良
関数定義の追加: チャットアプリに天気情報を取得するための関数定義を追加します。この関数は、Geminiが呼び出すことができるように設定されます。
WebSocketハンドラの変更: WebSocketハンドラを修正し、Geminiが関数呼び出しを要求した場合に、適切なAPIを呼び出すようにします。
関数呼び出しのフロー
関数定義の追加: チャットアプリのコードに、getweatherという関数定義を追加します。この関数は、場所を引数として受け取り、対応する天気情報を返します。
Geminiへの関数通知: チャットセッションの開始時に、Geminiに利用可能な関数としてgetweatherを通知します。
WebSocketハンドラの実装: ユーザーからのメッセージを受け取った際に、Geminiが関数呼び出しを要求しているかどうかをチェックします。要求があれば、天気情報APIを呼び出して結果を取得し、その結果をGeminiに渡します。
デモの実行
デモを実行し、以下の手順で動作を確認します:
チャットセッションの開始: ユーザーが「シアトルの現在の天気は?」と尋ねます。
関数呼び出しの実行: Geminiがgetweather関数を呼び出し、シアトルの天気情報を取得するように指示します。
天気情報の取得: 天気情報APIを呼び出し、現在の天気(例:40度、雨)を取得します。
結果の表示: 取得した天気情報をGeminiに渡し、ユーザーに回答を返します。
デモの結果
このデモにより、Geminiが最新の天気情報を取得してユーザーに提供する様子を確認できます。例えば、ユーザーが「シアトルの現在の天気は?」と尋ねると、Geminiは「シアトルの天気は現在40度で雨です」と正確な情報を返します。
(8) デモ3: Vertex AI APIを使ったビデオ処理ジョブ
デモの概要
このデモでは、Vertex AI APIを利用してビデオ処理ジョブを実行する方法を紹介します。具体的には、ビデオからシーンごとのタイムスタンプを取得し、各シーンの画像をキャプチャし、その画像に対してテキストキャプションを生成します。
Cloud Runジョブの概要
Cloud Runジョブは、特定のタスクを完了するまで実行され、その後自動的に終了するリソースです。HTTPリクエストに依存せず、スケジュールに従って自動実行することも可能です。
ビデオ処理ジョブのステップ
1. ビデオのダウンロード
ビデオファイルをGoogle Cloud Storageバケットからローカルにダウンロードします。このビデオには音声が含まれていません。
2. シーンチェンジの検出
Google Cloud Video Intelligence APIを使用して、ビデオ内のシーンチェンジを検出し、各シーンのタイムスタンプを取得します。
3. シーン画像のキャプチャ
ffmpegを使用して、各タイムスタンプでビデオのスクリーンショットをキャプチャします。
4. 画像キャプションの生成
取得したスクリーンショットに対して、Vertex AIのイメージテキストモデルを使用してテキストキャプションを生成します。
実装の詳細
ビデオのダウンロード
ビデオをローカルにダウンロードするためのコードを実装します。これは、Google Cloud Storageから指定されたビデオファイルをダウンロードするシンプルなプロセスです。
シーンチェンジの検出
以下のように、Video Intelligence APIを使用してシーンチェンジを検出します。シーンチェンジのタイムスタンプを取得し、配列として保存します。
シーン画像のキャプチャ
ffmpegを使用して、各タイムスタンプでスクリーンショットをキャプチャします。
画像キャプションの生成
Vertex AIのREST APIを使用して、画像キャプションを生成します。
デモの実行
デプロイされたジョブを実行し、以下の手順で結果を確認します:
ジョブの手動実行: gcloud run jobs execute video-describer-jobコマンドを使用してジョブを実行します。
ジョブのステータス確認: Cloud Runコンソールでジョブの実行状況を確認します。
ログの確認: ジョブログを確認し、各タイムスタンプで生成されたキャプションを確認します。
デモの結果
ビデオのシーンごとにキャプションが生成される様子を確認できます。例えば、ビデオの特定のシーンで「赤いシャツを着た女性が話している」というキャプションが生成されます。
(9) まとめと質疑応答
まとめ
今回のセッションでは、Google CloudのCloud Runを利用してAIアプリケーションを構築・デプロイする方法について学びました。具体的には、以下のポイントをカバーしました。
Cloud Runの概要と利点
サーバーレスの利点: インフラ管理の負担軽減、自動スケーリング、コスト効率、迅速な開発とデプロイが可能。
Cloud Runのリソース: リクエスト駆動のサービスとジョブの2種類があり、用途に応じて使い分けが可能。
デモの詳細
デモ1: Geminiを使ったチャットアプリのデプロイ
Node.jsとExpressを使用して、Gemini統合のチャットアプリをCloud Runにデプロイ。
Googleのクライアントライブラリを使用して、API認証を自動化。
デモ2: 関数呼び出し機能を使ったリアルタイムデータの利用
関数呼び出し機能を使用して、リアルタイムの天気情報を取得し、チャットアプリに統合。
Geminiが外部APIを通じて最新の情報を提供する様子を確認。
デモ3: Vertex AI APIを使ったビデオ処理ジョブ
Video Intelligence APIとffmpegを使用してビデオのシーンごとのキャプションを生成。
Cloud Runジョブを使用して、ビデオ処理タスクを完了する方法を紹介。
質疑応答
今回のセッションでは、以下のような質問に対して回答しました:
Cloud Runのスケーリングの仕組み: トラフィックに応じて自動的にインスタンスを増減させることで、効率的なリソース利用を実現します。
課金モデルの詳細: 使用した分だけ課金される「Pay as you go」モデルが採用されており、効率的なコスト管理が可能です。
実際のアプリケーション例: デモを通じて、実際のアプリケーションをCloud Runにデプロイする手順や注意点を学びました。
あとがき
この記事を通じて、Google Cloud Runを使用したAIアプリケーションの構築方法について理解を深めることができたでしょうか?サーバーレスアーキテクチャの利点を活かして、より効率的かつスケーラブルなアプリケーションを開発できるようになることを願っています。Cloud Runの柔軟性とパワーを活用して、次のプロジェクトにぜひ挑戦してみてください!
最後までお読みいただき、ありがとうございました。もしこの記事が役に立ったと感じたら、共有やコメントをお寄せいただけると嬉しいです。また、さらなる質問や深掘りしたいトピックがあれば、ぜひお知らせください。