File size: 3,683 Bytes
8093e7c 2232cda 8be0b00 2232cda 8093e7c 63deb2d bc374ec 63deb2d 2232cda 63deb2d b3f8236 d17d5f5 2232cda dac4d1a d952360 dac4d1a 3005693 b3f8236 d17d5f5 3005693 d17d5f5 b3f8236 d17d5f5 49d8f2d 3005693 dac2e68 d17d5f5 49d8f2d 3005693 dac2e68 d17d5f5 dac2e68 49d8f2d dac2e68 d17d5f5 49d8f2d 3005693 dac2e68 d17d5f5 dac2e68 49d8f2d dac2e68 d17d5f5 49d8f2d 9af8152 dac2e68 3005693 dac2e68 d17d5f5 49d8f2d 3005693 dac2e68 d17d5f5 49d8f2d 3005693 dac2e68 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
---
language:
- ja
tags:
- llm
- text generation
- lora
---
# Model Details
- **Model type:** Language Model with LoRA fine-tuning
- **Language(s):** Japanese
- **Finetuned from model:** llm-jp/llm-jp-3-13b
This llama model was trained 2x faster with [Unsloth](https://github.com/unslothai/unsloth) and Huggingface's TRL library.
## 使い方
unslothで学習したqLoRAのアダプタを用いてELYZA-tasks-100-TVの出力を得るためのコードです。<br>
松尾研大規模言語モデル講座2024のコンペ用の提出モデル作成の一環として作成・公開しています。<br>
unslothライブラリを用いてモデルを読み込み、推論するためのコードとなります。
### 前提条件
- Python環境があること(例: Google Colab)
- Hugging Faceのアクセストークン (HF_TOKEN) が取得済みであること
### 使用方法
1. 必要なライブラリをインストール
2. ベースモデルとLoRAアダプタを読み込み
3. 入力データの準備
4. モデルを用いてタスクの推論
5. 結果をJSONL形式で保存
### 必要なライブラリをインストール
```
%%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
```
### 必要なライブラリを読み込み
```
from unsloth import FastLanguageModel
from peft import PeftModel
import torch
import json
from tqdm import tqdm
import re
```
### ベースとなるモデルと学習したLoRAのアダプタ(Hugging FaceのIDを指定)。
```
model_id = "llm-jp/llm-jp-3-13b"
adapter_id = "tokushi/llm-jp-3-13b-it_lora"
```
### Hugging Face Token を指定。
```
HF_TOKEN = "Hugging Face Tokenを入力"
# unslothのFastLanguageModelで元のモデルをロード。
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,
)
```
### 元のモデルにLoRAのアダプタを統合。
```
model = PeftModel.from_pretrained(model, adapter_id, token = HF_TOKEN)
```
### 入力データの準備
./elyza-tasks-100-TV_0.jsonlというファイルからデータセットをロードします。
事前にデータをアップロードしてください。
```
datasets = []
with open("/content/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 = ""
```
### モデルを用いてタスクの推論。
```
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})
```
### 結果をjsonlで保存。
最後に、adapter_idをベースにしたファイル名で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')
``` |