nbd-vram: NVIDIA GPU VRAMをLinuxのSwapスペースとして使用する
システムメモリを拡張するためにVRAMをSwapスペースとして使用する
nbd-vramは、Linuxユーザー、特にメモリがマザーボードに直付けされているノートPCを使用しているユーザー向けに設計された、未使用のNVIDIA GPU VRAMをスワップデバイスとして利用するためのユーティリティです。VRAMをブロックデバイスとして扱うことで、システムが低速なSSDベースのスワップに頼る前にGPUメモリへデータを溢れさせることが可能になり、実質的にシステムのメモリアドレス範囲を拡大します。
一般的な構成では、メモリのオーバーフロー順序は以下のようになります:
- 物理RAM: 最初にプライマリシステムメモリが埋まります。
- VRAM (nbd-vram経由): PCIeを介した高速なオーバーフロー。
- zram: CPUによって管理される圧縮RAM。
- SSD Swap: 他のすべてのティアが使い果たされた際の最終手段。
技術アーキテクチャと実装
nbd-vramは、Network Block Device (NBD) プロトコルを利用することで、カスタムカーネルモジュールの必要性を回避しています。実装のデータパスは以下の通りです:
Kernel swap subsystem $\rightarrow$ /dev/nbdX $\rightarrow$ nbd kernel driver $\rightarrow$ Unix socket $\rightarrow$ nbd-vram daemon $\rightarrow$ cuMemcpyHtoD/DtoH $\rightarrow$ GPU VRAM
なぜP2P APIではなくNBDなのか?
開発者は、NVIDIAのコンシューマー向けドライバの制限を回避するためにNBDアプローチを選択しました。nvidia_p2p_get_pages_persistent APIを使用すると、ioremap_wcを介してCPUから直接VRAMページをピン留めできますが、NVIDIAはこの機能をQuadroおよびデータセンター向けSKUに限定しています。GeForce GPUでは、このAPIはEINVALを返します。さらに、BAR1の物理アドレスを直接ioremap_wcしようとしても、コンシューマー向けGPUは通常、BAR1の約16 MiB(ディスプレイ・フレームバッファ)のみをマップしており、残りのアドレス空間にはゼロを返すため、失敗します。
cuMemcpyHtoDおよびcuMemcpyDtoHを使用することで、nbd-vramは特別な権限やエンタープライズ向けハードウェアを必要とせずに、あらゆるCUDA対応GPUで動作できます。
パフォーマンスと設定
ベンチマーク
RTX 3070 Laptopにおいて、nbd-vramは4Mブロックを使用して約1.3 GB/sのシーケンシャルスループットを達成しました。開発者は、データパスがストレージコントローラを経由せず、PCIeを介してGPUに直接移動するため、レイテンシがNVMeよりも低いと述べています。
セットアップと要件
nbd-vramを実行するには、システムに以下が必要です:
- CUDAをサポートするNVIDIA GPU。
libcuda.so.1を提供するNVIDIAドライバ(フルCUDAツールキットは不要)。nbdモジュールを備えたLinuxカーネル 3.0以上。nbd-clientパッケージ、gcc、およびmake。
ユーザーは、systemdサービスファイル内のVRAM_SETUP_SIZE_MB環境変数を通じて、割り当てるVRAMの量を設定できます。デーモンは柔軟に設計されており、要求されたサイズが利用できない場合は、メモリの割り当てに成功するまで512 MiB刻みでサイズを下げていきます。
電源とリソース管理
ノートPCでの過度なバッテリー消費を防ぐため、nbd-vramには電力認識管理 (power-aware management) が含まれています。有効にすると、AC電源が抜かれたとき(または特定のバッテリー閾値に達したとき)にサービスが自動的に停止し、再接続時に再開されます。
コミュニティの洞察と批判的分析
このプロジェクトはメモリ制約のあるハードウェアに対して独創的な解決策を提供していますが、コミュニティからはその効率性と安定性に関していくつかの技術的な懸念が提起されています:
スループットとオーバーヘッド
一部のユーザーは、報告されている1.3 GB/sのスループットは、PCIe 4.0 x16 (64 GB/s) および GDDR6メモリ (448 GB/s) の理論的限界よりも大幅に低いことを指摘しています。
"このRTX 3070チップはPCIe 4.0 x16に搭載されており、64GB/sが出るはずです... NVMeドライブへのスワップの方が2倍速いですが、レイテンシは高くなります。"
これは、NBD-over-Unix-socketアーキテクチャが、ネイティブなカーネルレベルのブロックドライバと比較して大きなオーバーヘッドを導入していることを示唆しています。
VRAMの競合と安定性
システムがVRAMの競合をどのように処理するかについて懸念があります。VRAMがスワップ用に割り当てられているため、他のGPU負荷の高いアプリケーション(WaylandコンポジタやLLMなど)がメモリ不足に直面し、システムクラッシュにつながる可能性があります。
"VRAMが不足すると、デスクトップ全体が簡単にクラッシュすることがあります... Hyprland+llama-server+KVMの構成で、そのようなクラッシュを何度か経験しました。"
代替の実装
議論では、vramblk (OpenCLを使用) や GpuRamDrive (Windows向け) など、VRAMをストレージとして使用する他の同様の試みについても触れられましたが、そのような実装のほとんどはパフォーマンスの低下により、高性能なメモリ拡張ではなく「従来のスワッピング」のように感じられることが指摘されています。