Ryzen AI 9 HX 370のGPU用メモリ(GTT)を24GBに拡張する方法【Ubuntu 24.04】
AILinux

Ryzen AI 9 HX 370のGPU用メモリ(GTT)を24GBに拡張する方法【Ubuntu 24.04】

目次
  1. はじめに
  2. 環境
  3. GTTメモリってなに?
  4. 手順
  5. 注意点
  6. まとめ

はじめに

NucBox EVO X1を買って、ローカルでAI画像生成やLLM推論をやろうとしたら、いきなりメモリ不足で詰まりました。

搭載されているRadeon 890Mは統合GPU(APU)なので、専用のVRAMがありません。BIOSの「UMA Frame Buffer Size」で確保できるVRAMは最小1GB〜最大16GBですが、これだけだと重めの画像生成やLLMを動かすには全然足りない。

調べていくと、LinuxにはGTT(Graphics Translation Table)メモリというGPU用の共有メモリ領域があって、カーネルパラメータで拡張できることがわかりました。この記事では、そのGTTメモリを16GBから24GBに拡張した手順と、ハマったポイントをまとめます。

環境

  • マシン: GMKtec NucBox EVO X1

  • CPU/GPU: AMD Ryzen AI 9 HX 370 / Radeon 890M

  • RAM: 32GB DDR5

  • OS: Ubuntu 24.04

GTTメモリってなに?

ざっくり言うと、GPUがDMA(Direct Memory Access)で直接読み書きできるシステムメモリの領域です。

統合GPUの場合、BIOSで設定するVRAM(UMA Frame Buffer)は「GPUに固定で予約される領域」。一方GTTメモリは「必要なときにGPUが使える柔軟な共有領域」です。VRAMは固定で確保されてしまうのでCPU側から使えなくなりますが、GTTは使わないときはCPU側に返せるので、限られたRAMを効率よく使えます。

デフォルトではシステムRAMの50%がGTTの上限になっていて、32GBなら16GBまで。でもAI系のワークロードではこれが足りなくなることがあるので、カーネルパラメータで上限を引き上げます。

手順

1. ビデオドライバのインストール

AMD Radeonリポジトリから amdgpu-install パッケージをダウンロードしてインストールします。

$ sudo mkdir -p /etc/apt/keyrings
$ wget -P /tmp https://repo.radeon.com/amdgpu-install/7.2/ubuntu/noble/amdgpu-install_7.2.70200-1_all.deb
$ sudo apt install -y /tmp/amdgpu-install_7.2.70200-1_all.deb
$ sudo apt update

2. amdgpu-topコマンドのインストール

amdgpu-topはメモリ割り当て変更後の確認やGPUの状態を知るために必要。

$ wget -P /tmp https://github.com/Umio-Yasuno/amdgpu_top/releases/download/v0.11.2/amdgpu-top_0.11.2-1_amd64.deb
$ sudo dpkg -i /tmp/amdgpu-top_0.11.2-1_amd64.deb
$ amdgpu_top --smi

3. BIOSでUMA Frame Buffer Sizeを最小にする

まず再起動してBIOSに入ります(Delキー)。

Advanced → GFX Configuration を開いて、「UMA Frame Buffer Size」を最小の1GBに設定。F10で保存して再起動します。

GTTを拡張するなら、固定VRAMは小さい方がいい。VRAMとして固定予約された分はCPUから使えなくなるので、32GBしかないマシンではなおさらです。参考記事では512MBを推奨していますが、このBIOSでは1GBが最小でした。

4. 使っているTTMモジュールを確認する

ここが地味にハマるポイントです。Ubuntu 24.04では、ROCmドライバをインストールしているかどうかで、ロードされるTTMモジュールが変わります。

$ lsmod | grep ttm
  • ttm が出る場合 → ttm.pages_limitttm.page_pool_sizeを使う

  • amdttm が出る場合 → amdttm.pages_limitamdttm.page_pool_sizeを使う

自分の環境ではttmモジュールが表示されました。どっちかわからなければ両方書いておけば問題ありません(該当しないモジュールのパラメータは単に無視されます)。amdgpu-dkmsがインストールされている場合は両方表示されます。

5. ページ数を計算する

GTTサイズはページ数で指定します。1ページ = 4096バイトなので、24GBだと:

24 × 1024 × 1024 × 1024 ÷ 4096 = 6,291,456 ページ

電卓叩くのが面倒な人向けに、よく使いそうな値をまとめておきます。

GTTサイズ

ページ数

16GB

4,194,304

24GB

6,291,456

32GB

8,388,608

6. GRUBのカーネルパラメータを編集する

$ sudo nano /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULTの行を見つけて、以下のように書き換えます。

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash amdgpu.gttsize=24576 ttm.pages_limit=6291456 ttm.page_pool_size=6291456"

各パラメータの意味はこんな感じ。

パラメータ

何をしてるか

amdgpu.gttsize=24576

GTTサイズを24GB(MB単位)で指定 ※1

ttm.pages_limit=6291456

TTMモジュールが管理できるページ数の上限。これが本命

ttm.page_pool_size=6291456

TTMのページプールサイズ。pages_limitと同じ値でOK

※1 amdgpu.gttsizeは新しいカーネルではdeprecated扱いになるらしいが、自分の環境(Ubuntu 24.04標準カーネル)では警告は出なかった。TTM側のパラメータと併用しておくのが無難。

amdttmモジュールの環境なら、amdttm.pages_limit=6291456 amdttm.page_pool_size=6291456も追記してください。

7. GRUBを更新して再起動

$ sudo update-grub
$ sudo reboot

8. 確認する

再起動したら、ちゃんと反映されているか確認します。

# カーネルパラメータが適用されたか
$ cat /proc/cmdline

# TTMモジュールのパラメータ確認
$ cat /sys/module/ttm/parameters/pages_limit
$ cat /sys/module/ttm/parameters/page_pool_size

# GPU側のメモリ情報
$ cat /sys/class/drm/card*/device/mem_info_gtt_total
$ cat /sys/class/drm/card*/device/mem_info_vram_total

# GPU割り当てとTTM割り当ての確認
$ amdgpu_top --smi

以下のようにVRAM 1GBとGTT 24GBが表示されていれば成功。

VRAM 1GB + GTT 24GB = 合計25GBがGPUから使えるようになりました。

注意点

RAMの50%を超えるとリスクがある

AMD開発者のAlex Deucher氏いわく、LinuxのOOMハンドラの都合でTTMのデフォルト上限はRAMの50%になっているとのこと。32GB RAMで24GB(75%)は攻めた設定ですが、今のところ問題なく動いています。ただし重い処理を複数同時に走らせるとOOMキラーに殺される可能性はあるので、そこは自己責任で。

カーネルが新しければ不要になるかも

Kernel 6.16.x系にはAPUのユニファイドメモリ処理の改善が入っていて、新しいカーネルではこの手のパラメータなしでもGTTが正しく認識される場合があるらしいです。Ubuntu 24.04の標準カーネルは古いので手動設定が必要ですが、将来的には不要になるかもしれません。

まとめ

やったことは「BIOSでVRAMを最小にして、GRUBにカーネルパラメータを3行追加する」だけ。それで最大16GBだったGPUメモリが1GB + 24GBになりました。

重めの画像生成やLLM推論をRadeon 890Mでやるなら、この設定は最初にやっておいた方がいいと思います。特にComfyUIで重めのモデルを動かすときに、この数GBの差がOOMするかしないかの境界線になりました。