llama.cpp

llama.cppは、元々はLLMの一つllamaをローカルで動作させるためのツール群として開発されたが、 現在は(GGUF形式の)様々なLLMモデルを実行できる。

ツールの一つ、llama-serverはLLMのプロキシーとして動作するので、 制約*1はあるものの、 OpenAIの代わりにローカルのLLMモデル(Phi3, Mistral, Gemma2, Llamaなど)を使用してアプリケーションを動かすことができる。

つまり、OpenAIへの課金なしで(全てではないが)多くのLLMアプリを動作させることができる。

1. インストール

$ git clone https://github.com/ggerganov/llama.cpp
$ cd llama.cpp
$ make

2. LLMモデルのダウンロード

HuggingfaceからGGUF形式のLLMモデルをダウンロードし、適当なディレクトリに配置する。

Huggingfaceからモデルをダウンロード

3. テスト

llama-cliで簡単な質問をしてモデルの動作チェックができる。

$ ./llama-cli -m models/Phi-3-mini-4k-instruct-q4.gguf  -p "what is the tallest mountain in Japan?"

4. llama-server

llama-serverは例えば次のようにモデルを指定して起動する。

$ ./llama-server -c 4096 -m models/Phi-3-mini-4k-instruct-q4.gguf

5. アプリケーションの変更

基本的にはBASE_URLに"http://localhost:8080/v1"を設定するだけである。

import os
from openai import OpenAI

OPENAI_KEY = "no_key"
OPENAI_BASE_URL = "http://localhost:8080/v1"
client = OpenAI(api_key=OPENAI_KEY, base_url=OPENAI_BASE_URL)

response = client.chat.completions.create(
  model="gpt-4o",
  messages=[
    {
      "role": "user",
      "content": "What is the tallest mountain in Japan?"
    }
  ],
  temperature=0.2
)

print(response)

実行結果は以下の通り。

$ python test.py
ChatCompletion(id='chatcmpl-1d2BjdNHNUiHothjkQ1sUWrMlr8HSBX8', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='The tallest mountain in Japan is Mount Fuji, which stands at 3,776 meters (12,388 feet) above sea level. It is located on the main island of Honshu, about 100 kilometers (62 miles) west of Tokyo.', refusal=None, role='assistant', function_call=None, tool_calls=None))], created=1727315791, model='gpt-4o', object='chat.completion', service_tier=None, system_fingerprint=None, usage=CompletionUsage(completion_tokens=52, prompt_tokens=17, total_tokens=69, completion_tokens_details=None))

*1:例えば"Only one completion choice is allowed"