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')
```