🦙

Ollamaと行くローカルLLMの道

に公開

はじめに

https://ollama.com/

https://github.com/ollama/ollama

Ollamaはオープンソースで開発されているLLMの実行環境です。
このシステムはDockerなどのコンテナのようにモデルを扱うことで、モデルの公開や使用を非常に簡単に行うことができます。

使ってみる

OllamaはWindows、macOS、Linux向けに提供されています。
公式サイトからダウンロードしてインストールしてみましょう。

モデル

Ollamaはモデルをモデル名:タグの形式で識別します。
例えばGoogleのgemma3の4Bモデルはgemma3:4bのように表されます。

これらのモデル一覧は以下のページから確認することができます。
https://ollama.com/search

モデルを落としてきましょう

ollama pull gemma3:4b

これを実行するとgemma3:4bという名前の付いたモデルがダウンロードできます。

モデルページにはチャットテンプレートやライセンスの情報、パラメータなどが書かれています。
gemma3:4bのページを確認すると、ライセンスがGemmaのTerms of Useであることやtemperatureが1であることがわかると思います。

ちなみに、DockerよろしくOllamaのモデルにはlatestというタグがあります。
Dockerと同じくタグ名を省略した場合はlatestに指定したモデルが落とされます。

使ってみる

ollama run gemma3:4b

これを実行するとチャットが始まります。
ダウンロードしていないモデルの場合は、ダウンロードした後にチャットが始まります。

これだけでも十分に実用的ですね。

API

OllamaはWeb経由でアクセス可能な2つのAPIを持っています。
一つはOllama独自のAPI、もう一つがOpenAI API互換のAPIです。

Ollama API

https://docs.ollama.com/api

OllamaのAPIはチャット生成や、プロンプトに対するレスポンス生成など一般的な推論タスク用のAPIがあります。
このAPIを使用することで、Ollamaの機能をフルに使って推論を実行することができます。
このAPIはPythonJavaScript向けにパッケージが配布されており、WebAPIではなくライブラリとしてアプリケーションに組み込むこともできます。

さらに、OllamaのAPIではモデルの一覧取得やモデルの作成やコピーなどollamaコマンドを用いて行うタスクもAPI経由で実行できます。

OpenAI API

すでにLLM実行環境ではデファクトスタンダードになりつつあるOpenAI APIにOllamaは対応しています。
ただし、OpenAI APIではコンテキスト長を指定する機能がないため、モデル設定より長いコンテキストを使用する場合は、設定変更したモデルを作成するるかOllama APIを使用する必要があります。

Ollamaの裏側

Ollamaの内部ではllama.cppを用いLLMの推論を行っています。
llama.cppは非常に軽量なLLMの実行エンジンでC++で書かれています。
Ollama自体はGoで書かれていますが、llama.cppを内部的に呼び出す仕組みになっています。

llama.cppはGGUFと呼ばれるフォーマットのモデルを使用しています。
Hugging Faceなどの形式はトークナイザーやメタデータなどが別ファイルにされていますが、GGUFはテンソルも含め一つのファイルにまとめられています。
またllama.cppを使うことで量子化も可能で、重いモデルを小さくして扱うことも可能です。

Ollamaのモデルを作ってみる

Ollamaのモデルを作る前に、どのモデルを使うかを決める必要があります。
今回は簡単に試してみたいので、ライセンスが緩く (Apache-2.0) 非常に軽量 (総パラメータ数0.8B) なQwen/Qwen3-0.6Bを使うことにします。

llama.cppの準備

まず、llama.cppを落としてきます。
llama.cppのコマンドも必要なのですが、リポジトリに一緒に入っているPythonスクリプトも必要なので一旦llama.cppをcloneします。

リポジトリは以下です。

https://github.com/ggml-org/llama.cpp

# 作業ディレクトリの作成
mkdir work
cd work

# llama.cppをclone
git clone https://github.com/ggml-org/llama.cpp.git

# venvを作る
python3 -m venv venv
source venv/bin/activate

# llama.cppのPythonスクリプトの依存を入れる
pip install -r llama.cpp/requirements.txt

モデルのダウンロードとGGUF変換

次にモデルをダウンロードしつつ、GGUF形式に変換します。
llama.cppにはconvert_hf_to_gguf.pyというスクリプトが含まれており、Hugging Face形式のモデルからGGUF形式への変換をしてくれます。
この際、--remoteオプションをつけることで指定したモデルIDのモデルをダウンロードしてくれます。

python llama.cpp/convert_hf_to_gguf.py --remote --outtype bf16 --outfile qwen3-0.6b-bf16.gguf Qwen/Qwen3-0.6B

このコマンドを実行することで、Qwen/Qwen3-0.6Bのモデルをダウンロードし、qwen3-0.6b-bf16.ggufというファイルに変換することができます。
bf16を指定しているのはモデルカードにBF16と書いてあったためです。おそらくautoでも問題ないと思われます。

モデルを量子化

モデルを量子化する場合はllama.cppのllama-quantizeを使う必要があります。
落としてきたllama.cppをビルドしても良いですが、めんどくさいので、llama.cppのリリースページにあるzipファイルを使いましょう。
PATHが通っている場所などお好きな場所に展開してください。

llama-quantize qwen3-0.6b-bf16.gguf qwen3-0.6b-Q4_K_M.gguf Q4_K_M

このコマンドではllama-quantizeコマンドを使いQ4_K_Mへ量子化しています。
量子化の手法については詳しく解説している記事が多数あると思いますので、気になる方はそちらを探してください。

Modelfile

ここまでの操作で量子化されたGGUF形式のモデルファイルが手に入りました。
一応Hugging Faceに上げるなどすれば、このままOllamaでも実行はできるのですが、今回はollama.comに上げられる形式で作成してみます。

OllamaはDockerでいうDockerfileに当たるファイルがあり、それをModelfileといいます。
(ちなみにllamafileというものもありますが、別プロジェクトです。そちらも結構面白いのでぜひ見てみてください)

https://docs.ollama.com/modelfile

ModelfileはDockerfileにかなり似た形式ですが、非常にシンプルです。
以下に例を示します。

FROM ./qwen3-0.6b-Q4_K_M.gguf

PARAMETER num_ctx 32768
PARAMETER temperature 1

まずFROMは必須です。
ここにはOllamaのモデルも指定できます。モデルの設定を変えたい場合などはOllamaのモデルを使うことになるでしょう。
LlamaやMistral、Gemma、Phi3のsafetensorsも指定できるようです。
今回は先ほど量子化したggufファイルを指定しています。

PARAMETERはコンテキスト長やtop_pなどLLMを使用する際に指定できるパラメータを設定できます。

TEMPLATEを指定するとチャットテンプレートの形式を指定できます。
Ollama本体はGoで実装されているためこの部分のテンプレートエンジンにはGoのtext/templateが使用されます。

ほかの部分についてはリファレンスに記載がありますので興味があればご覧ください。

作ったModelfileはollama createコマンドでモデル化することができます。 (docker buildに当たるコマンドですね)

ollama create my/qwen3:0.6b

Modelfile以外の名前になっている場合は-fオプションで明示的に指定することもできます。

ollama run my/qwen3:0.6b

これで実行できるようになりました!

最後に

Ollamaは非常に簡単にLLMモデルを扱うことが可能なシステムです。

この簡単さの陰に隠れてしまいますが、各モデルにはライセンスがつけられており、商用利用ができなかったり、制限がかかるモデルもあります。
個人利用では問題ないものが多いと思いますが、使用する際はライセンスに注意してください。

Discussion