環境
- 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
- image: 先程ビルドしたdockerイメージの名前。
- ports: ホストとコンテナのポートをマッピング。8000番ポートを開放。
- volumes: ホストとコンテナのディレクトリをマッピング。キャッシュとモデル設定ファイルをマッピング。
- environment: 環境変数を設定。設定ファイルのパス、タイムゾーン、メモリロックの設定。
- cap_add: コンテナに追加のLinuxケーパビリティを付与。デバッグとリソース制限のため。
{ "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: 使用するモデルのリスト。
起動
docker compose up -d
確認
以下のコマンドでサーバーが正常に動作しているか確認できる。"フランスの首都は?"という質問を投げ、パリと返ってくれば成功
curl http://【サーバーのIP】:8000/v1/chat/completions -H 'Content-Type: application/json' -d '{"messages": [{"role": "user", "content": "フランスの首都は?"}]}'