IK.AM


AI > LLM > llama.cpp

llama-cpp-pythonを使ってLlama 3モデルを使ったOpenAI互換サーバーを起動しSpring AIからアクセスする

Created on Fri May 10 2024 • Last Updated on Fri May 10 2024N/A Views

🏷️ Python | llama.cpp | OpenAI | Machine Learning | MPS | Llama 3 | Spring AI

"llama-cpp-pythonを使ってGemmaモデルを使ったOpenAI互換サーバーを起動しSpring AIからアクセスする"と同じ要領でMetaのLlama 3を試します。

目次

llama-cpp-pythonのインストール

まずはvenvを作成します。

mkdir -p $HOME/work/llm
cd $HOME/work/llm
python3 -m venv .venv
source .venv/bin/activate

llama-cpp-pythonのインストールします。serverも一緒にインストールします。

CMAKE_ARGS="-DLLAMA_METAL=on" pip install --force-reinstall --no-cache-dir 'llama-cpp-python[server]'

Note

Apple SiliconのMac上でエラーが出る場合は、 https://github.com/abetlen/llama-cpp-python/blob/main/docs/install/macos.md のセットアップを試してください。

chat_format="llama-3"は以下のコミットでサポートされたので、v0.2.64以上を使用してください。

https://github.com/abetlen/llama-cpp-python/commit/8559e8ce88b7c7343004eeccb7333b806034b01c

Llama 3のダウンロード

sudo mkdir -p /opt/models
sudo chown -R $USER /opt/models

llama-cpp-pythonで利用するモデルはGGUF形式である必要があるので、今回はGGUF形式に変換された以下のモデルを使用します。

https://huggingface.co/QuantFactory/Meta-Llama-3-8B-Instruct-GGUF

Meta-Llama-3-8B-Instruct.Q4_K_M.gguf/opt/models/にダウンロードしてください。

OpenAI互換サーバーの起動

以下のコマンドでサーバーを立ち上げます。--chat_format=llama-3を指定する必要があります。

python3 -m llama_cpp.server --chat_format=llama-3 --model /opt/models/Meta-Llama-3-8B-Instruct.Q4_K_M.gguf --n_gpu_layers 1

以下からAPIドキュメントを確認できます。

http://localhost:8000/docs

OpenAIの"Create chat completion" APImodelパラメータが必須ですが、

llama-cpp-pythonの方はmodelパラメータはなくても良いみたいです。

curlでアクセス

curl -s http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
   "messages": [
      {"role": "user", "content": "Give me a joke."}
   ]
 }' | jq .

何かジョークが返ってきました。

{
  "id": "chatcmpl-755f1cc0-39e1-408c-b119-11034492b500",
  "object": "chat.completion",
  "created": 1715328366,
  "model": "/opt/models/Meta-Llama-3-8B-Instruct.Q4_K_M.gguf",
  "choices": [
    {
      "index": 0,
      "message": {
        "content": "Here's one:\n\nWhy couldn't the bicycle stand up by itself?\n\n(Wait for it...)\n\nBecause it was two-tired!\n\nHope that made you laugh!",
        "role": "assistant"
      },
      "logprobs": null,
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 17,
    "completion_tokens": 32,
    "total_tokens": 49
  }
}

Spring AIでアクセス

Spring AIを使ったアプリからアクセスしてみます。
OpenAI互換なので、Spring AIのOpenAI用のChat Clientが利用できます。

サンプルアプリはこちらです。

https://github.com/making/hello-spring-ai

git clone https://github.com/making/hello-spring-ai
cd hello-spring-ai
./mvnw clean package -DskipTests=true
java -jar target/hello-spring-ai-0.0.1-SNAPSHOT.jar --spring.ai.openai.base-url=http://localhost:8000 --spring.ai.openai.api-key=dummy
$ curl localhost:8080
Here's one:

Why couldn't the bicycle stand up by itself?

(Wait for it...)

Because it was two-tired!

Hope that made you smile! Do you want to hear another one?

このアプリ自体はOpenAI向けのアプリですが、プロパティを変えるだけででLlama-3も使えるのがllama-cpp-pythonを使う利点ですね。

OpenAI APIとの互換性は気にせず、Llama 3を使いたいだけであれば、spring-ai-ollama経由でOllamaを使うこともできます。

Found a mistake? Update the entry.