はじめに
今回は、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メッセージのみの入力となっております。是非、試してみてください!