ミニPCのCPUに内蔵されているGPU(Radeon)で機械学習を試してみた

作業手順メモ

概要

最近購入した5万円をきる低価格のGMKtecのミニPC(OSはubuntu24.04に変更)にはRyzen 7 5825uが搭載されているのですが、これにはGPU(Radeon Vega 8)が内蔵されています。AMDは自社のGPUでAIアプリを開発するためのROCmというソフトウェアスタックを提供しており、これを使えばRadeonでもPyTorchや生成AIアプリが動かせる、ということを知り、このiGPUでどこまで動かせるのか、PyTorchを使ったプログラム、および、ローカルLLMとして使えるlocal-ai及びollamaを動かして確かめてみました。※ちなみに現在ROCmではこのiGPUを正式にはサポートしていないようですので、試される方は自己責任でお願いします。

結論からいいますと、PyTorchに関しては実行するソフトによってはCPUよりGPUの方が遅かったり、GPUがハングすることもありました。local-aiやollamaも動作はするものの速度に難あり、といったところです。

BIOSの設定

まずはこちらを参考にしてBIOSの設定で、CPUの電源モードをperformanceに変更し、さらにUMA frame bufferのサイズを8Gに変更しました。

ROCmのインストール

  1. ROCmのドライバをインストールするためのスクリプト(amdgpu-install)をここから探してダウンロード、インストールする
    今回はubuntu24.04用の現時点(24/11/17現在)での最新版であるamdgpu-install_6.2.60204-1_all.debを使用。ダウンロードしたら、
sudo dpkg -i ./amdgpu-install_6.2.60204-1_all.deb

でインストールする。

  1. インストールしたスクリプトでROCmのドライバをインストール
sudo amdgpu-install --usecase=graphics,rocm,opencl -y --accept-eula
  1. renderとvideoのデバイスにアクセスできるようにROCmを使うユーザーをそれぞれのグループに追加
    例えば、現在ログインしているユーザーでROCmを使用するなら
sudo usermod -a -G render $LOGNAME
sudo usermod -a -G video $LOGNAME
  1. ROCmを使用するユーザーの環境変数を追加
    ~/.bashrcなどに以下を追加しておく。
export PYTORCH_ROCM_ARCH=gfx900
export HSA_OVERRIDE_GFX_VERSION=9.0.0

※5825uのiGPUはgfx90cというターゲット名であるが、ROCmの対応しているGPUにはないので、pytorchやlocal-aiなどで利用しているhipBLASというライブラリがエラーになる模様。そこで、この環境変数を設定することで、ROCmが対応しているgfx900gfx90cの命令セットと互換性があるらしい)として扱われるようにしているようだ。

  1. PCを再起動する
  2. インストールできているかチェックする
  • rocm-smi“でGPUの状態をチェック
============================================ ROCm System Management Interface ============================================
====================================================== Concise Info ======================================================
Device  Node  IDs              Temp    Power     Partitions          SCLK  MCLK     Fan  Perf  PwrCap       VRAM%  GPU%
              (DID,     GUID)  (Edge)  (Socket)  (Mem, Compute, ID)
==========================================================================================================================
0       1     0x15e7,   25445  44.0°C  12.0W     N/A, N/A, 0         None  1200Mhz  0%   auto  Unsupported  0%     0%
==========================================================================================================================
================================================== End of ROCm SMI Log ===================================================
  • clinfo“でOpenCLで認識されているかチェック
Number of devices:                               1
  Device Type:                                   CL_DEVICE_TYPE_GPU
  Vendor ID:                                     1002h
  Board name:                                    AMD Radeon Graphics
  Device Topology:                               PCI[ B#5, D#0, F#0 ]
  • “apt show rocm-libs -a”でROCmのバージョンチェック
Package: rocm-libs
Version: 6.2.4.60204-139~24.04
Priority: optional
Section: devel
Maintainer: ROCm Dev Support <[email protected]>

PyTorchを試してみる

  • pytorchのget-startedのページにあるコマンド(Compute PlatformはROCm6.2を指定)でインストール
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/rocm6.2
  • GPUが認識されているかを以下のPythonコードでチェック
import torch
print(torch.cuda.device_count())
for i in range(torch.cuda.device_count()):
   print(torch.cuda.get_device_properties(i))

を実行すると、以下のように出力された。

_CudaDeviceProperties(name='AMD Radeon Graphics', major=9, minor=0, gcnArchName='gfx900:xnack+', total_memory=14483MB, multi_processor_count=8, uuid=58580000-0000-0000-0000-000000000000, L2_cache_size=1MB)
  • 行列の掛け算、および主成分分析のコードを実行してみる
    • 行列の掛け算
      CPUよりかなり速い。Matrix Sizeが20000のとき、CPUは30.074051秒かかったがGPUは0.168245秒だった。
    • 主成分分析
      こちらは逆にCPUよりかなり遅くなった。
Matrix Size: 4000
実行開始 - Matrix Size: 4000
device_type の設定: GPU
Running on GPU
Available devices: cuda
PCA Calculation time: 434.748962 seconds
SVD Calculation time: 314.756380 seconds

実行開始 - Matrix Size: 4000
device_type の設定: CPU
Running on CPU
Available devices: cpu
PCA Calculation time: 8.335965 seconds
SVD Calculation time: 7.920610 seconds
HW Exception by GPU node-1 (Agent handle: 0x57a7bae47ec0) reason :GPU Hang

local-aiを動かす

  1. 以下のdocker-compose.ymlでコンテナを立ち上げる。するとコンテナ内でビルドが始まる(かなり時間がかかる)。
services:
  localai:
    image: quay.io/go-skynet/local-ai:master-aio-gpu-hipblas
    volumes:
      - ./models:/models
    environment:
      - MODELS_PATH=/models
      - DEBUG=true
      - REBUILD=true
      - BUILD_TYPE=hipblas
      - GPU_TARGETS=gfx900 # Vega10
      - HSA_OVERRIDE_GFX_VERSION=9.0.0 # Vega10
    devices:
      - /dev/dri
      - /dev/kfd
    ports:
      - "8080:8080"
  1. 一旦コンテナを停止して、イメージ化(コンテナが削除されても再ビルド不要とするため)
docker compose stop
docker commit localai-localai-1 localai-rocm
  1. docker-compose.ymlを編集して、REBUILDはfalse,imageはlocalai-rocmに変更し、再度起動
services:
  localai:
    image: localai-rocm
    volumes:
      - ./models:/models
    environment:
      - MODELS_PATH=/models
      - DEBUG=true
      - REBUILD=false
      - BUILD_TYPE=hipblas
      - GPU_TARGETS=gfx900 # Vega10
      - HSA_OVERRIDE_GFX_VERSION=9.0.0 # Vega10
    devices:
      - /dev/dri
      - /dev/kfd
    ports:
      - "8080:8080"
  1. 動作確認
    以下のコマンドでOpenAI互換のAPIをたたく。
curl http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer xxxxxxxxx" \
  -d '{
    "model": "gpt-4o",
    "messages": [
      {
        "role": "system",
        "content": "You are a helpful assistant."
      },
      {
        "role": "user",
        "content": "Hello!"
      }
    ]
  }'
  • モデルのダウンロード

ブラウザからhttp://localhost:8080にアクセスすると管理画面が表示される。ヘッダにあるmodelsをクリックすると表示されるモデル管理画面で必要なモデルをダウンロードする。例えばhermes-2-theta-llama-3-8bであれば5825uのiGPU(Radeon Vega 8)でも動作した。APIをたたくときに指定するモデルにはダウンロードしたモデルに対応したモデル名(http://localhost:8080の管理画面の表のMODEL NAME列で確認できる)を指定する。

curl http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer xxxxxxxxx" \
  -d '{
    "model": "hermes-2-theta-llama-3-8b",
    "messages": [
      {
        "role": "system",
        "content": "あなたは優秀なプログラマーです。"
      },
      {
        "role": "user",
        "content": "Pythonで電卓を実装して。"
      }
    ]
  }'

レスポンスが返ってくるまでの時間を計測したところ、1分53秒かかりました。遅いですね。一応、rocm-smiでGPUが動いていることを確認してます。ちなみに、メインPC(Ryzen 7 3700X、Geforce RTX 3070)だと16秒くらいでしたので、7倍くらい遅い、ということになります。

ollamaを動かす

ollamaを動かすため以下のページを参考にさせていただきました。

  1. インストール
curl -fsSL https://ollama.com/install.sh | sh

これでollamaのサーバが起動するが、GPUがサポートしていないということで、CPUで動いてしまう。

/etc/systemd/system/ollama.serviceのExecStartの下あたりに以下を追加

Environment="HSA_OVERRIDE_GFX_VERSION=9.0.0"

そのあと

sudo systemctl daemon-reload
sudo systemctl restart ollama
journalctl -u ollama

でollamaサーバのログをみてみる。

Dec 07 12:45:38 myserver ollama[2405]: time=2024-12-07T12:45:38.924Z level=INFO source=gpu.go:221 msg="looking for compatible GPUs"
Dec 07 12:45:38 myserver ollama[2405]: time=2024-12-07T12:45:38.932Z level=INFO source=amd_linux.go:386 msg="skipping rocm gfx compatibility check" HSA_OVERRIDE_GFX_VERSION=9.0.0
Dec 07 12:45:38 myserver ollama[2405]: time=2024-12-07T12:45:38.940Z level=INFO source=types.go:123 msg="inference compute" id=0 library=rocm variant="" compute=gfx90c driver=6.8 name=1002:15e7 to>D

のようにskipping rocm gfx compatibility checkとログに出ていれば環境変数が正しく認識されている。

  1. モデルをダウンロードしてチャットを起動する
ollama run nous-hermes2
  1. モデルをダウンロードするだけならpull
ollama pull gemma:2b
  1. OpenAI互換のAPIを利用する
curl http://localhost:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer xxxxxxxxx" \
  -d '{
    "model": "nous-hermes2",
    "messages": [
      {
        "role": "system",
        "content": "あなたは優秀なプログラマーです。"
      },
      {
        "role": "user",
        "content": "Pythonで電卓を実装して。"
      }
    ]
  }'

レスポンスが返ってくるまで2分30秒かかりました。やっぱり遅いですね。

Comments

Copied title and URL