なぜエッジでのメモリ効率が重要なのか
クラウドと異なり、エッジデバイスではCPUとGPUが限られたメモリを共有します。Jetson Orin Nano 8GBモジュールの場合、実際に使用可能なメモリは約7.6GBしかありません。そこにGUIサービス、不要なカーネルサービス、カメラ/ディスプレイ用のCarveout領域が加わると、AIワークロードに使えるメモリはさらに減少します。
本記事では、NVIDIA Jetsonプラットフォームにおいて BSP/OS → カーネル → ユーザースペース → 推論パイプライン → 推論フレームワーク → モデル量子化 の5層を最適化し、最大10〜12GBのメモリを節約する方法をステップバイステップで紹介します。特に、製造現場やロボティクスで頻発する「メモリ不足(OOM)」問題を実際のコードレベルで解決することに焦点を当てています。
本ガイドはJetson Orin NXおよびOrin Nanoを対象としています。IGXプラットフォームにも一部適用可能です。

ステップ1: BSP/OS層の最適化(最大1GB節約)
GUIおよび不要サービスの無効化
プロダクション環境ではGUIは不要です。systemdターゲットを変更してヘッドレスモードで起動しましょう。
# GUIサービス無効化(約865MB節約)
sudo systemctl set-default multi-user.target
sudo reboot
# ネットワーク/ロギング等の不要サービス無効化(約32MB追加節約)
sudo systemctl disable bluetooth.service
sudo systemctl disable cups.service
sudo systemctl disable avahi-daemon.service
Carveout領域の最適化(約68MB追加節約)
Carveoutはブート時に特定のハードウェアエンジン用に予約される物理メモリです。ディスプレイやカメラを使用しない場合は、該当するCarveoutを無効化できます。
ディスプレイCarveout無効化例(/bootloader/generic/BCT/tegra234-mb1-bct-misc-p3767-0000.dts):
// Display関連Carveoutをすべて0MBに設定
aux_info@CARVEOUT_BPMP_DCE {
pref_base = <0x0 0x0>;
size = <0x0 0x0>; // 0MB
alignment = <0x0 0x0>;
};
aux_info@CARVEOUT_DCE_TSEC {
pref_base = <0x0 0x0>;
size = <0x0 0x0>; // 0MB
alignment = <0x0 0x0>;
};
// ...(DCE, DISP_EARLY_BOOT_FB, TSEC_DCEも同様)
カメラCarveout無効化例(同一ファイル):
aux_info@CARVEOUT_CAMERA_TASKLIST {
pref_base = <0x0 0x0>;
size = <0x0 0x0>; // 0MB
alignment = <0x0 0x0>;
};
aux_info@CARVEOUT_RCE {
pref_base = <0x0 0x0>;
size = <0x0 0x0>; // 0MB
alignment = <0x0 0x0>;
};
変更後はdtcツールでDTSからDTBに再コンパイルし、フラッシュする必要があります。
ステップ2: カーネルおよびユーザースペースの最適化
SWIOTLBのチューニング
Jetson OrinにはハードウェアIOMMUが内蔵されているため、SWIOTLBは不要な場合が多いです。必要な場合はサイズを調整してください。
# カーネルブートパラメータに追加(4MBバッファの例)
# swiotlb=2048 (各スラブ2KB、合計2048個 = 4MB)
# /boot/extlinux/extlinux.conf のAPPEND行を修正
メモリ使用量の診断
# CPUメモリ使用量分析
git clone https://github.com/csimmonds/procrank_linux.git
cd procrank_linux && make
sudo ./procrank # PSS基準でソート
# GPU/マルチメディアメモリ使用量確認
sudo cat /sys/kernel/debug/nvmap/iovmm/clients
結果からgnome-shell、Xorg、pulseaudio、不要なpython3プロセスを特定し、無効化してください。
ステップ3: 推論パイプラインの最適化(最大412MB節約)
DeepStreamベースのパイプラインでTiler/OSD(画面表示)とFakeSinkを無効化すると、ヘッドレス環境で大きな効果があります。
# DeepStreamパイプライン例(Python→C++への移行も検討)
# FakeSinkを使用して表示段階を削除
pipeline = """
...
nvvidconv ! video/x-raw,width=1280,height=720 ! \
fakesink sync=false
"""
| 最適化項目 | 節約メモリ |
|---|---|
| Container → Bare Metal | ~70MB |
| Python → C++ | ~84MB |
| Tiler/OSD + FakeSink | ~258MB |
| 合計 | ~412MB |
ステップ4: モデル量子化(最大の効果、最大10GB節約)
核⼼は 精度要件を満たす最も低い精度 を選択することです。FP16からW4A16(4ビット重み)への変更だけでモデルサイズを1/4に削減できます。
# Llama.cppでQwen3 8BモデルをW4A16量子化する例
./quantize --model qwen3-8b-fp16.gguf --type q4_k_m --output qwen3-8b-q4_k_m.gguf
| モデル | 量子化前 | 量子化後 | 節約 |
|---|---|---|---|
| Qwen3 8B | FP16 (~16GB) | W4A16 (~6GB) | ~10GB |
| Qwen3 4B | BF16 (~8GB) | INT4 (~2.4GB) | ~5.6GB |
注意点: 量子化による精度低下が生じた場合は、量子化認識蒸留(QAD)手法で回復できます。まずFP16ベースラインを確保し、段階的に低精度をテストしてください。

実際の事例: Reachy Mini Jetson Assistant
上記の最適化をすべて適用した実例です。8GBのJetson Orin NanoでマルチモーダルAIロボットを稼働させました。
| 最適化層 | 最適化前(Orin NX 16GB) | 最適化後(Orin Nano 8GB) | メモリ使用量変化 |
|---|---|---|---|
| BSP/OS | Ubuntu Desktop (GNOME) | Headlessモード | 1.8GB → 1.1GB (-0.7GB) |
| モデル量子化 | VLM FP16 (6.6GB) | VLM Q4_K_M (2.2GB) | 6.6GB → 2.2GB (-4.4GB) |
| システム全体 | VLMだけで87% RAM使用 (OOM) | 全パイプライン60%使用 | >7.6GB → 4.5GB (-5.1GB+) |
追加ヒント: 専用アクセラレータの活用
JetsonプラットフォームにはGPU以外にも、ISP(画像信号処理)、NVENC/NVDEC(ビデオコーデック)、PVA(プログラマブルビジョンアクセラレータ)が内蔵されています。特にPVAは常時起動の低消費電力で動体検出や物体追跡などの軽量ビジョンタスクを処理し、GPUをAI推論に集中させることができます。
PVA SDK(cuPVA)は現在Early Access段階です。NVIDIAに問い合わせてアクセス権をリクエストしてください。

まとめ: エッジAI開発者のための核⼼戦略
エッジデバイスで大規模モデルを実行するための3つの核⼼原則を覚えておいてください:
- 不要なものはすべてオフにする — GUI、Bluetooth、カメラ、不要なCarveoutを無効化しましょう。
- 量子化は最強の武器 — 精度が許す限り最も低いビット精度(W4A16、INT4、NVFP4)を選択してください。
- パイプラインは軽量に保つ — PythonよりもC++ベースの推論フレームワーク(Llama.cpp、TensorRT-Edge-LLM)を使用し、表示段階は削除しましょう。
日本のエッジAI環境(スマートファクトリー、自律走行ロボット、監視カメラ分析)でも同じ原則が適用されます。特にJetson Orin Nano 8GBはコストパフォーマンスに優れていますがメモリがタイトなため、本ガイドの最適化をぜひ適用してみてください。
次のステップとしての学習方向
- NVIDIA JetPack SDKのインストールとヘッドレス設定の実践
- Llama.cppまたはTensorRT-Edge-LLMによる自社モデルの量子化
- PVA(cuPVA)を活用した電力効率の良いビジョンパイプラインの構築
合わせて読みたい記事
根拠資料: NVIDIA Developer Blog - Maximizing Memory Efficiency to Run Bigger Models on NVIDIA Jetson