Update README.md
Browse files
README.md
CHANGED
@@ -1,199 +1,240 @@
|
|
1 |
---
|
2 |
-
|
3 |
-
tags:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
---
|
5 |
|
6 |
# Model Card for Model ID
|
|
|
7 |
|
8 |
<!-- Provide a quick summary of what the model is/does. -->
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
---
|
2 |
+
base_model: llm-jp/llm-jp-3-13b
|
3 |
+
tags:
|
4 |
+
- text-generation-inference
|
5 |
+
- transformers
|
6 |
+
- unsloth
|
7 |
+
- llama
|
8 |
+
- trl
|
9 |
+
license: apache-2.0
|
10 |
+
language:
|
11 |
+
- en
|
12 |
---
|
13 |
|
14 |
# Model Card for Model ID
|
15 |
+
usui2024/llm-jp-3-13b-dpo_w_100usud
|
16 |
|
17 |
<!-- Provide a quick summary of what the model is/does. -->
|
18 |
|
19 |
+
# LLM-JP モデルのFine-Tuning と DPOの学習
|
20 |
+
|
21 |
+
## 概要
|
22 |
+
このプロジェクトでは、LLM-JPモデルをFine-Tuningし、DPO(Direct Preference Optimization)学習を用いてタスク生成と応答生成を行う方法を説明します。データセットは、ELYZAタスクを参考にしたものを用いて、新たなタスク生成を行います。このプロジェクトは、主に自然言語処理タスクにおけるトレーニングデータの自動生成に役立ちます。
|
23 |
+
|
24 |
+
## 利用方法
|
25 |
+
1. モデルをロード後、タスク生成を開始します。
|
26 |
+
- `datasets` モジュールを用いて、`ELYZA-tasks-100`からタスクを取得します。
|
27 |
+
- モデルを使ってタスクに基づいた新しいタスク生成を行います。
|
28 |
+
- 出力されたタスクを用いて、さらにモデルによる応答生成を行います。
|
29 |
+
|
30 |
+
2. DPO(Direct Preference Optimization)学習:
|
31 |
+
- 生成されたタスクと応答を使い、DPO学習を行います。
|
32 |
+
- トレーニングのための設定は、`DPOTrainer`を用いて行います。
|
33 |
+
```python
|
34 |
+
from trl import DPOTrainer
|
35 |
+
trainer = DPOTrainer(model, args, train_dataset=dpo_datasets)
|
36 |
+
trainer.train()
|
37 |
+
```
|
38 |
+
|
39 |
+
3. トレーニングが完了したモデルを使用して、タスクに基づく推論を行います。
|
40 |
+
|
41 |
+
## モデルの詳細
|
42 |
+
- **Developed by:** usui2040
|
43 |
+
- モデル名: **LLM-JP**
|
44 |
+
- ベースモデル: **llm-jp-3-13b**
|
45 |
+
- ファインチューニング方法: **LoRA**(Low-Rank Adaptation)
|
46 |
+
- 学習タスク: **タスク生成、応答生成**
|
47 |
+
- 利用されるアルゴリズム: **DPO (Direct Preference Optimization)**
|
48 |
+
- トークナイザー: **AutoTokenizer**(Hugging Face提供)
|
49 |
+
- 出力形式: **テキスト生成**
|
50 |
+
-
|
51 |
+
This llama model was trained 2x faster with [Unsloth](https://github.com/unslothai/unsloth) and Huggingface's TRL library.
|
52 |
+
|
53 |
+
[<img src="https://raw.githubusercontent.com/unslothai/unsloth/main/images/unsloth%20made%20with%20love.png" width="200"/>](https://github.com/unslothai/unsloth)
|
54 |
+
|
55 |
+
|
56 |
+
|
57 |
+
モデルは、日本語を対象とした大規模なトランスフォーマーモデルです。タスクに基づいたテキスト生成や応答生成が可能で、生成タスクを指定することで柔軟に動作します。
|
58 |
+
|
59 |
+
|
60 |
+
## モデルの設定とトレーニング
|
61 |
+
Hugging Face上でモデルをトレーニングし、評価・出力を行う方法を説明します。
|
62 |
+
|
63 |
+
### 必要なライブラリのインストール
|
64 |
+
```python
|
65 |
+
pip install -U ipywidgets
|
66 |
+
pip install transformers==4.46.3
|
67 |
+
pip install -U bitsandbytes
|
68 |
+
pip install -U accelerate
|
69 |
+
pip install -U datasets
|
70 |
+
pip install -U peft==0.13.2
|
71 |
+
pip install -U trl==0.12.1
|
72 |
+
```
|
73 |
+
|
74 |
+
|
75 |
+
### モデルの設定とトレーニング
|
76 |
+
使用するベースモデルを指定して、それを読み込みます。ここでは、llm-jp-3-13bというモデルを使用しています。
|
77 |
+
```python
|
78 |
+
from transformers import (
|
79 |
+
AutoModelForCausalLM,
|
80 |
+
AutoTokenizer,
|
81 |
+
BitsAndBytesConfig
|
82 |
+
)
|
83 |
+
from peft import PeftModel
|
84 |
+
|
85 |
+
# モデル設定
|
86 |
+
base_model_id = "llm-jp/llm-jp-3-13b" # モデルのIDまたはパスを指定
|
87 |
+
adapter_id = "usui2024/20241211_w_llm-jp-3-13b-it_lora" # LoRAアダプターID
|
88 |
+
|
89 |
+
# QLoRAの設定
|
90 |
+
bnb_config = BitsAndBytesConfig(
|
91 |
+
load_in_4bit=True,
|
92 |
+
bnb_4bit_quant_type="nf4",
|
93 |
+
bnb_4bit_compute_dtype=torch.bfloat16,
|
94 |
+
)
|
95 |
+
|
96 |
+
# モデルとトークナイザーのロード
|
97 |
+
model = AutoModelForCausalLM.from_pretrained(
|
98 |
+
base_model_id,
|
99 |
+
quantization_config=bnb_config,
|
100 |
+
device_map="auto",
|
101 |
+
token=HF_TOKEN # HF_TOKENはHugging Faceのアクセストークン
|
102 |
+
)
|
103 |
+
tokenizer = AutoTokenizer.from_pretrained(base_model_id, trust_remote_code=True, token=HF_TOKEN)
|
104 |
+
|
105 |
+
# LoRAアダプターを統合
|
106 |
+
model = PeftModel.from_pretrained(model, adapter_id, token=HF_TOKEN)
|
107 |
+
|
108 |
+
```
|
109 |
+
### 合成データの生成
|
110 |
+
次に、モデルを使って合成データを生成します。以下では、ELYZA-tasks-100のデータを使用して新しいタスクを生成し、それに対するモデルの回答を作成します。
|
111 |
+
|
112 |
+
```python
|
113 |
+
from datasets import load_dataset
|
114 |
+
from tqdm import tqdm
|
115 |
+
|
116 |
+
# データセットの読み込み
|
117 |
+
datasets = load_dataset("elyza/ELYZA-tasks-100")
|
118 |
+
|
119 |
+
task_results = []
|
120 |
+
|
121 |
+
# タスクの生成
|
122 |
+
for ref_input in tqdm(datasets['test']['input']):
|
123 |
+
prompt = f"""以下に示す参考タスクに従って、類似したタスクを生成しなさい。
|
124 |
+
## 参考タスク
|
125 |
+
仕事の熱意を取り戻すためのアイデアを5つ挙げてください。
|
126 |
+
## 類似タスク
|
127 |
+
試合に挑む心構えを3つほど挙げてください。
|
128 |
+
## 参考タスク
|
129 |
+
{ref_input}
|
130 |
+
## 類似タスク
|
131 |
+
"""
|
132 |
+
|
133 |
+
tokenized_input = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt").to(model.device)
|
134 |
+
attention_mask = torch.ones_like(tokenized_input)
|
135 |
+
|
136 |
+
with torch.no_grad():
|
137 |
+
outputs = model.generate(
|
138 |
+
tokenized_input,
|
139 |
+
attention_mask=attention_mask,
|
140 |
+
max_new_tokens=100,
|
141 |
+
num_return_sequences=3, # 同じタスクから3つの新タスクを生成
|
142 |
+
do_sample=True,
|
143 |
+
temperature=0.6,
|
144 |
+
top_p=0.9,
|
145 |
+
repetition_penalty=1.2,
|
146 |
+
pad_token_id=tokenizer.eos_token_id
|
147 |
+
)
|
148 |
+
|
149 |
+
output_texts = [tokenizer.decode(output[tokenized_input.size(1):], skip_special_tokens=True) for output in outputs]
|
150 |
+
|
151 |
+
new_task = {"reference_task": ref_input}
|
152 |
+
new_task.update({f"similar_task_{i}": output_text for i, output_text in enumerate(output_texts)})
|
153 |
+
task_results.append(new_task)
|
154 |
+
|
155 |
+
df = pd.DataFrame(task_results)
|
156 |
+
df.head()
|
157 |
+
```
|
158 |
+
|
159 |
+
|
160 |
+
### DPO (Differentiable Prompt Optimization) の学習
|
161 |
+
DPOを使って、生成したタスクと回答のペアに基づいてモデルをトレーニングします。
|
162 |
+
```python
|
163 |
+
from trl import DPOConfig, DPOTrainer
|
164 |
+
from datasets import Dataset
|
165 |
+
import torch
|
166 |
+
|
167 |
+
# DPO用のデータセットを準備
|
168 |
+
dpo_datasets = Dataset.from_list(dpo_datasets)
|
169 |
+
|
170 |
+
# DPOの設定
|
171 |
+
training_args = DPOConfig(
|
172 |
+
output_dir=new_model_id,
|
173 |
+
per_device_train_batch_size=1,
|
174 |
+
gradient_accumulation_steps=4,
|
175 |
+
num_train_epochs=2,
|
176 |
+
logging_steps=10,
|
177 |
+
save_steps=100,
|
178 |
+
save_total_limit=1,
|
179 |
+
learning_rate=1.5e-4,
|
180 |
+
fp16=True,
|
181 |
+
)
|
182 |
+
|
183 |
+
# DPOトレーナーの設定
|
184 |
+
dpo_trainer = DPOTrainer(
|
185 |
+
model,
|
186 |
+
args=training_args,
|
187 |
+
train_dataset=dpo_datasets,
|
188 |
+
tokenizer=tokenizer,
|
189 |
+
peft_config=peft_config,
|
190 |
+
)
|
191 |
+
|
192 |
+
# 学習の実行
|
193 |
+
dpo_trainer.train()
|
194 |
+
```
|
195 |
+
|
196 |
+
### モデルの推論
|
197 |
+
最後に、モデルにタスクを入力し、その結果を得るための推論コードを提供します。
|
198 |
+
```python
|
199 |
+
|
200 |
+
|
201 |
+
# データセットの読み込み。
|
202 |
+
datasets = []
|
203 |
+
with open("./elyza-tasks-100-TV_0.jsonl", "r") as f:
|
204 |
+
item = ""
|
205 |
+
for line in f:
|
206 |
+
line = line.strip()
|
207 |
+
item += line
|
208 |
+
if item.endswith("}"):
|
209 |
+
datasets.append(json.loads(item))
|
210 |
+
item = ""
|
211 |
+
|
212 |
+
task_results = []
|
213 |
+
outputs_results = []
|
214 |
+
|
215 |
+
for task in tqdm(dataset):
|
216 |
+
prompt = f"### 指示:\n{task}\n### 回答:\n"
|
217 |
+
tokenized_input = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt").to(model.device)
|
218 |
+
attention_mask = torch.ones_like(tokenized_input)
|
219 |
+
|
220 |
+
with torch.no_grad():
|
221 |
+
outputs = model.generate(
|
222 |
+
tokenized_input,
|
223 |
+
attention_mask=attention_mask,
|
224 |
+
max_new_tokens=512,
|
225 |
+
num_return_sequences=3, # 最低でも2個の出力を生成
|
226 |
+
do_sample=True,
|
227 |
+
temperature=0.6,
|
228 |
+
top_p=0.9,
|
229 |
+
repetition_penalty=1.2,
|
230 |
+
pad_token_id=tokenizer.eos_token_id
|
231 |
+
)
|
232 |
+
|
233 |
+
output_texts = [tokenizer.decode(output[tokenized_input.size(1):], skip_special_tokens=True) for output in outputs]
|
234 |
+
outputs_results.append(output_texts)
|
235 |
+
|
236 |
+
# 結果の表示
|
237 |
+
for result in outputs_results:
|
238 |
+
print(result)
|
239 |
+
|
240 |
+
```
|