推論用コード
本コードは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.
Inference Providers
NEW
This model is not currently available via any of the supported Inference Providers.
The model cannot be deployed to the HF Inference API:
The model has no pipeline_tag.
Model tree for Toshi2023/llm-jp-3-13b-it_lora
Base model
llm-jp/llm-jp-3-13b