llama-cpp-pythonとFlaskでLLMサーバをたててみた

※本ブログはアフィリエイトで収益を得ています

はじめに

今回は、llama-cpp-pythonとFlaskを使って、LLMサーバをたててみたので、その手順を紹介します。特にStreamデータとして返却する部分に苦労したため、自分の備忘録としても残しておきます

事前準備

事前準備に下記をインストールします

  • Flaskのインストール
  • llama-cpp-pythonのインストール
  • 学習済み大規模言語モデルのダウンロード

Flaskのインストール

FlaskはPythonでWebアプリケーションを作成するための軽量なフレームワークです。今回はこちらを使って、ローカル環境にLLMサーバをたてるためインストールしていきます

Flaskのインストールは下記のコマンドを使います

pip install Flask

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

llama-cpp-pythonは、Llama2のPythonラッパーです。Llama2はLarge Language Model(大規模言語モデル)の一種類です。こちらを使うと簡単にローカル環境でLLMをたてることができます。ローカル環境にLLMサーバをたてるためインストールしていきます

pip install llama-cpp-python

学習済み大規模言語モデルのダウンロード

大規模言語モデルを個人の環境で学習するのはとても困難です。そこで他の方が公開している学習済みモデルを使います。そこで便利なのがHugging Faceという学習済みモデル公開サイトです。今回はこの中でELYZA社のモデルをggufファイル化してくださっていた方がいたので利用させていただきます。

こちらにアクセスし、ELYZA-japanese-Llama-2-7b-instruct-q8_0.ggufをダウンロードしてください。

Pythonのコードを書く

先に完成系を下記に示します。

from llama_cpp import Llama
from flask import Flask, request, Response

llm = Llama(model_path="./ELYZA-japanese-Llama-2-7b-instruct-q8_0.gguf", chat_format="llama-2")
app = Flask(__name__)

@app.route('/llama', methods=['POST'])
def llama_chat():
    data = request.json
    message = data['message']

    def generate():
        response = llm.create_chat_completion(messages=[{'role': 'user', 'content': message}], stream=True, stop=None)
        for chunk in response:
            if 'content' in chunk['choices'][0]['delta']:
                yield chunk['choices'][0]['delta']['content']
    
    return Response(generate(), mimetype='text/plain') 


if __name__ == "__main__":
    app.run(port=5000, debug=True)

上記のコードを下記で実行してください。※モデルの読み込みが終わりサーバが立ち上がるまで時間がかかります

サーバが立ち上がったら下記でサーバにリクエストを送ります

curl -X POST -H "Content-Type: application/json" -d '{"message":"こんにちは"}' http://127.0.0.1:5000/llama

待っていると下記のようなメッセージが返ってきました。今回のコードはストリームデータを返却するようにしており、ChatGPTのように文章が随時更新されていきます。

こんにちは!
私はELYZAによって訓練されたAIです。
ユーザーからの様々な質問や要望にお答えすることができます。何をお手伝いしましょうか?%    

ということで完成です!

さいごに

今回は、llama-cpp-pythonとFlaskを使ってLLMサーバをたててみました。ローカル環境でのたて方を紹介しましたが、実際には、AWSやGCPなどのクラウド環境でたてることができます。また、今回のコードは実は未完成です。本来であればチャット履歴全部をモデルに入力してあげる必要がありますが、今回は1メッセージのみの入力となっております。是非、試してみてください!