![]() |
| 産廃を嬉しそうに掲げるミナさん |
Raspberry Pi5程度性能でもパラメータ数の少ないLLMなら動かせることがわかり、それならば、同等性能のSandyBridgeのCPUでも動かせるのでは?
という普通の人があまり考えない事をやってます。
いつかはSandyおじさんの一人娘キャラのLLMアシスタントを作る予定です。
この記事では、
- CUDAとSM_XXの関係
- no kernel imageエラーの正体
- VulkanとCUDAの違い
- 実際にGTX750Tiでどの程度動くのか
- GTX1050との比較結果
を整理しました。
環境
- UbuntuのLTSのやつ
- CPU:IvyBridge i5-3470
- GPU:Geforce GTX750Ti
- CUDA12.2
15年前のスペック
GTX750TiでLLMは動くのか?
古いGPU(GTX750Ti)で llama.cpp を動かそうとしたところ、最初に遭遇したのはこのエラーだった。
CUDA error: no kernel image is available for execution on the deviceGPUが壊れているわけではない。
原因は「CUDAとSM_XXの理解不足」だった。
1. CUDAバージョンとSM_XX
まず混乱ポイント。
CUDA 12.x は開発ツールキットのバージョン。
SM_XX はGPUのCompute Capability(アーキテクチャ世代)。
手持ちのGPUだとこんな感じ。
| GPU | Compute Capability | 表記 |
|---|---|---|
| GTX750Ti | 5.0 | sm_50 |
| GTX1050 | 6.1 | sm_61 |
| GTX3060 | 8.6 | sm_86 |
| GTX5070 | 12.0 | sm_120 |
英語版WikipediaでCUDAを参照すると、CUDA ToolKitのバージョンでどのGPUがサポートされるかわかる。
CUDA ToolKit12.2では、Maxwell、Pascal、Volta、Turing、Ampere、Ada、Lovelace、Hopperが対象だとわかる。つまりCUDA12.2でGTX750Ti(Maxwell sm_50)はギリギリサポートされているのだ。
2. 「no kernel image」エラーの意味
CUDA error: no kernel image is available for execution on the device
これは
そのGPU向けにコンパイルされたCUDAカーネルが存在しない
という意味。
つまり、
- バイナリに sm_50 が含まれていなかった
- そのためGTX750Tiでは実行できなかった
対処はllamaビルド時に明示すること。
-DCMAKE_CUDA_ARCHITECTURES="50;60;61;70;75;80;86;90"
これで sm_50を含んでmaxwell以降のGPUのためのコードが生成される。
cmake \ -DBUILD_SHARED_LIBS=OFF \ -DLLAMA_BUILD_SERVER=ON \ -DLLAMA_BUILD_EXAMPLES=ON \ -DLLAMA_BUILD_TESTS=ON \ -DLLAMA_BUILD_TOOLS=ON \ -DGGML_CUDA=ON \ -DCMAKE_CUDA_ARCHITECTURES="50;60;61;70;75;80;86;90" \ -DGGML_VULKAN=ON \ -DGGML_VULKAN_MXFP=OFF \ -DGGML_AVX=ON \ -DGGML_AVX2=OFF \ -DGGML_FMA=OFF
sandy、IvyあたりにはAVX2がないためOFFとします。
VULKANとCUDAが使えるようにしている感じです。
コンパイル、ビルドに割と時間がかかる
BUILD_TOOLS=ONのため、llama-cliやllama-serverなどが作られる、このあとllama-cliを使っていく。
オプション以外は👇の記事のllama.cppのところを見てください。
https://blogger.kinkuman.net/2025/11/oci-aituberkit.html
3. Vulkanで動いているのか?
llama-cli --list-devices では750Tiの
CUDA0
Vulkan0
$ llama-cli --list-devices ggml_cuda_init: found 1 CUDA devices: Device 0: NVIDIA GeForce GTX 750 Ti, compute capability 5.0, VMM: yes ggml_vulkan: Found 1 Vulkan devices: ggml_vulkan: 0 = NVIDIA GeForce GTX 750 Ti (NVIDIA) | uma: 0 | fp16: 0 | bf16: 0 | warp size: 32 | shared memory: 49152 | int dot: 0 | matrix cores: none Available devices: CUDA0: NVIDIA GeForce GTX 750 Ti (1999 MiB, 1629 MiB free) Vulkan0: NVIDIA GeForce GTX 750 Ti (2294 MiB, 1865 MiB free)
両方が表示される。
しかし重要なのは終了時のメモリ表示。
- CUDA0 (GTX 750 Ti)
Exiting... llama_memory_breakdown_print: | memory breakdown [MiB] | total free self model context compute unaccounted| llama_memory_breakdown_print: | - CUDA0 (GTX 750 Ti) | 1999 = 97 + (1469 = 969 + 200 + 299) + 432 | llama_memory_breakdown_print: | - Host | 326 = 280 + 24 + 22 |
model/context/compute が CUDA 側に確保されていれば、
実際にCUDAで推論しているという意味になる。
found Vulkanは「認識されている」だけで、実行に使われるとは限らない。
--device CUDA0 を指定すれば明示的にCUDAを使える。
次のように起動した。
./llama-cli -m /home/user1/workspace/llama.cpp/model/tinyswallow-1.5b-instruct-q5_k_m.gguf --device CUDA0 -ngl 26 -c 8192 --threads 4 --chat-template chatml
4. 実測結果
GTX750Ti
Prompt: 34.0 t/s
Generation: 17.9 t/s
GTX1050
Prompt: 19.0 t/s
Generation: 12.6 t/s理論スペックでは1050の方が新しい。
なぜか750Tiの方が良い結果が出る。
よくわからない、使用したバイナリが異なるので、1050は再度測定する必要がある。
5. GTX750TiでLLMをやる意味はあるのか?
ほとんどない。
ゴミPCをいつでも使えるOpenAI API互換サーバーとして動かすと便利なぐらいだ。
1.5B程度のLLMは、うまく導いてあげればそれなりに働く。
- VRAM 2GB
- Tensor Coreなし
- メモリ帯域も限定的
- 現在の主流はRTX世代
750TiでLLMを動かすのは実用というより実験。
しかし、適切にビルドすれば実際に動く。
まとめ
- CUDA SDKバージョンとSM_XXの関係性の整理ができた
- 「no kernel image」はGPU非対応ではなくビルド設定の問題
- VulkanとCUDA両方選んで使える。
- GTX750TiでもLLMは動く
- 理論スペックと推論速度は一致しないかも?
古いGPUでも、使用できないわけではない。
