|
--- |
|
base_model: llm-jp/llm-jp-3-13b |
|
tags: |
|
- text-generation-inference |
|
- transformers |
|
- unsloth |
|
- llama |
|
- trl |
|
license: apache-2.0 |
|
datasets: |
|
- elyza-tasks-100-TV |
|
model_creator: Toshi2023 |
|
model_type: llama |
|
inference: true |
|
fine_tuned_from: llm-jp/llm-jp-3-13b |
|
--- |
|
|
|
# 推論用コード |
|
|
|
本コードは**unsloth**で学習したqLoRAのアダプタを用いて**ELYZA-tasks-100-TV**の出力を得るためのコードです。 |
|
Hugging Faceにアダプタをアップロードしてあることが前提となります。 |
|
このコードは**unslothライブラリ**を用いてモデルを読み込み、推論するためのコードとなります。 |
|
このコードで生成された**jsonlファイル**は課題の成果として提出可能なフォーマットになっております。 |
|
|
|
※本コードは**Google Colab**での動作を想定しており、**Omnicampus**での動作を想定しておりません。 |
|
Omnicampus向けのコードは別途用意します。 |
|
|
|
--- |
|
|
|
## 必要なライブラリをインストール |
|
|
|
```bash |
|
%%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. |
|
|