loog

Raspberry pi 5 で LLM

February 26, 2024

いよいよ Raspberry pi 5 が日本でも発売されました。

今回はスイッチ・サイエンスから メモリ8G バージョンを購入しました。

https://geekworm.com/

セットアップ

Raspberry pi Imager で焼き付けるのは一緒。

IPアドレスの固定方法が dhcpcpd.conf ではなく、nmcli に変わっていたので躓きましたが、どうにかしました。

M.2 SSD

ハードウェア接続したのに認識せず、30分ほど調べました。

なんと、ケーブルに向きがありました。

正しい向きに刺したら、すんなり認識。

TinyLlama

小型ということで、TinyLlama を試します。

$ time python llama2.py "How heigh is the mt Fuji?"
Mt. Fuji is a mountain located in Japan that is known for its iconic shape and height. The mountain rises to an elevation of about 3,776 meters (...

real    0m5.658s
user    0m10.803s
sys     0m0.088s

gemma-2b-it-gguf

https://huggingface.co/mmnga/gemma-2b-it-gguf

こちらを試します。

$ time ./main -m 'gemma-2b-it-q4_0.gguf' -p "<start_of_turn>user\n日本の文化を10個教えて。<end_of_turn>\n<start_of_turn>model\
n" -n 128
Log start
main: build = 2268 (269de86b)
main: built with cc (Debian 12.2.0-14) 12.2.0 for aarch64-linux-gnu
main: seed  = 1708933474
llama_model_loader: loaded meta data with 21 key-value pairs and 164 tensors from gemma-2b-it-q4_0.gguf (version GGUF V3 (latest))
llama_model_loader: Dumping metadata keys/values. Note: KV overrides do not apply in this output.
llama_model_loader: - kv   0:                       general.architecture str              = gemma
llama_model_loader: - kv   1:                               general.name str              = gemma-2b-it
llama_model_loader: - kv   2:                       gemma.context_length u32              = 8192
llama_model_loader: - kv   3:                          gemma.block_count u32              = 18
llama_model_loader: - kv   4:                     gemma.embedding_length u32              = 2048
llama_model_loader: - kv   5:                  gemma.feed_forward_length u32              = 16384
llama_model_loader: - kv   6:                 gemma.attention.head_count u32              = 8
llama_model_loader: - kv   7:              gemma.attention.head_count_kv u32              = 1
llama_model_loader: - kv   8:                 gemma.attention.key_length u32              = 256
llama_model_loader: - kv   9:               gemma.attention.value_length u32              = 256
llama_model_loader: - kv  10:     gemma.attention.layer_norm_rms_epsilon f32              = 0.000001
llama_model_loader: - kv  11:                       tokenizer.ggml.model str              = llama
llama_model_loader: - kv  12:                tokenizer.ggml.bos_token_id u32              = 2
llama_model_loader: - kv  13:                tokenizer.ggml.eos_token_id u32              = 1
llama_model_loader: - kv  14:            tokenizer.ggml.padding_token_id u32              = 0
llama_model_loader: - kv  15:            tokenizer.ggml.unknown_token_id u32              = 3
llama_model_loader: - kv  16:                      tokenizer.ggml.tokens arr[str,256128]  = ["<pad>", "<eos>", "<bos>", "<unk>", ...
llama_model_loader: - kv  17:                      tokenizer.ggml.scores arr[f32,256128]  = [0.000000, 0.000000, 0.000000, 0.0000...
llama_model_loader: - kv  18:                  tokenizer.ggml.token_type arr[i32,256128]  = [3, 3, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, ...
llama_model_loader: - kv  19:               general.quantization_version u32              = 2
llama_model_loader: - kv  20:                          general.file_type u32              = 2
llama_model_loader: - type  f32:   37 tensors
llama_model_loader: - type q4_0:  127 tensors
llm_load_vocab: mismatch in special tokens definition ( 544/256128 vs 388/256128 ).
llm_load_print_meta: format           = GGUF V3 (latest)
llm_load_print_meta: arch             = gemma
llm_load_print_meta: vocab type       = SPM
llm_load_print_meta: n_vocab          = 256128
llm_load_print_meta: n_merges         = 0
llm_load_print_meta: n_ctx_train      = 8192
llm_load_print_meta: n_embd           = 2048
llm_load_print_meta: n_head           = 8
llm_load_print_meta: n_head_kv        = 1
llm_load_print_meta: n_layer          = 18
llm_load_print_meta: n_rot            = 256
llm_load_print_meta: n_embd_head_k    = 256
llm_load_print_meta: n_embd_head_v    = 256
llm_load_print_meta: n_gqa            = 8
llm_load_print_meta: n_embd_k_gqa     = 256
llm_load_print_meta: n_embd_v_gqa     = 256
llm_load_print_meta: f_norm_eps       = 0.0e+00
llm_load_print_meta: f_norm_rms_eps   = 1.0e-06
llm_load_print_meta: f_clamp_kqv      = 0.0e+00
llm_load_print_meta: f_max_alibi_bias = 0.0e+00
llm_load_print_meta: n_ff             = 16384
llm_load_print_meta: n_expert         = 0
llm_load_print_meta: n_expert_used    = 0
llm_load_print_meta: pooling type     = 0
llm_load_print_meta: rope type        = 2
llm_load_print_meta: rope scaling     = linear
llm_load_print_meta: freq_base_train  = 10000.0
llm_load_print_meta: freq_scale_train = 1
llm_load_print_meta: n_yarn_orig_ctx  = 8192
llm_load_print_meta: rope_finetuned   = unknown
llm_load_print_meta: model type       = 2B
llm_load_print_meta: model ftype      = Q4_0
llm_load_print_meta: model params     = 2.51 B
llm_load_print_meta: model size       = 1.31 GiB (4.50 BPW) 
llm_load_print_meta: general.name     = gemma-2b-it
llm_load_print_meta: BOS token        = 2 '<bos>'
llm_load_print_meta: EOS token        = 1 '<eos>'
llm_load_print_meta: UNK token        = 3 '<unk>'
llm_load_print_meta: PAD token        = 0 '<pad>'
llm_load_print_meta: LF token         = 227 '<0x0A>'
llm_load_tensors: ggml ctx size =    0.06 MiB
llm_load_tensors:        CPU buffer size =  1344.80 MiB
.............................................................
llama_new_context_with_model: n_ctx      = 512
llama_new_context_with_model: freq_base  = 10000.0
llama_new_context_with_model: freq_scale = 1
llama_kv_cache_init:        CPU KV buffer size =     9.00 MiB
llama_new_context_with_model: KV self size  =    9.00 MiB, K (f16):    4.50 MiB, V (f16):    4.50 MiB
llama_new_context_with_model:        CPU input buffer size   =     6.01 MiB
llama_new_context_with_model:        CPU compute buffer size =   504.25 MiB
llama_new_context_with_model: graph splits (measure): 1

system_info: n_threads = 4 / 4 | AVX = 0 | AVX_VNNI = 0 | AVX2 = 0 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 0 | NEON = 1 | ARM_FMA = 1 | F16C = 0 | FP16_VA = 1 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 0 | SSSE3 = 0 | VSX = 0 | MATMUL_INT8 = 0 | 
sampling: 
        repeat_last_n = 64, repeat_penalty = 1.100, frequency_penalty = 0.000, presence_penalty = 0.000
        top_k = 40, tfs_z = 1.000, top_p = 0.950, min_p = 0.050, typical_p = 1.000, temp = 0.800
        mirostat = 0, mirostat_lr = 0.100, mirostat_ent = 5.000
sampling order: 
CFG -> Penalties -> top_k -> tfs_z -> typical_p -> top_p -> min_p -> temperature 
generate: n_ctx = 512, n_batch = 512, n_predict = 128, n_keep = 1


<start_of_turn>user\n日本の文化を10個教えて。<end_of_turn>\n<start_of_turn>model\n1. 日本は東アジアに位置する島国です。
2. 日本は古くから数多くの文化と芸術を開発してきたとされています。
3. 日本は多くのスポーツや音楽の traditionsを開発したとされています。
4. 日本は歴史的に重要な国とされています。
5. 日本は多くの文学と芸術家を迎えたとされています。
6. 日本は多くの技術と科学を開発したとされています。
7. 日本は多くの料理と音楽を開発したとされています。
8. 日本は多くの言語と音楽を開発したとされています。
9. 日本は多くの技術
llama_print_timings:        load time =     218.19 ms
llama_print_timings:      sample time =     242.48 ms /   128 runs   (    1.89 ms per token,   527.88 tokens per second)
llama_print_timings: prompt eval time =    1487.06 ms /    20 tokens (   74.35 ms per token,    13.45 tokens per second)
llama_print_timings:        eval time =   16956.92 ms /   127 runs   (  133.52 ms per token,     7.49 tokens per second)
llama_print_timings:       total time =   18935.86 ms /   147 tokens
Log end

real    0m19.911s
user    1m14.317s
sys     0m0.305s

精度と速度はともかく、シングルボードコンピューターで動作しているのを見ると、ちょっとした感動があります。