🙄

OllamaがローカルLLMをどうやって呼び出しているのか

2024/05/19に公開

Ollamaとllama.cpp

Ollamaは内部的にllama.cppを利用してLLMのテキスト生成を実行していることが知られています。通常高性能なGPUやRAMが要求されるモデルの推論処理を、llama.cpp向けの量子化されたGGML/GGUFモデルを使うことによって一般ユーザーのPCの処理性能でもLLMを動作させることが可能になっているわけです。

という部分までなんとなく理解していたのですが、自分でカスタムモデルを使いたくなった段階でllama.cppについて知る必要があったのでollamaコマンドのソースコードを起点に内部仕様を調べることにしました

https://github.com/ollama/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コマンドでチャット形式の対話ができるわけです

https://github.com/ollama/ollama/blob/105186aa179c7ccbac03d6719ab1c58ab87d6477/llm/server.go#L264-L291

OllamaとCGo

Ollamaはllama server経由の呼び出しとは別に、CGo を使用して llama.cpp ライブラリの関数を呼び出します。例えばOllamaでカスタムモデルを作成するために使用するollama createコマンドはllama.cppllama_model_quantize() 関数を呼び出し、モデルの量子化を実行します。

https://github.com/ollama/ollama/blob/105186aa179c7ccbac03d6719ab1c58ab87d6477/llm/llm.go#L23-L39

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