Last Update 2026/04/28
低スペック寄りのPCでローカルLLMを動作させた際の記録です。
LLM以外の仮想マシンなどが起動され、多少負荷がかかった状態で実行しています。
ベンチマークなどでLLMの性能を評価する内容ではありません。
LLM以外の仮想マシンなどが起動され、多少負荷がかかった状態で実行しています。
ベンチマークなどでLLMの性能を評価する内容ではありません。
検証用PC
|
OS |
Debian GNU/Linux 12 (bookworm) |
|
CPU |
Intel(R) Core(TM) i5-14400F |
|
GPU |
GeForce RTX 3060 12GB |
|
メモリ |
DDR4 PC4-25600 32GB × 4 |
|
SSD |
crucial P310 CT1000P310SSD8-JP |
構築環境 : Docker + Ollama (特別な設定などは無い状態)
検証用プロンプト
```
### 依頼内容
- コード生成
### 指示
- C言語
- コード以外の出力は不要
- 中括弧スタイルはオールマン
- テストコードも生成
- テストコードは別ファイル
- 実行用ソースファイル名 : sample_code.c
- テスト用ソースファイル名 : sample_test.c
- 標準ヘッダ以外は使用しない
- 戻り値はEXIT_SUCCESSを使用
- 関数はmain()の前で定義
### コード仕様(sample_code.c)
- コマンドラインから整数2つを取得
- [引数1]から[引数2]までをインクリメントして空白区切りで標準出力に出力
- 出力する文字列はmain()ではなく関数で生成
### コード仕様(sample_test.c)
- unity.hを使用しない
```
Phi-4 [実測結果一覧へ]
GPU無し
14b-q4_K_M(4.46TPS)
GPU使用
14b-q4_K_M(32.38TPS)
14b-q4_K_M(GPU無し)
Model
architecture phi3
parameters 14.7B
context length 16384
embedding length 5120
quantization Q4_K_M
2026-04-28
total duration: 2m22.601828752s
load duration: 46.488492ms
prompt eval count: 277 token(s)
prompt eval duration: 18.806931559s
prompt eval rate: 14.73 tokens/s
eval count: 550 token(s)
eval duration: 2m3.406850995s
eval rate: 4.46 tokens/s
コード生成結果の概要
・C言語による生成
・コード以外に説明を出力
・コードの記述スタイルのオールマン指定を無視
・標準ヘッダ以外の使用無し
・関数はmain()の前で定義
・関数戻り値は stdlib.h の EXIT_*** を使用(sample_code.cのみ)
sample_test.cでは別途戻り値マクロを定義
・文字列生成関数
文字列生成ではなく出力
・main()
引数個数のチェック(エラー処理有)
文字列生成関数の呼び出し
・テストコードを別途生成
main()を伴うテストコード
テスト対象関数を sample_test.c 内で定義
標準出力をバッファにリダイレクトし関数の出力をキャプチャ
テストケースは1つのみ
整数1 < 整数2
(注) 上記概要は、検証用プロンプトを実測回数分実行した際の結果を使用しています。
LLMの生成結果は毎回一定ではないため、結果によっては上記内容通りではないことが考えられます。
生成コードの実行結果
sample_code.c : 検証用プロンプトにて生成されたコードsample_test.c : 検証用プロンプトにて生成されたテストコード
$ gcc -Wall -o sample_code sample_code.c
$ gcc -Wall -o sample_test sample_test.c
sample_test.c: In function ‘test_generate_and_print_numbers’:
sample_test.c:38:9: warning: implicit declaration of function ‘strcmp’ [-Wimplicit-function-declaration]
38 | if (strcmp(buffer, expected_output) == 0) {
| ^~~~~~
sample_test.c:5:1: note: include ‘<string.h>’ or provide a declaration of ‘strcmp’
4 | #include <stdlib.h>
+++ |+#include <string.h>
5 |
$ ./sample_code 1 5
1 2 3 4 5
$ ./sample_code -3 3
-3 -2 -1 0 1 2 3
$ ./sample_code 1 1
1
$ ./sample_code 5 1
$ ./sample_test
All tests passed.
14b-q4_K_M(GPU使用)
Model
architecture phi3
parameters 14.7B
context length 16384
embedding length 5120
quantization Q4_K_M
2026-04-28
total duration: 15.150419611s
load duration: 48.224658ms
prompt eval count: 277 token(s)
prompt eval duration: 306.785128ms
prompt eval rate: 902.91 tokens/s
eval count: 470 token(s)
eval duration: 14.513757541s
eval rate: 32.38 tokens/s
コード生成結果の概要
・C言語による生成
・コード以外に説明を出力
・コードの記述スタイルのオールマン指定を無視
・標準ヘッダ以外の使用無し
・関数はmain()の前で定義
・関数戻り値は stdlib.h の EXIT_*** を使用
・文字列生成関数
文字列生成ではなく出力
・main()
引数個数のチェック(エラー処理有)
文字列生成関数の呼び出し
・テストコードを別途生成
main()を伴うテストコード
文字列生成関数を間接的に呼び出してテスト実行
呼び出し時は関数自体の出力を制限するため、stdoutを`/dev/null` にリダイレクト
テストケースは2つ
(1) 整数1 < 整数2
(2) 整数1 < 整数2 ただし 整数1が負数
(注) 上記概要は、検証用プロンプトを実測回数分実行した際の結果を使用しています。
LLMの生成結果は毎回一定ではないため、結果によっては上記内容通りではないことが考えられます。
生成コードの実行結果
sample_code.c : 検証用プロンプトにて生成されたコードsample_test.c : 検証用プロンプトにて生成されたテストコード
$ gcc -Wall -o sample_code sample_code.c
$ gcc -Wall -o sample_test sample_code.c sample_test.c
sample_test.c: In function ‘test_generate_sequence’:
sample_test.c:8:5: warning: implicit declaration of function ‘generate_sequence’; did you mean ‘test_generate_sequence’? [-Wimplicit-function-declaration]
8 | generate_sequence(start, start + 5); // Test with a fixed range for simplicity
| ^~~~~~~~~~~~~~~~~
| test_generate_sequence
/bin/ld: /tmp/ccnO7w5t.o: in function `main':
sample_test.c:(.text+0x79): multiple definition of `main'; /tmp/ccBsgwWx.o:sample_code.c:(.text+0x3f): first defined here
collect2: error: ld returned 1 exit status
$ vi sample_code.c ← main()関数重複エラー解消のため条件付きコンパイル用の#ifndefマクロを追加
$ vi sample_test.c ← テスト対象関数の宣言を追加
$ gcc -D TEST_MAIN -Wall -o sample_test sample_code.c sample_test.c
$ ./sample_code 1 5
1 2 3 4 5
$ ./sample_code -3 3
-3 -2 -1 0 1 2 3
$ ./sample_code 1 1
1
$ ./sample_code 5 1
$ ./sample_test
Running tests... ← stdoutを閉じた後の処理が不十分。出力がここで終了
$ vi sample_test.c ← fclose(stdout)の後にfreopen("/dev/tty", "w", stdout)を追加
$ gcc -D TEST_MAIN -Wall -o sample_test sample_code.c sample_test.c
$ ./sample_test
Running tests...
Test: 1 to 6
Test: -3 to 2
All tests completed.