OllamaでローカルLLMを稼働させAPIサーバ化する
必要なもの
ローカル環境で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に定義された内容のモデルをgemma2
、ELYZA
という名前でOllamaに登録することを示します。登録する名前は任意なので、呼び出しやすい名前を付けてもいいです。
create
コマンドが完了したら、次のコマンドを実行して登録されているモデルの一覧を表示します。
ollama list
モデル一覧が表示されれば導入成功です。
最後に、次のコマンドを実行して実際にモデルが稼働するかを試します。
ollama run gemma2
ollama run ELYZA
プロンプト入力画面が表示され、AIとの対話が可能になればOllamaとLLMの導入は完了です。
Ollamaのネットワーク設定
Ollamaは、インストール後に特に設定を行っていない状態でも、http://localhost:11434
からアクセス可能です。実際にブラウザからアクセスしてみるとOllama is running
というページが表示されるはずです。
ちなみにポート番号の11434という数字は、
llama
→llAmA
→11434
からきています。
しかし、この状態ではローカルホストでのアクセスのみを受け付ける状態であり、ローカルエリアの他の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と処理を共用できるので便利ですね。
- 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