🦙

OllamaでローカルLLMを稼働させAPIサーバ化する

2024/10/26に公開

必要なもの

ローカル環境でOllamaを使ってLLMのAPIサーバを構築するために必要なものは、主に下記の3つです。

  • Ollamaインストーラ
  • LLMのggufファイル
  • Modelfile

Ollamaのインストール

https://ollama.com/から、Windows用のインストーラをダウンロードします。

インストーラを実行して「Install」ボタンをクリックてOllamaをインストールします。

インストールが完了したらWindowsターミナルを開き、次のコマンドを実行します。

ollama --version

バージョン情報が表示されれば、Ollamaの導入は完了です。

LLMのダウンロード

Huggingfaceなどで配布されているLLMの.ggufモデルをダウンロードします。

本記事ではGemma 2とLlama-3-ELYZA-JP-8B-GGUFを導入していきます。
google/gemma-2-2b-it-GGUF
elyza/Llama-3-ELYZA-JP-8B-GGUF

.ggufは、llama.cpp用の量子化バイナリ形式のモデルです。

Ollamaでは.safetensors形式のモデルはサポートされていないので、.gguf形式である必要があります。

モデルの使用について規約に同意する必要がある場合には、規約に同意のもとダウンロードを行ってください。

※ .safetensorsを.ggufに変換できる方は、別途その手順を行ってください。

Ollamaに標準で備わっているモデルを使用する場合には、Modelsからモデルを確認し、次のようなコマンドを実行してダウンロードすることもできます。

ollama pull llama2

Modelfileの作成

HuggingfaceなどからダウンロードしたモデルについてTEMPLATEを検索します。TEMPLATEとは、モデルに渡すプロンプトの形式を定義したもので、ファインチューニングや量子化されたモデルは、大元のモデルのTEMPLATEが適用できます。

  • TEMPLATE(Gemma 2)
<start_of_turn>user
{{ if .System }}{{ .System }} {{ end }}{{ .Prompt }}<end_of_turn>
<start_of_turn>model
{{ .Response }}<end_of_turn>
  • TEMPLATE(Llama 3)
{{ if .System }}<|start_header_id|>system<|end_header_id|>
{{ .System }}<|eot_id|>{{ end }}{{ if .Prompt }}<|start_header_id|>user<|end_header_id|>
{{ .Prompt }}<|eot_id|>{{ end }}<|start_header_id|>assistant<|end_header_id|>
{{ .Response }}<|eot_id|>

このTEMPLATEとモデルファイルがどこにあるかを示したFROMを記述したModelfileを作成します。

ここではデスクトップに量子化LLMファイル(.gguf)とModelfileを配置するものとします。

空のテキストファイルを新規作成し、名前を「Modelfile」に変更します。任意のエディタでModelfileを開き、

  • Modelfile(gemma-2-2b-it-GGUF)
FROM C:/Users/(ユーザ名)/Desktop/2b_it_v2.gguf
TEMPLATE """
<start_of_turn>user
{{ if .System }}{{ .System }} {{ end }}{{ .Prompt }}<end_of_turn>
<start_of_turn>model
{{ .Response }}<end_of_tu
"""
  • Modelfile(Llama-3-ELYZA-JP-8B-GGUF)
FROM C:/Users/(ユーザ名)/Desktop/Llama-3-ELYZA-JP-8B-q4_k_m.gguf
TEMPLATE """
{{ if .System }}<|start_header_id|>system<|end_header_id|>
{{ .System }}<|eot_id|>{{ end }}{{ if .Prompt }}<|start_header_id|>user<|end_header_id|>
{{ .Prompt }}<|eot_id|>{{ end }}<|start_header_id|>assistant<|end_header_id|>
{{ .Response }}<|eot_id|>
"""

このように、FROMで.ggufのパス、TEMPLATEでプロンプト形式を定義します。

Modelfileを作成したら、デスクトップでWindowsターミナルを開き、次のコマンドを実行します。

ollama create gemma2 -f Modelfile
ollama create ELYZA -f Modelfile

このコマンドは、Modelfileに定義された内容のモデルをgemma2ELYZAという名前でOllamaに登録することを示します。登録する名前は任意なので、呼び出しやすい名前を付けてもいいです。

createコマンドが完了したら、次のコマンドを実行して登録されているモデルの一覧を表示します。

ollama list

モデル一覧が表示されれば導入成功です。

最後に、次のコマンドを実行して実際にモデルが稼働するかを試します。

ollama run gemma2
ollama run ELYZA

プロンプト入力画面が表示され、AIとの対話が可能になればOllamaとLLMの導入は完了です。

Ollamaのネットワーク設定

Ollamaは、インストール後に特に設定を行っていない状態でも、http://localhost:11434からアクセス可能です。実際にブラウザからアクセスしてみるとOllama is runningというページが表示されるはずです。

ちなみにポート番号の11434という数字は、llamallAmA11434からきています。

しかし、この状態ではローカルホストでのアクセスのみを受け付ける状態であり、ローカルエリアの他のPCからのアクセスはできません。

他のPCのアクセスを許可するには、環境変数に次の2つの変数を登録する必要があります。

キー
OLLAMA_HOST 0.0.0.0
OLLAMA_ORIGINS 例: 192.168.1.*

これは、ローカルエリアネットワークの192.168.1.*のアドレスを持つコンピュータからのアクセスを許可する設定です。

環境変数の登録が終わったら、タスクバーの右端のOllamaアイコンを右クリックし「Quit Ollama」からOllamaを一度終了させ、Ollamaを再び起動させます。

次に、同じローカルエリアネットワークに接続されている他のPCから、OllamaのホストとなっているPCにアクセスします。

※ここでは例として、OllamaのホストPCのアドレスを192.168.1.10とします。
※他のPCが無い場合には、ホストPCで実施してもよいです。

ブラウザからhttp://192.168.1.10:11434にアクセスして、Ollama is runningと表示されれば、外部アクセス設定は完了です。

Pythonからの利用

構築したOllama APIサーバの動作を確認するために、APIリクエストを送りレスポンスを受け取るPythonプログラムを作成します。

import requests

API_SERVER_URL = "http://192.168.1.10:11434/api/chat"

def main():
    headers = {"Content-Type": "application/json"}
    json = {
        "model": "gemma2",
        "messages": [{
            "role": "user",
            "content": "Hello",
        }]
    }

    response = requests.post(API_SERVER_URL, headers=headers, json=json)
    response.raise_for_status()

    print(response.text)

main()

簡易的なサンプルプログラムですが、APIサーバが稼働していればレスポンスを受け取ることができるはずです。実際には、通信エラーが起きた際の例外処理が必要になってくるでしょう。
プログラムを拡張していけば、コンテキストを保持させたりストリーミングでレスポンスを受け取ることもできます。

OpenAIライブラリからの利用

構築したOllama APIサーバですが、実はOpenAI APIのJSON形式でやり取りができます。
ChatGPTと処理を共用できるので便利ですね。

OpenAI compatibility

  • Python
from openai import OpenAI

client = OpenAI(
    base_url = 'http://localhost:11434/v1',
    api_key='ollama', # required, but unused
)

response = client.chat.completions.create(
  model="llama2",
  messages=[
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "Who won the world series in 2020?"},
    {"role": "assistant", "content": "The LA Dodgers won in 2020."},
    {"role": "user", "content": "Where was it played?"}
  ]
)
print(response.choices[0].message.content)
  • JavaScript
import OpenAI from 'openai'

const openai = new OpenAI({
  baseURL: 'http://localhost:11434/v1',
  apiKey: 'ollama', // required but unused
})

const completion = await openai.chat.completions.create({
  model: 'llama2',
  messages: [{ role: 'user', content: 'Why is the sky blue?' }],
})

console.log(completion.choices[0].message.content)

まとめ

本記事では、Ollamaを使ってローカル環境にLLMのAPIサーバを構築する手順をまとめました。

最近は、性能の低下を最小限に抑えてモデルサイズを縮小した量子化モデルが多数公開されており、個人のPC環境でも高速に生成AIを稼働させることができます。モデルは、日本語対応したものからプログラム生成に特化したものまで幅広く存在していますので、用途に合わせていろいろ試してみてください。

Discussion