GPUドロップレットとネットワーキングを使用したGenAIのスケーリング
紹介
AIを使って画像を生成したことはありますか?
もしあなたがそうなら、良い画像の鍵は詳細なプロンプトにあることを知っています。
しかし、私はそのような詳細なビジュアルプロンプトを作るのが苦手ですので、大規模な言語モデルに依存して詳細なプロンプトを生成させ、それを使って素晴らしい画像を生成します。ここに、私が生成したプロンプトと画像のいくつかの例があります:
プロンプト:バンガロール、インドの素晴らしい空撮を作成し、画像の上部に太字の金色のフォントで都市名を記入し、背景には都市のスカイラインとナンディヒルズを表示します。
プロンプト:インド・バンガロールの象徴的なヴィダナ・ソウダの建物の画像をデザインし、画像の下部に現代的なサンセリフ字体で都市名を書き、スリークでミニマリストなスタイルにします。
インドのバンガロールの賑やかな街市の画像を生成し、シーンの上に遊び心のあるカール書体で市名を温かく親しみやすいスタイルで書いてください。
これらの結果を達成するために、私たちは画像生成にFlux.1-schnellモデルを、プロンプト生成にLlamma 3.1 - 8B - Instructモデルを使用しています。両方はMIGの助けを借りて1台のH100マシンでホストされています(詳細については後で説明します)。
このブログは、単なる画像生成チュートリアルではありません。私たちの目標は、スケーラブルで安全、かつグローバルにアクセス可能(かつ手頃な価格の)GenAIアーキテクチャを作成することです。
グローバルなeコマースプラットフォームがユーザー向けに迅速な画像カスタマイズを必要とするビジネスケースや、大陸間でオンデマンドのAI生成テキストを提供するコンテンツプラットフォームを想像してみてください。
このようなセットアップには、開発者にとって多くの課題があります。例:
- GPUは intimidating で高価です
- GenAIツールは最先端であり、それぞれのツールには特定のセットアップ要件があります。
- GenAIサーバーとバックエンドサーバーを安全に接続する
- 世界中の分散ユーザーを最寄りのサーバーにルーティングするなど
このプレゼンテーションは、ここにあるすべての問題を解決するための出発点を提供するはずです。
前提条件
デモを追加する前に、次のことを確認してください:
- DigitalOceanアカウント。
- GPU、クラウドネットワーキング、VPC、およびロードバランシングの基本知識。
- Bash、Docker、Pythonの基本的な知識。
- Flux.1モデルを使用して、画像生成へのHuggingFaceアクセスを許可しました。
- Llama 3.1-8b-InstructモデルへのHuggingFaceアクセスを許可しました。
- vLLMは、LLM推論と提供のための高速で使いやすいライブラリです。
ハンズオンチュートリアル
高レベル設計
これを可能にするために、私たちはDigitalOceanのインフラを使用して分散アーキテクチャを設計しました。私たちは、グローバルロードバランサー(GLB)を使って、受信リクエストを管理し、どの地域からのユーザーも最小限のレイテンシーで体験できるようにします。
次に、私たちは主要な地域で展開された軽量画像生成アプリを持っています。ロンドン、ニューヨーク、シドニーの各地にそれぞれキャッシュを持ち、必要に応じて私たちのGPUリソースに接続できるよう準備されています。最後に、これらのすべてのコンポーネントはVPCピアリングを介して安全に通信し、複雑なタスクをトロントにある私たちのパワーハウスH100 GPUに戻して、プロンプトと画像生成の魔法が行われます。
コンポーネント
軽量画像生成アプリ
画像生成アプリは、3つの主要なコンポーネントを持つシンプルなPython Flaskアプリケーションです。
位置検出セクション: このコンポーネントは、ユーザーの位置(都市と国)を特定し、リクエストを処理しているサーバーの地域を特定するために、ブラウザからサーバーへのダミーリクエストを行います。この情報はユーザーに表示され、後で詳しく説明するように、プロンプトや画像生成の最適化に役立ちます。
プロンプトのドロップダウンセクション: ユーザーの位置情報を特定した後、アプリは最初にその位置に関連する既存のプロンプトをキャッシュからチェックします。 適切なプロンプトがキャッシュに見つかると、すぐにドロップダウンメニューに表示され、ユーザーは画像生成のためにプロンプトを選択できます。 キャッシュにプロンプトがない場合、アプリは新しいプロンプトを生成するためにLLM(大規模言語モデル)にリクエストを送信し、それをキャッシュして将来使用できるようにし、ユーザーが選択できるようにドロップダウンに追加します。
生成された画像セクション: ユーザーがプロンプトを選択すると、アプリはまず、その特定のプロンプトから生成された画像がすでにディスクにキャッシュされているかどうかを確認します。キャッシュされた画像が存在する場合、それはディスクから直接ロードされ、応答時間が早くなります。キャッシュされた画像が利用できない場合、アプリは新しい画像を生成するためにAPIコールを行い、それを将来のリクエスト用にキャッシュし、ユーザーに表示します。
MIG GPUコンポーネント
MIG(マルチインスタンスGPU)は、NVIDIAのGPU、例えばH100の機能であり、単一の物理GPUを複数の独立したインスタンスに分割することを可能にします。各インスタンスはMIGスライスと呼ばれ、独自の計算、メモリ、および帯域幅リソースを持つ完全に隔離されたGPUとして機能します。このアプローチは、GPUの利用効率を最適化するだけでなく、画像生成モデルとプロンプト生成モデルを並行して展開することを可能にします。
ステップバイステップの設定
GPUドロップレットの作成: ML開発用のプレビルドOSイメージを使用して、単一のH100 GPUを搭載したGPUドロップレットをDigitalOceanで作成します。
H100 GPUでMIGを有効化: GPUドロップレットが稼働を開始したら、H100でMIG(マルチインスタンスGPU)モードを有効にします。MIGを使用することで、GPUを複数の小さなGPUインスタンスに分割でき、それぞれが他のインスタンスから隔離されます。この隔離は、異なるモデルを並行して干渉なく実行するために重要です。
sudo nvidia-smi -i 0 -mig 1
MIGプロファイルを選択し、インスタンスを作成する: MIGを有効にした状態で、実行予定の各モデルの要件に適したプロファイルを選択してください。
nvidia-smi mig -lgip # will list all the profiles
例えば
sudo nvidia-smi mig -cgi 9,9 -C
このコマンドは、2つのMIGインスタンスを作成し、両方のモデルに十分な40GBのメモリを提供するプロファイルを持っています。以下のコードはすべてのMIGインスタンスIDをリストします。
nvidia-smi -L
各MIGインスタンスにDockerコンテナを設定する: 各MIGインスタンスで、それぞれのモデルを使用した別々のDockerコンテナを実行します。このセットアップでは、画像生成用のDockerコンテナ(Flux.1-schnell)とプロンプト生成用のDockerコンテナ(Llama 3.1 via vLLM)をダウンロードして実行する必要があります。
画像生成のためのFlux.1-schnellをデプロイする: Flux.1のDockerイメージをデプロイするために、メタトニック画像とコードを使用しました。
Clone the repo
git clone https://github.com/matatonic/openedai-images-flux
cd openedai-images-flux
Copy Config file
cp config.default.json config/config.json
Run the docker image
sudo docker run -d \
-e HUGGING_FACE_HUB_TOKEN="<HF_READ_TOKEN>" \
--runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=<MIG_INSANCE_ID> \
-v ./config:/app/config \
-v ./models:/app/models \
-v ./lora:/app/lora \
-v ./models/hf_home:/root/.cache/huggingface \
-p 5005:5005 \
ghcr.io/matatonic/openedai-images-flux
プロンプト生成のために vLLM を使用して Llama 3.1 を展開する: vLLM を使用してプロンプト生成モデルの Docker コンテナをダウンロードして実行します。
sudo docker run -d --runtime=nvidia \
-e NVIDIA_VISIBLE_DEVICES=<MIG_INSANCE_ID> \
-v ~/.cache/huggingface:/root/.cache/huggingface \
-e HUGGING_FACE_HUB_TOKEN="<HF_READ_TOKEN>" \
-p 8000:8000 \
--ipc=host \
vllm/vllm-openai:latest \
--model meta-llama/Meta-Llama-3.1-8B-Instruct
モデルアクセスとコミュニケーション:
- 各コンテナは指定されたポートを通じてアクセス可能で、画像生成アプリのインスタンスが必要に応じて画像モデル(Flux.1-schnell)またはプロンプトモデル(Llama 3.1)に接続してリクエストを送信できるようになっています。
- MIGパーティショニングは、両方のモデルが効率的に同時に動作し、相互に干渉することなくGPUのリソースを利用できるようにします。
地域アプリインスタンス
私たちは、ユーザーリクエストを地域ごとに処理するために、軽量アプリをロンドン、ニューヨーク、シドニーの地域に設置しました。これにより、頻繁にアクセスされるプロンプトや画像をキャッシュし、より迅速な応答を実現しています。
- 最初にDOダッシュボードのDropletsセクションを通じて、1つのリージョンにDropletsを作成してください。
- SSHで接続してコードを設定します。スピードのために、すでにコンテナを作成しているので、私たちが必要なのはDOコンテナレジストリアクセスを確保し、イメージをプルすることだけです。
Login to docker registry
sudo docker login registry.linux-console.net
Pull the container
sudo docker pull registry.linux-console.net/<cr_name>/city-image-generator:v2
- この時点で、私はドロップレットのスナップショットを取り、アプリを展開する予定の他のリージョンでアクセスできるようにします。
- 水滴に戻り、コンテナを実行してください。
Run the Container
sudo docker run -d -p 80:80 registry.linux-console.net/<cr_name>/city-image-generator:v2
- 今、スナップショットを使用して他の地域に別のドロップレットを作成し、コンテナを実行します。
VPC ピアリング
VPCピアリングは、プライベートネットワークを介してトロントのGPUサーバーと地域アプリインスタンス間で安全で低遅延の通信を確保します。
- DigitalOceanのダッシュボードでネットワーキングセクションに移動します。
- 各リージョン(例:ロンドン、ニューヨーク、シドニー、トロント)の
デフォルト VPCを見ることができるはずです。 - VPCピアリング機能を使用して、トロントVPCと各地域VPCとの接続を確立します。
- 地域アプリサーバーからGPUサーバーへの簡単なネットワークツール(
pingやcurlなど)を使用して接続を確認してください。
グローバルロードバランサー (GLB)
GLBは、受信したユーザーリクエストを最も近い地域のアプリインスタンスに割り当て、レイテンシを最適化し、ユーザーエクスペリエンスを向上させます。
- ダッシュボードのネットワーキング部分のロードバランサーセクションで、新しいグローバルロードバランサーを作成します。
- 地域のアプリインスタンスをバックエンドターゲットとして追加してください。
- ヘルスチェック、タイムアウト、およびその他の詳細設定を構成します。
- ロードバランサーを作成する
すべてのコンポーネントが整ったことで、あなたのアーキテクチャは完全に稼働しており、スケーラブルで安全なGenAIサービスを可能にします。DigitalOceanのGUIは設定の多くを簡素化し、AIモデルのパフォーマンスと機能性の最適化に集中できるようにします。
結論
このデモは、パーソナライズされたコンテンツを生成するeコマースプラットフォームや、グローバルなオーディエンス向けのAI駆動のコンテンツプラットフォームなど、分散型GenAIソリューションを探求する企業や開発者にとって、実用的な出発点です。DigitalOceanの製品を活用することで、このセットアップは、最先端のAIサービスを展開する際の拡張性、セキュリティ、コスト効率のバランスを取る方法を示しています。
参考文献
このデモで使用されている技術については、こちらで詳しく読むことができます:
- Nvidia マルチインスタンス GPU (MIG)
- MIGをいつ使用しますか?
- フラックス.1 モデル
- ラマ3.1モデル




