OllamaがローカルLLMをどうやって呼び出しているのか
Ollamaとllama.cpp
Ollamaは内部的にllama.cppを利用してLLMのテキスト生成を実行していることが知られています。通常高性能なGPUやRAMが要求されるモデルの推論処理を、llama.cpp向けの量子化されたGGML/GGUFモデルを使うことによって一般ユーザーのPCの処理性能でもLLMを動作させることが可能になっているわけです。
という部分までなんとなく理解していたのですが、自分でカスタムモデルを使いたくなった段階でllama.cppについて知る必要があったのでollamaコマンドのソースコードを起点に内部仕様を調べることにしました
ollama serverとllama server
OllamaはGoで実装されたバックエンドサービスとなるREST APIを提供します。これはollama serverと呼ばれています。ollamaコマンドはこのバックエンドサービスとやり取りしています。
ollama serverはllama.cppライブラリを呼び出すためのラッパーとなるウェブサーバーです。例えば、サーバー内部でユーザーがpull(ダウンロード)したモデルを読み込んでセットアップします。
ollama serverはさらにllama.cppの中のウェブサーバー機能を持つollama_llama_server
というプログラムを内部コマンド実行しています。これはllama.cppが提供する機能で、llama serverと呼ばれます。
テキスト生成をする実態はこのC++で実装されたllama server側であり、結果をollama server側で受け取り後処理をしています。これによってollamaコマンドでチャット形式の対話ができるわけです
OllamaとCGo
Ollamaはllama server経由の呼び出しとは別に、CGo を使用して llama.cpp
ライブラリの関数を呼び出します。例えばOllamaでカスタムモデルを作成するために使用するollama create
コマンドはllama.cpp
の llama_model_quantize()
関数を呼び出し、モデルの量子化を実行します。
ollama pullで何がダウンロードされているのか
ollama pull mistral
などを実行するとOllamaのレジストリを参照してモデルのダウンロードを行います。この時にデフォルトではregistry.ollama.ai
にホストされているバイナリファイルがダウンロードされています。
例えば https://ollama.com/library/llama3:latest ではregistry.ollama.ai/library/llama3:latestが参照され、~/.ollama以下に分割されたファイルが保存されています
.ollama/models/manifests/registry.ollama.ai/library/llama3
.ollama/models/blobs/sha256-109037bec39c0becc8221222ae23557559bc594290945a2c4221ab4f303b8871
.ollama/models/blobs/sha256-00e1317cbf74d901080d7100f57580ba8dd8de57203072dc6f668324ba545f29
.ollama/models/blobs/sha256-8ab4849b038cf0abc5b1c9b8ee1443dca6b93a045c2272180d985126eb40bf6f
このレジストリはユーザーがローカルで作成したモデルをollama push
でアップロードする時にも使用されています。
なのでHugging Faceでホストされているバージョンとは異る場合があるということです。
Discussion