概要
- NVIDIA GPUのVRAM をLinuxでスワップ領域として利用する方法の紹介
- ラップトップのメモリ増設不可問題 を解決するソリューション
- NBDプロトコル を用いた実装でカーネルモジュール不要
- zramやSSDスワップとの組み合わせ でアドレス可能メモリを大幅拡張
- パフォーマンス・動作要件・インストール方法 も解説
NVIDIA GPUのVRAMをLinuxスワップ領域として活用する方法
-
ラップトップのメモリ増設不可問題 を解決する手段として、NVIDIA GPUの VRAMをスワップ領域 として活用
-
例えば RTX 3070 Laptop (物理メモリ16GB、VRAM 8GB)で7GBをスワップとして割当可能
-
スワップオーバーフロー順序 :RAM → VRAM(高速、PCIe経由)→ zram(CPU圧縮)→ SSD
-
最終的なアドレス可能メモリ :zramやSSDスワップと組み合わせて約46GB(物理メモリの3倍)
-
NBD(Network Block Device)プロトコル を活用し、カーネルのnbdドライバ経由で/dev/nbdXとして認識
- データ経路 :カーネルスワップサブシステム → /dev/nbdX → nbdカーネルドライバ → Unixソケット → nbd-vramデーモン → cuMemcpyHtoD/DtoH → GPU VRAM
-
カーネルモジュール不要、NVIDIAカーネルシンボルも未使用、カーネルやドライバ更新時も再構築不要
技術的背景とNBD方式の優位性
- NVIDIA P2P API (nvidia_p2p_get_pages_persistent)はGeForce等のコンシューマGPUでは RMレベルで無効化
- Quadro/datacenter SKUのみ有効、ドライババージョンに関係なく制限
- BAR1物理アドレスへ直接ioremap_wc も不可
- GPU内部ページテーブルに~16MiBしかBAR1マッピングされていないため
- mkswapは成功するがswaponで失敗(スワップヘッダーが実際には存在しない)
- NBD方式 はこれらの制約を回避
- cuMemcpyHtoD/DtoHは全CUDA対応GPUで動作、特別な権限不要
必要要件
- CUDA対応NVIDIA GPU (RTX/GTX等の一般向けカード)
- NVIDIAドライバ(libcuda.so.1)
- Linuxカーネル3.0+(nbdモジュール組込済み環境)
- nbd-clientパッケージ
- gcc, make
インストール手順
-
リポジトリ取得 git clone https://github.com/c0dejedi/nbd-vram
-
ディレクトリ移動 cd nbd-vram
-
インストール実行 sudo ./install.sh
-
サービス起動 sudo systemctl start vram-swap-nbd
-
動作確認 swapon --show (/dev/nbd0 partition 7G 0B 1500等が表示されれば成功)
- サービスはインストール時に自動有効化、再起動後も自動起動
設定変更方法
- /etc/systemd/system/vram-swap-nbd.service を編集
- Environment=VRAM_SETUP_SIZE_MB=7168 # 使用するVRAM容量(MB単位)
- Environment=VRAM_SWAP_PRIORITY=1500 # スワップ優先度(高いほど先に利用)
- 設定反映 sudo systemctl daemon-reload && sudo systemctl restart vram-swap-nbd
- VRAM_SETUP_SIZE_MB は上限値であり、GPUメモリ状況により自動調整(512MiB刻みで縮小)
電源管理機能
- インストール時に電源管理有効化を選択可能
- ACアダプタ切断やバッテリ残量低下時に自動停止、復帰時に自動再開
- systemctl stopによる手動停止は常に優先
- 設定変更 /etc/nbd-vram.confを編集し、次回ポーリング(60秒以内)またはAC抜き差し時に反映
インストール不要の動作確認(スモークテスト)
- テスト実行 sudo bash test-nbd.sh (VRAM割当・NBDデバイス接続・1MiB書込/読戻し・スワップ有効化・手動終了手順表示)
- 全領域ストレステスト sudo bash test-fill.sh (VRAM全域ゼロ書込・サンプル読戻し検証・終了時に自動でスワップ復帰)
パフォーマンス
- RTX 3070 Laptop(7GB連続書込、4Mブロック)での測定値
- シーケンシャルスループット:約1.3GB/s
- NVMe SSDより低レイテンシ (PCIe経由でGPUに直結するため)
- zram利用時はVRAMスワップの優先度を高く設定 し、SSDスワップへのアクセスを最小化
アンインストール方法
- アンインストール実行 sudo bash uninstall.sh
ライセンス
- MITライセンス
- 作者:Sean Lobjoit (c0dejedi)