File size: 6,975 Bytes
ba81b29
 
 
 
 
 
 
 
 
 
 
a73a8b3
 
ba81b29
 
 
 
 
 
 
 
 
 
 
47803f7
 
c09993b
85b352a
3b019d3
 
1c56d20
ed61ac6
c09993b
e79656b
1c56d20
 
 
 
 
 
e79656b
1c56d20
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e79656b
0f20590
c09993b
0f20590
 
 
 
 
 
 
 
 
 
 
 
 
1c56d20
 
ed61ac6
c09993b
1c56d20
c09993b
1c56d20
 
ed61ac6
c09993b
ed61ac6
1c56d20
 
ed61ac6
85b352a
1c56d20
 
 
 
 
85b352a
 
1c56d20
ed61ac6
85b352a
1c56d20
 
 
 
 
 
85b352a
1c56d20
 
 
 
 
ed61ac6
1c56d20
 
 
 
 
ed61ac6
 
 
1c56d20
ed61ac6
1c56d20
ed61ac6
 
1c56d20
 
 
 
ed61ac6
1c56d20
 
 
 
 
 
 
 
 
ed61ac6
1c56d20
 
 
 
 
 
 
 
 
47803f7
85b352a
ed61ac6
 
1c56d20
 
 
85b352a
ed61ac6
 
1c56d20
 
 
 
 
 
 
 
 
 
 
 
ed61ac6
1c56d20
ed61ac6
1c56d20
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ed61ac6
 
 
1c56d20
 
 
 
 
 
 
 
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
---
base_model: llm-jp/llm-jp-3-13b
tags:
- text-generation-inference
- transformers
- unsloth
- llama
- trl
license: apache-2.0
language:
- en
- ja

---

# Uploaded  model

- **Developed by:** aino813
- **License:** apache-2.0
- **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.

[<img src="https://raw.githubusercontent.com/unslothai/unsloth/main/images/unsloth%20made%20with%20love.png" width="200"/>](https://github.com/unslothai/unsloth)


# 🧐 Instruction Tuning

- このモデルは、以下のデータを用いて指示チューニング(Instruction Tuning)を行いました。
- 指示チューニングにあたっては、QLoRAを使っています。


## 🤩 Datasets
- 英語と非英語(日本語)のデータセットを使っています。
| データセット名                     | 言語   | 件数         | 主な用途                                 |
|-----------------------------------|--------|--------------|------------------------------------------|
| databricks-dolly-15k              | 英語   | 約15,000件   | 指示チューニング用                       |
| databricks-dolly-15k-ja           | 日本語 | 約15,000件   | 日本語指示チューニング用                 |
| oasst1-21k-en                     | 英語   | 約21,000件   | 会話モデルや指示応答モデルのトレーニング |
| oasst1-21k-ja                     | 日本語 | 約21,000件   | 日本語会話モデルや指示応答モデルのトレーニング |
| ichikara-instruction-003-001      | 日本語 | 2,903件      | 日本語特化の指示チューニング |


1. **databricks-dolly-15k**  
   - Databricksが公開した、指示応答形式のデータセット。
   - 約15,000件の英語の指示・応答ペアを含む。
   - 質問応答、説明、生成タスクなどが含まれる。
     
2. **databricks-dolly-15k-ja**  
   - databricks-dolly-15kを日本語に翻訳したデータセット。
   - 英語の指示・応答ペアを高品質な日本語翻訳に変換。
   - 総件数: 約15000件。

3. **oasst1-21k-en**
   - Open Assistantが公開した、英語の指示応答データセット。
   - 約21,000件の英語データを含む。
   - コミュニティから収集したデータで、多様なタスクや質問形式が含まれる。

4. **oasst1-21k-ja**
   - oasst1-21k-enを日本語に翻訳したバージョン。
   - 多様なタスクや指示形式に対応。
   - 総件数: 約21,000件

5. **ichikara-instruction-003-001**
   - LLMのための日本語のシングルターン指示応答データセット。
   - 約2,903件の日本語データ。

# Parameter

| パラメータ名                         |                    値                    |
|--------------------------------------|----------------------------------------|
| LoRA_r                               |                  128                    | 
| LoRA_alpha                           |                  256                    | 
| LoRA_dropout                         |                 0.05                    | 
| per_device_train_batch_size          |                   1                     | 
| gradient_accumulation_steps          |                  16                     | 
| max_steps                            |                  150                    |
| warmup_ratio                         |                  0.1                    |
| num_train_epochs                     |                   2                     |
| learning_rate                        |                 0.0001                   |        
| embedding_learning_rate              |                 0.00001                   |



# 😚 License
Apache-2.0 ライセンスに基づいて提供されています。
Apache License, Version 2.0



# 😉 Usage


#### ライブラリーのインストール・アップグレード

```
!pip install -U bitsandbytes
!pip install -U transformers
!pip install -U accelerate
!pip install -U datasets
!pip install -U peft
```

#### ライブラリーのインポート

```python
from transformers import (
    AutoModelForCausalLM,
    AutoTokenizer,
    BitsAndBytesConfig,
)
from peft import PeftModel
import torch
from tqdm import tqdm
import json
```

#### HF_TOKENの設定

```
HF_TOKEN = "******************"
```

#### モデルidの指定

元のモデルとLoRAアダプターを指定します。LoRAアダプターのIDは本レポジトリになります。

```python
# omnicampas環境を使用する場合
model_id = "models/models--llm-jp--llm-jp-3-13b/snapshots/cd3823f4c1fcbb0ad2e2af46036ab1b0ca13192a"
# omnicampas以外の環境を使用する場合(以下のコメントアウトを外す)
# model_id = "llm-jp/llm-jp-3-13b" 
adapter_id = "aino813/llm-jp-3-13b-241213-SFT-dolly-oasst-ichikara-final_lora"
```

#### 量子化の設定

```python
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16,
)
```

#### 元のモデルとトークナイザーの読み込み

```python
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    quantization_config=bnb_config,
    device_map="auto",
    token = HF_TOKEN
)

tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True, token = HF_TOKEN)
```

#### 元のモデルとLoRAアダプターの統合

```python
model = PeftModel.from_pretrained(model, adapter_id, token = HF_TOKEN)
```

#### 推論用データセットの読み込み

```python
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 = ""
```


#### 推論

```python
results = []
for data in tqdm(datasets):

  input = data["input"]

  prompt = f"""### 指示
  {input}
  ### 回答
  """

  tokenized_input = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt").to(model.device)
  attention_mask = torch.ones_like(tokenized_input)
  with torch.no_grad():
      outputs = model.generate(
          tokenized_input,
          attention_mask=attention_mask,
          max_new_tokens=1024,
          do_sample=False,
          repetition_penalty=1.2,
          pad_token_id=tokenizer.eos_token_id
      )[0]
  output = tokenizer.decode(outputs[tokenized_input.size(1):], skip_special_tokens=True)

  results.append({"task_id": data["task_id"], "input": input, "output": output})
```


#### Jsonlファイルの作成

```python
import re
jsonl_id = re.sub(".*/", "", adapter_id)
with open(f"./{jsonl_id}-outputs.jsonl", 'w', encoding='utf-8') as f:
    for result in results:
        json.dump(result, f, ensure_ascii=False)  # ensure_ascii=False for handling non-ASCII characters
        f.write('\n')
```