推論用コード

本コードはunslothで学習したqLoRAのアダプタを用いてELYZA-tasks-100-TVの出力を得るためのコードです。
Hugging Faceにアダプタをアップロードしてあることが前提となります。
このコードはunslothライブラリを用いてモデルを読み込み、推論するためのコードとなります。
このコードで生成されたjsonlファイルは課題の成果として提出可能なフォーマットになっております。

※本コードはGoogle Colabでの動作を想定しており、Omnicampusでの動作を想定しておりません。
Omnicampus向けのコードは別途用意します。


必要なライブラリをインストール

%%capture
!pip install unsloth
!pip uninstall unsloth -y && pip install --upgrade --no-cache-dir "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git"
!pip install -U torch
!pip install -U peft

```markdown
### Hugging Face Tokenの設定例
Hugging FaceのTokenを設定するには、以下のURLから取得したTokenを `HF_TOKEN` に代入してください。

```python
HF_TOKEN = "YOUR_HUGGINGFACE_TOKEN"  # ここに取得したTokenを入力 ご自身で実行して動作確認する際は、必ず自分のトークンを入れてください。

### 推論手順
モデルとアダプタの読み込み

model_id = "llm-jp/llm-jp-3-13b"
adapter_id = "Toshi2023/llm-jp-3-13b-it_lora"

from unsloth import FastLanguageModel
from peft import PeftModel  # PEFTのLoRA適用モデルを読み込む
import json

dtype = None  # Noneにしておけば自動で設定
load_in_4bit = True  # 今回は13Bモデルを扱うためTrue

model, tokenizer = FastLanguageModel.from_pretrained(
    model_name=model_id,
    dtype=dtype,
    load_in_4bit=load_in_4bit,
    trust_remote_code=True,
)

model = PeftModel.from_pretrained(model, adapter_id, token=HF_TOKEN)
Hugging Faceのモデルとアダプタを指定します。

データセットの準備
学習用データセットはIchikara Instructionデータセットです。
事前にデータをアップロードしてください。
datasets = []
with open("./elyza-tasks-100-TV_0.jsonl", "r") as f:
    item = ""
    for line in f:
        line = line.strip()
        item += line
        if item.endswith("}"):
            datasets.append(json.loads(item))
            item = ""

# 推論の実行
モデルを用いてデータの推論を行い、結果をjsonl形式で保存します。

### 推論コードの追加
以下のコードで推論を実行し、結果を保存します。

```python
from tqdm import tqdm
import re

# 推論するためにモデルのモードを変更
FastLanguageModel.for_inference(model)

results = []
for dt in tqdm(datasets):
    input = dt["input"]
    prompt = f"""### 指示\n{input}\n### 回答\n"""

    inputs = tokenizer([prompt], return_tensors="pt").to(model.device)
    outputs = model.generate(**inputs, max_new_tokens=512, use_cache=True, do_sample=False, repetition_penalty=1.2)
    prediction = tokenizer.decode(outputs[0], skip_special_tokens=True).split('\n### 回答')[-1]

    results.append({"task_id": dt["task_id"], "input": input, "output": prediction})

```python
# 結果をjsonl形式で保存
json_file_id = re.sub(".*/", "", adapter_id)
with open(f"/content/{json_file_id}_output.jsonl", 'w', encoding='utf-8') as f:
    for result in results:
        json.dump(result, f, ensure_ascii=False)
        f.write('\n')

print(f"JSONLファイルを生成しました: {json_file_id}_output.jsonl")

### 結果の確認方法
以下のコードで生成された `jsonl` ファイルの内容を確認できます。

```python
!head /content/{json_file_id}_output.jsonl

### 推論結果のサンプル
{"task_id": 1, "input": "指示内容1", "output": "モデルの生成結果1"}
{"task_id": 2, "input": "指示内容2", "output": "モデルの生成結果2"}
## ベンチマークの出力方法

推論結果を評価し、ベンチマークとして出力する方法を示します。  
ELYZA-tasks-100-TVは**文章生成タスク**が主であるため、**ROUGEスコア**を用いて評価します。

### ベンチマーク評価コード

```python
from datasets import load_metric

# ROUGEスコアを使用
rouge = load_metric("rouge")

# 参照データと推論結果を用意
references = [dt["reference"] for dt in datasets]  # 参照データ(正解ラベル)
predictions = [result["output"] for result in results]  # 推論結果

# ROUGEスコアの計算
rouge_result = rouge.compute(predictions=predictions, references=references)
print(f"ROUGEスコア: {rouge_result}")

# ベンチマーク結果をファイルに保存
benchmark_file = f"/content/{json_file_id}_benchmark_results.txt"
with open(benchmark_file, 'w', encoding='utf-8') as f:
    for key, value in rouge_result.items():
        f.write(f"{key}: {value.mid.fmeasure:.4f}\n")

print(f"ベンチマーク結果を保存しました: {benchmark_file}")
### 注意事項
商用利用不可:
モデルおよび出力データはCC-BY-NC-SAライセンスに基づき、商用利用はできません。

ライブラリバージョン:
本コードはGoogle Colab標準環境で動作確認済みです。
ライセンス情報
ベースモデル: llm-jp/llm-jp-3-13b
モデルライセンス: Apache-2.0
データセットライセンス: CC-BY-NC-SA(商用利用不可)
補足
開発者: Toshi2023
モデルの詳細:
This LLaMA model was trained 2x faster with Unsloth and Hugging Face's TRL library.
Downloads last month

-

Downloads are not tracked for this model. How to track
Inference API
Unable to determine this model’s pipeline type. Check the docs .

Model tree for Toshi2023/llm-jp-3-13b-it_lora

Finetuned
(1144)
this model