Views
No views yet
1# 必要なライブラリをインストール
2!pip install -U bitsandbytes
3!pip install -U transformers
4!pip install -U accelerate
5!pip install -U datasets
6!pip install -U peft
7!pip install ipywidgets --upgrade
8
9# 必要なライブラリを読み込み
10from transformers import (
11 AutoModelForCausalLM,
12 AutoTokenizer,
13 BitsAndBytesConfig,
14)
15from peft import PeftModel
16import torch
17from tqdm import tqdm
18import json
19
20# ベースとなるモデルと学習したLoRAのアダプタ(Hugging FaceのIDを指定)。
21model_id = "llm-jp/llm-jp-3-13b"
22adapter_id = "/kenichiNaoe/llm-jp-3-13b-instract-ken02"
23
24from google.colab import userdata
25HF_TOKEN=userdata.get('HF_TOKEN')
26
27# QLoRA config
28bnb_config = BitsAndBytesConfig(
29 load_in_4bit=True,
30 bnb_4bit_quant_type="nf4",
31 bnb_4bit_compute_dtype=torch.bfloat16,
32)
33
34# Load model
35model = AutoModelForCausalLM.from_pretrained(
36 model_id,
37 quantization_config=bnb_config,
38 device_map="auto",
39 token = HF_TOKEN
40)
41
42# Load tokenizer
43tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True, token = HF_TOKEN)
44
45# 元のモデルにLoRAのアダプタを統合。
46model = PeftModel.from_pretrained(model, adapter_id, token = HF_TOKEN)
47
48# タスクとなるデータの読み込み。
49# 事前にデータをアップロードしてください。
50datasets = []
51with open("./elyza-tasks-100-TV_0.jsonl", "r") as f:
52 item = ""
53 for line in f:
54 line = line.strip()
55 item += line
56 if item.endswith("}"):
57 datasets.append(json.loads(item))
58 item = ""
59
60# モデルを用いてタスクの推論。
61
62# 推論するためにモデルのモードを変更
63model.eval()
64
65results = []
66for dt in tqdm(datasets):
67 input = dt["input"]
68
69 prompt = f"""### 指示\n{input} \n### 回答\n"""
70
71 tokenized_input = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt").to(model.device)
72 attention_mask = torch.ones_like(tokenized_input)
73 with torch.no_grad():
74 outputs = model.generate(
75 tokenized_input,
76 attention_mask=attention_mask,
77 max_new_tokens=100,
78 do_sample=False,
79 repetition_penalty=1.2,
80 pad_token_id=tokenizer.eos_token_id
81 )[0]
82 output = tokenizer.decode(outputs[tokenized_input.size(1):], skip_special_tokens=True)
83
84 results.append({"task_id": data["task_id"], "input": input, "output": output})
85
86# 結果をjsonlで保存。
87import re
88json_file_id = re.sub(".*/", "", adapter_id)
89with open(f"/content/{json_file_id}_output.jsonl", 'w', encoding='utf-8') as f:
90 for result in results:
91 json.dump(result, f, ensure_ascii=False)
92 f.write('\n')| Language | Dataset | Description |
|---|---|---|
| Japanese | ichikara-instruction-003-001 | A manually constructed instruction dataset |
| ichikara-instruction-003-002 | A manually constructed instruction dataset |
1"""
2peft_config: PEFTの構成設定
3
4 - r
5 - LoRA のランク (4, 8, 16 ,32...)
6 - 増やすほど学習が捗るが, 過学習のリスクも高まるので注意
7
8 - lora_alpha
9 - LoRAのスケーリング係数
10
11 - lora_dropout
12 - ドロップアウト率(過学習を防ぐための割合)
13
14 - bias
15 - バイアス項の扱い ("none"の場合、LoRAはバイアスを学習しない)
16
17 - task_type
18 - タスクタイプ
19
20 - target_modules
21 - LoRAを適用するターゲットモジュール (前のコードで特定した層)
22"""ss
23LoraConfig(
24 r=32,
25 lora_alpha=32,
26 lora_dropout=0.05,
27 bias="none",
28 task_type="CAUSAL_LM",
29 target_modules=modules,
30)
31
32"""
33training_arguments: 学習の設定
34
35 - output_dir:
36 -トレーニング後のモデルを保存するディレクトリ
37
38 - per_device_train_batch_size:
39 - デバイスごとのトレーニングバッチサイズ
40
41 - per_device_
42 _batch_size:
43 - デバイスごとの評価バッチサイズ
44
45 - gradient_accumulation_steps:
46 - 勾配を更新する前にステップを積み重ねる回数
47
48 - optim:
49 - オプティマイザの設定
50
51 - num_train_epochs:
52 - エポック数
53
54 - eval_strategy:
55 - 評価の戦略 ("no"/"steps"/"epoch")
56
57 - eval_steps:
58 - eval_strategyが"steps"のとき、評価を行うstep間隔
59
60 - logging_strategy:
61 - ログ記録の戦略
62
63 - logging_steps:
64 - ログを出力するステップ間隔
65
66 - warmup_steps:
67 - 学習率のウォームアップステップ数
68
69 - save_steps:
70 - モデルを保存するステップ間隔
71
72 - save_total_limit:
73 - 保存しておくcheckpointの数
74
75 - max_steps:
76 - トレーニングの最大ステップ数
77
78 - learning_rate:
79 - 学習率
80
81 - fp16:
82 - 16bit浮動小数点の使用設定(第8回演習を参考にすると良いです)
83
84 - bf16:
85 - BFloat16の使用設定
86
87 - group_by_length:
88 - 入力シーケンスの長さによりバッチをグループ化 (トレーニングの効率化)
89"""
90TrainingArguments(
91 output_dir=new_model_id,
92 per_device_train_batch_size=1,
93 gradient_accumulation_steps=2,
94 optim="paged_adamw_32bit",
95 num_train_epochs=1,
96 logging_strategy="steps",
97 logging_steps=10,
98 warmup_steps=10,
99 save_steps=100,
100 save_total_limit = 2,
101 max_steps = -1,
102 learning_rate=5e-5,
103 fp16=False,
104 bf16=False,
105 seed = 2322,
106 group_by_length=True,
107)
108
109## max_seq_length: モデルに入力されるシーケンスの最大トークン長
110max_seq_length_for_sft_trainer = 512
111