llama.cppで「Umievo-itr012-Gleipnir-7B」をサーバー起動してELYZA-tasks-100の推論結果をWandBに送信する方法

AI・機械学習

はじめに

こんにちは!今回は、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/

このコードブロックでは、以下の作業を行っています:

  1. 必要なPythonライブラリをインストール
  2. Google Driveをマウントして、ファイルにアクセスできるようにする
  3. 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/

このコードでは:

  1. Hugging Faceからモデルファイルをダウンロード
  2. 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()

このスクリプトは以下の機能を持っています:

  1. 必要なライブラリとモジュールのインポート
  2. 評価データセットとプロンプトテンプレートの読み込み
  3. ローカルで起動したllama.cppサーバーへのリクエスト送信
  4. ELYZA-tasks-100の評価基準に基づくスコアリング
  5. 評価結果のWandBへの送信

評価の実行とWandBへの結果送信

最後に、作成したスクリプトを実行して評価を行い、結果をWandBに送信します。

# WandB APIキーの設定
from google.colab import userdata
os.environ['WANDB_API_KEY'] = userdata.get('WANDB_API_KEY')

# 評価スクリプトの実行
main()

file

このコードブロックでは:

  1. Google ColabのユーザーデータからWandBのAPIキーを取得
  2. 環境変数にAPIキーを設定
  3. 評価スクリプトのmain関数を実行

まとめ

以上で、llama.cppを使って「Umievo-itr012-Gleipnir-7B」モデルをサーバーとして起動し、ELYZA-tasks-100の推論結果をWandBに送信する一連の流れが完了しました。

この記事では、以下の内容を学びました:

  1. llama.cppの環境構築方法
  2. モデルのダウンロードと設定
  3. llama.cppサーバーの起動方法
  4. ELYZA-tasks-100を使用したモデル評価の実装
  5. 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.

コメント

タイトルとURLをコピーしました