プログラミング初心者がアーキテクトっぽく語る

見苦しい記事も多数あるとは思いますが訂正しつつブログと共に成長していければと思います

Ollamaで自分のMac上でLLMを動かしてみた

前回はGoogle Colabを使ってLLMを動かしました。

今回は自分のMacの上でLLMを動かしてみましょう。

当然ですが、私のMacbookにはGPUなんて高価なものは搭載されていません。

CPUはM1、メモリは16GBです。

そんなスペックですが、それでもLLMを動かしてみましょう!


Ollama

使うのはOllamaです。

LLMの世界のDockerだと思うと理解が早いかと思います。

公開されているオープンソースLLMを読み込んで実行したり停止したりできる便利なツールです。

お金はかかりません。


手順

1. Ollamaをインストール

ollamaの公式ページからバイナリをインストールする方法もあります。

今回はHomebrewでインストールしました。

brew install ollama

2. Ollamaを開始

Ollamaを開始します。

ollama serve

3. 実行するLLMを選ぶ

Ollamaの公式ページからLLMを選びます。

https://ollama.com/search

同じLLMでもサイズ違いのものが用意されています。

小さいほど精度は低いですが動く可能性が高いです。

まずは小さいLLMを選び、様子を見ながら大きくしていきましょう。

まずはパラメータ数が小さいこと。 モデル名に8bとか4bとか2bとか1bとか記載されるやつです。 小さい方が動く可能性が高いです。 以下、3b parameter(30億パラメータ)のllama-3.2の例です。

llama3.2:3b

次に量子化されていることです。 普通のLLMはFP32とかFP16、BF16というやつなのですが、これを軽量化するために量子化しています。 モデル名にq8とかq4とかq2とか記載されているやつです。 小さい方が動く可能性が高いです。 以下、3B parameterでq2のllama3.2の例です。

llama3.2:3b-instruct-q2_K

4. LLMを実行する

ollama runでLLMを実行します。

以下、llama3.2を実行する例です。 初回はファイルがダウンロードされます。 正常に実行できるとプロンプト>>>が表示されます。

arm64@~  % ollama run llama3.2
pulling manifest
pulling dde5aa3fc5ff: 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 2.0 GB
pulling 966de95ca8a6: 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 1.4 KB
pulling fcc5a6bec9da: 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 7.7 KB
pulling a70ff7e570d9: 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 6.0 KB
pulling 56bb8bd477a5: 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏   96 B
pulling 34bb5ab01051: 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏  561 B
verifying sha256 digest
writing manifest
success
>>>

5. プロンプトで試す

表示されたプロンプトで動作確認することができます。

>>> 日本語を話せますか?
はい、Japaneseを話すとともに英語でも話すことができます。どのようにhelpしてくださいかお知らせください。

>>>

6. プロンプトを終了する

/byeでプロンプトを終了することができます。

>>> /bye
arm64@~  %

プロンプトを終了してもまだLLMは動いています。 引き続きREST APIPython SDK、Web UIから利用可能です。

7. REST APIで試す

REST APIhttp://localhost:11434から利用できます。 推論用のEndpointは、/api/generate/api/chatがあります。

デフォルトでStreamingが有効になっています。 下記の例では結果が見やすいよう、Streamingを無効にしています。

curl -X POST \
--location 'http://localhost:11434/api/generate' \
--header 'Content-Type: application/json' \
--data '{
  "model": "llama3.2",
  "prompt":"日本で一番高い山はなんですか?",
  "stream": false
}'
curl -X \
POST --location 'http://localhost:11434/api/chat' \
--header 'Content-Type: application/json' \
--data '{
  "model": "llama3.2",
  "messages": [
    { "role": "user", "content": "日本で一番高い山はなんですか?" }
  ],
  "stream": false
}'

REST APIの詳細はこちらです。

https://github.com/ollama/ollama/blob/main/docs/api.md

8. Python SDKで試す

Python SDKをインストールします。

% pip install ollama

以下のサンプルコードを実行します。

from ollama import chat
from ollama import ChatResponse

response: ChatResponse = chat(model='llama3.2', messages=[
  {
    'role': 'user',
    'content': 'Why is the sky blue?',
  },
])
print(response['message']['content'])
# or access fields directly from the response object
print(response.message.content)

Python SDKの詳細はこちらです。

https://github.com/ollama/ollama-python

9. Web UIで試す

Open WebUIをインストールします。

% pip install open-webui

本記事執筆時点でopen-webuiはPython 3.11にのみ対応しているようです。 Python 3.13環境でpip installしたらエラーが出たので、Python 3.11環境を用意して再実施したところ無事インストールできました。

Open WebUIを開始します。

% open-webui serve

ブラウザでhttp://localhost:8080を開きます。

「開始」ボタンを押すと管理者アカウント作成画面が表示されるので、適当に入力して管理者アカウントを作成します。

チャット画面が表示されました。 モデルを複数実行している場合は左上のドロップダウンメニューからモデルを選択してください。


10. 実行中のLLMの確認

arm64@~  % ollama ps
NAME           ID              SIZE      PROCESSOR    UNTIL
llama3.1:8b    46e0c10c039e    7.0 GB    100% GPU     3 minutes from now
arm64@~  %

数分、要求がないとダウンしてollama psから消えます。

新しい要求が来ると自動的にアップしてollama psに再び現れます。

11. LLMの停止

arm64@~  % ollama stop llama3.1:8b
arm64@~  %
arm64@~  % ollama ps
NAME    ID    SIZE    PROCESSOR    UNTIL
arm64@~  %

停止しても新しい要求が来ると自動的にアップしてollama psに再び現れます。

12. 利用可能なLLMの確認

arm64@~  % ollama list
NAME           ID              SIZE      MODIFIED
llama3.1:8b    46e0c10c039e    4.9 GB    43 hours ago
arm64@~  %

13. LLMの削除

arm64@~  % ollama rm llama3.1:8b
deleted 'llama3.1:8b'
arm64@~  %
arm64@~  % ollama list
NAME    ID    SIZE    MODIFIED
arm64@~  %

14. Ollamaの終了

ollama serveを実行したターミナルでCtrl Cします。


感想

LLMをローカルで実行できるのはありがたいです。

でも利用できるLLMには制限があります。

今回はllama3.2やllama3.1を利用しましたが、ChatGPTやClaudeとは大分、使い勝手が違いました。

例えば、ChatGPTやClaudeならうまく回答してくれるプロンプトがllamaだと全然、見当違いの結果になったりします。

うまく活用するにはオープンソースLLMへの慣れが必要だと感じました。