はじめに
こんにちは!今回は、llama.cppを使って「Umievo-itr012-Gleipnir-7B」モデルをサーバーとして起動し、ELYZA-tasks-100の推論結果をWandB(Weights and Biases)に送信する方法を、初心者の方にも分かりやすく解説していきます。
llama.cppで「Umievo-itr012-Gleipnir-7B」をサーバー起動する方法(GoogleColab)
はじめに本記事では、純粋なC/C++で実装された言語モデル推論ツールである「llama.cpp」を、Google Colab上でサーバーとして起動し、HTTPリクエストを送信して推論を行う方法を初心者向けに解説します。今回は、4つの強力な日...
それでは、順を追って説明していきましょう!
環境構築
まずは、必要なライブラリやツールをインストールします。Google Colabを開いて、以下のコードを順番に実行してください。
# 必要なライブラリのインストール
!pip install litellm mlflow wandb loguru
# Google Driveのマウント
from google.colab import drive
drive.mount('/content/drive')
# llama.cppのクローンとビルド
!git clone https://github.com/ggerganov/llama.cpp.git
%cd /content/llama.cpp
!make -j
# カレントディレクトリを元に戻す
%cd /content/
このコードブロックでは、以下の作業を行っています:
- 必要なPythonライブラリをインストール
- Google Driveをマウントして、ファイルにアクセスできるようにする
- llama.cppのリポジトリをクローンし、ビルドする
モデルのダウンロード
次に、Umievo-itr012-Gleipnir-7Bモデルをダウンロードします。
# Umievo-itr012-Gleipnir-7Bモデルのダウンロード
!huggingface-cli download mmnga/umiyuki-Umievo-itr012-Gleipnir-7B-gguf umiyuki-Umievo-itr012-Gleipnir-7B-Q4_K_M.gguf --local-dir .
# ELYZA-tasks-100データセットのダウンロード
!git clone https://huggingface.co/datasets/elyza/ELYZA-tasks-100/
このコードでは:
- Hugging Faceからモデルファイルをダウンロード
- ELYZA-tasks-100データセットをクローン
llama.cppサーバーの起動
モデルのダウンロードが完了したら、llama.cppサーバーを起動します。
# llama.cppサーバーの起動(バックグラウンドで実行)
!nohup ./llama.cpp/llama-server -m umiyuki-Umievo-itr012-Gleipnir-7B-Q4_K_M.gguf --port 8181 > output.log &
このコマンドは:
nohup
を使ってバックグラウンドでサーバーを起動- ダウンロードしたモデルファイルを指定
- ポート8181でサーバーを起動
- 出力を
output.log
ファイルにリダイレクト
評価スクリプトの作成
次に、ELYZA-tasks-100を使用してモデルを評価し、結果をWandBに送信するスクリプトを作成します。
from google.colab import userdata
os.environ['GEMINI_API_KEY'] = userdata.get('GOOGLE_API_KEY')
import csv
import json
import os
import requests
from litellm import completion
import wandb
from transformers import AutoTokenizer
from tqdm import tqdm
import loguru
# ロガーの設定
logger = loguru.logger
# パラメータ設定
MODEL_NAME = "umiyuki/Umievo-itr012-Gleipnir-7B"
EXPERIMENT_NAME = "elyza-tasks-100"
EVAL_DATASET_PATH = "/content/ELYZA-tasks-100/test.csv"
TEMPLATE_PROMPT_PATH = "/content/drive/MyDrive/Bench/prompt_eval_llamacpp.txt"
USE_WANDB = True
LITELLM_MODEL = "gemini/gemini-1.5-pro-latest"
# 評価データセットの読み込み関数
def load_eval_dataset(path):
with open(path, "r") as f:
csv_table = list(csv.reader(f))[1:]
return [{"input_text": r[0], "output_text": r[1], "eval_aspect": r[2]} for r in csv_table]
# プロンプトテンプレートの読み込み関数
def load_template_prompt(path):
with open(path, encoding="utf-8") as f:
return f.read()
# ローカルモデルクラス
class LocalModel:
def predict(self, input_text: str) -> str:
prompt = f"あなたは誠実で優秀なアシスタントです。\n\n{input_text}"
r = requests.post(
"http://127.0.0.1:8181/completions",
data=json.dumps({
"prompt": prompt,
"n_predict": 512,
"temperature": 0.3,
}),
headers={"Content-Type": "application/json"}
)
return json.loads(r.content)["content"]
# ELYZA-tasks-100のスコアリング関数
def elyza_tasks_100_score(input_text, output_text, eval_aspect, model_output, template_prompt, litellm_model):
prompt = template_prompt.format(
input_text=input_text,
output_text=output_text,
eval_aspect=eval_aspect,
pred=model_output,
)
response = completion(
model=litellm_model,
messages=[{"role": "user", "content": prompt}]
)
content = response.get('choices', [{}])[0].get('message', {}).get('content')
num = int(content)
if 1 <= num <= 5:
return num
raise Exception("Response Error")
# 評価実行関数
def evaluate(model, eval_dataset, template_prompt, litellm_model):
for i, row in tqdm(enumerate(eval_dataset[:3])):
input_text = row["input_text"]
output_text = row["output_text"]
eval_aspect = row["eval_aspect"]
model_output = model.predict(input_text)
score = elyza_tasks_100_score(input_text, output_text, eval_aspect, model_output, template_prompt, litellm_model)
# ログ表示
logger.info(f"Input Text: {input_text}")
logger.info(f"Output Text: {output_text}")
logger.info(f"Evaluation Aspect: {eval_aspect}")
logger.info(f"Score: {score}")
if USE_WANDB:
wandb.init(project=EXPERIMENT_NAME, name=f"Task{i:03d}")
wandb.log({"score": score, "input_text": input_text, "output_text": output_text, "eval_aspect": eval_aspect})
wandb.finish()
# メイン関数
def main():
if USE_WANDB:
from google.colab import userdata
WANDB_API_KEY = userdata.get('WANDB_API_KEY')
wandb.login(key=WANDB_API_KEY)
# データセットとプロンプトテンプレートの読み込み
eval_dataset = load_eval_dataset(EVAL_DATASET_PATH)
template_prompt = load_template_prompt(TEMPLATE_PROMPT_PATH)
# モデルとトークナイザーの準備
model = LocalModel()
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
# 評価の実行
evaluate(model, eval_dataset, template_prompt, LITELLM_MODEL)
if __name__ == "__main__":
main()
このスクリプトは以下の機能を持っています:
- 必要なライブラリとモジュールのインポート
- 評価データセットとプロンプトテンプレートの読み込み
- ローカルで起動したllama.cppサーバーへのリクエスト送信
- ELYZA-tasks-100の評価基準に基づくスコアリング
- 評価結果のWandBへの送信
評価の実行とWandBへの結果送信
最後に、作成したスクリプトを実行して評価を行い、結果をWandBに送信します。
# WandB APIキーの設定
from google.colab import userdata
os.environ['WANDB_API_KEY'] = userdata.get('WANDB_API_KEY')
# 評価スクリプトの実行
main()
このコードブロックでは:
- Google ColabのユーザーデータからWandBのAPIキーを取得
- 環境変数にAPIキーを設定
- 評価スクリプトのmain関数を実行
まとめ
以上で、llama.cppを使って「Umievo-itr012-Gleipnir-7B」モデルをサーバーとして起動し、ELYZA-tasks-100の推論結果をWandBに送信する一連の流れが完了しました。
この記事では、以下の内容を学びました:
- llama.cppの環境構築方法
- モデルのダウンロードと設定
- llama.cppサーバーの起動方法
- ELYZA-tasks-100を使用したモデル評価の実装
- WandBを使用した評価結果の記録方法
これらの手順を踏むことで、大規模言語モデルの評価と結果の可視化が可能になります。モデルの性能向上や比較分析に役立てることができるでしょう。
ぜひ、この記事を参考に実際に試してみてください。モデル評価の世界が広がることを願っています!
📒Google Colabノートブック
Google Colab
参考サイト
GitHub - ggerganov/llama.cpp: LLM inference in C/C++
LLM inference in C/C++. Contribute to ggerganov/llama.cpp development by creating an account on GitHub.
Weave と Elyza-tasks-100 で ローカルLLMを評価する|npaka
「Weave」と「Elyza-tasks-100」で ローカルLLMの評価を試したので、まとめました。 1. Weave と Elyza-tasks-100 「Weave」は、LLMアプリケーションの記録、実験、評価のためのツールです。「Weights & Biases」が提供する機能の1つになります。「評価関数...
https://note.com/_4piken/n/n6bf08e547f1e
Google Colab で Llama-2-70B-chat-GGUF を試す。|npaka
「Google Colab」で「Llama-2-70B-chat-GGUF」を試したので、まとめました。 1. Llama-2-70B-chat-GGUF 「TheBloke/Llama-2-70B-chat-GGUF」を利用します。2023年9月12日現在、70Bは「Llama 2」の最大パラメータモデルになり...
mmnga/umiyuki-Umievo-itr012-Gleipnir-7B-gguf · Hugging Face
We’re on a journey to advance and democratize artificial intelligence through open source and open science.
コメント