てんやわんやの大改造-GPUの組み替え

Artificial Intelligence

WindowsマシンからLinuxマシンへの転換を図る

あれからWindowsマシンにIntel ARC PRO B70を入れて動かし始めたわけですが、ここで悲劇が一つ起きましたです。なんと、Windowsの地雷を踏みました。それはこれ。

【2026年6月】セキュリティ証明書の期限切れとは? Windows PC・セキュアブートへの影響と今すぐできる対策 – PC WRAPブログ
2026年6月のセキュリティ証明書期限切れでWindows PCは本当に使えなくなる?セキュアブートへの影響、対象となるPC、確認方法、Windows 10・11の違い、今すぐできる対策をわかりやすく解説します。

引用させてもらったものではありますが、2026年6月をもって、2011年に発行されたSecure Boot証明書の有効期限が切れるというお話です。私のこのマシン、実は2023年の証明書が発行された場合にそれをデフォルトストアとして保存しとく機能がありません。というか、2021年以降BIOSの更新が全く成されてません。

どこかのタイミングでどうやら SecureBootRecovery.efi の仕様が新しいものに変わったようでして、Signitureの突き合わせが出来なくなり、起動できなくなりました。ってか、どのタイミングで一時保存はされてるはずのSignitureが飛んだのかどうかは分かりませんが、昨日(9/5)の早朝にこれに気づきました。取り敢えず執る手段としてその時点でとったのはWindows 11の初期化でしたけれども、初期化してみると色々な設定が吹っ飛ぶんですよね。

その時に「ああ、下手な貧乏くじを引かされた結果になったなぁ」と思ったと同時に「コイツもうめんどいからLinuxマシンにしようか」という思いに至り、SecureBootを無効化した上でコイツをLinuxにすることにしました。で、こんな流れで対応しています。

  • Z440からSSD2台を摘出し、このIN WINマシンにぶっ込む(NVMe-SSDは念のため触らずに残す)
  • Windowsマシンは元々持ってるhp ZBOOK 14u G6に移行。移行データはファイルサーバに全投げ。
  • お仕事のデータは元々ファイルサーバに投入してたので影響なし

LinuxはSSDに入ってるものをそのまま使う

SSDはZ440に居る頃から変わらずでそのSSD内に入ってるものをそのまま使います。
中にはDockerのイメージデータやら更新済みカーネルやら色々は言ってるので、それらをそのまま使うイメージです。ただ、Kernel 7.0.0.30では色々不具合も多くて困ったことから、一度ダウングレードして6.17.0-42に更新し直しています。

SATAポートに突っ込んだスロットの関係で、sdaとsdbが入れ替わりましたが、そこは /etc/fstab を変更すれば良いだけの話でしたので、この点はわりかしスムーズに行きました。

Intel GPUのドライバを最新化する

これが一番手間かかりました。

llama.cpp/docs/backend/SYCL.md at master ツキ ggml-org/llama.cpp
LLM inference in C/C++. Contribute to ggml-org/llama.cpp development by creating an account on GitHub.

ここに書かれてる内容に沿っていくと、以下の対応が必要になりそうです。

Installing Intel® Open Middleware Xe — Intel® software for general purpose GPU capabilities documentation

Intel ARC PRO B70を入れてる場合はIntel Open Middleware Xeが必要らしいということで、これの手順を実践しています。なお、Get Intel dGPU Drivers.と書かれてるのは、恐らくGaudi系のGPUだと思われますので間違ってこれを実行しないように。逆にXeが認識できなくなります。

よくよく考えてみるとXeって IrisXe からきてるんでしょうから、Intel ARC PRO B70 も同じ系列の技術と考えればなる程って感じがしますね。

2の手順で示される以下の部分はファイルで <適当な名前>.sh とかで保存し、その後 bash <適当な名前>sh とかで実行させると良いでしょう。

. /etc/os-release
if [[ ! " resolute noble " =~ " ${VERSION_CODENAME} " ]]; then
    echo "Ubuntu version ${VERSION_CODENAME} not supported"
else
    echo "deb [arch=amd64 signed-by=/usr/share/keyrings/intel-graphics.gpg] https://repositories.intel.com/gpu/ubuntu ${VERSION_CODENAME}/intel-omix/0.3 unified" | \
    sudo tee /etc/apt/sources.list.d/intel-gpu-${VERSION_CODENAME}.list
    sudo apt update
fi

そして intel-omix 及び intel-omix-dev をインストールして reboot すればこれらは無事入りまっす。
clinfo をガイド通りに実行すると、こんな風に出力されました。

Platform #0: NVIDIA CUDA
 `-- Device #0: NVIDIA GeForce RTX 3060
Platform #1: Intel(R) OpenCL Graphics
 `-- Device #0: Intel(R) Arc(TM) Pro B70 Graphics

実は最初の頃は、このデバイス#0となっているRTX 3060がでてきませんでした。コレも色々苦労話があるので後で書きます。

SYCL環境で実行するには必ず打たなきゃならぬスクリプトがある

Linux環境のSYCLを実行するために必要な環境変数群として、 /opt/intel/oneapi/setvars.sh があります。
これ、簡単にコピーして終わりみたいな感じのシェルスクリプトじゃなかったので、llama.cppを操作する度にこれを打たせるようにスクリプトを仕込んでいます。例えば、Muse Glimmer用の起動スクリプトはこんな感じ。

#!/usr/bin/bash
source /opt/intel/oneapi/setvars.sh

export ONEAPI_DEVICE_SELECTOR="level_zero:0"
/opt/llama/bin/llama-server --model /opt/llama/models/Muse-Glimmer-30B-UD-Q4_K_XL.gguf -t 20 \
  -np 1 --prio 2 --temp 1.0 --top-p 0.95 --top-k 64 --host 0.0.0.0 --port 8051 -mg 0 -sm layer \
  --fit on --no-warmup --no-cache-prompt -fa on --cache-ram 0 -c 131072 -b 2048 -ub 2048 --reasoning on --log_verbosity 4 \
  --model-draft /opt/llama/models/Muse-Glimmer-30B-DFlash2-Q4_K_M.gguf \
  --spec-type draft-dflash --spec-draft-n-max 4 \
  --mmproj /opt/llama/models/mmproj-MuseGlimmer-kquant.gguf

こんな風にして環境変数を合わせてうまく実行させるようにしないと、いざ実行時にライブラリファイルとうまくリンクできずに起動できなくなります。こうしたsystemdからの直接実行から、シェルスクリプトを介した実行形式に一通り修正する必要が出てきました。

とは言え、それ以外はSYCL環境でも十分良い感じで動いてくれたので、終わり良ければ全てよしかなと思います。

PCI Express x16スロットは「デカい方から挿していこう」で

最初、私は物理的な位置を気にしてたりしましたので、PCI Express x16スロットの2番目(一番下段のスロット)にIntel ARC PRO B70を挿していました。その間にスペーサーを仕込んで重量負荷を下げたかったのが理由です。ところがこれが良くなかったようで、なんと情けないことにこれが原因でIntel ARC PRO B70の動きは不安定だし、RTX 3060は認識すらされていませんでした。

私自身完全に勘違いしてたことなんですが、 ASUS ROG STRIX H370-F GAMING ってマザーボードは、2番目のPCI-Ex16スロット、実質x4スロットだったんですね。

これが原因でアドレス要求指定に狂いが生じてでたらめに大きなリソース要求を発生させて他のボードの認識を阻害してたようです。入れてたスペーサーが原因でファンが回り出すと共振が起き、家中に強烈な重低音を響かせる羽目になりましたし、なかなか踏んだり蹴ったりでした。

途中でこの2番目スロットのレーンがx4と分かって、デバイスを入れ替えてみたところ正常に認識しまして、もうスペーサーとか設置せずに横置きで動かしていこうと決めてからは比較的スムーズに認識をさせることができるようになりました。

お陰様で今は 32 + 14 = 44 GiB のVRAMを備える環境として検証の幅を広げることがどうやら出来そうです。

今までの環境ではどうしてもZ440の電源制約(GPU用は6pin x2しかない状況)で選べる選択肢が少ない中で色々考えないといけないところが多くあったのですが、やっぱり然るべきハードを準備しないことにはうまくいかないんだなぁと認識を改めたところです。とは言え、Xeon E5が使えなくなったのは少し痛いと言えばいたいので、その内自己環境の見直しを本格的に行って然るべき設備を整えたいなぁと感じているところではあります。

なお、スロット入れ替え後のARC PROは非常に元気でして、推論スピードも以下のように安定してました。

0.55.921.222 I srv  update_slots: all slots are idle
1.23.528.755 I srv  server_strea: conv_id= (empty=1)
1.23.584.445 I srv    operator(): chat format: peg-native
1.23.595.651 I slot get_availabl: id  0 | task -1 |  - skipping, slot is empty
1.23.595.654 I slot get_availabl: id  0 | task -1 | selected slot by LRU, t_last = -1
1.23.603.137 I slot launch_slot_: id  0 | task -1 | sampler chain: logits -> ?penalties -> ?dry -> ?top-n-sigma -> top-k -> ?typical -> top-p -> min-p -> ?xtc -> ?temp-ext -> dist
1.23.603.146 I slot launch_slot_: id  0 | task -1 | sampler params:
        repeat_last_n = 64, repeat_penalty = 1.000, frequency_penalty = 0.000, presence_penalty = 0.000
        dry_multiplier = 0.000, dry_base = 1.750, dry_allowed_length = 2, dry_penalty_last_n = 64
        top_k = 64, top_p = 0.950, min_p = 0.050, xtc_probability = 0.000, xtc_threshold = 0.100, typical_p = 1.000, top_n_sigma = -1.000, temp = 1.000
        mirostat = 0, mirostat_lr = 0.100, mirostat_ent = 5.000, adaptive_target = -1.000, adaptive_decay = 0.900
1.23.603.149 I slot launch_slot_: id  0 | task 0 | processing task, is_child = 0
1.23.603.157 I slot   operator(): id  0 | task 0 | new prompt, n_ctx_slot = 131072, n_keep = 0, task.n_tokens = 13307
1.23.603.163 I slot   operator(): id  0 | task 0 | cached n_tokens = 0, memory_seq_rm [0, end)
1.23.603.617 I sched_reserve: reserving ...
1.23.649.914 I sched_reserve:      SYCL0 compute buffer size =  1360.07 MiB
1.23.649.918 I sched_reserve:  SYCL_Host compute buffer size =   632.08 MiB
1.23.649.919 I sched_reserve: graph nodes  = 2169
1.23.649.919 I sched_reserve: graph splits = 2
1.23.649.920 I sched_reserve: reserve took 46.29 ms, sched copies = 1
1.26.878.973 I slot   operator(): id  0 | task 0 | cached n_tokens = 2048, memory_seq_rm [2048, end)
1.29.395.537 I slot print_timing: id  0 | task 0 | prompt processing, n_tokens =   4096, progress = 0.31, t =   5.39 s / 760.28 tokens per second
1.29.395.539 I slot   operator(): id  0 | task 0 | cached n_tokens = 4096, memory_seq_rm [4096, end)
1.32.023.254 I slot print_timing: id  0 | task 0 | prompt processing, n_tokens =   6144, progress = 0.46, t =   8.01 s / 767.01 tokens per second
1.32.023.257 I slot   operator(): id  0 | task 0 | cached n_tokens = 6144, memory_seq_rm [6144, end)
1.34.750.772 I slot print_timing: id  0 | task 0 | prompt processing, n_tokens =   8192, progress = 0.62, t =  10.74 s / 762.79 tokens per second
1.34.750.774 I slot   operator(): id  0 | task 0 | cached n_tokens = 8192, memory_seq_rm [8192, end)
1.37.587.984 I slot print_timing: id  0 | task 0 | prompt processing, n_tokens =  10240, progress = 0.77, t =  13.57 s / 754.40 tokens per second
1.37.587.987 I slot   operator(): id  0 | task 0 | cached n_tokens = 10240, memory_seq_rm [10240, end)
1.38.221.483 I slot print_timing: id  0 | task 0 | prompt processing, n_tokens =  10403, progress = 0.78, t =  14.58 s / 713.35 tokens per second
1.38.221.485 I slot   operator(): id  0 | task 0 | cached n_tokens = 10403, memory_seq_rm [10403, end)
1.38.273.838 I slot create_check: id  0 | task 0 | created context checkpoint 1 of 32 (pos_min = 6307, pos_max = 10402, n_tokens = 10403, size = 118.048 MiB)
1.39.732.991 I slot print_timing: id  0 | task 0 | prompt processing, n_tokens =  11259, progress = 0.85, t =  15.95 s / 705.68 tokens per second
1.39.732.994 I slot   operator(): id  0 | task 0 | cached n_tokens = 11259, memory_seq_rm [11259, end)
1.39.790.255 I slot create_check: id  0 | task 0 | created context checkpoint 2 of 32 (pos_min = 7163, pos_max = 11258, n_tokens = 11259, size = 118.048 MiB)
1.42.783.577 I slot print_timing: id  0 | task 0 | prompt processing, n_tokens =  13303, progress = 1.00, t =  18.77 s / 708.69 tokens per second
1.42.783.579 I slot   operator(): id  0 | task 0 | cached n_tokens = 13303, memory_seq_rm [13303, end)
1.42.784.874 I slot init_sampler: id  0 | task 0 | init sampler, took 1.11 ms, tokens: text = 13307, total = 13307
1.42.834.361 I slot create_check: id  0 | task 0 | created context checkpoint 3 of 32 (pos_min = 9207, pos_max = 13302, n_tokens = 13303, size = 118.048 MiB)
1.47.145.847 I slot print_timing: id  0 | task 0 | n_gen =    104, tg =  24.39 t/s, tg_3s =  24.63 t/s
1.50.191.695 I slot print_timing: id  0 | task 0 | n_gen =    186, tg =  25.45 t/s, tg_3s =  26.92 t/s
1.53.234.310 I slot print_timing: id  0 | task 0 | n_gen =    258, tg =  24.92 t/s, tg_3s =  23.66 t/s
1.56.276.852 I slot print_timing: id  0 | task 0 | n_gen =    324, tg =  24.19 t/s, tg_3s =  21.69 t/s
1.59.332.150 I slot print_timing: id  0 | task 0 | n_gen =    405, tg =  24.62 t/s, tg_3s =  26.51 t/s
2.02.382.545 I slot print_timing: id  0 | task 0 | n_gen =    479, tg =  24.56 t/s, tg_3s =  24.26 t/s
2.05.438.759 I slot print_timing: id  0 | task 0 | n_gen =    553, tg =  24.52 t/s, tg_3s =  24.21 t/s
2.08.501.670 I slot print_timing: id  0 | task 0 | n_gen =    628, tg =  24.51 t/s, tg_3s =  24.49 t/s
2.11.571.080 I slot print_timing: id  0 | task 0 | n_gen =    706, tg =  24.61 t/s, tg_3s =  25.41 t/s
2.14.639.780 I slot print_timing: id  0 | task 0 | n_gen =    763, tg =  24.03 t/s, tg_3s =  18.57 t/s
2.17.712.895 I slot print_timing: id  0 | task 0 | n_gen =    824, tg =  23.66 t/s, tg_3s =  19.85 t/s
2.20.796.221 I slot print_timing: id  0 | task 0 | n_gen =    912, tg =  24.05 t/s, tg_3s =  28.54 t/s
2.23.881.658 I slot print_timing: id  0 | task 0 | n_gen =   1005, tg =  24.51 t/s, tg_3s =  30.14 t/s
2.26.966.069 I slot print_timing: id  0 | task 0 | n_gen =   1071, tg =  24.29 t/s, tg_3s =  21.40 t/s
2.30.055.657 I slot print_timing: id  0 | task 0 | n_gen =   1158, tg =  24.55 t/s, tg_3s =  28.16 t/s
2.33.150.810 I slot print_timing: id  0 | task 0 | n_gen =   1259, tg =  25.05 t/s, tg_3s =  32.63 t/s
2.36.240.694 I slot print_timing: id  0 | task 0 | n_gen =   1332, tg =  24.96 t/s, tg_3s =  23.63 t/s
2.39.331.901 I slot print_timing: id  0 | task 0 | n_gen =   1410, tg =  24.98 t/s, tg_3s =  25.23 t/s
2.42.432.472 I slot print_timing: id  0 | task 0 | n_gen =   1514, tg =  25.42 t/s, tg_3s =  33.54 t/s
2.45.531.617 I slot print_timing: id  0 | task 0 | n_gen =   1601, tg =  25.56 t/s, tg_3s =  28.07 t/s
2.48.630.707 I slot print_timing: id  0 | task 0 | n_gen =   1684, tg =  25.61 t/s, tg_3s =  26.78 t/s
2.51.730.468 I slot print_timing: id  0 | task 0 | n_gen =   1753, tg =  25.46 t/s, tg_3s =  22.26 t/s
2.54.831.083 I slot print_timing: id  0 | task 0 | n_gen =   1827, tg =  25.39 t/s, tg_3s =  23.87 t/s
2.57.938.376 I slot print_timing: id  0 | task 0 | n_gen =   1912, tg =  25.47 t/s, tg_3s =  27.35 t/s
3.01.040.771 I slot print_timing: id  0 | task 0 | n_gen =   1987, tg =  25.42 t/s, tg_3s =  24.17 t/s
3.04.149.746 I slot print_timing: id  0 | task 0 | n_gen =   2070, tg =  25.47 t/s, tg_3s =  26.70 t/s
3.07.158.073 I slot print_timing: id  0 | task 0 | n_gen =   2177, tg =  25.83 t/s, tg_3s =  35.57 t/s
3.10.163.179 I slot print_timing: id  0 | task 0 | n_gen =   2261, tg =  25.91 t/s, tg_3s =  27.95 t/s
3.13.172.327 I slot print_timing: id  0 | task 0 | n_gen =   2391, tg =  26.48 t/s, tg_3s =  43.20 t/s
3.16.173.146 I slot print_timing: id  0 | task 0 | n_gen =   2480, tg =  26.58 t/s, tg_3s =  29.66 t/s
3.19.288.124 I slot print_timing: id  0 | task 0 | n_gen =   2557, tg =  26.52 t/s, tg_3s =  24.72 t/s
3.21.594.062 I slot print_timing: id  0 | task 0 | prompt eval time =   19319.88 ms / 13307 tokens (    1.45 ms per token,   688.77 tokens per second)
3.21.594.065 I slot print_timing: id  0 | task 0 |        eval time =   98670.82 ms /  2603 tokens (   37.92 ms per token,    26.37 tokens per second)
3.21.594.066 I slot print_timing: id  0 | task 0 |       total time =  117990.71 ms / 15910 tokens
3.21.594.068 I slot print_timing: id  0 | task 0 |    graphs reused =        851
3.21.594.072 I slot print_timing: id  0 | task 0 | draft acceptance = 0.50406 ( 1740 accepted /  3452 generated), mean len =  3.02
3.21.594.072 I slot print_timing: id  0 | task 0 |      acc per pos = (0.820, 0.561, 0.373, 0.262)

このデバイスを追加したことで、やっとMuse Glimmer 30BモデルをUD-Q4_K_XLで動かせるようになりました。そして、その速度もDflash-2のお陰か、25-30tok/sで出力できるようになっており、本当にARC様々となっています。小規模モデルは3060で安定的に動かし、中規模モデルはARCで動かす、そんな環境にやっとたどり着いたと言って良いのかな。今後も色々調査し続けていくのでよろしくお願いします<(_ _)>

コメント

タイトルとURLをコピーしました