はじめに
本記事では、純粋なC/C++で実装された言語モデル推論ツールである「llama.cpp」を、Google Colab上でサーバーとして起動し、HTTPリクエストを送信して推論を行う方法を初心者向けに解説します。
今回は、4つの強力な日本語AIモデルを進化的アルゴリズムでマージした「Umievo-itr012-Gleipnir-7B」モデルを使用します。
このモデルは、Japanese-Starling-ChatV-7B、Ninja-v1-RP-expressive-v2、Vecteus-v1、Japanese-Chat-Umievo-itr004-7bの4つのモデルを組み合わせたもので、ElyzaTasks100ベンチマークで平均点が3.91(Llama3-70Bによる自動評価を3回行った平均点)という高い性能を示しています。
プログラミング初心者の方でも、この記事を読めば問題なくllama.cppサーバーの環境構築から実行までできるようになります。ではさっそく始めていきましょう!
環境構築
まずはGoogle Colabの環境構築から行います。下記の手順に沿って進めてください。
1. モデルのダウンロード
以下のコマンドを実行し、使用するモデルファイルをダウンロードします。今回は例として「umiyuki-Umievo-itr012-Gleipnir-7B-Q4_K_M.gguf」モデルを使用します。
!huggingface-cli download mmnga/umiyuki-Umievo-itr012-Gleipnir-7B-gguf umiyuki-Umievo-itr012-Gleipnir-7B-Q4_K_M.gguf --local-dir .
huggingface-cli
コマンドを使用して、指定したリポジトリ(mmnga/umiyuki-Umievo-itr012-Gleipnir-7B-gguf
)からモデルファイル(umiyuki-Umievo-itr012-Gleipnir-7B-Q4_K_M.gguf
)をダウンロードし、カレントディレクトリ(--local-dir .
)に保存します。
2. llama.cppのクローン
続いて、以下のコマンドでllama.cppリポジトリをクローンします。
!git clone https://github.com/ggerganov/llama.cpp.git
%cd llama.cpp
!make -j
まずgit clone
コマンドでllama.cppのGitリポジトリをクローンし、%cd llama.cpp
でllama.cppディレクトリに移動します。
そしてmake -j
コマンドでllama.cppをビルドします。-j
オプションは並列ビルドを有効にするためのものです。
これで環境構築は完了です。次はllama.cppサーバーを起動し、リクエストを送信していきます。
llama.cppサーバーの起動とリクエスト送信
1. llama-serverの起動
以下のコマンドを実行し、バックグラウンドでllama-serverを起動します。
!nohup ./llama-server -m ../umiyuki-Umievo-itr012-Gleipnir-7B-Q4_K_M.gguf --port 8181 > output.log &
nohup
コマンドを使用することで、プロセスをバックグラウンドで実行できます。./llama-server
はllama-serverの実行ファイルを指定しています。-m
オプションで使用するモデルファイルのパスを指定します。今回は先ほどダウンロードした「umiyuki-Umievo-itr012-Gleipnir-7B-Q4_K_M.gguf」を使用します。--port
オプションでllama-serverが利用するポート番号を指定します。ここでは8181番ポートを使用しています。- 最後に
> output.log &
で標準出力をoutput.logファイルにリダイレクトし、バックグラウンドで実行します。
2. リクエストの送信
llama-serverが起動したら、以下のコマンドでHTTPリクエストを送信し、モデルからの応答を得ます。
!curl --request POST \
--url http://localhost:8181/completion \
--header "Content-Type: application/json" \
--data '{"prompt": "User:日本語で回答してください。富士山の高さは? Assistant: ","n_predict": 128}'
curl
コマンドを使用してHTTPリクエストを送信します。--request POST
でPOSTメソッドを指定し、--url
オプションでリクエスト送信先のURLを指定します。今回はローカルホストの8181番ポートにリクエストを送信します。--header
オプションでリクエストのContent-Typeヘッダを指定します。llama-serverはJSONデータを受け取るため、application/json
を指定します。--data
オプションでリクエストのJSONデータを指定します。ここではプロンプト(prompt
)と予測トークン数(n_predict
)を指定しています。
リクエストを送信すると、llama-serverがモデルを使用して推論を行い、結果をレスポンスとして返してくれます。
CPU
{"content":"富士山の高さは、3,776メートルです。富士山は日本最高峰の山で、世界遺産にも登録されています。","id_slot":0,"stop":true,"model":"../umiyuki-Umievo-itr012-Gleipnir-7B-Q4_K_M.gguf","tokens_predicted":53,"tokens_evaluated":27,"generation_settings":{"n_ctx":8192,"n_predict":-1,"model":"../umiyuki-Umievo-itr012-Gleipnir-7B-Q4_K_M.gguf","seed":4294967295,"temperature":0.800000011920929,"dynatemp_range":0.0,"dynatemp_exponent":1.0,"top_k":40,"top_p":0.949999988079071,"min_p":0.05000000074505806,"tfs_z":1.0,"typical_p":1.0,"repeat_last_n":64,"repeat_penalty":1.0,"presence_penalty":0.0,"frequency_penalty":0.0,"penalty_prompt_tokens":[],"use_penalty_prompt_tokens":false,"mirostat":0,"mirostat_tau":5.0,"mirostat_eta":0.10000000149011612,"penalize_nl":false,"stop":[],"n_keep":0,"n_discard":0,"ignore_eos":false,"stream":false,"logit_bias":[],"n_probs":0,"min_keep":0,"grammar":"","samplers":["top_k","tfs_z","typical_p","top_p","min_p","temperature"]},"prompt":"User:日本語で回答してください。富士山の高さは? Assistant: ","truncated":false,"stopped_eos":true,"stopped_word":false,"stopped_limit":false,"stopping_word":"","tokens_cached":79,"timings":{"prompt_n":27,"prompt_ms":13900.257,"prompt_per_token_ms":514.8243333333334,"prompt_per_second":1.9424101295393317,"predicted_n":53,"predicted_ms":37726.265,"predicted_per_token_ms":711.816320754717,"predicted_per_second":1.4048568020184347}}CPU times: user 404 ms, sys: 53.8 ms, total: 458 ms
Wall time: 51.7 s
GPU
{"content":"富士山の高さは、3,776メートルです。","id_slot":0,"stop":true,"model":"../umiyuki-Umievo-itr012-Gleipnir-7B-Q4_K_M.gguf","tokens_predicted":21,"tokens_evaluated":27,"generation_settings":{"n_ctx":8192,"n_predict":-1,"model":"../umiyuki-Umievo-itr012-Gleipnir-7B-Q4_K_M.gguf","seed":4294967295,"temperature":0.800000011920929,"dynatemp_range":0.0,"dynatemp_exponent":1.0,"top_k":40,"top_p":0.949999988079071,"min_p":0.05000000074505806,"tfs_z":1.0,"typical_p":1.0,"repeat_last_n":64,"repeat_penalty":1.0,"presence_penalty":0.0,"frequency_penalty":0.0,"penalty_prompt_tokens":[],"use_penalty_prompt_tokens":false,"mirostat":0,"mirostat_tau":5.0,"mirostat_eta":0.10000000149011612,"penalize_nl":false,"stop":[],"n_keep":0,"n_discard":0,"ignore_eos":false,"stream":false,"logit_bias":[],"n_probs":0,"min_keep":0,"grammar":"","samplers":["top_k","tfs_z","typical_p","top_p","min_p","temperature"]},"prompt":"User:日本語で回答してください。富士山の高さは? Assistant: ","truncated":false,"stopped_eos":true,"stopped_word":false,"stopped_limit":false,"stopping_word":"","tokens_cached":47,"timings":{"prompt_n":27,"prompt_ms":11601.427,"prompt_per_token_ms":429.6824814814815,"prompt_per_second":2.327299908881899,"predicted_n":21,"predicted_ms":12795.433,"predicted_per_token_ms":609.3063333333333,"predicted_per_second":1.6412105788057345}}CPU times: user 247 ms, sys: 35.4 ms, total: 283 ms
Wall time: 37.7 s
おわりに
本記事では、llama.cppをGoogle Colab上でサーバーとして起動し、HTTPリクエストを送信して推論を行う方法を初心者向けに解説しました。
少しでもプログラミング初心者の方の理解に役立てば幸いです。ぜひ、実際にllama.cppサーバーを動かしてみて、色々なモデルで推論を試してみてください。
コメント