VMware vSphere Bitfusionによるネットワーク経由のGPU共有:パフォーマンスの最適化とリソースの最大活用

VMware tutorial - IT technology blog
VMware tutorial - IT technology blog

現実的な課題:放置される高価なGPUリソース

AIやディープラーニングに携わる方なら、このような状況に見覚えがあるはずです。会社に申請して、数百万円相当のNVIDIA A100やRTX 3090を搭載したサーバーを導入したとします。しかし、現実は理想通りにはいきません。DirectPath I/Oなどの仕組みを使ってGPUを仮想マシン(VM)に直接割り当てると、その VM がリソースを完全に占有してしまいます。

その結果どうなるでしょうか?データサイエンティストがコードを書いたりデータの前処理を行ったりしている間、GPUは完全にアイドル状態で「遊んでいる」ことになります。その一方で、他の同僚がモデルのクイックテストのために少しだけ「パワー」を借りたいと思っても、GPUがロックされているため使えません。ある研究ラボでは、高価なGPUアレイがフル稼働するのは1日わずか2時間だけで、残りの22時間はサーバー室を暖めるだけの高価な暖房器具と化している光景を目にしたこともあります。これは非常に大きな無駄です。

なぜGPUの仮想化はこれほど難しいのか?

問題の根本はハードウェアのアーキテクチャにあります。GPUはもともと、CPUやRAMのように柔軟に共有されるようには設計されていません。これまで、主に2つの選択肢がありましたが、どちらにも致命的な欠点がありました。

  • PCI Passthrough: 100%のパフォーマンスを発揮できますが、1枚のGPUにつき1台のVMしか利用できません。別のマシンに切り替えるには、VMをシャットダウンして再設定する必要があり、非常に手間がかかります。
  • NVIDIA vGPU (GRID): GPUをプロファイルごとに分割できますが、NVIDIA Enterpriseのライセンスが非常に高価(通常1ユーザーあたり年間500ドル以上)であり、特定のTesla/Quadroシリーズのカードしかサポートしていません。

Bitfusionは、この難題を解決するために登場しました。サーバーAにあるVMが、ネットワーク経由でサーバーBのGPUパワーを借りるにはどうすればよいか、という問いへの答えです。

Bitfusion:ハードウェアの課題に対する「ソフトウェア」による解決策

物理レイヤーに介入する代わりに、Bitfusionはクライアント・サーバーモデルで動作します。これは CUDA 関数呼び出しのプロキシ層として機能します。物理 GPU を搭載したマシンがサーバーとなり、AI コードを実行するマシンがクライアントとなります。両者は Ethernet または RDMA ネットワークを介して接続されます。

Bitfusionの最大のメリットは、その透過性です。AIのコードを1行も修正する必要はありません。TensorFlowやPyTorchは、あたかもローカルに本物のGPUが存在するかのように認識します。特に、GPUメモリの容量をパーセンテージで細分化できる点は強力です(例:40GBのA100の20%だけを小さなタスクに割り当てるなど)。

ステップ1:Bitfusion Server(アプライアンス)のデプロイ

まず、VMwareの公式サイトからBitfusionのOVFファイルをダウンロードします。Bitfusion Serverは、最適化されたPhoton OS上で動作する仮想マシンです。

  1. vCenterにOVFをデプロイします。物理GPUカードが装着されているホストを正しく選択する必要があります。
  2. VMのハードウェア構成で、PCI Deviceを追加し、該当するNVIDIAカードを選択します。
  3. 重要な注意点: Reserve all guest memory(すべてのゲストメモリを予約)を有効にしてください。この手順を忘れると、パススルー機能が動作しません。
  4. 起動後、ポート443経由でBitfusionのWebインターフェースにアクセスし、アクティベーションとvCenterへの接続を行います。

ステップ2:Linux仮想マシンでのクライアント設定

ここはデータサイエンティストの作業環境です。Ubuntu 20.04または22.04を推奨します。大きな利点は、ここに重いNVIDIAドライバーをインストールする必要がなく、より軽量なBitfusion Clientをインストールするだけで済むことです。

リポジトリを追加し、以下のコマンドでインストールします。

# クライアントパッケージのインストール(debファイルがある場合)
sudo dpkg -i bitfusion-client-ubuntu2004_4.0.0-11_amd64.deb
sudo apt-get install -f

次に、vCenterから取得したセキュリティトークンを使用して、このクライアントマシンをサーバーに接続します。

# 集約されたGPUクラスタへの接続を確認
bitfusion list_servers

GPUリストが “Active” 状態で表示されれば、システムの準備は完了です。

ステップ3:ネットワーク経由でのAIアプリケーションの実行

ここからが魔法の本番です。python train.pyを実行する代わりに、Bitfusionのコマンドでラップするだけです。例えば、GPUを1枚、メモリの50%だけを借用したい場合は以下のようにします。

# GPUを1枚借用し、他者のためにメモリを50%に制限する
bitfusion run -n 1 -p 0.5 python3 my_model.py

Bitfusion ClientがCUDA APIの呼び出しをインターセプトし、ネットワークインフラがあれば、レイテンシによるオーバーヘッドは通常10%未満であり、直接装着されたカードとほとんど遜色ありません。

実戦での経験:ネットワークをボトルネックにしないために

実際の導入プロセスを通じて、非常に重要な3つのポイントを学びました。

  • ネットワーク帯域幅: 1Gbpsのネットワークは絶対に使用しないでください。どんなに強力なGPUでも、亀のような速度になってしまいます。最低でも10Gbpsを使用してください。可能であれば、最高のパフォーマンスを得るためにRDMA (RoCE) 対応のMellanoxを導入してください。
  • バージョンの同期: サーバーとクライアントは同じバージョンを実行する必要があります。サーバーがバージョン4.0でクライアントが3.5だったために、お互いを認識できず、午後の時間を丸々無駄にしたことがあります。
  • ジャンボフレーム: スイッチインフラ全体でMTU 9000を有効にしてください。これにより、クライアントとサーバー間で大きなデータブロックを転送する際のCPU負荷を軽減できます。

Bitfusionに移行したことで、チームのハードウェア使用効率は飛躍的に向上しました。1人が1枚のカードを独占する代わりに、今では4〜5人が1枚の強力なGPUを共有して小さなタスクを並行処理しています。GPUの調達コストに頭を悩ませているなら、Bitfusionは現時点で最も現実的な解決策と言えるでしょう。

Share: