以下の内容はhttps://kazuhira-r.hatenablog.com/entry/2025/01/25/192411より取得しました。


Ubutu Linux 24.04 LTSでローカルLLMのOllamaを使ってみる

これは、なにをしたくて書いたもの?

久しぶりにローカルLLMを試してみようと思いまして、以前はllama-cpp-pythonやLocalAIを使っていたのですが。

Ollamaがひとつ抜けて人気のようなので、1度試してみることにしました。

Ollama

OllamaのWebサイトはこちら。

Ollama

なのですが、OllamaのWebサイトを見てもドキュメントなどがなく、今ひとつOllamaが何者なのかがわかりません…。

Ollamaで使いそうなモデルを検索するページはあります。

Models

どうやらGitHubリポジトリーを見た方がよさそうですね。

GitHub - ollama/ollama: Get up and running with Llama 3.3, Phi 4, Gemma 2, and other large language models.

まあ、見ても簡単な使い方しか書かれていないのですが…。

どうやらサーバーとして動作するらしく(それはそうですが)、その操作はCLIで行うようです。

macOSWindowsLinuxで動作しそうですね。

そしてllama.cppを使っているようです。

Ollama / Supported backends

なのでGGUFも扱えそうですね。

Ollama / Customize a model / Import from GGUF

主なモデルはこちらに載っています。

Ollama / Model library

REST APIもあります。APIはこちら。

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です。

Ollama / Linux

すると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

中身はbinlibディレクトリーで、こんな感じでした。

$ 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のモデルです。

Ollama / Model library

ダウンロードが終わると入力待ちになりました。

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なのでレスポンスがストリーミングに
なります。

API / Conventions

今回はstreamfalseにして、ストリーミングを無効にしました。

結果。

{"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

curlbashでインストールした場合は、/usr/share/ollamaディレクトリーのようですが。

あとは、このあたりから他のモデルに切り替えてみたりする感じでしょうね。

Ollama / Model library

Models

だいたい雰囲気はわかりました。

オマケ:インストールスクリプトでインストールした場合

最後に、インストールスクリプトでインストールした場合もメモしておきます。

インストール。

$ 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

アンインストールはこちら。

Linux / Uninstall

おわりに

ローカルLLM、Ollamaを試してみました。

かなり簡単に使えますね。複数のモデルも扱えるようですし、バックエンドはllama.cppということで少し馴染みが(?)
ありますし。

今の環境だとそこそこの速度で動きそうなので、また試せるところはローカルLLMにチャレンジしたいなと思います。




以上の内容はhttps://kazuhira-r.hatenablog.com/entry/2025/01/25/192411より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14