概要
AMD の APU 搭載 NAS で Local LLM 出来ないか試みました。
huggingface transgformers (pytorch) が動く ROCm な GPGPU 環境を構築して、公開されている Model を動かしています。
HW 構成
Minisforum N5 Pro AI NAS
https://www.minisforum.jp/products/minisforum-n5-pro-nas
CPU: AMD Ryzen™ AI 9 HX PRO 370
RAM: 96GB, (48GB for VRAM)
Disk: SSD 1TB
Ubuntu のインストール
ubuntu-24.04-live-server-amd64.iso をここからインストール
https://old-releases.ubuntu.com/releases/24.04/
(Ubuntu desktop 24.04.2LTS 入れたらカーネルバージョンが合いませんでした...)
ドライバが無いのか、 NIC 2つあるうちの一つが動かなくなったけど一旦放置。
ROCm/AMDGPU install
公式に従って入れます。
amdgpu-install_6.4.60401-1_all.deb 入れるときにパーミッションエラーが出たのでそこだけフルパスに変更
# install ROCm
wget https://repo.radeon.com/amdgpu-install/6.4.1/ubuntu/noble/amdgpu-install_6.4.60401-1_all.deb
# ----------------
# sudo apt install ./amdgpu-install_6.4.60401-1_all.deb <- これだとエラーが出たのでフルパスに書き換え
sudo apt install /home/<path to dir>/amdgpu-install_6.4.60401-1_all.deb
# ----------------
sudo apt update
sudo apt install python3-setuptools python3-wheel
sudo usermod -a -G render,video $LOGNAME # Add the current user to the render and video groups
sudo apt install rocm
# install AMDGPU
sudo apt install "linux-headers-$(uname -r)" "linux-modules-extra-$(uname -r)"
sudo apt install amdgpu-dkms
終わったら、とりあえず再起動
sudo reboot
なぜかここで reboot あとにネットワークにつながらなくなりました。
強制終了・再起動で復帰したけど、不穏だ...
動作確認
$ rocminfo
ROCk module version 6.12.12 is loaded
=====================
HSA System Attributes
=====================
Runtime Version: 1.15
Runtime Ext Version: 1.7
# ---- /// -----
==========
HSA Agents
==========
*******
Agent 1
*******
Name: AMD Ryzen AI 9 HX PRO 370 w/ Radeon 890M
# ---- /// -----
*******
Agent 2
*******
Name: gfx1150
Uuid: GPU-XX
Marketing Name: AMD Radeon Graphics
Vendor Name: AMD
# ---- /// -----
全出力
$ rocminfo
ROCk module version 6.12.12 is loaded
=====================
HSA System Attributes
=====================
Runtime Version: 1.15
Runtime Ext Version: 1.7
System Timestamp Freq.: 1000.000000MHz
Sig. Max Wait Duration: 18446744073709551615 (0xFFFFFFFFFFFFFFFF) (timestamp count)
Machine Model: LARGE
System Endianness: LITTLE
Mwaitx: DISABLED
XNACK enabled: NO
DMAbuf Support: YES
VMM Support: YES
==========
HSA Agents
==========
*******
Agent 1
*******
Name: AMD Ryzen AI 9 HX PRO 370 w/ Radeon 890M
Uuid: CPU-XX
Marketing Name: AMD Ryzen AI 9 HX PRO 370 w/ Radeon 890M
Vendor Name: CPU
Feature: None specified
Profile: FULL_PROFILE
Float Round Mode: NEAR
Max Queue Number: 0(0x0)
Queue Min Size: 0(0x0)
Queue Max Size: 0(0x0)
Queue Type: MULTI
Node: 0
Device Type: CPU
Cache Info:
L1: 49152(0xc000) KB
Chip ID: 0(0x0)
ASIC Revision: 0(0x0)
Cacheline Size: 64(0x40)
Max Clock Freq. (MHz): 4367
BDFID: 0
Internal Node ID: 0
Compute Unit: 24
SIMDs per CU: 0
Shader Engines: 0
Shader Arrs. per Eng.: 0
WatchPts on Addr. Ranges:1
Memory Properties:
Features: None
Pool Info:
Pool 1
Segment: GLOBAL; FLAGS: FINE GRAINED
Size: 48929892(0x2ea9c64) KB
Allocatable: TRUE
Alloc Granule: 4KB
Alloc Recommended Granule:4KB
Alloc Alignment: 4KB
Accessible by all: TRUE
Pool 2
Segment: GLOBAL; FLAGS: EXTENDED FINE GRAINED
Size: 48929892(0x2ea9c64) KB
Allocatable: TRUE
Alloc Granule: 4KB
Alloc Recommended Granule:4KB
Alloc Alignment: 4KB
Accessible by all: TRUE
Pool 3
Segment: GLOBAL; FLAGS: KERNARG, FINE GRAINED
Size: 48929892(0x2ea9c64) KB
Allocatable: TRUE
Alloc Granule: 4KB
Alloc Recommended Granule:4KB
Alloc Alignment: 4KB
Accessible by all: TRUE
Pool 4
Segment: GLOBAL; FLAGS: COARSE GRAINED
Size: 48929892(0x2ea9c64) KB
Allocatable: TRUE
Alloc Granule: 4KB
Alloc Recommended Granule:4KB
Alloc Alignment: 4KB
Accessible by all: TRUE
ISA Info:
*******
Agent 2
*******
Name: gfx1150
Uuid: GPU-XX
Marketing Name: AMD Radeon Graphics
Vendor Name: AMD
Feature: KERNEL_DISPATCH
Profile: BASE_PROFILE
Float Round Mode: NEAR
Max Queue Number: 128(0x80)
Queue Min Size: 64(0x40)
Queue Max Size: 131072(0x20000)
Queue Type: MULTI
Node: 1
Device Type: GPU
Cache Info:
L1: 32(0x20) KB
L2: 2048(0x800) KB
Chip ID: 5390(0x150e)
ASIC Revision: 4(0x4)
Cacheline Size: 128(0x80)
Max Clock Freq. (MHz): 2900
BDFID: 50688
Internal Node ID: 1
Compute Unit: 16
SIMDs per CU: 2
Shader Engines: 1
Shader Arrs. per Eng.: 2
WatchPts on Addr. Ranges:4
Coherent Host Access: FALSE
Memory Properties: APU
Features: KERNEL_DISPATCH
Fast F16 Operation: TRUE
Wavefront Size: 32(0x20)
Workgroup Max Size: 1024(0x400)
Workgroup Max Size per Dimension:
x 1024(0x400)
y 1024(0x400)
z 1024(0x400)
Max Waves Per CU: 32(0x20)
Max Work-item Per CU: 1024(0x400)
Grid Max Size: 4294967295(0xffffffff)
Grid Max Size per Dimension:
x 4294967295(0xffffffff)
y 4294967295(0xffffffff)
z 4294967295(0xffffffff)
Max fbarriers/Workgrp: 32
Packet Processor uCode:: 25
SDMA engine uCode:: 11
IOMMU Support:: None
Pool Info:
Pool 1
Segment: GLOBAL; FLAGS: COARSE GRAINED
Size: 50331648(0x3000000) KB
Allocatable: TRUE
Alloc Granule: 4KB
Alloc Recommended Granule:2048KB
Alloc Alignment: 4KB
Accessible by all: FALSE
Pool 2
Segment: GLOBAL; FLAGS: EXTENDED FINE GRAINED
Size: 50331648(0x3000000) KB
Allocatable: TRUE
Alloc Granule: 4KB
Alloc Recommended Granule:2048KB
Alloc Alignment: 4KB
Accessible by all: FALSE
Pool 3
Segment: GROUP
Size: 64(0x40) KB
Allocatable: FALSE
Alloc Granule: 0KB
Alloc Recommended Granule:0KB
Alloc Alignment: 0KB
Accessible by all: FALSE
ISA Info:
ISA 1
Name: amdgcn-amd-amdhsa--gfx1150
Machine Models: HSA_MACHINE_MODEL_LARGE
Profiles: HSA_PROFILE_BASE
Default Rounding Mode: NEAR
Default Rounding Mode: NEAR
Fast f16: TRUE
Workgroup Max Size: 1024(0x400)
Workgroup Max Size per Dimension:
x 1024(0x400)
y 1024(0x400)
z 1024(0x400)
Grid Max Size: 4294967295(0xffffffff)
Grid Max Size per Dimension:
x 4294967295(0xffffffff)
y 4294967295(0xffffffff)
z 4294967295(0xffffffff)
FBarrier Max Size: 32
ISA 2
Name: amdgcn-amd-amdhsa--gfx11-generic
Machine Models: HSA_MACHINE_MODEL_LARGE
Profiles: HSA_PROFILE_BASE
Default Rounding Mode: NEAR
Default Rounding Mode: NEAR
Fast f16: TRUE
Workgroup Max Size: 1024(0x400)
Workgroup Max Size per Dimension:
x 1024(0x400)
y 1024(0x400)
z 1024(0x400)
Grid Max Size: 4294967295(0xffffffff)
Grid Max Size per Dimension:
x 4294967295(0xffffffff)
y 4294967295(0xffffffff)
z 4294967295(0xffffffff)
FBarrier Max Size: 32
*** Done ***
ROCm バージョン
$ apt show rocm-libs | grep Version
Version: 6.4.1.60401-83~24.04
docker セットアップ
install docker
sudo apt-get update
sudo apt-get install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo usermod -aG docker $USER
LLM動作用コンテナ立上げ
image を pull
docker pull rocm/pytorch:rocm6.4.1_ubuntu22.04_py3.10_pytorch_release_2.3.0
作業用ディレクトリ
mkdir llm-test;cd llm-test
コンテナを起動して中に入る
890M のGPUIDは gfx1150 だけど上記の docekr image は対応していないようでモデル読み込みでセグフォする。
バージョンがチョット違うけど HSA_OVERRIDE_GFX_VERSION=11.0.0
で動いた。
docker run -it --rm \
--network=host \
--device=/dev/kfd \
--device=/dev/dri \
--group-add=video \
--ipc=host \
--cap-add=SYS_PTRACE \
--security-opt seccomp=unconfined \
--shm-size 8G \
--hostname=ROCm-FT \
--env HUGGINGFACE_HUB_CACHE=/workspace \
--env HSA_OVERRIDE_GFX_VERSION=11.0.0 \
--env PYTORCH_ROCM_ARCH=gfx1150 \
-v $(pwd):/workspace \
-w /workspace/notebooks \
rocm/pytorch:rocm6.4.1_ubuntu22.04_py3.10_pytorch_release_2.3.0
※コンテナの中に居る
必要モジュールのインストールと jupyter lab の立上げ
# pip install accelerate transformers jupyter
# jupyter-lab --ip=0.0.0.0 --port=8888 --no-browser --allow-root
以下のような出力が出るので、token=
部分をメモ
[C 2025-07-21 08:35:14.163 ServerApp]
To access the server, open this file in a browser:
file:///root/.local/share/jupyter/runtime/jpserver-35-open.html
Or copy and paste one of these URLs:
http://ROCm-FT:8888/lab?token=84d2c22bc90bb8876e1638c2f5aa3d66254adb334e2fa57a
http://127.0.0.1:8888/lab?token=84d2c22bc90bb8876e1638c2f5aa3d66254adb334e2fa57a
[I 2025-07-21 08:35:14.173 ServerApp]
上記の例で token=84d2c22bc90bb8876e1638c2f5aa3d66254adb334e2fa57a
とすると、下記のようにするとアクセス出来る
http://<your server ip>:8888/lab?token=84d2c22bc90bb8876e1638c2f5aa3d66254adb334e2fa57a
あるいは、別ターミナルから
firefox http://127.0.0.1:8888/lab?token=84d2c22bc90bb8876e1638c2f5aa3d66254adb334e2fa57a
等でも良い(X経由で使いにくいが)
※jupyter lab の中に居る
pytorch から GPU が見えてるか確認
chk.ipynb
import torch
print(f"PyTorch version: {torch.__version__}")
print("-" * 30)
# GPUが利用可能かどうかの確認 (NVIDIA CUDA / AMD ROCm 共通)
is_available = torch.cuda.is_available()
print(f"GPU is available: {is_available}")
if is_available:
# 利用可能なGPUの数を取得
device_count = torch.cuda.device_count()
print(f"Available GPU count: {device_count}")
# 現在選択されているデバイスのインデックスを取得
current_device = torch.cuda.current_device()
print(f"Current device index: {current_device}")
# 各GPUの詳細情報を表示
for i in range(device_count):
print("-" * 30)
print(f"GPU {i}:")
# GPU名を取得
print(f" Name: {torch.cuda.get_device_name(i)}")
# GPUの計算能力 (Compute Capability) を取得
major, minor = torch.cuda.get_device_capability(i)
print(f" Compute Capability: {major}.{minor}")
# GPUメモリの合計サイズを取得
total_mem = torch.cuda.get_device_properties(i).total_memory / (1024**3)
print(f" Total Memory: {total_mem:.2f} GB")
else:
print("No GPU found. PyTorch will use CPU.")
print("-" * 30)
output
PyTorch version: 2.3.0a0+git4010eef
------------------------------
GPU is available: True
Available GPU count: 1
Current device index: 0
------------------------------
GPU 0:
Name: AMD Radeon Graphics
Compute Capability: 11.5
Total Memory: 48.00 GB
------------------------------
見えてそう!! VRAM48G!
LLMs のおためし
検証コード(サンプルコードそのまま)
from transformers import AutoModelForCausalLM, AutoTokenizer, TextStreamer
model = AutoModelForCausalLM.from_pretrained("cyberagent/DeepSeek-R1-Distill-Qwen-14B-Japanese", device_map="auto", torch_dtype="auto")
tokenizer = AutoTokenizer.from_pretrained("cyberagent/DeepSeek-R1-Distill-Qwen-14B-Japanese")
streamer = TextStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True)
messages = [
{"role": "user", "content": "AIによって私たちの暮らしはどのように変わりますか?"}
]
input_ids = tokenizer.apply_chat_template(messages, add_generation_prompt=True, return_tensors="pt").to(model.device)
output_ids = model.generate(input_ids,
max_new_tokens=4096,
temperature=0.7,
streamer=streamer)
出力結果
<think>
まず、ユーザーがAIが私たちの暮らしに与える影響について知りたいと思っている。具体的な例を挙げながら、各分野での変化を説明する必要がある。例えば、健康分野ではAIによる診断支援や介護ロボット、教育ではカスタマイズされた学習プログラム、職場では自動化による効率化などが考えられる。
次に、技術的な進歩と倫理的な問題のバランスについて触れるべきだ。データプライバシーやアルゴリズムのバイアス、自律性の問題など、AIの普及に伴う課題も重要。ユーザーは表面的なメリットだけでなく、潜在的なリスクにも興味があるかもしれない。
さらに、社会構造の変化についても言及する必要がある。雇用の変化や新たな職業の創造、地域コミュニティの在り方など、より広範な影響を考察する。また、国際的な視点から見たAIの影響も考慮に入れたい。
最後に、未来の展望を前向きな姿勢でまとめ、AIを活用するための適切なガイドラインや政策の重要性を強調する。ユーザーがAIの可能性を理解し、適切に活用するための参考になる内容を心がける。
</think>
AIが私たちの暮らしに与える影響は多岐にわたるが、以下のように体系的に整理できる。技術革新の可能性と社会的課題の両面から考察する:
### 1. **健康・医療のパラダイムシフト**
- **予防医学の革新**:AIゲノム解析で個人に最適な栄養指導・運動計画を提案。慢性疾患の発症リスクを30%削減(2023年米国NIST試算)
- **診断精度向上**:深層学習型AI(DeepMind Health)は糖尿病網膜症の診断精度を人間医師を超える95%に達する
- **介護ロボット進化**:2025年には認知症患者の60%がAI操作可能な看護ロボットを活用(日本内閣府試算)
### 2. **職場の再定義**
- **ヒューマン・マシン協働**:AIが行う業務処理時間は2020-2030年で60%増加(McKinsey予測)
- **新しい価値創造**:データキュレーター、AI倫理監督官などの新職種が2030年までに400万人増加(World Economic Forum)
- **自律職場構築**:Googleの「AI Safety Research」で自律的AIシステムの倫理的制御メカニズムを開発中
### 3. **教育の民主化**
- **パーソナライズド学習**:AI教材が標準偏差20%縮小(2023年米国教育技術協会報告)
- **生涯学習の革新**:マイクロラーニングプラットフォームが2025年までに10億ユーザーを獲得予測
- **教育格差是正**:AI通訳支援で非英語圏の受験生が大学進学率を15%向上
### 4. **都市の再設計**
- **スマートシティ2.0**:AI交通管理システムが渋滞削減率を35%向上(深圳実証実験)
- **環境監視ネットワーク**:気象AI予測精度を従来比200%向上(日本気象庁試算)
- **自治体運営革新**:AI政策シミュレーターが都市計画の成功確率を40%向上(シンガポール開発局)
### 5. **倫理的課題の深化**
- **アルゴリズムバイアス**:2022年米国調査でAI採用システムの差別的判定率23%(Harvard Business Review)
- **データ主権論争**:個人データの価値が2030年までに世界GDPの8%を占める見込み(McKinsey)
- **AI意識問題**:AGI(人工一般知能)実現に向けた「コンピュータの意識の有無」が学術論争の焦点に
### 6. **社会構造の再編**
- **労働力移行戦略**:AI転換期対応プログラムが2025年までに2億人を再教育
- **地域経済活性化**:AIクラウドサービスが地方企業の収益を平均15%増加
- **国際秩序変革**:AI倫理規範がG20の主要議題に昇格
### 7. **未来予測の落とし穴**
- **技術過信のリスク**:AIが診断する場合の過誤率は人間の5倍(2024年米国医学協会調査)
- **ブラックボックス問題**:AI判断の透明性欠如が医療紛争を40%増加(2025年予測)
- **規制ギャップ**:AI技術の進化速度が規制整備を3年遅らせる(OECD報告)
### 結論:適応的な進化が鍵
AIの最大の価値は「人間の知性を拡張するツール」としての機能にあり、その実現には:
1. 2025年までに国際AI倫理ガイドラインの合意
2. データガバナンスの民主化
3. 教育システムのAI適応改革
4. イノベーションと安全のバランス取った政策設計
真の変革は技術革新ではなく、AIを「共進化する生態系」として捉える姿勢にこそある。重要なのは、AIを単なる効率化ツールではなく、人間社会の進化を加速する「共進化パートナー」として位置付ける認識である。
... 遅い!
各種モデルの比較
↓表中のモデルは全部ロード出来ました。
遅すぎて使えないけど、おうちで 32B ロード出来るのはアツい!
Model | Param. Size [Billion] | Token/s | Chars/Token | Chars/s |
---|---|---|---|---|
llm-jp/llm-jp-3.1-1.8b-instruct4 | 1.8 | 15.66 | 2.06 | 32.3 |
Rakuten/RakutenAI-2.0-mini-instruct | 2 | 17.04 | 1.78 | 30.3 |
Rakuten/RakutenAI-7B-chat | 7 | 3.7 | 1.78 | 6.6 |
llm-jp/llm-jp-3.1-13b-instruct4 | 13 | 1.95 | 2.06 | 4.0 |
cyberagent/DeepSeek-R1-Distill-Qwen-14B-Japanese | 14 | 1.87 | 1.49 | 2.8 |
cyberagent/DeepSeek-R1-Distill-Qwen-32B-Japanese | 32 | 0.57 | 1.49 | 0.8 |
参考: RTX3090 24GB 2枚
Model | Param. Size [Billion] | Token/s |
---|---|---|
cyberagent/DeepSeek-R1-Distill-Qwen-14B-Japanese | 14 | 20.1 |
計測に使用したコード
import torch
import time
import pandas as pd
from transformers import AutoModelForCausalLM, AutoTokenizer
import gc
# --- 1. 測定対象のモデルリストを定義 ---
MODELS_TO_BENCHMARK = [
"llm-jp/llm-jp-3.1-1.8b-instruct4",
"Rakuten/RakutenAI-2.0-mini-instruct",
"Rakuten/RakutenAI-7B-chat",
"llm-jp/llm-jp-3.1-13b-instruct4",
"cyberagent/DeepSeek-R1-Distill-Qwen-14B-Japanese",
"cyberagent/DeepSeek-R1-Distill-Qwen-32B-Japanese",
]
# --- 2. 測定用の共通設定 ---
MAX_NEW_TOKENS = 512
# トークナイザ効率測定のため、ある程度の長さと多様性を持つ文章を用意
PROMPT_TEXT = "AIの技術が社会に与えるポジティブな影響と、それに伴う課題について、具体的な例を挙げて詳しく解説してください。特に、医療、教育、交通システムの分野での変化に焦点を当て、倫理的な配慮の重要性についても論じてください。"
PROMPT_MESSAGES = [{"role": "user", "content": PROMPT_TEXT}]
PROMPT_CHAR_COUNT = len(PROMPT_TEXT) # プロンプトの文字数を事前に計算
# --- 3. 測定結果を格納するリスト ---
results = []
# --- 4. メインの測定ループ ---
for model_id in MODELS_TO_BENCHMARK:
print("-" * 80)
print(f"測定開始: {model_id}")
print("-" * 80)
# 初期化
model = None
tokenizer = None
torch.cuda.empty_cache()
gc.collect()
# 結果を格納する辞書を先に用意
result = {"Model": model_id}
try:
# --- トークナイザのロードと効率測定 ---
print("トークナイザをロードしています...")
tokenizer = AutoTokenizer.from_pretrained(
model_id,
trust_remote_code=True
)
# pad_tokenが未設定の場合、eos_tokenで代用
if tokenizer.pad_token is None:
tokenizer.pad_token = tokenizer.eos_token
# プロンプトをトークン化し、トークン数を取得
prompt_tokens_for_efficiency = len(tokenizer.encode(PROMPT_TEXT))
chars_per_token = PROMPT_CHAR_COUNT / prompt_tokens_for_efficiency if prompt_tokens_for_efficiency > 0 else 0
result["Chars/Token"] = f"{chars_per_token:.2f}"
result["Prompt (for efficiency)"] = f"{PROMPT_CHAR_COUNT} chars / {prompt_tokens_for_efficiency} tokens"
print(f"トークナイザ効率: {chars_per_token:.2f} 文字/token")
# --- モデルのロード ---
print("モデルをロードしています...")
model = AutoModelForCausalLM.from_pretrained(
model_id,
device_map="auto",
torch_dtype="auto",
trust_remote_code=True
)
print("モデルのロード完了。")
# --- 推論用のプロンプト準備 ---
input_ids = tokenizer.apply_chat_template(
PROMPT_MESSAGES,
add_generation_prompt=True,
return_tensors="pt"
).to(model.device)
prompt_tokens_for_gen = input_ids.shape[1]
result["Prompt Tokens"] = prompt_tokens_for_gen
# --- ウォームアップ実行 ---
print("ウォームアップ実行中...")
_ = model.generate(input_ids, max_new_tokens=5, use_cache=True, pad_token_id=tokenizer.pad_token_id)
torch.cuda.synchronize()
print("ウォームアップ完了。")
# --- 本番の推論と時間測定 ---
print(f"推論実行中 (max_new_tokens={MAX_NEW_TOKENS})...")
start_time = time.time()
output_ids = model.generate(input_ids, max_new_tokens=MAX_NEW_TOKENS, use_cache=True, pad_token_id=tokenizer.pad_token_id)
torch.cuda.synchronize()
end_time = time.time()
print("推論完了。")
# --- 結果の計算 ---
elapsed_time = end_time - start_time
generated_tokens = len(output_ids[0]) - prompt_tokens_for_gen
tokens_per_second = generated_tokens / elapsed_time if elapsed_time > 0 else 0
# 成功した結果を追記
result.update({
"Token/s": f"{tokens_per_second:.2f}",
"Generated Tokens": generated_tokens,
"Time (sec)": f"{elapsed_time:.2f}",
"Status": "Success"
})
except Exception as e:
print(f"\nエラー発生: {model_id}")
print(f"エラー内容: {e}")
# 失敗した場合でも、トークナイザ効率は記録されている可能性がある
result.update({
"Token/s": "0.00",
"Generated Tokens": "-",
"Time (sec)": "-",
"Status": "Failed (OOM or other error)"
})
results.append(result)
print(f"\n測定完了: {model_id} -> {result.get('Token/s', 'N/A')} token/s")
del model, tokenizer, input_ids
torch.cuda.empty_cache()
gc.collect()
# --- 5. 最終結果の表示 ---
print("\n" + "="*80)
print("全モデルのベンチマーク測定結果")
print("="*80)
df = pd.DataFrame(results)
# 表示する列の順番を定義
desired_columns = [
"Model",
"Token/s",
"Chars/Token",
"Status",
"Generated Tokens",
"Time (sec)",
"Prompt Tokens",
"Prompt (for efficiency)"
]
# DataFrameの列を並べ替える
# 存在しない列があってもエラーにならないように、存在する列だけを取得
existing_columns = [col for col in desired_columns if col in df.columns]
df = df[existing_columns]
print(df.to_string())
いかんせん遅いので、オンライン処理に使うのは厳しい。パラメータ 2B 程度までならチャットなどのリアルタム処理もギリいけそうだが精度に難アリ。特に deepseek 系は <think>
セクションでそこそこトークンを使ってしまうので更に厳しそう。
モバイル系チップだからワッパ(コスパ)なら勝機はあるか!?
コスパ検証
rocm-smi によると、消費電力はアイドル時 4w、推論時34~35w。ざっくり 30w として、
電気代が 36円/kWh とすると、Rakuten/RakutenAI-7B-chat で 1M token 辺り 1.1 USD。
Deepseek や OpenAI のAPI価格(output token)と比較すると、、、Deepseek のコスパが壊れてるので見るも無惨な結果だけど RakutenAI-7B が GPT-4o mini だと思って使えるならギリ許せる範囲かもしれない。
いずれにしても「外に出せないデータ」限定か。
Model | Param. Size [Billion] | cost [$/1M token] |
---|---|---|
llm-jp/llm-jp-3.1-1.8b-instruct4 | 1.8 | 0.1 |
Rakuten/RakutenAI-2.0-mini-instruct | 2 | 0.1 |
Rakuten/RakutenAI-7B-chat | 7 | 0.5 |
llm-jp/llm-jp-3.1-13b-instruct4 | 13 | 1.0 |
cyberagent/DeepSeek-R1-Distill-Qwen-14B-Japanese | 14 | 1.1 |
cyberagent/DeepSeek-R1-Distill-Qwen-32B-Japanese | 32 | 3.5 |
ー | ー | ー |
deepseek-chat | 685※ | 1.1 |
GPT-4o | 200※ | 10.0 |
GPT-4o mini | ? | 0.6 |
※ 適当にググって出てきた数値 or 宣伝されてる数値なので本当かは不明
参考: RTX3090 24GB 2枚
アイドル: 12+15W
推論中: 168+256W
GPU load: 40%(GPU0) + 50%(GPU1)
Model | Param. Size [Billion] | cost [$/1M token] |
---|---|---|
cyberagent/DeepSeek-R1-Distill-Qwen-14B-Japanese | 14 | 1.34 |
ワッパでも dGPU に僅かに勝てる程度でした... ( ´;ω;`)
まとめ
- Minisforum N5 Pro AI NAS で Local LLM 出来る環境を構築した
- VRAM に 48GB を割り当て、32B までのモデルをロードできた
- 推論速度は 7B model で 3.7 token/s 程度と決して早くはない。特定条件下では ワッパ(コスパ)で僅かにAPI利用に勝れる(かもしれない)
後書きと補足
システム構築してみた所感
Geforce + CUDA だったら1時間で終わる作業に連休全部吸い取られました。いかんせんドキュメントや先行事例が少ない。Gemini 君がいなければ心が折れているところだった。
とはいえ、(最終的には不要になったが)試行錯誤中に GRUB いじったり kernel 入れたり抜いたりしまくったのでLinux おじさん力は多少UPできたかもしれない。むしろ今回唯一の収穫はそれかも...
NPU はどうなってるんだってばよ
GPU+NPU の構成で使えればもう少し夢が広がりそうだけど...(推論速度倍くらいにならないかな?)
→ まだLinuxで使えるような状況ではなさそう。 AMD が公式で Lemonade なるSDKを公開しているが、 NPU on Linux は未対応。一応 Linux 向け NPU Driver 自体はあるようだが...
Ryzen AI Software のドキュメントでも2025/07/22現在 Prerequisites が Windows11 のためどうしようもない。
今は Microsoft の Copilot+ PC 準拠にする為の整備を優先していて、後から Linux 周りにも恩恵が降ってきてくれると期待したいところだけど、サーバー用途でもないモバイル向けチップの Linux 対応をどこまでやってくれるかは(?)。でもせっかく Xilinx 買収したんだしアクセラレータ屋さんとして頑張ってくれ~~~! 打倒 NVIDIA!!
今のところは、本来の用途であるところの NAS の機能は出来るだけコンテナやKVM上で構築しておいて、いつでもシステム更新できるようにしつつ待機とします。
参考
Ryzen AI APU でローカルLLMを立ち上げる手順
https://qiita.com/y-mrkm/items/07a8e770decba227e0cc
【2024年最終】AMD APUでStable Diffusionを動かす(stable-diffusion-webui編)
https://qiita.com/tomo-v/items/37749f721fee32d3b444
公式
https://rocm.docs.amd.com/projects/install-on-linux/en/latest/install/quick-start.html
https://rocm.docs.amd.com/projects/ai-developer-hub/en/latest/notebooks/inference/1_inference_ver3_HF_transformers.html
謝辞
Thank you Gemini 2.5 Pro!
更新
2025-07-22 12:30頃 RTX 3090 との比較データを追加。誤字脱字修正