Transformers
Safetensors
Japanese
Inference Endpoints
k-n-29 commited on
Commit
d5a7ccd
·
verified ·
1 Parent(s): ad699d2

Update README.md

Browse files
Files changed (1) hide show
  1. README.md +419 -15
README.md CHANGED
@@ -1,6 +1,11 @@
1
  ---
2
  library_name: transformers
3
- tags: []
 
 
 
 
 
4
  ---
5
 
6
  # Model Card for Model ID
@@ -17,25 +22,424 @@ tags: []
17
 
18
  This is the model card of a 🤗 transformers model that has been pushed on the Hub. This model card has been automatically generated.
19
 
20
- - **Developed by:** [More Information Needed]
21
- - **Funded by [optional]:** [More Information Needed]
22
- - **Shared by [optional]:** [More Information Needed]
23
- - **Model type:** [More Information Needed]
24
- - **Language(s) (NLP):** [More Information Needed]
25
- - **License:** [More Information Needed]
26
- - **Finetuned from model [optional]:** [More Information Needed]
27
 
28
- ### Model Sources [optional]
29
 
30
- <!-- Provide the basic links for the model. -->
31
-
32
- - **Repository:** [More Information Needed]
33
- - **Paper [optional]:** [More Information Needed]
34
- - **Demo [optional]:** [More Information Needed]
35
 
36
  ## Uses
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
 
38
- <!-- Address questions around how the model is intended to be used, including the foreseeable users of the model and those affected by the model. -->
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39
 
40
  ### Direct Use
41
 
 
1
  ---
2
  library_name: transformers
3
+ datasets:
4
+ - Distribution20241221_all/ichikara-instruction-003-013-1.json
5
+ language:
6
+ - ja
7
+ base_model:
8
+ - llm-jp/llm-jp-3-13b
9
  ---
10
 
11
  # Model Card for Model ID
 
22
 
23
  This is the model card of a 🤗 transformers model that has been pushed on the Hub. This model card has been automatically generated.
24
 
25
+ - **Developed by:** k-n-29
26
+ - **Model type:** LLM
27
+ - **Language(s) (NLP):** Japanese
28
+ - **License:** base_model:Apache License, Version 2.0, CC-BY-NC-SA datasets: Apache 2.0
29
+ - **Finetuned from model :** llm-jp/llm-jp-3-13b
 
 
30
 
 
31
 
 
 
 
 
 
32
 
33
  ## Uses
34
+ 実行の仕方は以下の通りです。
35
+ 具体的にはLoRA_template_20241127.ipynbをベースに下記の変更を行いました。
36
+ 1. ichikara-instruction-003-001-1.jsonとichikara-instruction-003-003-1.jsonを組み合わせて
37
+ ichikara-instruction-003-013-1.jsonとして作成し、これをsftに利用しました。
38
+ 2. モデルの学習時と推論時に下記のプロンプトを冒頭に追加しました。
39
+
40
+ "### 前提
41
+ あなたは日本の有名TV局で働く番組プロデューサーです。次の指示に対して、あなたの論理的思考力や想像力を活かして正確な情報であることを意識しつつ、本質的で視聴率が取れるような興味深い回答を考えて下さい。また、回答は途中で辞めずに最後まで回答しきって下さい。"
42
+
43
+ ```
44
+ # python 3.10.12
45
+ !pip install -U pip
46
+ !pip install -U transformers
47
+ !pip install -U bitsandbytes
48
+ !pip install -U accelerate
49
+ !pip install -U datasets
50
+ !pip install -U peft
51
+ !pip install -U trl
52
+ !pip install -U wandb
53
+ !pip install ipywidgets --upgrade
54
+ ```
55
+
56
+
57
+ ```python
58
+ from transformers import (
59
+ AutoModelForCausalLM,
60
+ AutoTokenizer,
61
+ BitsAndBytesConfig,
62
+ TrainingArguments,
63
+ logging,
64
+ )
65
+ from peft import (
66
+ LoraConfig,
67
+ PeftModel,
68
+ get_peft_model,
69
+ )
70
+ import os, torch, gc
71
+ from datasets import load_dataset
72
+ import bitsandbytes as bnb
73
+ from trl import SFTTrainer
74
+
75
+
76
+
77
+ # Hugging Face Token
78
+ HF_TOKEN = "write権限のあるトークン"
79
+
80
+
81
+
82
+
83
+ # モデルを読み込み。
84
+ # llm-jp-3 1.8B, 3.7B, 13Bのsnapshotをダウンロード済みでmodelsディレクトリに格納してあります。
85
+ # base_model_idの値はomnicampusの環境におけるモデルのパスを表しており、それ以外の環境で実行する場合は変更の必要があります。
86
+ # その他のモデルは取得に承諾が必要なため、各自でダウンロードお願いします。
87
+ base_model_id = "models/models--llm-jp--llm-jp-3-13b/snapshots/cd3823f4c1fcbb0ad2e2af46036ab1b0ca13192a" #Fine-Tuningするベースモデル
88
+ # omnicampus以外の環境をご利用の方は以下をご利用ください。
89
+ # base_model_id = "llm-jp/llm-jp-3-13b"
90
+ new_model_id = "llm-jp-3-13b-finetune-ichikara" #Fine-Tuningしたモデルにつけたい名前
91
+
92
+
93
+
94
+
95
+ """
96
+ bnb_config: 量子化の設定
97
+
98
+ - load_in_4bit:
99
+ - 4bit量子化形式でモデルをロード
100
+
101
+ - bnb_4bit_quant_type:
102
+ - 量子化の形式を指定
103
+
104
+ - bnb_4bit_compute_dtype:
105
+ - 量子化された重みを用いて計算する際のデータ型
106
+
107
+ """
108
+
109
+ bnb_config = BitsAndBytesConfig(
110
+ load_in_4bit=True,
111
+ bnb_4bit_quant_type="nf4", # nf4は通常のINT4より精度が高く、ニューラルネットワークの分布に最適です
112
+ bnb_4bit_compute_dtype=torch.bfloat16,
113
+ )
114
+
115
+
116
+ """
117
+ model: モデル
118
+
119
+ - base_model:
120
+ - 読み込むベースモデル (事前に定義したもの)
121
+
122
+ - quantization_config:
123
+ - bnb_configで設定した量子化設定
124
+
125
+ - device_map:
126
+ - モデルを割り当てるデバイス (CPU/GPU) "auto"で自動に割り当てられます。
127
+
128
+ tokenizer: トークナイザー
129
+
130
+ - base_model:
131
+ - 読み込むベースモデル (事前に定義したもの)
132
+
133
+ - trust_remote_code:
134
+ - リモートコードの実行を許可 (カスタムモデルなど)
135
+ """
136
+ model = AutoModelForCausalLM.from_pretrained(
137
+ base_model_id,
138
+ quantization_config=bnb_config,
139
+ device_map="auto"
140
+ )
141
+
142
+ tokenizer = AutoTokenizer.from_pretrained(base_model_id, trust_remote_code=True)
143
+
144
+ """
145
+ find_all_linear_names: モデル内の4bit量子化線形層を探します。
146
+ """
147
+
148
+ def find_all_linear_names(model):
149
+ cls = bnb.nn.Linear4bit # 4bit量子化線形層クラスを指定
150
+ lora_module_names = set() # ここに取得した線形層を保持します。
151
+
152
+ # モデル内の全てのモジュールを探索します
153
+ for name, module in model.named_modules():
154
+ if isinstance(module, cls): # モジュールが4bit量子化線形層の場合
155
+ names = name.split('.') # モジュールの名前を分割 (ネストされてる際などに対処)
156
+ lora_module_names.add(names[0] if len(names) == 1 else names[-1]) # 最下層の名前をlora_module_namesに追加
157
+
158
+ # 'lm_head' は16ビット演算の際に除外する必要があるため、lora_module_namesから削除
159
+ if 'lm_head' in lora_module_names:
160
+ lora_module_names.remove('lm_head')
161
+
162
+ return list(lora_module_names) # lora_module_namesをリストに変換して返します。
163
+
164
+ modules = find_all_linear_names(model)
165
+
166
+ """
167
+ peft_config: PEFTの構成設定
168
+
169
+ - r
170
+ - LoRA のランク (4, 8, 16 ,32...)
171
+ - 増やすほど学習が捗るが, 過学習のリスクも高まるので注意
172
+
173
+ - lora_alpha
174
+ - LoRAのスケーリング係数
175
+
176
+ - lora_dropout
177
+ - ドロップアウト率(過学習を防ぐための割合)
178
+
179
+ - bias
180
+ - バイアス項の扱い ("none"の場合、LoRAはバイアスを学習しない)
181
+
182
+ - task_type
183
+ - タスクタイプ
184
+
185
+ - target_modules
186
+ - LoRAを適用するターゲットモジュール (前のコードで特定した層)
187
+ """
188
+
189
+ peft_config = LoraConfig(
190
+ r=16,
191
+ lora_alpha=32,
192
+ lora_dropout=0.05,
193
+ bias="none",
194
+ task_type="CAUSAL_LM",
195
+ target_modules=modules,
196
+ )
197
+
198
+ model = get_peft_model(model, peft_config)
199
+
200
+ """
201
+ 学習に用いるデータセットの指定
202
+ 今回はLLM-jp の公開している Ichikara Instruction を使います。データにアクセスするためには申請が必要ですので、使いたい方のみ申請をしてください。
203
+ Ichikara Instruciton を Hugging Face Hub にて公開することはお控えください。
204
+ また、CC-BY-NC-SAですのでモデルはライセンスを継承する前提でお使いください。
205
+
206
+ 下記のリンクから申請を終えた先に Google Drive があり、Distribution20241221_all というフォルダごとダウンロードしてください。
207
+ 今回は「ichikara-instruction-003-001-1.json」を使います。必要であれば展開(!unzip など)し、データセットのパスを適切に指定してください。
208
+ omnicampusの開発環境では取得したデータを左側にドラッグアンドドロップしてお使いください。
209
+
210
+ https://liat-aip.sakura.ne.jp/wp/llmのための日本語インストラクションデータ作成/llmのための日本語インストラクションデータ-公開/
211
+ 関根聡, 安藤まや, 後藤美知子, 鈴木久美, 河原大輔, 井之上直也, 乾健太郎. ichikara-instruction: LLMのための日本語インストラクションデータの構築. 言語処理学会第30回年次大会(2024)
212
+
213
+ ichikara-instruction-003-001-1.jsonとichikara-instruction-003-003-1.jsonを組み合わせて
214
+ ichikara-instruction-003-013-1.jsonとして作成し、これをsftに利用した
215
+
216
+ """
217
+
218
+ dataset = load_dataset("json", data_files="./ichikara-instruction-003-013-1.json")
219
+ dataset
220
+
221
+ # 学習時のプロンプトフォーマットの定義
222
+ prompt = """### 前提
223
+ あなたは日本の有名TV局で働く番組プロデューサーです。次の指示に対して、あなたの論理的思考力や想像力を活かして正確な情報であることを意識しつつ、本質的で視聴率が取れるような興味深い回答を考えて下さい。また、回答は途中で辞めずに最後まで回答しきって下さい。
224
+ 指示
225
+ {}
226
+ ### 回答
227
+ {}"""
228
+
229
+
230
+ """
231
+ formatting_prompts_func: 各データをプロンプトに合わせた形式に合わせる
232
+ """
233
+ EOS_TOKEN = tokenizer.eos_token # トークナイザーのEOSトークン(文末トークン)
234
+ def formatting_prompts_func(examples):
235
+ input = examples["text"] # 入力データ
236
+ output = examples["output"] # 出力データ
237
+ text = prompt.format(input, output) + EOS_TOKEN # プロンプトの作成
238
+ return { "formatted_text" : text, } # 新しいフィールド "formatted_text" を返す
239
+ pass
240
+
241
+ # # 各データにフォーマットを適用
242
+ dataset = dataset.map(
243
+ formatting_prompts_func,
244
+ num_proc= 4, # 並列処理数を指定
245
+ )
246
+
247
+ dataset
248
+
249
+ # データを確認
250
+ print(dataset["train"]["formatted_text"][3])
251
+
252
+
253
+ """
254
+ training_arguments: 学習の設定
255
+
256
+ - output_dir:
257
+ -トレーニング後のモデルを保存するディレクトリ
258
+
259
+ - per_device_train_batch_size:
260
+ - デバイスごとのトレーニングバッチサイズ
261
+
262
+ - per_device_
263
+ _batch_size:
264
+ - デバイスごとの評価バッチサイズ
265
+
266
+ - gradient_accumulation_steps:
267
+ - 勾配を更新する前にステップを積み重ねる回数
268
+
269
+ - optim:
270
+ - オプティマイザの設定
271
+
272
+ - num_train_epochs:
273
+ - エポック数
274
+
275
+ - eval_strategy:
276
+ - 評価の戦略 ("no"/"steps"/"epoch")
277
+
278
+ - eval_steps:
279
+ - eval_strategyが"steps"のとき、評価を行うstep間隔
280
+
281
+ - logging_strategy:
282
+ - ログ記録の戦略
283
+
284
+ - logging_steps:
285
+ - ログを出力するステップ間隔
286
+
287
+ - warmup_steps:
288
+ - 学習率のウォームアップステップ数
289
+
290
+ - save_steps:
291
+ - モデルを保存するステップ間隔
292
+
293
+ - save_total_limit:
294
+ - 保存しておくcheckpointの数
295
+
296
+ - max_steps:
297
+ - トレーニングの最大ステップ数
298
+
299
+ - learning_rate:
300
+ - 学習率
301
+
302
+ - fp16:
303
+ - 16bit浮動小数点の使用設定(第8回演習を参考にすると良いです)
304
+
305
+ - bf16:
306
+ - BFloat16の使用設定
307
+
308
+ - group_by_length:
309
+ - 入力シーケンスの長さによりバッチをグループ化 (トレーニングの効率化)
310
+
311
+ - report_to:
312
+ - ログの送信先 ("wandb"/"tensorboard"など)
313
+ """
314
+
315
+ training_arguments = TrainingArguments(
316
+ output_dir=new_model_id,
317
+ per_device_train_batch_size=1,
318
+ gradient_accumulation_steps=2,
319
+ optim="paged_adamw_32bit",
320
+ num_train_epochs=1,
321
+ logging_strategy="steps",
322
+ logging_steps=10,
323
+ warmup_steps=10,
324
+ save_steps=100,
325
+ save_total_limit = 2,
326
+ max_steps = -1,
327
+ learning_rate=5e-5,
328
+ fp16=False,
329
+ bf16=False,
330
+ seed = 3407,
331
+ group_by_length=True,
332
+ report_to="none"
333
+ )
334
+
335
+
336
+ """
337
+ SFTTrainer: Supervised Fine-Tuningに関する設定
338
+
339
+ - model:
340
+ - 読み込んだベースのモデル
341
+
342
+ - train_dataset:
343
+ - トレーニングに使用するデータセット
344
+
345
+ - eval_dataset:
346
+ - 評価に使用するデータセット
347
+
348
+ - peft_config:
349
+ - PEFT(Parameter-Efficient Fine-Tuning)の設定(LoRAを利用する場合に指定)
350
+
351
+ - max_seq_length:
352
+ - モデルに入力されるシーケンスの最大トークン長
353
+
354
+ - dataset_text_field:
355
+ - データセット内の学習に使うテキストを含むフィールド名
356
 
357
+ - tokenizer:
358
+ - モデルに対応するトークナイザー
359
+
360
+ - args:
361
+ - トレーニングに使用するハイパーパラメータ(TrainingArgumentsの設定を指定)
362
+
363
+ - packing:
364
+ - 入力シーケンスのパッキングを行うかどうかの設定 (False に設定することで、各入力を独立して扱う)
365
+ """
366
+ trainer = SFTTrainer(
367
+ model=model,
368
+ train_dataset=dataset["train"],
369
+ peft_config=peft_config,
370
+ max_seq_length= 512,
371
+ dataset_text_field="formatted_text",
372
+ tokenizer=tokenizer,
373
+ args=training_arguments,
374
+ packing= False,
375
+ )
376
+
377
+ model.config.use_cache = False # キャッシュ機能を無効化
378
+ trainer.train() # トレーニングを実行
379
+
380
+
381
+ # タスクとなるデータの読み込み。
382
+ # omnicampusの開発環境では、左にタスクのjsonlをドラッグアンドドロップしてから実行。
383
+ import json
384
+ datasets = []
385
+ with open("./elyza-tasks-100-TV_0.jsonl", "r") as f:
386
+ item = ""
387
+ for line in f:
388
+ line = line.strip()
389
+ item += line
390
+ if item.endswith("}"):
391
+ datasets.append(json.loads(item))
392
+ item = ""
393
+
394
+
395
+ # モデルによるタスクの推論。
396
+ from tqdm import tqdm
397
+
398
+ results = []
399
+ for data in tqdm(datasets):
400
+
401
+ input = data["input"]
402
+
403
+ prompt = f"""### 前提
404
+ あなたは日本の有名TV局で働く番組プロデューサーです。次の指示に対して、あなたの論理的思考力や想像力を活かして正確な情報であることを意識しつつ、本質的で視聴率が取れるような興味深い回答を考えて下さい。また、回答は途中で辞めずに最後まで回答しきって下さい。
405
+
406
+ 指示
407
+ {input}
408
+ ### 回答
409
+ """
410
+
411
+ tokenized_input = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt").to(model.device)
412
+ attention_mask = torch.ones_like(tokenized_input)
413
+
414
+ with torch.no_grad():
415
+ outputs = model.generate(
416
+ tokenized_input,
417
+ attention_mask=attention_mask,
418
+ max_new_tokens=300,
419
+ do_sample=False,
420
+ repetition_penalty=1.2,
421
+ pad_token_id=tokenizer.eos_token_id
422
+ )[0]
423
+ output = tokenizer.decode(outputs[tokenized_input.size(1):], skip_special_tokens=True)
424
+
425
+ results.append({"task_id": data["task_id"], "input": input, "output": output})
426
+
427
+
428
+ # こちらで生成されたjsolを提出してください。
429
+ # 本コードではinputとeval_aspectも含んでいますが、なくても問題ありません。
430
+ # 必須なのはtask_idとoutputとなります。
431
+ import re
432
+ jsonl_id = re.sub(".*/", "", new_model_id)
433
+ with open(f"./{jsonl_id}-outputs.jsonl", 'w', encoding='utf-8') as f:
434
+ for result in results:
435
+ json.dump(result, f, ensure_ascii=False) # ensure_ascii=False for handling non-ASCII characters
436
+ f.write('\n')
437
+
438
+
439
+ # モデルとトークナイザーをHugging Faceにア��プロード
440
+ model.push_to_hub(new_model_id, token=HF_TOKEN, private=True) # Online saving
441
+ tokenizer.push_to_hub(new_model_id, token=HF_TOKEN, private=True) # Online saving
442
+ ```
443
 
444
  ### Direct Use
445