PaPoo
cover
technews
Author
technews
世界の技術ニュースをリアルタイムでキャッチし、日本語でわかりやすく発信。AI・半導体・スタートアップから規制動向まで、グローバルテックシーンの「今」をお届けします。

NVIDIA GPUのVRAMをswapに使う? Linuxで“空いているGPUメモリ”を活かす面白い試み

キーポイント

そもそも何をするプロジェクト?

今回紹介するのは、GitHubの nbd-vram というプロジェクトです。
一言でいうと、​NVIDIA GPUのVRAMをLinuxのswapスペースとして使うための仕組みです。

「swapって何?」という人向けにざっくり説明すると、
PCのメモリ(RAM)が足りなくなったときに、​一時的な退避場所としてSSDやHDDを使う機能です。
ただしswapはRAMよりずっと遅いので、使いすぎると体感が重くなります。

そこでこのプロジェクトは、​SSDの代わりにGPUのVRAMを退避先にするわけです。
VRAMは通常、ゲームや3D描画で使うGPU専用メモリですが、ハイブリッドGPU構成のノートPCだと、​GPUがあまり働いていない時間帯にVRAMが空いていることがあります。そこを活用しよう、という発想です。
これはかなり面白いです。正直、最初に見たとき「その手があったか」と思いました。

どういう人向けなのか

READMEでは、特に次のような環境を想定しています。

特に刺さるのは、​8GBやそれ以上のVRAMがあるのに、普段はほぼ寝ているような構成だと思います。
もしRAMが少なくてSSD swapが頻繁に発生しているなら、「そのVRAMを使えるなら使いたい」という気持ちはかなり自然です。

仕組みはどうなっているのか

このプロジェクトの肝は、​NBD (Network Block Device) を使っていることです。

名前に “Network” とありますが、実際にはネットワーク経由でなくても使えます。
要するに、Linuxカーネルが外部のブロックデバイスに接続するための仕組みで、ここではUnix socketを通してローカルのdaemonにつなぎ、VRAMをブロックデバイスのように見せています。

流れをかなり簡単にするとこんな感じです。

  1. カーネルのswap機能が /dev/nbdX を使う
  2. nbd kernel driver がそれを受ける
  3. Unix socket を通じてユーザー空間の daemon に送る
  4. daemon が CUDA API を使って VRAM に読み書きする
  5. 結果として、VRAMがswap領域のように使える

READMEにあるデータ経路はこんな感じです。

image_0002.gif

kernel swap subsystem - /dev/nbdX - nbd kernel driver - Unix socket - nbd-vram daemon - cuMemcpyHtoD/DtoH - GPU VRAM

ここで出てくる cuMemcpyHtoD/DtoH は、簡単に言えば

という意味です。
つまり、​特別な裏技ではなく、CUDAで普通に使えるメモリコピー機能を利用しているのがポイントです。

個人的には、ここがこのプロジェクトのいちばん賢いところだと思います。
NVIDIAのカーネル内部の特殊機能に頼るより、​動く範囲の広いAPIで組み立てているので、更新に比較的強いんですよね。

なぜ“普通のやり方”ではダメなのか

READMEでは、よく思いつく方法として NVIDIA P2P API を使う案が説明されています。
これはGPUのメモリをCPUから直接扱えるようにする方向の技術ですが、GeForceなどのconsumer GPUでは EINVAL が返るケースがあるそうです。
つまり、​Quadro/datacenter系のSKU向けに制限されているとのことです。

また、BAR1の物理アドレスを直接 ioremap_wc で触る方法も試したものの、
GPU内部のページテーブルで実際に見えているBAR1領域は約16 MiB程度で、ほとんどは使えなかったと説明されています。
その結果、mkswap は通っても swapon で失敗する、という流れになるそうです。

要するに、​**“GPUのVRAMを直接いじる”王道っぽい方法は、consumer GPUではうまくいかない**。
だからこそ、nbd-vramNBD経由でブロックデバイス化する回り道を選んでいるわけです。
こういう、正面突破ではなく「通る道を探す」アプローチは、OSSらしくて好きです。

どんな構成で使えるのか

必要条件は比較的シンプルです。

つまり、巨大なCUDA開発環境を入れなくても動かせるのは地味にうれしい点です。
「研究用の特殊環境がないと無理」という感じではなく、​比較的ふつうのLinux環境で試せるのが良いですね。

インストールはどうする?

READMEでは、次のような手順が案内されています。

git clone https://github.com/c0dejedi/nbd-vram
cd nbd-vram
sudo ./install.sh
sudo systemctl start vram-swap-nbd

インストール後は swapon --show で確認できます。
READMEの例では、/dev/nbd0 が swap として見えており、優先度も 1500 になっています。

image_0003.gif

このプロジェクトは、​サービスとして起動し、ブート時に自動的に有効化される構成です。
なので、単なる一回限りのハックではなく、​日常運用を意識しているのがわかります。

設定で何が変えられる?

設定は systemd service の環境変数で行います。

優先度が高いほど、Linuxはそのswapを先に使います。
READMEでは例として、VRAM_SWAP_PRIORITY=1500 が設定されています。

面白いのは、​指定サイズを“上限”として扱う点です。
もしGPU側に余裕がなければ、​512 MiBずつ下げながら確保可能な分だけ使うそうです。
これなら、すでに画面描画などでVRAMを消費していても、取れるだけ取るという動きになります。

これは実運用をよく考えた設計だと思います。
「固定サイズしか取れません」だとちょっと使いにくいですが、こういう柔軟な後退処理があると試しやすいです。

電源管理も考えられている

さらにREADMEでは、​AC電源接続中だけ有効にするような管理も案内されています。

ノートPC向けとしてはかなり納得感があります。
VRAMをswapに使うのは面白いですが、​バッテリー駆動中まで積極的に回すのは現実的ではない場面もあります。
そのため、こういう電源連動の制御があるのはかなり親切です。

READMEによると、手動で systemctl stop した場合は、それを尊重して勝手には復帰しないそうです。
このあたりも、運用者の気持ちをわかっている感じがします。

速度は速いの? 遅いの?

ここがいちばん気になるところですよね。
結論からいうと、​用途によるです。

READMEのベンチマークでは、対象は RTX 3070 Laptop(8GB VRAM) + NVMe cryptswap です。
結果の要点をざっくり見るとこうです。

連続読み書き

image_0004.gif

連続転送では、当然ながらNVMeのほうが強いです。
これは、VRAM側が遅いというより、​NBD + CUDA のユーザー空間経由の往復オーバーヘッドが効いているためです。

4Kランダム IOPS

ここでもNVMeが強いです。
高い負荷で連続してアクセスするなら、やはりSSDのほうが有利です。

レイテンシ

ここがかなり面白いところです。
たまにちょっとだけアクセスする場合は、VRAMのほうが圧倒的に速い
READMEでは、NVMeはAPST(省電力機能)で寝たり起きたりするので、1秒に1回程度の疎なアクセスだと毎回数msの起床コストが乗ると説明されています。

つまり、

という見方になります。

これ、swapの性質を考えるとかなり筋が通っています。
swapは必ずしも巨大な連続ストリームではなく、​細かいページがときどき飛ぶ世界です。
なので、「帯域」だけでなく「応答の速さ」が効く場面がある、というのはなるほどと思いました。

ただし、万能ではない

ここははっきり書いておきたいのですが、nbd-vram魔法の高速化装置ではありません
むしろ、かなり条件付きです。

たとえば:

要するに、これは
​「余っているVRAMを、SSDの代わりに少し賢く使う」ための道具
であって、
メモリ不足を根本解決する最強の手段
ではない、ということです。

image_0005.gif

個人的には、こういうプロジェクトは「実用かどうか」を二択で見るより、​**“どの条件なら面白く効くか”を見るのが大事**だと思います。
その意味で nbd-vram は、かなり良い実験材料ですし、刺さる人にはすごく刺さるはずです。

どこがいちばん魅力的か

私が特に魅力を感じたのは、次の3点です。

1. 発想がシンプルでわかりやすい

「使っていないVRAMをswapに回す」。
この説明だけで価値が伝わるのが強いです。
難しい最適化を持ち出さなくても、課題と解決策が直感的です。

2. カーネルモジュールを書かずに実現している

Linuxの深いところを触ると、どうしても保守が重くなります。
でもこのプロジェクトは、​既存の仕組みをつないで実現している
こういう設計は、あとから見返しても筋が良いです。

3. “ノートPCの現実”に刺さっている

メモリは増設できない。
でもGPUは積んでいる。
そしてGPUのVRAMは空いている。
この状況、まさに「もったいない」を拾いにいく発想です。
Linux好き、ハード好きにはかなりニヤリと来ると思います。

まとめ

nbd-vram は、​NVIDIA GPUのVRAMをLinuxのswapとして使うかなりユニークなプロジェクトです。
普通のユーザーに無条件で勧められるものではないですが、​メモリ増設できないノートPCや、​遊んでいるVRAMを有効活用したい人には、かなり面白い選択肢だと思います。

速度面ではNVMeに勝てない場面もありますが、​疎なアクセスでの低レイテンシは魅力的です。
しかも、カーネルモジュールに依存しすぎない設計なので、​更新に強いのも良いところです。

こういう「ちょっと変だけど理にかなっている」プロジェクト、私はかなり好きです。
実用一点張りではないけれど、​Linuxの自由度と工夫の面白さがぎゅっと詰まっている感じがします。


参考: GitHub - c0deJedi/nbd-vram: Use your NVIDIA GPU's VRAM as swap space on Linux. Built for laptops with soldered memory and no upgrade path. If you have an RTX card sitting there with 8GB of VRAM and you're getting swapped to SSD, this puts that VRAM to work

同じ著者の記事