Raspberry Pi 400上のollamaでGemma 3 270Mを動かす

先日公開されたGoogleの軽量大規模言語モデル「Gemma 3 270M」は、そのコンパクトさからエッジデバイスでの活用が期待されています。 前回の記事では、llama.cppを利用してRaspberry Pi 400で直接モデルを動かす方法を確認しました。 今回は、より手軽にLLMを管理・実行できるプラットフォームであるollamaをRaspberry Pi 400に導入し、Gemma 3 270Mを動作させる手順をまとめます。 なぜollamaを使うのか? ollamaは、モデルのダウンロード、管理、実行をシンプルなコマンドで完結させてくれるツールです。APIサーバーも内蔵しているため、他のアプリケーションとの連携も容易になります。Raspberry PiのようなデバイスでLLMを「サービス」として動かしたい場合に非常に便利です。 ollamaのインストール ollamaのインストールは、公式が提供しているスクリプトを実行するだけです。非常に簡単です。 curl -fsSL https://ollama.com/install.sh | sh インストール後、以下のコマンドでバージョン情報が表示されれば成功です。 ollama --version ollamaサービスの有効化 インストールしただけでは手動で起動する必要があります。マシンの起動時に自動でollamaが起動するように、systemdサービスを有効化しておきましょう。 sudo systemctl enable --now ollama 以下のコマンドでサービスが正常に動作しているか確認できます。 systemctl status ollama Active: active (running)と表示されていれば問題ありません。 Gemma 3 270Mモデルの実行 ollamaでモデルを実行するにはollama runコマンドを使用します。今回は、Hugging Face Hubで公開されているunslothによるGGUF形式のモデルを利用します。 ollama run hf.co/unsloth/gemma-3-270m-it-GGUF:Q2_K モデルの選択について hf.co/unsloth/gemma-3-270m-it-GGUF: Hugging Face Hub上のモデルリポジトリを指定しています。ollamaは直接Hugging Face Hubからモデルをダウンロードできます。 Q2_K: モデルの量子化レベルを指定しています。Q2_Kは2ビット量子化されており、ファイルサイズとメモリ使用量を大幅に削減できるため、Raspberry Pi 400のようなメモリが限られたデバイス(4GB)に最適です。 初回実行時には、モデルファイルのダウンロードと展開が行われます。完了すると、プロンプトが入力可能な状態になります。 まとめ ollamaを利用することで、Raspberry Pi 400という手軽な環境に、非常に簡単にローカルLLM環境を構築できました。モデルの切り替えや管理も容易なため、様々な軽量モデルを試すのに最適なプラットフォームと言えるでしょう。 常時起動させておけば、家庭内LANからAPI経由でアクセスするAIアシスタントとして活用したり、IoTデバイスの制御に自然言語インターフェースを追加したりと、様々な応用が考えられます。皆さんもぜひ、手元のRaspberry PiでローカルLLMの世界に触れてみてください。

8月 21, 2025 · 1 分 · 66 文字 · Me

Gemma 3 270M を Raspberry Pi 400 で動かす

Gemma 3 270MモデルがRaspberry Pi 400上で動作させることが確認されました。 ビルドと実行方法 ビルドコマンド 以下のコマンドを使用して、llama.cppをビルドします。 cmake -B build -DGGML_NATIVE=ON -DLLAMA_NEON=ON -DLLAMA_CURL=OFF cmake --build build --config Release -j4 ベンチマーク実行 ビルド後、ベンチマークを実行します。 ./llama.cpp/build/bin/llama-bench -m models/gemma-3-270m-it-Q2_K.gguf ベンチマーク結果は以下の通りです。 model size params backend threads test t/s gemma3 270M Q2_K - Medium 219.87 MiB 268.10 M CPU 4 pp512 47.36 ± 0.04 gemma3 270M Q2_K - Medium 219.87 MiB 268.10 M CPU 4 tg128 2.48 ± 0.00 対話モードの実行とテスト 以下のコマンドで対話モードを実行します。 ./llama.cpp/build/bin/llama-cli -m models/gemma-3-270m-it-Q2_K.gguf build: 6201 (9d262f4b) with cc (Debian 12.2.0-14+deb12u1) 12.2.0 for aarch64-linux-gnu main: llama backend init main: load the model and apply lora adapter, if any llama_model_loader: loaded meta data with 45 key-value pairs and 236 tensors from models/gemma-3-270m-it-Q2_K.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 = gemma3 llama_model_loader: - kv 1: general.type str = model llama_model_loader: - kv 2: general.name str = Gemma-3-270M-It llama_model_loader: - kv 3: general.finetune str = it llama_model_loader: - kv 4: general.basename str = Gemma-3-270M-It llama_model_loader: - kv 5: general.quantized_by str = Unsloth llama_model_loader: - kv 6: general.size_label str = 270M llama_model_loader: - kv 7: general.license str = gemma llama_model_loader: - kv 8: general.repo_url str = https://huggingface.co/unsloth llama_model_loader: - kv 9: general.base_model.count u32 = 1 llama_model_loader: - kv 10: general.base_model.0.name str = Gemma 3 270m It llama_model_loader: - kv 11: general.base_model.0.organization str = Gg Hf Gm llama_model_loader: - kv 12: general.base_model.0.repo_url str = https://huggingface.co/gg-hf-gm/gemma… llama_model_loader: - kv 13: general.tags arr[str,5] = [“gemma3”, “unsloth”, “gemma”, “googl… llama_model_loader: - kv 14: gemma3.context_length u32 = 32768 llama_model_loader: - kv 15: gemma3.embedding_length u32 = 640 llama_model_loader: - kv 16: gemma3.block_count u32 = 18 llama_model_loader: - kv 17: gemma3.feed_forward_length u32 = 2048 llama_model_loader: - kv 18: gemma3.attention.head_count u32 = 4 llama_model_loader: - kv 19: gemma3.attention.layer_norm_rms_epsilon f32 = 0.000001 llama_model_loader: - kv 20: gemma3.attention.key_length u32 = 256 llama_model_loader: - kv 21: gemma3.attention.value_length u32 = 256 llama_model_loader: - kv 22: gemma3.rope.freq_base f32 = 1000000.000000 llama_model_loader: - kv 23: gemma3.attention.sliding_window u32 = 512 llama_model_loader: - kv 24: gemma3.attention.head_count_kv u32 = 1 llama_model_loader: - kv 25: tokenizer.ggml.model str = llama llama_model_loader: - kv 26: tokenizer.ggml.pre str = default llama_model_loader: - kv 27: tokenizer.ggml.tokens arr[str,262144] = ["”, “”, “”, “”, … llama_model_loader: - kv 28: tokenizer.ggml.scores arr[f32,262144] = [-1000.000000, -1000.000000, -1000.00… llama_model_loader: - kv 29: tokenizer.ggml.token_type arr[i32,262144] = [3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3, … llama_model_loader: - kv 30: tokenizer.ggml.bos_token_id u32 = 2 llama_model_loader: - kv 31: tokenizer.ggml.eos_token_id u32 = 106 llama_model_loader: - kv 32: tokenizer.ggml.unknown_token_id u32 = 3 llama_model_loader: - kv 33: tokenizer.ggml.padding_token_id u32 = 0 llama_model_loader: - kv 34: tokenizer.ggml.add_bos_token bool = true llama_model_loader: - kv 35: tokenizer.ggml.add_sep_token bool = false llama_model_loader: - kv 36: tokenizer.ggml.add_eos_token bool = false llama_model_loader: - kv 37: tokenizer.chat_template str = {# Unsloth Chat template fixes #}\n{{ … llama_model_loader: - kv 38: tokenizer.ggml.add_space_prefix bool = false llama_model_loader: - kv 39: general.quantization_version u32 = 2 llama_model_loader: - kv 40: general.file_type u32 = 10 llama_model_loader: - kv 41: quantize.imatrix.file str = gemma-3-270m-it-GGUF/imatrix_unsloth…. llama_model_loader: - kv 42: quantize.imatrix.dataset str = unsloth_calibration_gemma-3-270m-it.txt llama_model_loader: - kv 43: quantize.imatrix.entries_count u32 = 126 llama_model_loader: - kv 44: quantize.imatrix.chunks_count u32 = 141 llama_model_loader: - type f32: 109 tensors llama_model_loader: - type q5_0: 18 tensors llama_model_loader: - type q8_0: 1 tensors llama_model_loader: - type q3_K: 36 tensors llama_model_loader: - type iq4_nl: 72 tensors print_info: file format = GGUF V3 (latest) print_info: file type = Q2_K - Medium print_info: file size = 219.87 MiB (6.88 BPW) load: printing all EOG tokens: load: - 106 (’<end_of_turn>’) load: special tokens cache size = 6414 load: token to piece cache size = 1.9446 MB print_info: arch = gemma3 print_info: vocab_only = 0 print_info: n_ctx_train = 32768 print_info: n_embd = 640 print_info: n_layer = 18 print_info: n_head = 4 print_info: n_head_kv = 1 print_info: n_rot = 256 print_info: n_swa = 512 print_info: is_swa_any = 1 print_info: n_embd_head_k = 256 print_info: n_embd_head_v = 256 print_info: n_gqa = 4 print_info: n_embd_k_gqa = 256 print_info: n_embd_v_gqa = 256 print_info: f_norm_eps = 0.0e+00 print_info: f_norm_rms_eps = 1.0e-06 print_info: f_clamp_kqv = 0.0e+00 print_info: f_max_alibi_bias = 0.0e+00 print_info: f_logit_scale = 0.0e+00 print_info: f_attn_scale = 6.2e-02 print_info: n_ff = 2048 print_info: n_expert = 0 print_info: n_expert_used = 0 print_info: causal attn = 1 print_info: pooling type = 0 print_info: rope type = 2 print_info: rope scaling = linear print_info: freq_base_train = 1000000.0 print_info: freq_scale_train = 1 print_info: n_ctx_orig_yarn = 32768 print_info: rope_finetuned = unknown print_info: model type = ?B print_info: model params = 268.10 M print_info: general.name = Gemma-3-270M-It print_info: vocab type = SPM print_info: n_vocab = 262144 print_info: n_merges = 0 print_info: BOS token = 2 ‘’ print_info: EOS token = 106 ‘<end_of_turn>’ print_info: EOT token = 106 ‘<end_of_turn>’ print_info: UNK token = 3 ‘’ print_info: PAD token = 0 ‘’ print_info: LF token = 248 ‘<0x0A>’ print_info: EOG token = 106 ‘<end_of_turn>’ print_info: max token length = 48 load_tensors: loading model tensors, this can take a while… (mmap = true) load_tensors: CPU_Mapped model buffer size = 219.87 MiB …………………… llama_context: constructing llama_context llama_context: n_seq_max = 1 llama_context: n_ctx = 4096 llama_context: n_ctx_per_seq = 4096 llama_context: n_batch = 2048 llama_context: n_ubatch = 512 llama_context: causal_attn = 1 llama_context: flash_attn = 0 llama_context: kv_unified = false llama_context: freq_base = 1000000.0 llama_context: freq_scale = 1 llama_context: n_ctx_per_seq (4096) < n_ctx_train (32768) – the full capacity of the model will not be utilized llama_context: CPU output buffer size = 1.00 MiB llama_kv_cache_unified_iswa: creating non-SWA KV cache, size = 4096 cells llama_kv_cache_unified: CPU KV buffer size = 12.00 MiB llama_kv_cache_unified: size = 12.00 MiB ( 4096 cells, 3 layers, 1/1 seqs), K (f16): 6.00 MiB, V (f16): 6.00 MiB llama_kv_cache_unified_iswa: creating SWA KV cache, size = 1024 cells llama_kv_cache_unified: CPU KV buffer size = 15.00 MiB llama_kv_cache_unified: size = 15.00 MiB ( 1024 cells, 15 layers, 1/1 seqs), K (f16): 7.50 MiB, V (f16): 7.50 MiB llama_context: CPU compute buffer size = 513.25 MiB llama_context: graph nodes = 799 llama_context: graph splits = 1 common_init_from_params: KV cache shifting is not supported for this context, disabling KV cache shifting common_init_from_params: added <end_of_turn> logit bias = -inf common_init_from_params: setting dry_penalty_last_n to ctx_size = 4096 common_init_from_params: warming up the model with an empty run - please wait … (–no-warmup to disable) main: llama threadpool init, n_threads = 4 main: chat template is available, enabling conversation mode (disable it with -no-cnv) main: chat template example: <start_of_turn>user You are a helpful assistant ...

8月 19, 2025 · 7 分 · 1306 文字 · Me