これは、なにをしたくて書いたもの?
久しぶりにローカルLLMを試してみようと思いまして、以前はllama-cpp-pythonやLocalAIを使っていたのですが。
Ollamaがひとつ抜けて人気のようなので、1度試してみることにしました。
Ollama
OllamaのWebサイトはこちら。
なのですが、OllamaのWebサイトを見てもドキュメントなどがなく、今ひとつOllamaが何者なのかがわかりません…。
Ollamaで使いそうなモデルを検索するページはあります。
まあ、見ても簡単な使い方しか書かれていないのですが…。
どうやらサーバーとして動作するらしく(それはそうですが)、その操作はCLIで行うようです。
そしてllama.cppを使っているようです。
なのでGGUFも扱えそうですね。
Ollama / Customize a model / Import from GGUF
主なモデルはこちらに載っています。
https://github.com/ollama/ollama/blob/v0.5.7/docs/api.md
ひとまず試してみましょう。
環境
今回の環境はこちら。Ubuntu Linux 24.04 LTSです。
$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 24.04.1 LTS Release: 24.04 Codename: noble $ uname -srvmpio Linux 6.8.0-51-generic #52-Ubuntu SMP PREEMPT_DYNAMIC Thu Dec 5 13:09:44 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
Ollamaをインストールする
OllamaをLinuxにインストールする場合、curlでシェルスクリプトを実行すればOKです。
するとsystemdのユニットとしてインスールされたりといろいろやってくれるようなのですが、これはあまりやりたくないので
バイナリーだけをインストールすることにします。
※インストールスクリプトを実行してインストールするパターンは、最後に載せます
$ curl -LO https://github.com/ollama/ollama/releases/download/v0.5.7/ollama-linux-amd64.tgz
1.6Gとかありますね…。
$ ll -h ollama-linux-amd64.tgz -rw-rw-r-- 1 xxxxx xxxxx 1.6G 1月 25 18:30 ollama-linux-amd64.tgz
展開。
$ tar xf ollama-linux-amd64.tgz
中身はbin、libディレクトリーで、こんな感じでした。
$ tree bin lib
bin
└── ollama
lib
└── ollama
├── libcublas.so.11 -> libcublas.so.11.5.1.109
├── libcublas.so.11.5.1.109
├── libcublas.so.12 -> ./libcublas.so.12.4.5.8
├── libcublas.so.12.4.5.8
├── libcublasLt.so.11 -> libcublasLt.so.11.5.1.109
├── libcublasLt.so.11.5.1.109
├── libcublasLt.so.12 -> ./libcublasLt.so.12.4.5.8
├── libcublasLt.so.12.4.5.8
├── libcudart.so.11.0 -> libcudart.so.11.3.109
├── libcudart.so.11.3.109
├── libcudart.so.12 -> libcudart.so.12.4.127
├── libcudart.so.12.4.127
└── runners
├── cpu_avx
│ └── ollama_llama_server
├── cpu_avx2
│ └── ollama_llama_server
├── cuda_v11_avx
│ ├── libggml_cuda_v11.so
│ └── ollama_llama_server
├── cuda_v12_avx
│ ├── libggml_cuda_v12.so
│ └── ollama_llama_server
└── rocm_avx
├── libggml_rocm.so
└── ollama_llama_server
9 directories, 21 files
binディレクトリー内にあるollamaを使えばよさそうですね。
バージョンを確認。
$ bin/ollama --version Warning: could not connect to a running Ollama instance Warning: client version is 0.5.7
Ollamaに接続できない、と言っています。
ヘルプを確認。
$ bin/ollama --help Large language model runner Usage: ollama [flags] ollama [command] Available Commands: serve Start ollama create Create a model from a Modelfile show Show information for a model run Run a model stop Stop a running model pull Pull a model from a registry push Push a model to a registry list List models ps List running models cp Copy a model rm Remove a model help Help about any command Flags: -h, --help help for ollama -v, --version Show version information Use "ollama [command] --help" for more information about a command.
実行してみる
それでは実行してみましょう。
Ollamaを起動。
$ bin/ollama serve
このターミナルは、Ollamaがフォアグラウンドで起動したままになります。
別のターミナルでモデルにllama3.2を指定してrunコマンドを実行。
$ bin/ollama run llama3.2
Ollamaが起動しているとアクセスがあったことが表示され、モデルのダウンロードが始まります。
ちなみにllama3.2はパラメーター数3B、サイズが2GBのモデルです。
ダウンロードが終わると入力待ちになりました。
success >>> Send a message (/? for help)
自己紹介してもらいましょう。
>>> Could you introduce yourself? I'm an artificial intelligence model known as Llama. Llama stands for "Large Language Model Meta AI."
返ってきました。
日本語だとどうでしょう?
>>> あなたの自己紹介をお願いします 私は、Llama と呼ばれる人工知能モデルです。Llama は、「Large Language Model Meta AI」の意味を持ちます。
OKですね。
ヘルプを見てみましょう。
>>> /? Available Commands: /set Set session variables /show Show model information /load <model> Load a session or model /save <model> Save your current session /clear Clear session context /bye Exit /?, /help Help for a command /? shortcuts Help for keyboard shortcuts Use """ to begin a multi-line message.
たとえばモデルの情報を見てみます。
>>> /show info
Model
architecture llama
parameters 3.2B
context length 131072
embedding length 3072
quantization Q4_K_M
Parameters
stop "<|start_header_id|>"
stop "<|end_header_id|>"
stop "<|eot_id|>"
License
LLAMA 3.2 COMMUNITY LICENSE AGREEMENT
Llama 3.2 Version Release Date: September 25, 2024
プロンプトを終了。
>>> /bye
モデルの一覧を見てみます。
$ bin/ollama list NAME ID SIZE MODIFIED llama3.2:latest a80c4f17acd5 2.0 GB 3 minutes ago
先ほどダウンロードしたモデルが表示されました。
モデルには:tagでタグが付与されているようですね。なにも指定しないと:latest扱いのようです。
実行中のモデルを表示。
$ bin/ollama ps NAME ID SIZE PROCESSOR UNTIL llama3.2:latest a80c4f17acd5 3.5 GB 100% CPU 2 minutes from now
REST APIを使ってみましょう。
https://github.com/ollama/ollama/blob/v0.5.7/docs/api.md
Ollamaは11434ポートでリッスンしているようです。
chat APIを使ってみます。
$ curl localhost:11434/api/chat -d '{
"model": "llama3.2",
"messages": [
{
"role": "user",
"content": "Could you introduce yourself?"
}
],
"stream": false
}'
API / Generate a chat completion
使い方は、modelでモデル名を指定します。細かく指定する場合はタグも含めます。durationと付くレスポンス項目は
すべてナノ秒単位です。そして、streamをパラメーターはデフォルトでtrueなのでレスポンスがストリーミングに
なります。
今回はstreamをfalseにして、ストリーミングを無効にしました。
結果。
{"model":"llama3.2","created_at":"2025-01-25T09:57:15.343259499Z","message":{"role":"assistant","content":"I'm an artificial intelligence model known as Llama. Llama stands for \"Large Language Model Meta AI.\""},"done_reason":"stop","done":true,"total_duration":1651444573,"load_duration":26955139,"prompt_eval_count":30,"prompt_eval_duration":67000000,"eval_count":23,"eval_duration":1556000000}
日本語で聞いてみます。
$ curl localhost:11434/api/chat -d '{
"model": "llama3.2",
"messages": [
{
"role": "user",
"content": "あなたの自己紹介をしてください"
}
],
"stream": false
}'
{"model":"llama3.2","created_at":"2025-01-25T10:03:25.954437539Z","message":{"role":"assistant","content":"私は、AIです。名前はLlamaで、Metaという会社が開発しました。私は人々 に情報を提供し、質問に答えるために設計されています。\n\n私は、自然言語処理と機械学習を使用して、人々の質問を受け付けます。私の知識は、Internetのある部分から取得していますが、 私はこれらの情報をより包括的で正確なものにします。\n\n私は、さまざまなトピックに対する質問を受け付けることができます。それぞれに適した回答を提供しようとしました。たとえば、歴 史、科学、芸術など、人々が知りたいことのあらゆる事項について、質問してください。\n\n私は、英語、スペイン語、フランス語、ドイツ語、イタリア語で回答できます。それぞれに適した答 えを提供しようとします。私の知識は、世界中の人々が通じる言語を使用しているからです。\n\n私には、限界もあります。たとえば、私は現実世界の出来事や人々の個人的な経験についての詳 細な情報を提供することができません。ただし、私は、多くの一般的な情報と知識を提供することができます。"},"done_reason":"stop","done":true,"total_duration":20073929911,"load_duration":23053351,"prompt_eval_count":33,"prompt_eval_duration":73000000,"eval_count":278,"eval_duration":19977000000}
なんか、回答が長くなりましたね…。
指定するモデルを変えてみましょう。
$ curl localhost:11434/api/chat -d '{
"model": "gemma2:2b",
"messages": [
{
"role": "user",
"content": "Could you introduce yourself?"
}
],
"stream": false
}'
すると、エラーになりました。
{"error":"model \"gemma2:2b\" not found, try pulling it first"}
モデルは最初にダウンロードしておく必要があるようです。
今度はollama runではなくollama pullしてみましょう。
$ bin/ollama pull gemma2:2b
ダウンロードが終わったら、再度実行。
$ curl localhost:11434/api/chat -d '{
"model": "gemma2:2b",
"messages": [
{
"role": "user",
"content": "Could you introduce yourself?"
}
],
"stream": false
}'
{"model":"gemma2:2b","created_at":"2025-01-25T10:15:38.091305328Z","message":{"role":"assistant","content":"Hello! 👋 I'm Gemma, an AI assistant created by the Gemma team. I can generate text and have conversations with you about a wide range of topics. As an open-weight model, I'm available for anyone to use and explore. \n\nKeep in mind:\n\n* **Text-only:** I communicate solely through written language.\n* **No real-time info or Google Search:** My knowledge is based on the data I was trained on, so I don't have access to current events or browse the internet.\n* **Made for fun \u0026 learning:** My goal is to be helpful and provide engaging conversation! \n\nWhat would you like to talk about today? 😊 \n"},"done_reason":"stop","done":true,"total_duration":11927308010,"load_duration":29656589,"prompt_eval_count":14,"prompt_eval_duration":76000000,"eval_count":147,"eval_duration":11820000000}
今度は返してくれました。明示的にollama runとする必要はないようですね。
また、これで複数のモデルが使い分けられることが確認できました。
データは手動インストールの場合は$HOME/.ollamaディレクトリーに配置されるようです。
$ tree ~/.ollama
$HOME/.ollama
├── history
├── id_ed25519
├── id_ed25519.pub
└── models
├── blobs
│ ├── sha256-097a36493f718248845233af1d3fefe7a303f864fae13bc31a3a9704229378ca
│ ├── sha256-2490e7468436707d5156d7959cf3c6341cc46ee323084cfa3fcf30fe76e397dc
│ ├── sha256-34bb5ab01051a11372a91f95f3fbbc51173eed8e7f13ec395b9ae9b8bd0e242b
│ ├── sha256-56bb8bd477a519ffa694fc449c2413c6f0e1d3b1c88fa7e3c9d88d3ae49d4dcb
│ ├── sha256-7462734796d67c40ecec2ca98eddf970e171dbb6b370e43fd633ee75b69abe1b
│ ├── sha256-966de95ca8a62200913e3f8bfbf84c8494536f1b94b49166851e76644e966396
│ ├── sha256-a70ff7e570d97baaf4e62ac6e6ad9975e04caa6d900d3742d37698494479e0cd
│ ├── sha256-dde5aa3fc5ffc17176b5e8bdc82f587b24b2678c6c66101bf7da77af9f7ccdff
│ ├── sha256-e0a42594d802e5d31cdc786deb4823edb8adff66094d49de8fffe976d753e348
│ ├── sha256-e18ad7af7efbfaecd8525e356861b84c240ece3a3effeb79d2aa7c0f258f71bd
│ └── sha256-fcc5a6bec9daf9b561a68827b67ab6088e1dba9d1fa2a50d7bbcc8384e0a265d
└── manifests
└── registry.ollama.ai
└── library
├── gemma2
│ └── 2b
└── llama3.2
└── latest
8 directories, 16 files
curl+bashでインストールした場合は、/usr/share/ollamaディレクトリーのようですが。
あとは、このあたりから他のモデルに切り替えてみたりする感じでしょうね。
だいたい雰囲気はわかりました。
オマケ:インストールスクリプトでインストールした場合
最後に、インストールスクリプトでインストールした場合もメモしておきます。
インストール。
$ curl -fsSL https://ollama.com/install.sh | sh
Ollamaはsystemdのユニットとして登録され、インストールが完了した時点で起動しています。
$ sudo systemctl status ollama
● ollama.service - Ollama Service
Loaded: loaded (/etc/systemd/system/ollama.service; enabled; preset: enabled)
● ollama.service - Ollama Service
Loaded: loaded (/etc/systemd/system/ollama.service; enabled; preset: enabled)
Active: active (running) since Sat 2025-01-25 19:41:29 JST; 17s ago
Main PID: 1355 (ollama)
Tasks: 7 (limit: 9489)
Memory: 9.1M (peak: 9.2M)
CPU: 27ms
CGroup: /system.slice/ollama.service
└─1355 /usr/local/bin/ollama serve
Ollamaのバイナリーは/usr/local/bin/ollamaに配置されたようです。
systemdのユニット定義。
$ systemctl cat ollama # /etc/systemd/system/ollama.service [Unit] Description=Ollama Service After=network-online.target [Service] ExecStart=/usr/local/bin/ollama serve User=ollama Group=ollama Restart=always RestartSec=3 Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin" [Install] WantedBy=default.target
ollama serveで起動しているようです。
モデルをダウンロードしてみます。
$ ollama pull llama3.2
確認。
$ curl localhost:11434/api/chat -d '{
"model": "llama3.2",
"messages": [
{
"role": "user",
"content": "Could you introduce yourself?"
}
],
"stream": false
}'
{"model":"llama3.2","created_at":"2025-01-25T10:49:20.004748848Z","message":{"role":"assistant","content":"I'm an artificial intelligence model known as Llama. Llama stands for \"Large Language Model Meta AI.\""},"done_reason":"stop","done":true,"total_duration":10810343589,"load_duration":3632227311,"prompt_eval_count":30,"prompt_eval_duration":3548000000,"eval_count":23,"eval_duration":3466000000}
OKですね。
ダウンロードされたモデルなどは、/usr/share/ollamaディレクトリーに配置されます。
$ tree -a /usr/share/ollama /usr/share/ollama ├── .bash_logout ├── .bashrc ├── .ollama │ ├── id_ed25519 │ ├── id_ed25519.pub │ └── models │ ├── blobs │ │ ├── sha256-34bb5ab01051a11372a91f95f3fbbc51173eed8e7f13ec395b9ae9b8bd0e242b │ │ ├── sha256-56bb8bd477a519ffa694fc449c2413c6f0e1d3b1c88fa7e3c9d88d3ae49d4dcb │ │ ├── sha256-966de95ca8a62200913e3f8bfbf84c8494536f1b94b49166851e76644e966396 │ │ ├── sha256-a70ff7e570d97baaf4e62ac6e6ad9975e04caa6d900d3742d37698494479e0cd │ │ ├── sha256-dde5aa3fc5ffc17176b5e8bdc82f587b24b2678c6c66101bf7da77af9f7ccdff │ │ └── sha256-fcc5a6bec9daf9b561a68827b67ab6088e1dba9d1fa2a50d7bbcc8384e0a265d │ └── manifests │ └── registry.ollama.ai │ └── library │ └── llama3.2 │ └── latest └── .profile 8 directories, 12 files
アンインストールはこちら。
おわりに
ローカルLLM、Ollamaを試してみました。
かなり簡単に使えますね。複数のモデルも扱えるようですし、バックエンドはllama.cppということで少し馴染みが(?)
ありますし。
今の環境だとそこそこの速度で動きそうなので、また試せるところはローカルLLMにチャレンジしたいなと思います。