名古屋出身ソフトウェアエンジニアのブログ

ELYZA Japanese LLaMA 2 13B を WEB デプロイ

公開:
更新:

ELYZA Japanese LLaMA 2 の 13B モデルがリリースされたのでお試しです。量子化済みモデルの中から fast-instruct-q5_K_M を選びました。

7B を扱った先回記事とだいたい同じ内容を Ubuntu で行っています。

Llama.cpp の Python バインディング (CPU) である llama-cpp-python は OpenAI 互換の API サーバーを内蔵しているので、ここに Chatbot UI (WEB フロントエンド) を接続することで、ChatGPT サービスのように WEB から ELYZA Japanese LLaMa 2 を使うことができます1

Elyza LLaMA 2 Japanese

検証環境

  • Ubuntu 18.04 LTS
  • Intel Xeon Silver 4216
  • 48GB RAM

仮想環境を切る

python3 -m venv venv
. ./venv/bin/activate

サーバープログラムの用意

仮想環境に llama-cpp-python をインストールします。[server] エクストラをつけてインストールする必要があります。 Llama.cpp 本体も含まれているので、別で用意する必要はありません。

pip3 install "llama-cpp-python[server]"

llama-cpp-python がアップデートで、Elyza モデルと同等フォーマットのプロンプティングに対応(下図のように)したので、仮想環境内の llama-cpp パッケージ内ソースの書き換えは不要になりました。

# see https://github.com/huggingface/transformers/blob/main/src/transformers/models/llama/tokenization_llama.py
# system prompt is "embedded" in the first message
@register_chat_format("llama-2")
def format_llama2(
    messages: List[llama_types.ChatCompletionRequestMessage],
    **kwargs: Any,
) -> ChatFormatterResponse:
    _system_template = "<s>[INST] <<SYS>>\n{system_message}\n<</SYS>>"
    _roles = dict(user="<s>[INST]", assistant="[/INST]")
    _messages = _map_roles(messages, _roles)
    system_message = _get_system_message(messages)
    if system_message:
        system_message = _system_template.format(system_message=system_message)
    _prompt = _format_llama2(system_message, _messages, " ", "</s>") + "[/INST]"
    return ChatFormatterResponse(prompt=_prompt)

サーバー起動

--model オプションで gguf ファイルへのパスを指定して、API サーバーを起動します。上記フォーマットを使うため、--chat_format llama-2 も必須です。

python3 -m llama_cpp.server --model ELYZA-japanese-Llama-2-13b-fast-instruct-q5_K_M.gguf --chat_format llama-2

外に公開する場合は、オプションに --host 0.0.0.0 を付けます。

http://localhost:8000/docs へアクセスして、FastAPI ではお馴染みの Swagger 画面が出ていれば起動できています。

Swagger (OpenAPI)

WEB クライアントを用意する

Chatbot UI をクローンします。

mckaywrigley/chatbot-ui: An open source ChatGPT UI.
An open source ChatGPT UI. Contribute to mckaywrigley/chatbot-ui development by creating an account on GitHub.

v2 から Supabase を使うようになったらしく、面倒くさいので legacy ブランチを使います。

git clone -b legacy https://github.com/mckaywrigley/chatbot-ui.git
cd chatbot-ui

npm パッケージをインストールします。

npm i

vulnerabilities が出たら適当に解決します。

npm audit fix --force

環境変数ファイルを作成します。

cp .env.local.example .env.local

.env.local に、いくつか環境変数を設定する必要があります。以下のように OPENAI_API_HOSTOPENAI_API_KEY を設定します。本物の OPENAI_API_KEY を入れる必要はありません。

# Chatbot UI
OPENAI_API_HOST="http://localhost:8000"
OPENAI_API_KEY=fake_key
DEFAULT_SYSTEM_PROMPT="あなたは誠実で優秀な日本人のアシスタントです。"

WEB フロントエンドを起動

Next.js の開発サーバーを起動します。

npm run dev

http://localhost:3000 にアクセスすると、以下のようにお話しができるようになっています。

Chat


  1. ただし、Chatbot UI は ChatGPT 前提で作られているので、一部 UI 表示におかしい点がでます。 ↩︎