うちにはどうでもいい家訓?があって、「グラボは5000円まで」というのがある。AGPバス全盛の時は、そんな値段のグラフィックカードでも普通に使えて困らなかった。なので、昔からグラフィックカードなんて投資する習慣がなかった。しかし、今やAI全盛の時代。グラフィックカードではなくて、GPUが必須になる。しかし、Nvidiaのグラフィックカードなんて持っていない。ふと気がついたのだが、Intel CPUって今やGPU内蔵だから使えるのではないかと。この先、アップしていくが、結論からすると、GPUというパーツが付いているだけで、ゴミに近いことが後で判明。
見回してみると、NUCやMini PC、NASにまでiGPUが付いているから使ってみようというのが、今回のブログ。
閑話休題
とはいえ、まずは作ったり消したりするので、仮想マシンにGPUをパススルーしてつかってみようと思う。手元のESXでGPUをパススルーしてみた。物理サーバでやる人はもちろん不要。
ESXのGPUのパススルーの方法
以下でグラフィックカードを指定して、Toggle passthroughをクリック
以下のようにアクティブになる。
また、SSHでESXにログインをして、以下を実行しておかないと、ESX再起動時にPCIパススルーが無効になってしまう。
esxcli system settings kernel set -s vga -v FALSE
VGAは、仮想マシンに持って行かれてしまうので、ESXのコンソールで立ち上がっているDCUIを使いたい場合は、SSHでログインをして、
TERM=xterm
dcui
とするとSSHの画面で利用可能になる。
仮想マシンでのPCIパススルーの設定
注意:この設定をすると
- VM間でGPUの共有はできない。つまりVM1つでしか利用できない。
- Nestの仮想化は使えない。よって、仮想マシン内でKVMとか、Hyper-Vが使えなくなる。
- スナップショットが使えない。
となる。
普段使っているテンプレートでVMを建てて、そこで、一度、スナップショットを作成しておき、起動する前にPCIパススルーを設定しておき、後でスナップショットを戻した場合、PCIパススルーが外れた状態でスナップショットが戻る。スナップショットから起動するときに再度PCIパススルーを指定する必要があるが、検証が楽になる。
PCIデバイスを追加
CPUの仮想化を無効にしないと保存ができない。
Ubuntu Server 24.04を使って実際にPCIパススルーをしてみた。
起動して、PCIパススルーを確認してみる。
lspci -tvnn
以下、PCIパススルーされていないVM
# lspci -tvnn
-+-[0000:00]-+-00.0 Intel Corporation 440BX/ZX/DX – 82443BX/ZX/DX Host bridge [8086:7190]
| +-01.0-[01]—
| +-07.0 Intel Corporation 82371AB/EB/MB PIIX4 ISA [8086:7110]
| +-07.1 Intel Corporation 82371AB/EB/MB PIIX4 IDE [8086:7111]
| +-07.3 Intel Corporation 82371AB/EB/MB PIIX4 ACPI [8086:7113]
| +-07.7 VMware Virtual Machine Communication Interface [15ad:0740]
| \-0f.0 VMware SVGA II Adapter [15ad:0405]
\-[0000:02]-+-00.0 VMware PVSCSI SCSI Controller [15ad:07c0]
+-01.0 VMware VMXNET3 Ethernet Controller [15ad:07b0]
\-02.0 VMware SATA AHCI controller [15ad:07e0]
以下、PCIパススルーされているVM
# lspci -tvnn
-+-[0000:00]-+-00.0 Intel Corporation 440BX/ZX/DX – 82443BX/ZX/DX Host bridge [8086:7190]
| +-01.0-[01]—
| +-07.0 Intel Corporation 82371AB/EB/MB PIIX4 ISA [8086:7110]
| +-07.1 Intel Corporation 82371AB/EB/MB PIIX4 IDE [8086:7111]
| +-07.3 Intel Corporation 82371AB/EB/MB PIIX4 ACPI [8086:7113]
| +-07.7 VMware Virtual Machine Communication Interface [15ad:0740]
| -0f.0 VMware SVGA II Adapter [15ad:0405]
-[0000:02]-+-00.0 VMware PVSCSI SCSI Controller [15ad:07c0]
+-01.0 VMware VMXNET3 Ethernet Controller [15ad:07b0]
+-02.0 VMware SATA AHCI controller [15ad:07e0]
-03.0 Intel Corporation TigerLake-LP GT2 [Iris Xe Graphics] [8086:9a49]
ls -l /dev/dri
total 0
drwxr-xr-x 2 root root 120 Sep 4 14:05 by-path
crw-rw—- 1 root video 226, 0 Sep 4 14:05 card0
crw-rw—- 1 root video 226, 1 Sep 4 14:05 card1
crw-rw—- 1 root render 226, 128 Sep 4 14:05 renderD128
crw-rw—- 1 root render 226, 129 Sep 4 14:05 renderD129
Intel_gpu_topでGPUの動きを確認できるようにする。
sudo apt install -y intel-gpu-tools
以後別のログインセッションで、intel_gpu_topを実行して表示をしておく。
sudo intel_gpu_top
GPUが利用できるようになったのが確認できたので、GPUを使うアプリケーション hashcatでテストをしてみる
intel-level-zero-gpuのインストール
sudo apt update
sudo apt install -y software-properties-common
sudo add-apt-repository -y ppa:kobuk-team/intel-graphics
sudo apt update
sudo apt-get install -y libze-intel-gpu1 intel-gsc intel-opencl-icd clinfo libze1
参考:少々古いバージョンであれば、Ubuntuの標準レポジトリから実はインストールが可能
sudo apt update
sudo apt install -y ocl-icd-libopencl1 intel-opencl-icd clinfo libze1
ocl-icd-opencl-dev
CPU用の OpenCL ICD(runtime) CPU OpenCL runtimeを入れる。
sudo apt install -y pocl-opencl-icd
動作確認
clinfo | egrep 'Platform Name|Device Name|Device Type’
– Platform Name に “Intel”、Device Type: GPU が出ればOK。
root@rlug-dev:~# clinfo | egrep ‘Platform Name|Device Name|Device Type’
Platform Name Intel(R) OpenCL Graphics
Platform Name Portable Computing Language
Platform Name Intel(R) OpenCL Graphics
Device Name Intel(R) Iris(R) Xe Graphics
Device Type GPU
Platform Name Portable Computing Language
Device Name cpu-skylake-avx512-11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz
Device Type CPU
Platform Name Intel(R) OpenCL Graphics
Device Name Intel(R) Iris(R) Xe Graphics
Platform Name Intel(R) OpenCL Graphics
Device Name Intel(R) Iris(R) Xe Graphics
Platform Name Intel(R) OpenCL Graphics
Device Name Intel(R) Iris(R) Xe Graphics
hashcat のインストール
古いバージョン(6.2.6+ds1-1build2)はsudo apt -y install hashcatでインストールできるが最新版をインストールする。
wget https://github.com/hashcat/hashcat/releases/download/v7.1.2/hashcat-7.1.2.7z
sudo apt install -y p7zip-full
7z x hashcat-7.1.2.7z
cd hashcat-7.1.2
sudo cp hashcat.bin /usr/local/bin/hashcat
sudo mkdir -p /usr/local/share/hashcat
sudo cp -r ~/hashcat-7.1.2/modules /usr/local/share/hashcat/
sudo cp -r ~/hashcat-7.1.2/OpenCL /usr/local/share/hashcat/
sudo cp ~/hashcat-7.1.2/hashcat.hcstat2 /usr/local/share/hashcat/
cd
hashcat —version
hashcat が Intel GPU を認識するか確認
hashcat -I
CPUとGPUが見えているはず。
hashcat (v7.1.2) starting in backend information mode
OpenCL Info:
============
OpenCL Platform ID #1
Vendor..: Intel(R) Corporation
Name….: Intel(R) OpenCL Graphics
Version.: OpenCL 3.0
Backend Device ID #01
Type………..: GPU
Vendor.ID……: 8
Vendor………: Intel(R) Corporation
Name………..: Intel(R) Iris(R) Xe Graphics
Version……..: OpenCL 3.0 NEO
Processor(s)…: 16
Preferred.Thrd.: 7
Clock……….: 1300
Memory.Total…: 29717 MB (limited to 2047 MB allocatable in one block)
Memory.Free….: 14858 MB
Memory.Unified.: 1
Local.Memory…: 64 KB
OpenCL.Version.: OpenCL C 1.2
Driver.Version.: 25.31.34666
OpenCL Platform ID #2
Vendor..: The pocl project
Name….: Portable Computing Language
Version.: OpenCL 3.0 PoCL 5.0+debian Linux, None+Asserts, RELOC, SPIR, LLVM 16.0.6, SLEEF, DISTRO, POCL_DEBUG
Backend Device ID #02
Type………..: CPU
Vendor.ID……: 128
Vendor………: GenuineIntel
Name………..: cpu-skylake-avx512-11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz
Version……..: OpenCL 3.0 PoCL HSTR: cpu-x86_64-pc-linux-gnu-skylake-avx512
Processor(s)…: 8
Preferred.Thrd.: 1
Clock……….: 2803
Memory.Total…: 30045 MB (limited to 4096 MB allocatable in one block)
Memory.Free….: 15022 MB
Memory.Unified.: 1
Local.Memory…: 1280 KB
OpenCL.Version.: OpenCL C 1.2 PoCL
Driver.Version.: 5.0+debian
hashcat でGPUとCPUで動作比較
デモ 1:単純なベンチマーク
以下のコマンド例は GPU が Device #01 の前提です(番号が違う場合は -d を合わせて変更)
1) GPU ベンチマーク(Optimized Kernel・高ワークロード)
hashcat -b -m 0 -O -w 4 -D 2 -d 1
Benchmark relevant options:
===========================
* –backend-devices=1
* –backend-devices-virtmulti=1
* –backend-devices-virthost=1
* –opencl-device-types=2
* –optimized-kernel-enable
* –workload-profile=4
—————————
* Hash-Mode 0 (MD5)
—————————
Speed.#01……..: 2967.1 MH/s (446.83ms) @ Accel:160 Loops:1024 Thr:511 Vec:1
Started: Thu Sep 4 14:51:23 2025
Stopped: Thu Sep 4 14:51:44 2025
– 見るポイント:Speed.#01(MH/s)。端末Bの intel_gpu_top で EU/Cores 使用率や周波数が上がるのを確認。
2) CPU ベンチマーク(比較用)
hashcat -b -m 0 -O -w 3 -D 1
Benchmark relevant options:
===========================
* –backend-devices-virtmulti=1
* –backend-devices-virthost=1
* –opencl-device-types=1
* –optimized-kernel-enable
* –workload-profile=3
—————————
* Hash-Mode 0 (MD5)
—————————
Speed.#02……..: 1647.2 MH/s (4.81ms) @ Accel:1024 Loops:1024 Thr:1 Vec:16
Started: Thu Sep 4 14:53:18 2025
Stopped: Thu Sep 4 14:53:45 2025
– 見るポイント:Speed.#01(MH/s)。通常は GPU ≫ CPU。intel_gpu_top はほぼ動かない(CPU実行だから)。
デモ 2:GPU と CPU の違いを見る(実行編)
1) サンプルハッシュ(MD5の “password”)を用意
echo '5f4dcc3b5aa765d61d8327deb882cf99' > hash.txt
2) 簡易ワードリストを用意(最小でOK)
printf "password\n123456\nqwerty\nletmein\nwelcome\n" > wordlist.txt
cat wordlist.txt
password
123456
qwerty
letmein
welcome
3) GPU:マスク攻撃(短時間)
hashcat -m 0 -a 3 -O -w 4 -D 2 -d 1 \
--runtime 10 --potfile-disable \
hash.txt '?l?l?l?l?l?l?l?l’
Session……….: hashcat
Status………..: Cracked
Hash.Mode……..: 0 (MD5)
Hash.Target……: 5f4dcc3b5aa765d61d8327deb882cf99
Time.Started…..: Thu Sep 4 14:56:39 2025 (2 secs)
Time.Estimated…: Thu Sep 4 14:56:41 2025 (0 secs; Runtime limited: 8 secs)
Kernel.Feature…: Optimized Kernel (password length 0-55 bytes)
Guess.Mask…….: ?l?l?l?l?l?l?l?l [8]
Guess.Queue……: 1/1 (100.00%)
Speed.#01……..: 2911.0 MH/s (446.88ms) @ Accel:160 Loops:1024 Thr:511 Vec:1
Recovered……..: 1/1 (100.00%) Digests (total), 1/1 (100.00%) Digests (new)
Progress………: 4018667520/208827064576 (1.92%)
Rejected………: 0/4018667520 (0.00%)
Restore.Point….: 0/11881376 (0.00%)
Restore.Sub.#01..: Salt:0 Amplifier:2048-3072 Iteration:0-1024
Candidate.Engine.: Device Generator
Candidates.#01…: oroerane -> bctzeije
Hardware.Mon.#01.: N/A
– 見るポイント:Speed.#01、Accel/Loops/Thr/Vec、進捗率、端末Bの intel_gpu_top の変化。
3) CPU:マスク攻撃(短時間・比較)
hashcat -m 0 -a 3 -O -w 3 -D 1 \
--runtime 10 --potfile-disable \
hash.txt '?l?l?l?l?l?l?l?l’
Session……….: hashcat
Status………..: Cracked
Hash.Mode……..: 0 (MD5)
Hash.Target……: 5f4dcc3b5aa765d61d8327deb882cf99
Time.Started…..: Thu Sep 4 14:57:18 2025 (1 sec)
Time.Estimated…: Thu Sep 4 14:57:19 2025 (0 secs; Runtime limited: 9 secs)
Kernel.Feature…: Optimized Kernel (password length 0-55 bytes)
Guess.Mask…….: ?l?l?l?l?l?l?l?l [8]
Guess.Queue……: 1/1 (100.00%)
Speed.#02……..: 1601.5 MH/s (4.73ms) @ Accel:1024 Loops:1024 Thr:1 Vec:16
Recovered……..: 1/1 (100.00%) Digests (total), 1/1 (100.00%) Digests (new)
Progress………: 313131008/208827064576 (0.15%)
Rejected………: 0/313131008 (0.00%)
Restore.Point….: 16384/11881376 (0.14%)
Restore.Sub.#02..: Salt:0 Amplifier:2048-3072 Iteration:0-1024
Candidate.Engine.: Device Generator
Candidates.#02…: orotyxxx -> bctlbcer
Hardware.Mon.#02.: Util: 25%
– 見るポイント:GPUとの差、Speed.#01 の桁が大きく落ちること。
4) GPU:辞書攻撃(「password」をすぐ当てる例)
hashcat -m 0 -a 0 -O -w 4 -D 2 -d 1 \
--potfile-disable \
hash.txt wordlist.txt
Session……….: hashcat
Status………..: Cracked
Hash.Mode……..: 0 (MD5)
Hash.Target……: 5f4dcc3b5aa765d61d8327deb882cf99
Time.Started…..: Thu Sep 4 14:58:04 2025 (0 secs)
Time.Estimated…: Thu Sep 4 14:58:04 2025 (0 secs)
Kernel.Feature…: Optimized Kernel (password length 0-31 bytes)
Guess.Base…….: File (wordlist.txt)
Guess.Queue……: 1/1 (100.00%)
Speed.#01……..: 1715 H/s (0.02ms) @ Accel:224 Loops:1 Thr:483 Vec:1
Recovered……..: 1/1 (100.00%) Digests (total), 1/1 (100.00%) Digests (new)
Progress………: 5/5 (100.00%)
Rejected………: 0/5 (0.00%)
Restore.Point….: 0/5 (0.00%)
Restore.Sub.#01..: Salt:0 Amplifier:0-1 Iteration:0-1
Candidate.Engine.: Device Generator
Candidates.#01…: password -> welcome
Hardware.Mon.#01.: N/A
– 見るポイント:Recovered が即 1/1 になり、端末Bの intel_gpu_top にも短時間の負荷が出る。
5) CPU:辞書攻撃(比較用)
hashcat -m 0 -a 0 -O -w 3 -D 1 \
--potfile-disable \
hash.txt wordlist.txt
Session……….: hashcat
Status………..: Cracked
Hash.Mode……..: 0 (MD5)
Hash.Target……: 5f4dcc3b5aa765d61d8327deb882cf99
Time.Started…..: Thu Sep 4 14:59:14 2025 (0 secs)
Time.Estimated…: Thu Sep 4 14:59:14 2025 (0 secs)
Kernel.Feature…: Optimized Kernel (password length 0-31 bytes)
Guess.Base…….: File (wordlist.txt)
Guess.Queue……: 1/1 (100.00%)
Speed.#02……..: 153 H/s (0.03ms) @ Accel:1024 Loops:1 Thr:1 Vec:16
Recovered……..: 1/1 (100.00%) Digests (total), 1/1 (100.00%) Digests (new)
Progress………: 5/5 (100.00%)
Rejected………: 0/5 (0.00%)
Restore.Point….: 0/5 (0.00%)
Restore.Sub.#02..: Salt:0 Amplifier:0-1 Iteration:0-1
Candidate.Engine.: Device Generator
Candidates.#02…: password -> welcome
Hardware.Mon.#02.: Util: 12%
– 見るポイント:同じく 1/1 で復元されるが、GPUの時より処理が遅い傾向。
これで簡単なGPUの動作確認ができた。さてなんでこんなことをしていたのか?ってAIで使ってみたかったから。ただ、先に結論を言うと、使ってはくれるがパフォーマンスはあがることはなく、逆に足枷になることに。。。
また、機材も、以前の仕事までやっていた単純な仮想化インフラ、大容量メモリを積んだだけのサーバでは意味はなく、真っ当なGPUがあることとともに、メモリもDDR5とかではないとパフォーマンスが上がらない。今まで使っていた形式のサーバは役立たずということもわかった。