動かざることバグの如し

近づきたいよ 君の理想に

llama-cpp-pythonをDockerで動かす

環境

  • Docker24
  • llama-cpp-python 0.2.79

やりたいこと

ローカルのLLMを自宅のGPUサーバー上で動かすことを目指す。ChatGPT互換APIを使用すると、その利便性が向上する。llama cppを使用するとシンプルだが、llama-cpp-pythonのserverを使用すると、ChatGPT互換APIを簡単に構築できる。

インストール

llama-cpp-pythonでは公式でDockerイメージが用意されている。

しかしそれにはCUDAは対応していないため、別途自分でビルドする必要がある。

そのまま起動しようとすると以下のエラーになってしまう。

Traceback (most recent call last):
  File "<frozen runpy>", line 189, in _run_module_as_main
  File "<frozen runpy>", line 112, in _get_module_details
  File "/app/llama_cpp/__init__.py", line 1, in <module>
    from .llama_cpp import *
  File "/app/llama_cpp/llama_cpp.py", line 83, in <module>
    _lib = _load_shared_library(_lib_base_name)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/app/llama_cpp/llama_cpp.py", line 74, in _load_shared_library
    raise FileNotFoundError(
FileNotFoundError: Shared library with base name 'llama' not found
exited with code 1

まずはllama-cpp-python/docker/cuda_simpleディレクトリ下のDockerfileをダウンロードし、ビルドする

docker build -t cuda_simple .

起動

以下の docker-compose.yml を用意する。cuda_simpleは先程用意したdockerイメージ。

services:
  server:
    image: cuda_simple
    ports:
      - 8000:8000
    volumes:
      - ./cache:/root/.cache
      - ./models.json:/models.json
    environment:
      CONFIG_FILE: /models.json
      TZ: Asia/Tokyo
      USE_MLOCK=0
    cap_add:
        - SYS_PTRACE
        - SYS_RESOURCE
    deploy:
          resources:
            reservations:
              devices:
                - driver: nvidia
                  capabilities: [gpu]
    tty: true
    stop_grace_period: 0s

次に同じディレクトリにmodels.jsonを用意する

{
  "host": "0.0.0.0",
  "models": [
    {
      "hf_model_repo_id": "mmnga/HODACHI-EZO-Common-9B-gemma-2-it-gguf",
      "model": "*Q5_K_M.gguf",
      "n_gpu_layers": -1,
      "n_threads": 4,
      "n_batch": 512,
      "n_ctx": 4096,
      "model_alias": "gpt-3.5-turbo"
    }
  ]
}
  • host: サーバーのホスト名。ここでは全てのIPからの接続を許可。
  • models: 使用するモデルのリスト。
    • hf_model_repo_id: Hugging Face Model HubのモデルID。
    • model: モデルのファイル名。
    • n_gpu_layers: GPUで計算するレイヤーの数。-1は全てのレイヤーを意味する。
    • n_threads: 使用するスレッドの数。
    • n_batch: バッチサイズ。
    • n_ctx: コンテキストウィンドウのサイズ。
    • model_alias: モデルのエイリアス名。

起動

docker compose up -d

確認

以下のコマンドでサーバーが正常に動作しているか確認できる。"フランスの首都は?"という質問を投げ、パリと返ってくれば成功

curl http://【サーバーのIP】:8000/v1/chat/completions -H 'Content-Type: application/json' -d '{"messages": [{"role": "user", "content": "フランスの首都は?"}]}'