kakerukc0506 commited on
Commit
8172cd9
·
verified ·
1 Parent(s): 1bbd4cf

Update README.md

Browse files
Files changed (1) hide show
  1. README.md +237 -12
README.md CHANGED
@@ -17,8 +17,15 @@
17
  # モデルの読み込みと使用
18
  以下のコードを使用してモデルをロードできます。
19
  ```
20
- from unsloth import FastLanguageModel
21
- import torch
 
 
 
 
 
 
 
22
  ```
23
 
24
  # モデル設定
@@ -27,6 +34,12 @@ model_id = "llm-jp-3-13b-it" # Fine-TunedモデルID
27
  load_in_4bit = True # 4-bit量子化
28
  max_seq_length = 512
29
  ```
 
 
 
 
 
 
30
 
31
  # モデルとトークナイザーのロード
32
  ```
@@ -38,17 +51,235 @@ model, tokenizer = FastLanguageModel.from_pretrained(
38
  )
39
  ```
40
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
  # テキスト生成例
42
  ```
43
- input_text = "生成AIの可能性について説明して��ださい。"
44
- inputs = tokenizer(input_text, return_tensors="pt").to("cuda")
45
- outputs = model.generate(**inputs, max_new_tokens=256)
46
- print(tokenizer.decode(outputs[0], skip_special_tokens=True))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  ```
48
 
49
  # トレーニング詳細
50
  フレームワーク: Hugging Face Transformers
51
 
 
52
  # 設定
53
  エポック数: 未記載
54
  バッチサイズ: 1(勾配累積を使用)
@@ -57,12 +288,6 @@ LoRAパラメータ: r=32, alpha=32, dropout=0.05
57
  量子化方式: 4-bit
58
  その他: 勾配チェックポイントやRoPEをサポート
59
 
60
- # 必要なライブラリ
61
- 以下をインストールしてください。
62
- ```
63
- pip install unsloth
64
- pip install torch xformers
65
- ```
66
 
67
  # パフォーマンス
68
  本モデルは以下のタスクで高い性能を発揮します。
 
17
  # モデルの読み込みと使用
18
  以下のコードを使用してモデルをロードできます。
19
  ```
20
+ # Google Colab の場合は上記の環境構築手順を行なわず、単にこのセルから実行していってください。
21
+ !pip uninstall unsloth -y
22
+ !pip install --upgrade --no-cache-dir "xxxx"
23
+ ```
24
+
25
+ # Google Colab のデフォルトで入っているパッケージをアップグレード(Moriyasu さんありがとうございます)
26
+ ```
27
+ !pip install --upgrade torch
28
+ !pip install --upgrade xformers
29
  ```
30
 
31
  # モデル設定
 
34
  load_in_4bit = True # 4-bit量子化
35
  max_seq_length = 512
36
  ```
37
+ ```
38
+ # Install Flash Attention 2 for softcapping support
39
+ import torch
40
+ if torch.cuda.get_device_capability()[0] >= 8:
41
+ !pip install --no-deps packaging ninja einops "flash-attn>=2.6.3"
42
+ ```
43
 
44
  # モデルとトークナイザーのロード
45
  ```
 
51
  )
52
  ```
53
 
54
+ # llm-jp/llm-jp-3-13bを4bit量子化のqLoRA設定でロード。
55
+ ```
56
+ from unsloth import FastLanguageModel
57
+ import torch
58
+ max_seq_length = 512 # unslothではRoPEをサポートしているのでコンテキスト長は自由に設定可能
59
+ dtype = None # Noneにしておけば自動で設定
60
+ load_in_4bit = True # 今回は13Bモデルを扱うためTrue
61
+
62
+ model_id = "llm-jp/llm-jp-3-13b"
63
+ new_model_id = "llm-jp-3-13b-it" #Fine-Tuningしたモデルにつけたい名前、it: Instruction Tuning
64
+ # FastLanguageModel インスタンスを作成
65
+ model, tokenizer = FastLanguageModel.from_pretrained(
66
+ model_name=model_id,
67
+ dtype=dtype,
68
+ load_in_4bit=load_in_4bit,
69
+ trust_remote_code=True,
70
+ )
71
+
72
+ # SFT用のモデルを用意
73
+ model = FastLanguageModel.get_peft_model(
74
+ model,
75
+ r = 32,
76
+ target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
77
+ "gate_proj", "up_proj", "down_proj",],
78
+ lora_alpha = 32,
79
+ lora_dropout = 0.05,
80
+ bias = "none",
81
+ use_gradient_checkpointing = "unsloth",
82
+ random_state = 3407,
83
+ use_rslora = False,
84
+ loftq_config = None,
85
+ max_seq_length = max_seq_length,
86
+ )
87
+ ```
88
+ # 学習に用いるデータセットの指定
89
+ # 今回はLLM-jp の公開している Ichikara Instruction を使います。データにアクセスするためには申請が必要ですので、使いたい方のみ申請をしてください。
90
+ # Ichikara Instruciton を Hugging Face Hub にて公開することはお控えください。
91
+ # また、CC-BY-NC-SAですのでモデルはライセンスを継承する前提でお使いください。
92
+
93
+ # 下記のリンクから申請を終えた先に Google Drive があり、Distribution20241221_all というフォルダごとダウンロードしてください。
94
+ # 今回は「ichikara-instruction-003-001-1.json」を使います。必要であれば展開(!unzip など)し、データセットのパスを適切に指定してください。
95
+ # omnicampusの開発環境では取得したデータを左側にドラッグアンドドロップしてお使いください。
96
+ # Google Colab の場合も左のサイドバーよりドラッグ&ドロップでアップデートしてください。
97
+
98
+ # https://liat-aip.sakura.ne.jp/wp/llmのための日本語インストラクションデータ作成/llmのための日本語インストラクションデータ-公開/
99
+ # 関根聡, 安藤まや, 後藤美知子, 鈴木久美, 河原大輔, 井之上直也, 乾健太郎. ichikara-instruction: LLMのための日本語インストラクションデータの構築. 言語処理学会第30回年次大会(2024)
100
+ ```
101
+ from datasets import load_dataset
102
+ ```
103
+ dataset = load_dataset("json", data_files="/content/ichikara-instruction-003-001-1.json")
104
+
105
+ # パスの指定にご注意ください。アップロードしたファイルを右クリックし、「パスをコピー」をクリック、上記の data_files と合致していることをご確認ください。Omnicampus のディレクトリ構造とは異なるかもしれません。
106
+
107
+ # 学習時のプロンプトフォーマットの定義
108
+ ```
109
+ prompt = """### 指示
110
+ {}
111
+ ### 回答
112
+ {}"""
113
+
114
+
115
+ """
116
+ formatting_prompts_func: 各データをプロンプトに合わせた形式に合わせる
117
+ """
118
+ EOS_TOKEN = tokenizer.eos_token # トークナイザーのEOSトークン(文末トークン)
119
+ def formatting_prompts_func(examples):
120
+ input = examples["text"] # 入力データ
121
+ output = examples["output"] # 出力データ
122
+ text = prompt.format(input, output) + EOS_TOKEN # プロンプトの作成
123
+ return { "formatted_text" : text, } # 新しいフィールド "formatted_text" を返す
124
+ pass
125
+
126
+ # # 各データにフォーマットを適用
127
+ dataset = dataset.map(
128
+ formatting_prompts_func,
129
+ num_proc= 4, # 並列処理数を指定
130
+ )
131
+
132
+ dataset
133
+ ```
134
+
135
  # テキスト生成例
136
  ```
137
+ """
138
+ training_arguments: 学習の設定
139
+
140
+ - output_dir:
141
+ -トレーニング後のモデルを保存するディレクトリ
142
+
143
+ - per_device_train_batch_size:
144
+ - デバイスごとのトレーニングバッチサイズ
145
+
146
+ - per_device_eval_batch_size:
147
+ - デバイスごとの評価バッチサイズ
148
+
149
+ - gradient_accumulation_steps:
150
+ - 勾配を更新する前にステップを積み重ねる回数
151
+
152
+ - optim:
153
+ - オプティマイザの設定
154
+
155
+ - num_train_epochs:
156
+ - エポック数
157
+
158
+ - eval_strategy:
159
+ - 評価の戦略 ("no"/"steps"/"epoch")
160
+
161
+ - eval_steps:
162
+ - eval_strategyが"steps"のとき、評価を行うstep間隔
163
+
164
+ - logging_strategy:
165
+ - ログ記録の戦略
166
+
167
+ - logging_steps:
168
+ - ログを出力するステップ間隔
169
+
170
+ - warmup_steps:
171
+ - 学習率のウォームアップステップ数
172
+
173
+ - save_steps:
174
+ - モデルを保存するステップ間隔
175
+
176
+ - save_total_limit:
177
+ - 保存しておくcheckpointの数
178
+
179
+ - max_steps:
180
+ - トレーニングの最大ステップ数
181
+
182
+ - learning_rate:
183
+ - 学習率
184
+
185
+ - fp16:
186
+ - 16bit浮動小数点の使用設定(第8回演習を参考にすると良いです)
187
+
188
+ - bf16:
189
+ - BFloat16の使用設定
190
+
191
+ - group_by_length:
192
+ - 入力シーケンスの長さによりバッチをグループ化 (トレーニングの効率化)
193
+
194
+ - report_to:
195
+ - ログの送信先 ("wandb"/"tensorboard"など)
196
+ """
197
+ from trl import SFTTrainer
198
+ from transformers import TrainingArguments
199
+ from unsloth import is_bfloat16_supported
200
+
201
+ trainer = SFTTrainer(
202
+ model = model,
203
+ tokenizer = tokenizer,
204
+ train_dataset=dataset["train"],
205
+ max_seq_length = max_seq_length,
206
+ dataset_text_field="formatted_text",
207
+ packing = False,
208
+ args = TrainingArguments(
209
+ per_device_train_batch_size = 2,
210
+ gradient_accumulation_steps = 4,
211
+ num_train_epochs = 1,
212
+ logging_steps = 10,
213
+ warmup_steps = 10,
214
+ save_steps=100,
215
+ save_total_limit=2,
216
+ max_steps=-1,
217
+ learning_rate = 2e-4,
218
+ fp16 = not is_bfloat16_supported(),
219
+ bf16 = is_bfloat16_supported(),
220
+ group_by_length=True,
221
+ seed = 3407,
222
+ output_dir = "outputs",
223
+ report_to = "none",
224
+ ),
225
+ )
226
+ ```
227
+ # 現在のメモリ使用量を表示
228
+ ```
229
+ gpu_stats = torch.cuda.get_device_properties(0)
230
+ start_gpu_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)
231
+ max_memory = round(gpu_stats.total_memory / 1024 / 1024 / 1024, 3)
232
+ print(f"GPU = {gpu_stats.name}. Max memory = {max_memory} GB.")
233
+ print(f"{start_gpu_memory} GB of memory reserved.")
234
+ ```
235
+
236
+ # title 学習実行
237
+ ```
238
+ trainer_stats = trainer.train()
239
+ ```
240
+
241
+ # ELYZA-tasks-100-TVの読み込み。事前にファイルをアップロードしてください
242
+ # データセットの読み込み。
243
+ # omnicampusの開発環境では、左にタスクのjsonlをドラッグアンドドロップしてから実行。
244
+ ```
245
+ import json
246
+ datasets = []
247
+ with open("/content/elyza-tasks-100-TV_0.jsonl", "r") as f:
248
+ item = ""
249
+ for line in f:
250
+ line = line.strip()
251
+ item += line
252
+ if item.endswith("}"):
253
+ datasets.append(json.loads(item))
254
+ item = ""
255
+ ```
256
+ # 学習したモデルを用いてタスクを実行
257
+ ```
258
+ from tqdm import tqdm
259
+ ```
260
+
261
+ # 推論するためにモデルのモードを変更
262
+ ```
263
+ FastLanguageModel.for_inference(model)
264
+
265
+ results = []
266
+ for dt in tqdm(datasets):
267
+ input = dt["input"]
268
+
269
+ prompt = f"""### 指示\n{input}\n### 回答\n"""
270
+
271
+ inputs = tokenizer([prompt], return_tensors = "pt").to(model.device)
272
+
273
+ outputs = model.generate(**inputs, max_new_tokens = 512, use_cache = True, do_sample=False, repetition_penalty=1.2)
274
+ prediction = tokenizer.decode(outputs[0], skip_special_tokens=True).split('\n### 回答')[-1]
275
+
276
+ results.append({"task_id": dt["task_id"], "input": input, "output": prediction})
277
  ```
278
 
279
  # トレーニング詳細
280
  フレームワーク: Hugging Face Transformers
281
 
282
+
283
  # 設定
284
  エポック数: 未記載
285
  バッチサイズ: 1(勾配累積を使用)
 
288
  量子化方式: 4-bit
289
  その他: 勾配チェックポイントやRoPEをサポート
290
 
 
 
 
 
 
 
291
 
292
  # パフォーマンス
293
  本モデルは以下のタスクで高い性能を発揮します。