ã¯ããã«
huggingfaceã«ã¯TRLïŒTransformer Reinforcement LearningïŒãšããã©ã€ãã©ãªããããŸããããã¯ãLLMããã¥ãŒãã³ã°ããéã®ãInstruction Tuningãå ±é ¬ã¢ãã«ã®åŠç¿ãPPOã«ããLLMã®ãã¥ãŒãã³ã°ãããã«ã¹ã¿ãã¯ã§æäŸããŠãããã©ã€ãã©ãªã§ãã
ä»åã¯ãã®äžã§ãSFTTrainerã«çŠç¹ãåœãŠãŠäœ¿ãæ¹ã詳ããã«è§£èª¬ããŠãããŸãã
SFTTrainerã§ã§ããããš
以åãhuggingfaceã®transformersã«çŽã¥ãTrainerã¯ã©ã¹ã®ç޹ä»ãããŸããã
SFTTrainerã¯ãã®Trainerã¯ã©ã¹ãç¶æ¿ããã¯ã©ã¹ã«ãªã£ãŠãããTrainerã¯ã©ã¹ãããLLMã®ãã¥ãŒãã³ã°ã«ç¹åããããã®ãã¿ãããªäœçœ®ã¥ãããšæããŸãã
SFTTraienrã§ã¯LLMããã¥ãŒãã³ã°ããŠããäžã§ä»¥äžã®ããšãç°¡åã«è¡ãããšãã§ããŸãã
CausalLMã«ããåŠç¿ïŒæ¬¡åèªãäºæž¬ããã¿ã¹ã¯ïŒ
ããã¯SFTTrainerã«éã£ã話ã§ã¯ãªããTrainerã¯ã©ã¹ã§ããã¡ãããµã¯ããšè¡ãããšãã§ããã®ã§ãããSFTTrainerã§ã¯data_collatorãäœãæå®ããªããšãè£ã§ DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False)ãèšå®ãããŸãã
Instruction Tuningã®éã«å¿çéšåã®ã¿ãæå€±èšç®ãã
trlã«DataCollatorForCompletionOnlyLMãšããcollatorã¯ã©ã¹ããããŸãããã®collatorã¯Instruction Tuningããéã®ããã³ããã®å¿çãã©ãŒãããïŒ###å¿çã[ASSISTANT]: ã¿ãããªãã€ïŒãæå®ããããšã§ããã以éã«ç¶ãtokenã®ã¿ãCrossEntropyLossã®èšç®å¯Ÿè±¡ãšããŠãããŸããïŒå¿çãã©ãŒããããå«ããã以åã®tokenã«å¯ŸããŠã¯CrossEntropyLossã®ignore_index -100ãèšå®ããŠãããïŒ
è€æ°ã¿ãŒã³ã®äŒè©±ãåŠç¿ãããããšããå¿çãã©ãŒãããã«äœµããŠãæç€ºãã©ãŒãããïŒ###æç€ºã[USER]: ãªã©ïŒã®æå®ãããããšã§ãåã¿ãŒã³ã®å¿çéšåã®ã¿ãæå€±èšç®ã§ããããã«ignore_indexãè¯ããªã«èšå®ããŠãããŸãã
LoRAã«ãããã¥ãŒãã³ã°
以åLoRAã䜿ã£ãLLMã®ãã¥ãŒãã³ã°èšäºãæçš¿ããŸããããSFTTrainerã䜿ãã°ãåæ§ã®ããšãããã¹ãããªããã³ãŒãã§å®çŸã§ããããšæããŸãã
packingã«ããåŠç¿
packingã¯ããŒã¿ã»ãããæå®ããåºå®é·ã«ïŒç¡çããïŒè©°ã蟌ãã§paddingããªããå¹ççã«LLMãªã©ãåŠç¿ãããæ¹æ³ã§ãLLMã®ãã¥ãŒãã³ã°ã®éã¯ããè¡ãããæ¹æ³ã§ãã
SFTTrainerã§ã¯ãpackingãšããåŒæ°ãããããããTrueã«æå®ãããšãå
éšã§trlã®ConstantLengthDatasetãšããã¯ã©ã¹ã䜿çšãããŸããååã®éããpackingå°çšã®Datasetã¯ã©ã¹ã§ãã
NEFTuneã«ããåŠç¿
NEFTune(Noisy Embedding Fine Tuning)ã¯LLMã®Embeddingå±€ã«ã©ã³ãã ãªãã€ãºãå ããªããåŠç¿ããããšã§Instruction Tuningã®æ§èœãåçã«åäžãããããšãã§ããç»æçãªææ³ã§ãã
ããã¯ããããTrainerã¯ã©ã¹ã«ãå®è£
ãããŠãŸãããSFTTrainerãããæå®ã§ããŸããTrainerãšåæ§ã«SFTTrainerã«ãneftune_noise_alphaãšããåŒæ°ããããããã§ãã€ãºã®ã¹ã±ãŒã«èª¿æŽãè¡ãããšãã§ããŸãã
æ¬èšäºæã¯ãäžèšã®åŠç¿æ¹æ³ãå®è£
äŸãšãšãã«è§£èª¬ããŠãããŸãã
ãšãã«packing=Trueãšãããšãã®å
éšã®æåãå人çã«ã¯è€éã«æããŠããçè§£ã«æéãããã£ããããåãã«è§£èª¬ããŸãã
â»SFTTrainerã®ããã¥ã¡ã³ãã«ã¯Flash Attentionãžã®èšåããããŸãããSFTTrainerèªäœã¯ããŸãé¢ä¿ç¡ãæ°ãããã®ã§ãæ¬èšäºã§ã¯å²æããŸãããã ãpackingãè¡ããšãã¯ç³»åé·ãé·ããªãããšãæ³å®ãããã®ã§ãFlash Attentionã䜵ããŠäœ¿ãããšã§ããå¹ççã«åŠç¿ãè¡ãªããŸãã
Flash Attentionã®äœ¿ãæ¹ã¯ä»¥äžã®æ¹ã®èšäºããã¡ããã¡ãããããããã®ã§ãã¡ããã芧ãã ããã
- Flash Attentionã䜿ã£ãŠLLMã®æšè«ãé«éã»è»œéåã§ãããïŒ
- ãç¶ãFlash Attentionã䜿ã£ãŠLLMã®æšè«ãé«éã»è»œéåã§ãããïŒ
- Flash AttentionãšDeep Speedã䜿ã£ãŠLLMãGPU1æã§ãã«ãã¡ã€ã³ãã¥ãŒãã³ã°ãã
æ¬èšäºãèšè¿°ããã«åœãã£ãŠãåèã«ãããŠããã ããèšäºãã³ãŒãã¯ä»¥äžã®ãšããã§ãã
- SFTTrainerã®å ¬åŒããã¥ã¡ã³ã
- Google Colab ã§ SFTTrainer ã«ããLLMã®ãã«ãã©ã¡ãŒã¿ã®ãã¡ã€ã³ãã¥ãŒãã³ã°ã詊ã
- Google Colab ã§ SFTTrainer ã«ããLLMã®ãã«ãã©ã¡ãŒã¿ã®æç€ºãã¥ãŒãã³ã°ã詊ã
- SFTTrainerã®ã³ãŒã
- ConstantLengthDatasetã®ã³ãŒã
- DataCollatorForCompletionOnlyLMã®ã³ãŒã
å®è£ æºå
æ¬èšäºãæçš¿ããã«åœãã£ãŠäœ¿çšããäž»èŠã©ã€ãã©ãªã®ããŒãžã§ã³ã¯ä»¥äžã®ãšããã§ããhuggingfaceã¯å€åãæ¿ããã®ã§ãããŒãžã§ã³ãå€ãããšãæ¬èšäºã®å 容ãåããªãå¯èœæ§ã¯ããããŸãã®ã§ããã®ç¹ã¯ã容赊ãã ããã
accelerate 0.23.0
datasets 2.14.5
peft 0.5.0
torch 2.1.0+cu118
transformers 4.34.1
trl 0.7.4
ä»åå®è£ 玹ä»ãããäžã§æ±ãLLMãããŒã¿ã»ããã¯ä»¥äžã®éããšããŸãã
- LLM: cyberagent/open-calm-large
- dataset: kunishou/databricks-dolly-15k-ja
open-calm-largeã¢ãã«ãdolly-jaããŒã¿ã»ããã䜿ã£ãŠInstruction Tuningããããšããããšã顿ã«ããŸãã
ãŸãã¯dolly-jaããŒã¿ã»ãããçšæããŸãã
from datasets import load_dataset
dolly_dataset = load_dataset("kunishou/databricks-dolly-15k-ja")
# ç°¡æåã®ããinputã®å€ã空ã®ããŒã¿ã«çµã
# npakaããã®èšäºïŒhttps://note.com/npaka/n/nc7a4c20f98f8ïŒãåè
dolly_train_dataset = dolly_dataset['train'].filter(lambda example: example['input'] == '')
print(dolly_train_dataset)
# ããŒã¿ä»¶æ°ã¯å
šéšã§10,417ä»¶
#Dataset({
# features: ['output', 'index', 'category', 'instruction', 'input'],
# num_rows: 10417
#})
print(dolly_train_dataset[0])
#{'output': 'ã€ã³ã¯ãšã€ã©ã¯ãã«',
# 'index': '1',
# 'category': 'classification',
# 'instruction': 'éã®çš®é¡ã¯ã©ã£ã¡ïŒã€ã³ã¯ãšã€ã©ã¯ãã«ãšããŒã',
# 'input': ''}
ã¢ãã«ãèªã¿èŸŒãã§ãããŸãã
from transformers import AutoModelForCausalLM, AutoTokenizer
# open-calm-largeã¯çŽ7åãã©ã¡ãŒã¿ã®å°ããã®LLMã§ãã
# ãšã¯ãããæ¬èšäºã§ç޹ä»ããã³ãŒãããã®ãŸãŸäœ¿ããšcolab pro+ã§äœ¿ããA100ã®ãªã®ãªãããããŸãããïŒè©ŠããŠãŸããïŒ
# ãæå
ã®GPUã®ãªãœãŒã¹ãéãããŠããå Žåãåäœç¢ºèªãç®çã§ããã°ãopen-calm-smallã«åãæ¿ãããªã©ããŠããã ããšè¯ããããããŸããã
model_name = "cyberagent/open-calm-large"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
device_map="auto",
# torch_dtype=torch.float16, # ãã®æç¹ã§torch.float16ãæå®ãããšãtrainæã®lossã0.0ã«ãªã£ãŠåŠç¿ãããŸããããªããåå ãããããã£ãŠããŸããã
)
2024幎11æ25æ¥ è¿œèš
ã¢ãã«ã from_pretrained ã§ããŒãããéãtorch_dtype=torch.float16ãæå®ãããšloss=0ã«ãªãçŸè±¡ã«ã€ããŠã@seanayuuto0826ããããæçãªã³ã¡ã³ããããã ããŠããã®ã§ãåæ§ã®äºè±¡ã«ééãããå Žåã¯ã³ã¡ã³ãæ¬ã®å
容ãã確èªãã ããã
Instruction Tuningã®éã«å¿çéšåã®ã¿ãæå€±èšç®ãã
ãŸããSFTTrainerã®formatting_funcåŒæ°ã«æž¡ãããã³ãããã©ãŒããã倿çšã®é¢æ°ãå®çŸ©ããŸããSFTTrainerã®ããã¥ã¡ã³ãã«èšèŒãããŠããéãå®è£
ããŠããŸãããŸããnpakaããã®èšäºã§ãè¡ã£ãŠããããã«æ«å°Ÿã«eos_tokenæååã远å ããŠããŸãã
â»ååèšäºãšåæ§ã®ããã³ãããã©ãŒããããæ¡çšããŠããŸãã
print(tokenizer.eos_token)
#'<|endoftext|>'
def formatting_prompts_func(example):
output_texts = []
for i in range(len(example['instruction'])):
text = f"以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã\n\n### æç€º:\n{example['instruction'][i]}\n\n### å¿ç:\n{example['output'][i]}<|endoftext|>"
output_texts.append(text)
return output_texts
Intruction Tuningãè¡ãéãæç€ºæãå«ããŠãã¹ãŠã®ããŒã¯ã³ãCausalLMã®æå€±èšç®ã®å¯Ÿè±¡ã«ããŠãåŠç¿ã¯ãããããšæããŸãããå¿çéšåã®ã¿ãæå€±èšç®ã®å¯Ÿè±¡ãšããæ¹æ³ã®ã»ãã广çãããªæ°ãããŸããïŒå®éã«ããã瀺ãå è¡ç ç©¶ãšãããã°ç¥ããããïŒ
ãããå®çŸããã«ã¯ãdata_collatorãšããŠDataCollatorForCompletionOnlyLMã䜿çšããå¿
èŠããããŸãã
DataCollatorForCompletionOnlyLMã䜿çšããã«ã¯SFTTrainerã®åŒæ°ãšããŠpacking=Falseãèšå®ããå¿
èŠããããŸããã€ãŸãå¿çéšåã®ã¿ãæå€±èšç®ããªããåºå®é·ã«packingããåŠç¿ã¯SFTTrainerã ãã§ã¯é£ããããšããããšã«ãªãããšæããŸãã
packing=Falseãæå®ãããšConstantLengthDatasetã䜿ãããŸãããSFTTrainerã«æž¡ããããŒã¿ã»ããããã¡ãã®ãã¥ãŒããªã¢ã«ã§è¡ã£ãŠãæ¹æ³ãšåæ§ã«tokenizeããŠinput_idsãattention_maskãè¿ãããã«ãªã£ãŠããŸãã(該åœã³ãŒãã¯ãã¡ã)
ïŒpacking=Trueã®ãšãã®æåã«ã€ããŠã¯åŸåã§è©³ããã«è§£èª¬ããŸããïŒ
DataCollatorForCompletionOnlyLMã¯response_templateãå¿
é æå®ã«ãªã£ãŠããŸãã
ä»åã®ããã³ããã§èšãã°response_templateã¯### å¿ç:\nã«ãªãã®ã§ããã®æååãæå®ããŸãã
ãŸãã以äžã§ã¯æå®ããŠããŸããããinstruction_templateãšããåŒæ°ããããŸãã
ããã¯è€æ°åã®å¯Ÿè©±åœ¢åŒãããéã«ãASSISTANTã®å¿çéšåã®ã¿ãç¹å®ãããã以å€ã®tokenã-100ã«èšå®ããããã®ãã®ã§ããä»åã¯1å1ç圢åŒã®åŠç¿ãæ³å®ããŠãããããç¹ã«instruction_templateã¯æå®ããŠããŸããã
instruction_templateãèšå®ãããŠããªãå ŽåãæåŸã®ASSISTANTã®å¿çéšåã®ã¿ãç¹å®ãããã以å€ã®tokenãæ£è§£ã©ãã«ãšããŠ-100ãèšå®ãããŸãã
from trl import DataCollatorForCompletionOnlyLM
# response_templateã¯å¿
é æå®
response_template = "### å¿ç:\n"
collator = DataCollatorForCompletionOnlyLM(response_template, tokenizer=tokenizer)
å®éã«SFTTrainerã€ã³ã¹ã¿ã³ã¹ãäœæããã³ãŒãã以äžã«ãªããŸããSFTTrainerã¯Trainerã¯ã©ã¹ã§äœ¿ãTrainingArgumentsã䜿ã£ãŠãåŠç¿æã®æ§ã ãªèšå®ãTrainerã¯ã©ã¹ãšåæ§ã«è¡ãããšãã§ããŸãã
from transformers import TrainingArguments
from trl import SFTTrainer
# SFTTrainerã¯TrainingArgumentsã䜿çšããããšãã§ããã
# æå®ããªãå ŽåãTrainingArgumentsã®ããã©ã«ããæå®ãããã
args = TrainingArguments(
output_dir='./output',
num_train_epochs=2,
gradient_accumulation_steps=8,
per_device_train_batch_size=8,
save_strategy="no",
logging_steps=20,
lr_scheduler_type="constant",
save_total_limit=1,
fp16=True,
)
# data_collatorãæå®ãããŠããªãå Žåã以äžã®ããã«DataCollatorForLanguageModelingãmlm=Falseã§äœ¿ãããã
# ã€ãŸãéåžžã®Causal LMãåŠç¿ããããšã«ãªãã
# if data_collator is None:
# data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False)
# packing=FalseïŒdefaultïŒã§ã¯dataset_text_fieldãformatting_funcãæå®ããå¿
èŠãã
trainer = SFTTrainer(
model,
args=args,
train_dataset=dolly_train_dataset,
formatting_func=formatting_prompts_func,
max_seq_length=1024,
data_collator=collator,
)
äžèšã§å®çŸ©ããtrainerããæå®ããããŒã¿ã»ãããã¡ãããšããã³ãããã©ãŒãããã«å€æãããŠããããšã確èªã§ããŸãã
print(trainer.train_dataset)
#Dataset({
# features: ['input_ids', 'attention_mask'],
# num_rows: 10417
#})
print(tokenizer.decode(trainer.train_dataset[0]['input_ids']))
#以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã
#
#### æç€º:
#éã®çš®é¡ã¯ã©ã£ã¡?ã€ã³ã¯ãšã€ã©ã¯ãã«ãšããŒã
#
#### å¿ç:
#ã€ã³ã¯ãšã€ã©ã¯ãã«<|endoftext|>
trainer.train_datsetãSFTTrainerã®å
éšã§äœ¿ãããDatasetã«ãªãããã§ããããããå
çšå®çŸ©ããcollatorã䜿ã£ãŠDataLoaderãåãããŠã¿ããšãã¡ãããšå¿çéšå以å€ãignore_index -100ã§åããããŠããããšã確èªã§ããŸããïŒå¿çéšåã®åãã¹ãŠãšpaddingããŒã¯ã³ã«å¯ŸããŠ-100ãèšå®ãããŠãããïŒ
from torch.utils.data import DataLoader
loader = DataLoader(trainer.train_dataset, collate_fn=collator, batch_size=8)
batch = next(iter(loader))
print(batch['labels'][0])
#tensor([ -100, -100, -100, -100, -100, -100, -100, -100, -100, -100,
# -100, -100, -100, -100, -100, -100, -100, -100, -100, -100,
# -100, -100, -100, -100, -100, -100, -100, -100, -100, -100,
# -100, -100, -100, -100, -100, -100, -100, -100, -100, -100,
# -100, -100, -100, -100, 275, 19052, 4044, 2048, 431, 367,
# 0, -100, -100, -100, -100, -100, -100, -100, -100, -100,
# -100, -100, -100, -100, -100, -100, -100, -100, -100, -100,
# -100, -100, -100, -100, -100, -100, -100, -100, -100, -100,
# -100, -100, -100, -100, -100, -100, -100, -100, -100, -100,
# -100, -100, -100, -100, -100, -100, -100, -100, -100, -100,
# -100, -100, -100, -100, -100, -100, -100, -100, -100, -100,
# -100, -100, -100, -100, -100, -100, -100, -100, -100, -100,
# -100, -100, -100, -100, -100])
ããšã¯Trainerã¯ã©ã¹ãšåæ§ã«.train()ã§åŠç¿ã.save_model()ã§ã¢ãã«ã®ä¿åãç°¡åã«ã§ããŸãã
trainer.train()
trainer.save_model()
ãã®ããã«LLMãInstruction Tuningããéå¿çéšåã ããæå€±èšç®å¯Ÿè±¡ãšããŠèšç·Žããæ¹æ³ããããªã«ç°¡åã«å°ãªãã³ãŒãã§å®çŸã§ããŸãã
LoRAã«ãããã¥ãŒãã³ã°
SFTTrainerã䜿ãã°ãLoRAã«ãããã¥ãŒãã³ã°ãå°ãªãã³ãŒãã§ç°¡åã«èšè¿°ã§ããŸããå
¬åŒããã¥ã¡ã³ãéããpeftã§LoraConfigãå®çŸ©ããŠãSFTTrainerã®peft_configåŒæ°ã«æå®ããŠããã°çµããã§ããïŒdata_collatoråŒæ°ãformatting_funcåŒæ°ãªã©ã¯åè¿°ãšåæ§ã®ãã®ãæå®ããŠããŸããïŒ
from peft import LoraConfig
peft_config = LoraConfig(
r=8,
lora_alpha=16,
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM",
)
args = TrainingArguments(
output_dir='./output_lora',
num_train_epochs=2,
gradient_accumulation_steps=8,
per_device_train_batch_size=8,
save_strategy="no",
logging_steps=20,
lr_scheduler_type="constant",
save_total_limit=1,
fp16=True,
)
trainer = SFTTrainer(
model,
args=args,
train_dataset=dolly_train_dataset,
formatting_func=formatting_prompts_func,
max_seq_length=1024,
data_collator=collator,
peft_config=peft_config,
)
trainer.train()
trainer.save_model()
SFTTrainerã§ã¯LoRAã®Adapteréšåã ããä¿åããããã«callback颿°ãå®çŸ©ããŸããããçãªããšãæžãããŠããŸãããã®èŸºããããã£ãŠãªãã®ã§ãããäžèšã®ã³ãŒãã®ããã«trainer.save_model()ãšããã ãã§ãoutput_dirã«æå®ãããã£ã¬ã¯ããªã«ã¯ãã©ã¡ãŒã¿ãã¡ã€ã«ãšããŠadatper_model.binïŒLoRA Adapterã®ã¿ã®ãã©ã¡ãŒã¿ïŒã ããä¿åãããŠãŸãããã©ã€ãã©ãªãããã¥ã¡ã³ããæžããããšãããã¢ããããŒãããŠããã§ãããã
ãŸããSFTTrainerããLoRAåŠç¿ãè¡ããšãæã£ã以äžã«GPUã¡ã¢ãªå°ããŸãããåãæ¡ä»¶äžã§SFTTrainer䜿ããã«LoRAãã¥ãŒãã³ã°ã詊ããŠãªãã®ã§ãæ°ã®ãããããããŸãããã
äžèšã®ç¹ãããSFTTrainerã«ããLoRAåŠç¿ãæå³ããæåæ ã£ãŠãããã念ã®ãã確èªããŸããå ·äœçã«ã¯ãSFTTrainerã§LoRAåŠç¿ããååŸã§ã¢ãã«ã®ããŒã¹ã®ãã©ã¡ãŒã¿ã«å€åããªãïŒåŠç¿ãè¡ãããŠããªãïŒããšã確èªããŸãã
ãŸããä»å䜿çšããã¢ãã«(open-calm-large)ã®æ§é ãèŠãŠãããŸããããã¯SFTTrainerã«ã¢ãã«ãæž¡ãåã®æ®µéã§ãã
print(model)ã®åºå
GPTNeoXForCausalLM(
(gpt_neox): GPTNeoXModel(
(embed_in): Embedding(52096, 1536)
(emb_dropout): Dropout(p=0.0, inplace=False)
(layers): ModuleList(
(0-23): 24 x GPTNeoXLayer(
(input_layernorm): LayerNorm((1536,), eps=1e-05, elementwise_affine=True)
(post_attention_layernorm): LayerNorm((1536,), eps=1e-05, elementwise_affine=True)
(post_attention_dropout): Dropout(p=0.0, inplace=False)
(post_mlp_dropout): Dropout(p=0.0, inplace=False)
(attention): GPTNeoXAttention(
(rotary_emb): GPTNeoXRotaryEmbedding()
(query_key_value): Linear(in_features=1536, out_features=4608, bias=True)
(dense): Linear(in_features=1536, out_features=1536, bias=True)
(attention_dropout): Dropout(p=0.0, inplace=False)
)
(mlp): GPTNeoXMLP(
(dense_h_to_4h): Linear(in_features=1536, out_features=6144, bias=True)
(dense_4h_to_h): Linear(in_features=6144, out_features=1536, bias=True)
(act): GELUActivation()
)
)
)
(final_layer_norm): LayerNorm((1536,), eps=1e-05, elementwise_affine=True)
)
(embed_out): Linear(in_features=1536, out_features=52096, bias=False)
)
ãŸããSFTTrainerã«æž¡ãåæ®µéã®LoRA Adapterãæ¿å ¥ãããªãå±€ã®ãã©ã¡ãŒã¿ãèŠãŠãããŸãã
# æåã®å±€ã®FFNã®äžéšã確èªãã
# ãã®æç¹ã§ã¯requires_grad=Trueã«ãªã£ãŠãã
first_ffn_param = model.gpt_neox.layers[0].mlp.dense_h_to_4h.weight
print(first_ffn_param)
#Parameter containing:
#tensor([[-0.1072, 0.0417, -0.0432, ..., -0.0873, -0.1708, -0.1608],
# [-0.0934, 0.0773, 0.0074, ..., -0.2107, 0.0881, -0.0803],
# [-0.0506, -0.1282, -0.1511, ..., 0.1120, -0.0126, -0.1172],
# ...,
# [ 0.1274, -0.0688, 0.1787, ..., 0.1432, 0.0266, -0.1370],
# [-0.1108, -0.0758, 0.0035, ..., -0.0404, -0.1801, 0.0338],
# [ 0.0669, 0.0399, -0.0443, ..., -0.2275, -0.1323, 0.0034]],
# device='cuda:0', requires_grad=True)
次ã«SFTTrainerã«modelãæž¡ããåŸã§SFTTrainerããmodelã«ã¢ã¯ã»ã¹ããŠã¿ãŸãã
print(trainer.model)
PeftModelForCausalLM(
(base_model): LoraModel(
(model): GPTNeoXForCausalLM(
(gpt_neox): GPTNeoXModel(
(embed_in): Embedding(52096, 1536)
(emb_dropout): Dropout(p=0.0, inplace=False)
(layers): ModuleList(
(0-23): 24 x GPTNeoXLayer(
(input_layernorm): LayerNorm((1536,), eps=1e-05, elementwise_affine=True)
(post_attention_layernorm): LayerNorm((1536,), eps=1e-05, elementwise_affine=True)
(post_attention_dropout): Dropout(p=0.0, inplace=False)
(post_mlp_dropout): Dropout(p=0.0, inplace=False)
(attention): GPTNeoXAttention(
(rotary_emb): GPTNeoXRotaryEmbedding()
(query_key_value): Linear(
in_features=1536, out_features=4608, bias=True
(lora_dropout): ModuleDict(
(default): Dropout(p=0.05, inplace=False)
)
(lora_A): ModuleDict(
(default): Linear(in_features=1536, out_features=8, bias=False)
)
(lora_B): ModuleDict(
(default): Linear(in_features=8, out_features=4608, bias=False)
)
(lora_embedding_A): ParameterDict()
(lora_embedding_B): ParameterDict()
)
(dense): Linear(in_features=1536, out_features=1536, bias=True)
(attention_dropout): Dropout(p=0.0, inplace=False)
)
(mlp): GPTNeoXMLP(
(dense_h_to_4h): Linear(in_features=1536, out_features=6144, bias=True)
(dense_4h_to_h): Linear(in_features=6144, out_features=1536, bias=True)
(act): GELUActivation()
)
)
)
(final_layer_norm): LayerNorm((1536,), eps=1e-05, elementwise_affine=True)
)
(embed_out): Linear(in_features=1536, out_features=52096, bias=False)
)
)
)
ä»åç¹ã«LoraConfigãèšå®ããéãtarget_modulesãæå®ããŠããŸããã§ããããããæãã«self-attentionã®èšç®éšåã®Linearå±€ã«ã ãAdapterãæ¿å
¥ãããŠããããšãããããŸãã
åŠç¿ããããã©ã¡ãŒã¿æ°ã確èªããŸãã
trainer.model.print_trainable_parameters()
#trainable params: 1,179,648 || all params: 841,178,112 || trainable%: 0.14023760047622352
trainableãªãã©ã¡ãŒã¿ãããªãå°ãªããLoRAã«ããèšå®ãã¡ãããšãããŠããã§ãã
SFTTrainerã䜿ã£ãŠåŠç¿ãããAdapterãèªã¿èŸŒããšãã¯output_dirã«æå®ãããã£ã¬ã¯ããªã.from_pretrainedã§èªã¿èŸŒãã ãã§Adapterãæ¿å
¥ãããç¶æ
ã§LLMãããŒãããããšãã§ããŸããããŒã¹ã®ãã©ã¡ãŒã¿ã¯ã©ãããæã£ãŠããŠããã ïŒã£ãŠè©±ã§ãããoutput_dirã®ãã£ã¬ã¯ããªé
äžã«adapter_config.jsonãšãããã®ãåºåãããŠãããbase_model_name_or_pathãšããé
ç®ã«ããŒã¹ã®ã¢ãã«ã®åç
§å
ãæ ŒçŽãããŠããã®ã§ãããŒã¹ã®ãã©ã¡ãŒã¿ãããããæã£ãŠããããšãã§ããŠããããã§ãã
# adapterã ããä¿åãããŠãããã£ã¬ã¯ããªãæå®ããã ãã§ã¡ãããšã¢ãã«ãããŒãã§ããŠãã
lora_model = AutoModelForCausalLM.from_pretrained('./output_lora', device_map="auto")
念ã®ãããããŒãããã¢ãã«ãšåŠç¿åã®LLMã«ãããŠãããŒã¹ã¢ãã«ã®ãã©ã¡ãŒã¿ã«å€åããªãããšã確èªã§ããŸãã
# adapterãæ¿å
¥ãããŠããªãå±€ã¯ãã©ã¡ãŒã¿ã¯baseã¢ãã«ã®ãšããšãŸã£ããåã
(lora_model.gpt_neox.layers[0].mlp.dense_h_to_4h.weight == first_ffn_param).all()
#tensor(True, device='cuda:0')
念ã®ãããããã確èªããŸããããSFTTrainerã䜿ã£ãLoRAã«ãããã¥ãŒãã³ã°ãç°¡åã«èšè¿°ã§ããããšã確èªã§ããŸããã
NEFTuneã«ããåŠç¿
NEFTuneã¯åé ã§ãè§Šããããã«LLMã®Embeddingå±€ã«ã©ã³ãã ãªãã€ãºãå ããŠåŠç¿ããããšã§Instruction Tuning
ããããšã§æ§èœãåäžãããããææ³ã§ãã
åè«æã®Algorithm1ããåŒçš
neftune_noise_alphaã¯$\frac{\alpha}{\sqrt{Ld}}$ ($L$:ç³»åé·ã$d$: embeddingã®æ¬¡å
æ°)ã®èšç®åŒã§ãã€ãºã®ã¹ã±ãŒãªã³ã°ã®æ©èœãæããããã§ãã
NEFTuneãçšããåŠç¿ãæå¹ã«ããã®ã¯éåžžã«ç°¡åã§ã以äžã®ããã«SFTTrainerã§neftune_noise_alphaãæå®ããã ãã§OKã§ããããã ãã§NEFTuneã«åŠç¿ãæå¹ã«ãªããŸãã
args = TrainingArguments(
output_dir='./output_neftune',
num_train_epochs=2,
gradient_accumulation_steps=8,
per_device_train_batch_size=8,
save_strategy="no",
logging_steps=20,
lr_scheduler_type="constant",
save_total_limit=1,
fp16=True,
)
# neftune_nosise_alphaã¯ããã©ã«ãã§None
# Noneã§ãªãfloatå€ãèšå®ããããšNEFTuneã®æ©èœãæå¹ã«ãªãã
# neftune_noise_alphaã¯åã蟌ã¿å±€ã«å ç®ããããã€ãºãã¯ãã«ã®ã¹ã±ãŒã«èª¿æŽã«äœ¿ãããã
trainer = SFTTrainer(
model,
args=args,
train_dataset=dolly_train_dataset,
formatting_func=formatting_prompts_func,
max_seq_length=1024,
data_collator=collator,
neftune_noise_alpha=5,
)
trainer.train()
trainer.save_model()
äžèšã§ã¯neftune_noise_alpha=5ãšãSFTTrainerã®ããã¥ã¡ã³ãã§ç޹ä»ãããŠããå€ããã®ãŸãŸäœ¿ã£ãŠããŸããæ¬èšäºã®æ¡ä»¶äžã§ãããæé©ãªå€ãã©ãããŸã§ã¯èª¿ã¹ãŠããŸãããåè«æã§ã¯ãApppendix A.1ã«ãŠã70Bã®LLamaã¢ãã«ã®å®éšã§ã¯$\alpha=15$ã䜿çšããããååãªæ€èšŒã¯ã§ããŠããªãããšããèšè¿°ããããŸããå®éã«NEFTuneã䜿çšããéã¯ãneftune_noise_alphaãäœãã¿ãŒã³ãæ€èšŒããã»ããããã§ãããã
When using NEFTune on the 70B parameter model, we use α = 15 and did not explore other (potentially better) settings due to computational constraints.
packingãçšããåŠç¿
LLMã®åŠç¿ãè¡ãéãããŒã¿ã»ãããåºå®ã®ç³»åé·ã«è©°ã蟌ãã§åŠç¿ãããææ³ãäž»æµã®ããã§ãSFTTrainerã§ããã®åŠç¿æ¹æ³ããµããŒãããŠããŸãã
SFTTrainerã®åŒæ°ãšããŠpacking=Trueãæå®ããããšã§ãConstantLengthDatasetãå
éšã§äœ¿çšãããŸãã
泚æç¹ãšããŠpacking=Trueãæå®ãã€ã€ãdata_collatorãšããŠDataCollatorForCompletionOnlyLMã䜿ãããšã¯ã§ããŸãããã€ãŸããpackingãè¡ããªãããå¿çéšåã ãã®æå€±ãèšç®ãããããªæåã¯SFTTrainerã«éãã圢ã§ã¯å®çŸãçŸç¶ã¯é£ãããã§ããããããåŠç¿ãè¡ãããå Žåã¯èªäœã§collatorã¯ã©ã¹ãäœããªãããå¿
èŠãããããšæããŸãã
packing=Trueã®ãšãã®æåãçè§£ããã«ã¯ConstantLengthDatasetã®æåãçè§£ããããšãéèŠã§ããSFTTrainerã®ããã¥ã¡ã³ãã«ãpacking=Trueã®èª¬æã§ã以äžã®ãããªèšè¿°ããããŸãã
Note that if you use a packed dataset and if you pass max_steps in the training arguments you will probably train your models for more than few epochs, depending on the way you have configured the packed dataset and the training protocol. Double check that you know and understand what you are doing.
ãŸãã¯ContantLengthDatasetãå®éã«äœ¿ã£ãŠã¿ãŸãããã
ConstantLengthDataset
ConstantLengthDatasetã¯IterableDatasetãç¶æ¿ããã¯ã©ã¹ã§ãããªã®ã§ã__getitem__ã¡ãœãããæã£ãŠããŸããã
ConstantLengthDatasetã®äž»ãªåŒæ°ã¯ä»¥äžã§ãã
-
formatting_func- åããŒã¿ãããã³ããã®ãã©ãŒãããã«å€æãã颿°ãæå®ããŸããã¡ãã£ãšæ³šæãªã®ããäžèšã§ã¿ãŠãã
formatting_funcãšã¯éã£ãŠããã¡ãã§ã¯åã¬ã³ãŒã1ä»¶ã«å¯ŸããŠã®å€æåŠçãèšè¿°ããå¿ èŠããããŸããSFTTrainerã®formatting_funcããæå®ããããšã«ãªããŸãã
- åããŒã¿ãããã³ããã®ãã©ãŒãããã«å€æãã颿°ãæå®ããŸããã¡ãã£ãšæ³šæãªã®ããäžèšã§ã¿ãŠãã
-
seq_length- packingããéã®åºå®ã®ç³»åé·ãæå®ããŸããæå®ãããç³»åé·ã«ãªããŸã§ããŒã¿ãè©°ã蟌ãŸããããšãæå³ããŸããSFTTrainerããã¯
max_seq_lengthã§æå®ããŸãã
- packingããéã®åºå®ã®ç³»åé·ãæå®ããŸããæå®ãããç³»åé·ã«ãªããŸã§ããŒã¿ãè©°ã蟌ãŸããããšãæå³ããŸããSFTTrainerããã¯
-
chars_per_token- 1ããŒã¯ã³ãå ããæåæ°ã®æšå®å€ãæå®ããŸããããã¯
ConstantLengthDatasetã®å éšã§ããŒã¿ãpackingããéã«packing察象ãšããŠäžæçã«ãããã¡ãŒé åã«ããŒã¿ãæ ŒçŽããã®ã§ããããã®ãããã¡ãŒã®å®¹éãæ±ºããããã«äœ¿ãããŸããSFTTrainerããã¯chars_per_tokenã§æå®ããŸãã
- 1ããŒã¯ã³ãå ããæåæ°ã®æšå®å€ãæå®ããŸããããã¯
-
num_of_sequences- å
éšã§èšç®ãããããã¡ãŒå®¹éãšããŠäœã»ã³ãã³ã¹ãŸã§ãæ ŒçŽãããããæå®ããŸããSFTTrainerããã¯
num_of_sequencesã§æå®ããŸãã
- å
éšã§èšç®ãããããã¡ãŒå®¹éãšããŠäœã»ã³ãã³ã¹ãŸã§ãæ ŒçŽãããããæå®ããŸããSFTTrainerããã¯
-
infinite-
ConstantLengthDatasetã®å éšã®ã€ãã¬ãŒã¿ãŒã®åŠçã«ãããŠãããŒã¿ã»ããã®çµç«¯ã«å°éãããšãã«ã€ãã¬ãŒã¿ãŒãçµäºããã代ããã«ããŒã¿ã»ããã®éå§å°ç¹ã«ã€ãã¬ãŒã¿ãŒãæ»ã圹å²ãæãããŸããå®è³ªç¡éã«ãŒãã®ãããªæ¯ãèããããŸããããã©ã«ãã§ã¯Falseã§ãããinfinite=Trueãæå®ãããšãã¯å¥ã®å¶åŸ¡è»žïŒãšããã¯æ°ãmaxã¹ãããæ°ïŒãªã©ã§åŠç¿ã«ãŒããå¶åŸ¡ããå¿ èŠããããŸããSFTTrainerããã¯infiniteã§æå®ããŸãã
-
packingãšã¯ïŒ
ããããpackingã£ãŠã©ããªåŠçã£ãŠæãã®æ¹ã«ç°¡åã«äžè¬çãªpackingã®æåã®èª¬æãããŸãã
äŸãã°ä»¥äžã®ãããªããŒã¿ã»ããããã£ããšããŸããïŒ1æåã§1ããŒã¯ã³ã ãšæã£ãŠãã ãããïŒ
aaaaa
bbb
cccccc
dddd
...
ãã®ããŒã¿ã»ããã«å¯Ÿããããããµã€ãº2ã§ãã®ãŸãŸäžããé çªã«ãããåãããšã
1batchç®: [aaaaa, bbb<pad><pad>]
2batchç®: [cccccc, dddd<pad><pad>]
...
ãããªæãã§ãããå ã®æå€§ç³»åé·ã«äœµããŠçãããŒã¿ã¯paddingããŒã¯ã³ã§åããããŠãããå ã§ç³»åé·ãæããŸãããã ãã®paddingã¯åŠç¿ã«äœ¿ãããªãïŒattention maskã匵ãããïŒã®ã§ãpaddingãããããçºçãããšèšç®å¹çãæªãã§ãã(paddingãånetworkãéãããã§ã)
ããã§ä»¥äžã®ããã«ç¡çããããŒã¿ãåºå®é·ã«è©°ã蟌ãã§paddingããªããããšãèããŸããä»åã®ã±ãŒã¹ã§ã¯åºå®é·ã5ãšãããšã
1batchç®: [aaaaa, bbbcc]
2batchç®: [cccdd, ddeee]
...
ãããªæãã®è©°ãèŸŒã¿æ¹ã«ãªããccccccã®ããŒã¿ãéäžã§truncationãããŠãŸããæãéäžã§åããŠãããªãããããªããããšããéåžžã§ããã°èšç®ãããªãattention(bbbãšccã®éšåïŒãèšç®ããã¡ããã®ã¯ã©ããªãã ïŒãšãã®æžå¿µç¹ã¯ããããšæããŸããããã®æžå¿µä»¥äžã«ãã®ããã«ããããšã®èšç®å¹çåäžã®ã»ããããã倧éã®ããŒã¿ãæ©ãåŠç¿ã§ããŠæ©æµã倧ããããšããããšãªãã ãšçè§£ããŠããŸãã
ConstantLengthDatasetã®å
éšã§è¡ãããpackingã®åŠçã®æµã
å®éã®ã³ãŒããé©å®åç §ããŠãããã€ã€ãèšèã§ãã®åŠçã®èª¬æãããŸãã
å®éã®è©²åœã³ãŒã
def __iter__(self):
iterator = iter(self.dataset)
more_examples = True
while more_examples:
buffer, buffer_len = [], 0
while True:
if buffer_len >= self.max_buffer_size:
break
try:
buffer.append(self.formatting_func(next(iterator)))
buffer_len += len(buffer[-1])
except StopIteration:
if self.infinite:
iterator = iter(self.dataset)
warnings.warn("The dataset reached end and the iterator is reset to the start.")
else:
more_examples = False
break
tokenized_inputs = self.tokenizer(buffer, truncation=False)["input_ids"]
all_token_ids = []
for tokenized_input in tokenized_inputs:
all_token_ids.extend(tokenized_input + [self.concat_token_id])
examples = []
for i in range(0, len(all_token_ids), self.seq_length):
input_ids = all_token_ids[i : i + self.seq_length]
if len(input_ids) == self.seq_length:
examples.append(input_ids)
if self.shuffle:
random.shuffle(examples)
for example in examples:
self.current_size += 1
yield {
"input_ids": torch.LongTensor(example),
"labels": torch.LongTensor(example),
}
Step1
ãŸãããããã¡ãŒãšããèãããããŸããããã¯ããŒã¿ãpackingããéã«ãäºåã«packing察象ã®ããŒã¿ãåãåããŠäžæçã«æ ŒçŽããŠããé åãæãããŸãããããã¡ãŒã®ãµã€ãºã¯3ã€ã®åŒæ°ã䜿ã£ãŠä»¥äžã®ããã«èšç®ãããŸãã
self.max_buffer_size = seq_length * chars_per_token * num_of_sequences
ãã®ãããã¡ãŒã«å ¥ãåãã ãããŒã¿ã»ããããé çªã«ããã¹ããè©°ã蟌ãã§ãããŸãã
Step2
ãããã¡ãŒã®å®¹éããã£ã±ãã«ãªã£ãããæ¬¡ã«packingã®åŠçã«å
¥ããŸããpackingã¯ãã®ãããã¡ãŒã«æ ŒçŽãããŠããããã¹ããå
šéštokenizerã§tokenåããŸãããã®ãšããåããŒã¿ïŒæç« ïŒã®æ«å°Ÿã«EOSããŒã¯ã³ã远å ããŸãã
ãããŠseq_lengthåã®ããŒã¯ã³ãã¹ã©ã€ã¹ããŠåãåºãããããå
ã«å«ã1ã¬ã³ãŒãåã®ããŒã¿ãäœæããŠãããŸãã
seq_lengthã§å²ãåããªã端æ°åã®ããŒã¿ã¯åãæšãŠãããããšã«æ³šæãå¿
èŠã§ãã
Step3
ãããã¡ãŒåã®ããŒã¿ãpackingããŠseq_lengthåã®ããŒã¿ãé çªã«yieldã§è¿åŽããŠãããŸãããã¹ãŠã®ããŒã¿ãè¿åŽãçµãããããããã¡ãŒã®å®¹éã空ã«ããŠãããŒã¿ã»ããã®ã€ãã¬ãŒã¿ãŒã®ç¶ããããŸããããã¡ãŒã«æ ŒçŽããäœæ¥ãåéããŸãã
ãããããŒã¿ã»ããã®çµç«¯ãŸã§ç¹°ãè¿ããŸããããŒã¿ã»ããã®çµç«¯ãŸã§ãã©ãçããããinfinite=Falseãæå®ããŠããå Žåã1epochåãå®äºããããšã«ãªããŸãããinfinite=Trueãæå®ãããŠããå Žåã¯ããŒã¿ã»ããã®ã€ãã¬ãŒã¿ãŒãåæåãããããŒã¿ã»ããã®æåãããããã¡ãŒã«è©°ã蟌ãäœæ¥ãåéãããŸãã
ãããã¡ãŒã®ãµã€ãºãå°ãããããšãStep2ã§åãæšãŠãããããŒã¿ãå€ããªã£ãŠããŸããããããŸãããéã«ãããã¡ãŒãµã€ãºã倧ãããããšãäžæçã«å€§éã®ããŒã¿ã確ä¿ãtokenizeããå¿ èŠããããå¹çãæªããªããããããŸããããã®èŸºã¯ãã¬ãŒããªãã®é¢ä¿ããããšæããŸãã
ãªãã§ãããªãããã¡ãŒé åãå¿
èŠãªã®ããšãããšãseq_lengthãšããŠæå®ããåºå®é·ã¯å®éã¯tokenizerã§tokenåãããåŸã§èšç®ããå¿
èŠããããŸãããæåããDatasetã®æ®µéã§ãã¹ãŠã®ããŒã¿ãtokenizeããŠtokenåããäžã§ããŒã¿ãseq_lengthã«è©°ã蟌ãäœæ¥ããã¡ãããšãæ¯epochåãpackingæ¹æ³ã®ããŒã¿ã§åŠç¿ããããšã«ãªããåŠç¿ã«ãžããªåããšããçãã¡ããã®ãé²ãç®çãããã®ããªãŒãšèå¯ããŠãŸãã
ConstantLengthDatasetãå®éã«è§Šã£ãŠã¿ã
æåã®çè§£ã確ãããããã«ããããããã¹ãŠã®ããŒã¿ãã§ããã ããããªãseq_length=1024ã§packingã§ãããããã¡ãŒãµã€ãºãèšç®ããŠã¿ãŸãããã®ããã«chars_per_tokensãšnum_of_sequencesãæšå®ããå¿
èŠããããŸãã
ãŸãä»åã®æ¡ä»¶äžïŒdolly-jaããŒã¿ã»ãããopen-calm-largeã¢ãã«ã®Tokenizerã§æ±ãïŒã«çœ®ããŠãchars_per_tokensãã©ããããã®å€ãªã®ããæšå®ããŸãã
# chars_per_tokensã¯ããã©ã«ãã3.6ãšããå€ãèšå®ãããŠããã
# æšå®æ¹æ³ã®ã³ãŒãã¯stack-llamaïœãåç
§ããŠããã
# è±èªåæã§èšç®ããŠãããªã®ã§ãæ¥æ¬èªããŒã¿ã§æšå®ãããšã©ããããã®å€ã«ãªãã®ããä»åã®dollyããŒã¿ã»ããã§ç¢ºèª
# çµæçã«çŽ2.12ã«ãªã£ããããã¯æ±ãtokenizerãæ¥æ¬èªã®ãã®ãªã®ããå€èšèªã®ãã®ãªã®ãããšãã§ãå€ããããã
from tqdm import tqdm
def prepare_sample_text(example):
"""Prepare the text from a sample of the dataset."""
# text = f"Question: {example['question']}\n\nAnswer: {example['response_j']}"
text = f"以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã\n\n### æç€º:\n{example['instruction']}\n\n### å¿ç:\n{example['output']}"
return text
def chars_token_ratio(dataset, tokenizer, nb_examples=400):
"""
Estimate the average number of characters per token in the dataset.
"""
total_characters, total_tokens = 0, 0
for _, example in tqdm(zip(range(nb_examples), iter(dataset)), total=nb_examples):
text = prepare_sample_text(example)
total_characters += len(text)
if tokenizer.is_fast:
total_tokens += len(tokenizer(text).tokens())
else:
total_tokens += len(tokenizer.tokenize(text))
return total_characters / total_tokens
chars_per_tokens = chars_token_ratio(dolly_train_dataset, tokenizer, nb_examples=dolly_train_dataset.num_rows)
chars_per_tokens
# 2.123043180452291
ããã«ä»å䜿çšããããŒã¿ã»ããã®åèšæåæ°ãèšç®ããŸãã
# ä»å䜿çšããåèšæåæ°ãèšç®
all_char_len = 0
for example in dolly_train_dataset:
text = formatting_func(example)
all_char_len += len(text)
all_char_len
# 2730673
ãããã®å€ããnum_of_sequencesã¯
num_of_sequences = (all_char_len / seq_len) / chars_per_tokens
# (2730673 / 1024) / 2.123043180452291
num_of_sequences
# 1257.8645526238206
ã ãããnum_of_sequences=1258ãããã«èšå®ããŠããã°ã¡ããã©ãããµã€ãºã®ãããã¡ãŒã«ãªãããã§ãããããå
ã«ConstantLengthDatasetã䜿ã£ãŠã¿ãŸãã
from trl.trainer import ConstantLengthDataset
# packing=Falseã®ãšãã«èŠãŠããformatting_funcãšäœãæ¹ãéãç¹ã«æ³šæ
# ConsantLengthDatsetå
éšã§æ«å°Ÿã«eos_tokenãæ¿å
¥ããã®ã§ãããã§ã¯eos_tokenã®æ¿å
¥ã¯è¡ããªãã
def formatting_func(example):
text = f"以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã\n\n### æç€º:\n{example['instruction']}\n\n### å¿ç:\n{example['output']}"
return text
cl_dataset = ConstantLengthDataset(
tokenizer=tokenizer,
dataset=dolly_train_dataset,
formatting_func=formatting_func,
num_of_sequences=1258,
seq_length=1024,
chars_per_token=2.12,
shuffle=False,
)
å®éã«ããŒã¿ãåãåºããŠã¿ãŸãã
# ConstantLengthDatasetã¯IterableDatsetãç¶æ¿ããŠããã®ã§ã__getitem__ãæã£ãŠããªãã
# i.e. cl_dataset[0]ãšããåŒã³åºãã¯ãšã©ãŒã«ãªã
d = next(iter(cl_dataset))
tokenizer.decode(d['input_ids'])
åãåºããçµæã¯ä»¥äžã®ãšããã§ããé·ãã®ã§éããŠãããŸãã
以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã\n\n### æç€º:\néã®çš®é¡ã¯ã©ã£ã¡?ã€ã³ã¯ãšã€ã©ã¯ãã«ãšããŒã\n\n### å¿ç:\nã€ã³ã¯ãšã€ã©ã¯ãã«<|endoftext|>以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã\n\n### æç€º:\nã©ã¯ãã¯ãªãæ°Žãªãã§é·ãçããããã®ã?\n\n### å¿ç:\nã©ã¯ãã¯ãé·æéã«ããã£ãŠãšãã«ã®ãŒãšæ°Žåã§æºããããç¶æ ãä¿ã€ããã«ãè °ã®èèªãå©çšããŠããŸãã<|endoftext|>以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã\n\n### æç€º:\nã¢ãªã¹ã®äž¡èŠªã«ã¯3人ã®åšããã:ãšã€ããŒããžã§ã·ãŒããããŠäžå¥³ã®ååã¯?\n\n### å¿ç:\näžå¥³ã®ååã¯ã¢ãªã¹<|endoftext|>以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã\n\n### æç€º:\nåœé£ã«æ¬éšã建ãŠãããã«ãã¥ãŒãšãŒã¯ã®åå°ãå¯ä»ããã®ã¯èª°?\n\n### å¿ç:\nãžã§ã³ã»ãã€ãŽã£ãœã³ã»ããã¯ãã§ã©ãŒ<|endoftext|>以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã\n\n### æç€º:\nã¹ããã人éã«æªãçç±\n\n### å¿ç:\nåžžã«ã¹ãããæäœããŠããã®ãè¯ããªãããã<|endoftext|>以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã\n\n### æç€º:\nå€è§åœ¢ãšã¯äœã§ãã?\n\n### å¿ç:\nå€è§åœ¢ã¯ã幟äœåŠã«ããã圢ã®äžã€ã§ããå€è§åœ¢ã¯éæãç·ãããã¯éæ²ç·ãæããç·åã®éããæééã§å²ãŸããå¹³é¢å³åœ¢ã§ãããå€è§åœ¢ã®é ç¹ã¯ã2ã€ã®èŸºã亀ãããšããã«åœ¢æãããŸããå€è§åœ¢ã®äŸãšããŠã¯ãå è§åœ¢ãäºè§åœ¢ãå «è§åœ¢ããããŸãã蟺ãé ç¹ãå«ãŸãªãå¹³é¢ã¯ãå€è§åœ¢ã§ã¯ãããŸãããå€è§åœ¢ã§ãªããã®ã®äŸãšããŠãåããããŸãã<|endoftext|>以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã\n\n### æç€º:\nã©ã³ãã³ã°ãå§ããã«ã¯ã©ããããããã®ã§ãããã?\n\n### å¿ç:\nã©ã³ãã³ã°ã·ã¥ãŒãºãæè£ ã¯ãäœ¿ãæ £ãããã®ãçšæãã5kmã®èµ°è¡ã®ãããªéæå¯èœãªç®æšããå§ããŸããããèµ°ã£ãããšããªã人ã¯ãæåã¯15~30åãç®æšã«ããŠã©ãŒãã³ã°ãæ©æ©ãã軜ããžã§ã®ã³ã°ããåŸã ã«å§ããŠãã ãããäœåãã€ããŠããŸããããå°ããã€èµ°ãæéãè·é¢ãå»¶ã°ããŠãããŸããããæãéèŠãªããšã¯ãã¯ãŒã«ããŠã³ãšã¹ãã¬ããã§ããèªåã®äœã®å£°ã«è³ãåŸããå¿ èŠãªæã«ã¯äŒé€ããšããæªæãããªãããã«ããŸãããã<|endoftext|>以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã\n\n### æç€º:\nãã·ã§ã«ã»ãã¯ã©ãŒã¬ã³ãç£ç£ãããã²ãŒã ã»ãªãã»ã¹ããŒã³ãºãã·ãŒãºã³4ã®ãšããœãŒãã¯?\n\n### å¿ç:\nã·ãŒãºã³4ã®ç¬¬4話ãèªçŽãæãããã®ãã第5è©±ãæ°çèªçããããããç£ç£ããã<|endoftext|>以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã\n\n### æç€º:\nèªåã§äœãããŠããŒã¯ãªã«ãŒãã³ã®ã¿ã€ããã¯ã¯?\n\n### å¿ç:\nã«ãŒãã³ã®ã¿ã€ããã¯ãäœãããã«äœ¿çšã§ããã¢ã€ãã ã¯ãããããããŸãããã§ãŒã³ããµãŒã¯ã«ããã³ããžã¥ãŒãããŒããæšè£œããŒãºããŒããããã¯ã©ãã¯ããã¬ã¹ã¬ããããã¢ãããé©ãã«ãããã¯ã©ã¡ããŒããé è±ãªã©ããã®ã¢ã€ãã¢ã§ãã<|endoftext|>以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã\n\n### æç€º:\n楜åšã匊楜åšãªã®ããææ¥œåšãªã®ããåé¡ãã:ã«ã³ã¿ããŒãã°ããŒã¯\n\n### å¿ç:\nã°ããŒã¯ã¯åŒŠæ¥œåšãã«ã³ã¿ããŒã¯ææ¥œåšã§ãã<|endoftext|>以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã\n\n### æç€º:\nãŽã«ãçšåã®äŒç€Ÿåããã5ããããŠãã ããã\n\n### å¿ç:\nTitleistãTaylormadeãCallawayãPingãCobra<|endoftext|>以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã\n\n### æç€º:\nãªãªã³ããã¯å²äžãæãå€ãã®éã¡ãã«ãç²åŸããå人ã¯?\n\n### å¿ç:\nãã€ã±ã«ã»ãã§ã«ãã¹éžæã¯æŽä»£æå€ã®23åã®éã¡ãã«ãç²åŸããŠããŸãã<|endoftext|>以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã\n\n### æç€º:\nãçç ã®è³é£Ÿãã®å°å¥³ããæãããªã©ã³ãã®ç»å®¶ã¯?\n\n### å¿ç:\nãã§ã«ã¡ãŒã«<|endoftext|>以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã\n\n### æç€º:\n倪éœãæ²ããšã©ããªãã®ã?\n\n### å¿ç:\n倪éœãæ²ããšãå€ãå§ãŸãã<|endoftext|>以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã\n\n### æç€º:\nåè©ãšã¯äœã§ãã?\n\n### å¿ç:\nåè©ãšã¯ãäž»ã«åäœãç¶æ ã衚ããé ãšããŠäž»èªãç®çèªãªã©ã®åè©å¥ããšãèªã§ãããåè©ã®äŸãšããŠæ³³ããæ©ãããã®çµæãèŠãŠãããããã«ãåããŒã¿ã®æ«å°Ÿ<|endoftext|>ã®åŸã«æ¬¡ã®ããŒã¿ã®æç€ºæããã£ã€ããŠããŸããpackingã¯ããããã®ãŸãŸCausalLMã§åŠç¿ããŸãã
cl_datasetããå
šãŠã®ããŒã¿ãåãåºããåèšã®æåæ°ãã«ãŠã³ãããŠã¿ãŸãã
num_of_all_chars = 0
for chunked_text in cl_dataset:
decoded_text = tokenizer.decode(chunked_text['input_ids'])
decoded_text = decoded_text.replace(tokenizer.eos_token, '')
num_of_all_chars += len(decoded_text)
num_of_all_chars
# 2730086
å šããŒã¿ã®æåæ°ã2,730,673ã ã£ãã®å¯ŸããpackingãããããŒã¿ã®æåæ°ã¯2,730,086ã«ãªã£ãŠãããã»ãŒã»ãŒå šéšã®ããŒã¿ãpackingã§ããŠããããšããããšã確èªã§ããŸããã
SFTTrainerã§packing=Trueãæå®ããŠåŠç¿ããã
ConstantLengthDatasetã®äœ¿ãæ¹ããªããšãªãããã£ããšããã§ãå®éã«SFTTrainerã§packing=Trueãæå®ããŠåŠç¿ãè¡ããŸãããæ³šæç¹ãããã€ããããŸãã
- æ¬ã»ã¯ã·ã§ã³ã®åé ã§ãè¿°ã¹ãããã«
packing=TrueãšDataCollatorForCompletionOnlyLMã¯äœµçšã§ããªããpacking=Trueãæå®ããå Žåã¯éåžžã®CausalLMã§åŠç¿ãããã -
formatting_funcåŒæ°ã«æž¡ã颿°ãpacking=Falseã®ãšããšä»æ§ãéã -
infinite=Trueãæå®ããŠãTrainingArgumentsã®æ®µéã§max_stepsãæå®ããŠããªããšSFTTrainerã®å éšã§infinite=Falseãèšå®ãããã
ãšãã«infinite=Trueã®æåãå人çã«ã¯ããããããã«ãããšæããŸãããSFTTrainerã§ã¯infiniteåŒæ°ã¯æå®ã§ããã®ã§ããããããã¡ãããšæå¹ã«ããã«ã¯TrainingArgumentsã§æå®ããmax_stepsãæç€ºçã«æå®ããªããšãããªãããã§ãã
ã€ãŸãinfinite=Trueã§åŠç¿ãããããšãã¯æç¢ºã«äœã¹ãããåŠç¿ããããããšããèšç»ããããšã以å€ã¯äœ¿ãå¿
èŠããªãããšããããšã§ããããããã®ãããªã±ãŒã¹ãã©ããããšãã«ããããã®ããç§ã¯ã¡ãããšçè§£ã§ããŠããŸããã
def formatting_func(example):
text = f"以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã\n\n### æç€º:\n{example['instruction']}\n\n### å¿ç:\n{example['output']}"
return text
args = TrainingArguments(
output_dir='./output_packing',
num_train_epochs=2,
gradient_accumulation_steps=8,
per_device_train_batch_size=8,
save_strategy="no",
logging_steps=20,
lr_scheduler_type="constant",
save_total_limit=1,
fp16=True,
)
trainer = SFTTrainer(
model,
args=args,
train_dataset=dolly_train_dataset,
packing=True,
formatting_func=formatting_func,
# infinite=True, # Trueãæå®ããŠãargsã§max_stepsãæå®ããªãéãå
éšã§Falseã«ãªã
chars_per_token=2.12,
max_seq_length=1024,
num_of_sequences=1258,
)
trainer.train()
trainer.save_model()
packing=Falseã®ãšããšæ¯ã¹ãŠãä»ã®æ¡ä»¶äžãåãã®ãšããåŠç¿ã®æéãååãããã«ãªããŸããã
ãããªã«å¹çåãããŠéã«äžå®ã§ããããã®åŸã玹ä»ããå
šãã¿ãŒã³ã®åŠç¿æ¹æ³ã«å¯Ÿããæšè«çµæã玹ä»ããŸãã
åŠç¿çµæã®æ¯èŒ
ä»åSFTTrainerã§ä»¥äžã®4ãã¿ãŒã³ã®Instruction Tuningã詊ããŸããã
- å¿çéšåã®ã¿æå€±èšç®ããåŠç¿
- packingãçšããåŠç¿
- LoRAã«ããåŠç¿
- NEFTuneãçšããåŠç¿
(2.ã ãå¿çéšåã®ã¿ã®æå€±èšç®ãã§ããŠããŸããã)
ä»åã¯ãããŸã§SFTTrainerã®äœ¿ãæ¹ã«ãã©ãŒã«ã¹ããŠããã®ã§ãè¯ãã¢ãã«ãäœãããšã¯æ³å®ããŠããŸãããæ¬ã»ã¯ã·ã§ã³ã§ã¯ãããŸã§ãååŠç¿æ¹æ³ã§ãå šç¶åŠç¿ã§ããŠãªãããšããç¶æ ã§ã¯ãªãããŸãã¡ãããšInstruction Tuningã¯ãããŠããã ãããããã®ç¢ºèªãã§ããã°è¯ãããªãšæããŸãã
ãã®ããã«ãInstruction TuningããŠããªãããŒã¹ã®LLMã®ç¶æ ã®æšè«çµæã䜵ããŠç¢ºèªããŠãããŸãã
ããã¹ããçæããã³ãŒãã¯ä»¥äžã®ããã«ããŸãããåãæ¡ä»¶äžã§çæããããããããŒã¹ã®LLMã§ãã£ãŠãä»åã®åŠç¿ã«äœ¿ã£ãããã³ãããã©ãŒãããã§å ¥åããŸãã
def generate(model, tokenizer, input_text):
input_text = f"以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã\n\n### æç€º:\n{input_text}\n\n### å¿ç:"
inputs = tokenizer(input_text, return_tensors='pt').to(model.device)
with torch.no_grad():
generated_tokens = model.generate(
**inputs,
max_length = 512,
do_sample = True,
temperature = 0.8,
top_p = 0.9,
top_k = 0,
repetition_penalty = 1.1,
num_beams = 1
)
generated_text = tokenizer.decode(generated_tokens[0], skip_special_tokens=True)
return generated_text
åã¢ãã«ãèŸæžã§ãŸãšããŸãã
model_name = "cyberagent/open-calm-large"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model_dict = {
'base_model': AutoModelForCausalLM.from_pretrained(model_name, device_map="auto"),
'sft_model': AutoModelForCausalLM.from_pretrained('./output', device_map="auto"),
'packing_model': AutoModelForCausalLM.from_pretrained('./output_packing', device_map="auto"),
'lora_model': AutoModelForCausalLM.from_pretrained('./output_lora', device_map="auto"),
'nef_model': AutoModelForCausalLM.from_pretrained('./output_neftune', device_map="auto")
}
å®éã«ããã€ãæšè«ãããŠã¿ãŸãã
(warningãšãã¯é©å®åé€ããŠèšèŒããŠããŸãã)
ããŒã¿ãµã€ãšã³ãã£ã¹ãã«æ±ããããã¹ãã«ã5ã€æããŠãã ããã
input_text = "ããŒã¿ãµã€ãšã³ãã£ã¹ãã«æ±ããããã¹ãã«ã5ã€æããŠãã ããã"
for model_type, model in model_dict.items():
generated_text = generate(model, tokenizer, input_text)
print('@'*3, model_type, '@'*3)
print(generated_text)
print('='*30)
@@@ base_model @@@
以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã
### æç€º:
ããŒã¿ãµã€ãšã³ãã£ã¹ãã«æ±ããããã¹ãã«ã5ã€æããŠãã ããã
### å¿ç:
ããã·ããªãªã«é¢ãã詳现ãåçããé©åãªããŒã¿ã¢ãã«ãå«ããããã«ããŸãã
### ããŒã¿åæ:
çºçããã€ãã³ããšå¿çã®ããŒã¿æ§é ãæ¯èŒããåã€ãã³ãã®åå ãçè§£ããŸãã
### PHPã¢ããªã±ãŒã·ã§ã³:
ãŠã§ããµãŒãã¹éçºè
ãã¯ã©ã€ã¢ã³ãã®ãã©ãŒã ã«å
¥åããå€ã衚瀺ããPHPã³ãŒããæžããŸãã
==============================
@@@ sft_model @@@
以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã
### æç€º:
ããŒã¿ãµã€ãšã³ãã£ã¹ãã«æ±ããããã¹ãã«ã5ã€æããŠãã ããã
### å¿ç: ããŒã¿ãµã€ãšã³ã¹ã«ã¯ã以äžãå«ãå€ãã®åœ¹å²ããããŸã:çµ±èšè§£æãæ©æ¢°åŠç¿(ML)ããã¿ãŒã³èªèãšäºæž¬ãã¢ãã«è©äŸ¡ãæé©åãããæææ±ºå®æ¯æŽã¢ã«ãŽãªãºã (AOAC)ã
==============================
@@@ packing_model @@@
以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã
### æç€º:
ããŒã¿ãµã€ãšã³ãã£ã¹ãã«æ±ããããã¹ãã«ã5ã€æããŠãã ããã
### å¿ç:
1.ããŒã¿åæã®åºç€ãåŠã¶2.ããŒã¿ã®å¯èŠå3.çµ±èšçã¢ãããŒã4.ã¢ãã«é§åååæ5.äºæž¬ãšæææ±ºå®ã®ããã®ããŒã«ã®äœ¿çš
==============================
@@@ lora_model @@@
以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã
### æç€º:
ããŒã¿ãµã€ãšã³ãã£ã¹ãã«æ±ããããã¹ãã«ã5ã€æããŠãã ããã
### å¿ç: ããŒã¿åæã¹ãã«
==============================
@@@ nef_model @@@
以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã
### æç€º:
ããŒã¿ãµã€ãšã³ãã£ã¹ãã«æ±ããããã¹ãã«ã5ã€æããŠãã ããã
### å¿ç: ããŒã¿ãµã€ãšã³ã¹ã®ã¹ãã«ã«ã¯ãã³ã³ãã¥ãŒã¿ãµã€ãšã³ã¹ã®ç¥èãšãæ°åŠçãªæšè«ãæ¢çŽ¢ã«é¢ããã¹ãã«ãå«ãŸããŸãããããã®ç¥èã¯ãç®ç倿°ãšè¿°èªå€æ°ãå«ãäžè¬çãªæŠå¿µãçè§£ããã®ã«åœ¹ç«ã¡ãŸãã
==============================
æ¥æ¬ã®èгå åæãïŒã€æããŠäžããã
input_text = "æ¥æ¬ã®èгå
åæãïŒã€æããŠäžããã"
for model_type, model in model_dict.items():
generated_text = generate(model, tokenizer, input_text)
print('@'*3, model_type, '@'*3)
print(generated_text)
print('='*30)
@@@ base_model @@@
以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã
### æç€º:
æ¥æ¬ã®èгå
åæã3ã€æããŠäžããã
### å¿ç:
ã©ãã«è¡ãããã説æããªããã(ãã®åœã®)å°å³ãæäŸããŠãã ããã
## # ###
(n-1) Haskellã§2鲿°ã®æ°å€ã衚ãèšèªã§ããã³ã³ãã¥ãŒã¿ã®ããã°ã©ã ã§äœ¿ãããããšãå€ãã§ãããæåååŠçã§ã䜿ãããŸããã³ãŒãäŸãšã¢ã«ãŽãªãºã ã®äŸã¯ä»¥äžã«ç€ºãããŠããŸãã
### æç€º:
$ k = $ (N + 1) / 2 ãè¿ããŸãããã ã N + 1 ã¯æŽæ°ã§ãã
### å¿ç:
$ x = $ (N + 1) / 4 ãè¿ããŸãããã ã N + 1 ã¯æŽæ°ã§ãã
## # ###
(n-1) K ã®çŽ å æ°åè§£ã®å®è£
ã説æããªããã
### å¿ç:
(n-1) K ã®çŽ å æ°åè§£ã®å®è£
ã説æããªããã
### æç€º:
# \[ -\variable \] ããçããã
### åç:
a, b, c, dã 3 ã€å®ãããšã$a=b+c$ ãšæžããããšãããããŸãã
### å¿ç:
åæåã«ã€ããŠããã®æåã®æåãã¢ã«ãã¡ããã以å€ã®æåã®å Žåã«æç«ãããæ¬¡ã®4ã€ã®èŠåã®ãã¡ãæ¡ä»¶ã«åããã®ãéžã³ãªããã
1. æåAã '' ã§å§ãŸãæåã¯ã'' ãå«ãããšã瀺ãã
2. æåA ã '' ã§çµããæåã¯ã'' ãå«ãŸãªãããšã瀺ãã
3. æåA㯠'' ã§çµãããã'' ã«ç¶ãæåããªããšãã¯ã'' ãå«ãããšã瀺ãã
4. æåB ã '' ã§çµããæåã¯ã'' ãå«ãŸãªãããšã瀺ãã
### æç€º:
ãªããžã§ã¯ããã°ã«ãŒãåãã颿°makedocument_groupã®äœãæ¹ãšãã®æ©èœã説æããªããã
### å¿ç:
makedocument_groupãšããæ°ãã颿°ãäœã£ãŠãã ããã
makefuncsãmakemakeinstanceã䜿ã£ãŠäœããŸãã
### 解説:
以äžã®ãããªé¢æ°ãå®çŸ©ããŸãã
åŒæ°ãããããã以äžã®éãã§ãã
group()
echo func0;
makefileã«ã¯ä»¥äžã®ãªãã·ã§ã³ããããŸãã
make install
åŒæ°argsã«è¿œå ãããå
容ãå
ã«å®è¡ãã¡ã€ã«ãçæããŠãããŸãã
###
==============================
@@@ sft_model @@@
以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã
### æç€º:
æ¥æ¬ã®èгå
åæã3ã€æããŠäžããã
### å¿ç:
- æ¥æ¬ã¯æ
è¡å
ãšããŠçŽ æŽãããåœã§ãããå®ã¯æ¥æ¬ã¯ãšãŠãé
åçãªèгå
å°ã§ããããŸããæ¥æ¬ã¯ã¢ãã¡ãã²ãŒã ãªã©ã®åœ±é¿ããããäžççã«æåã§äººæ°ã®ããæååã§ããããšãç¥ãããŠããŸãããã®äŒçµ±ãæåãããããå€ãã®æ¥æ¬äººã«èšªããŠããããããšé¡ã£ãŠããŸãã
==============================
@@@ packing_model @@@
以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã
### æç€º:
æ¥æ¬ã®èгå
åæã3ã€æããŠäžããã
### å¿ç:
å¯å£«å±±ã京éœã倧éª
==============================
@@@ lora_model @@@
以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã
### æç€º:
æ¥æ¬ã®èгå
åæã3ã€æããŠäžããã
### å¿ç:
京éœãæ¥å
æ±ç
§å®®ãé·åŽãªã©
==============================
@@@ nef_model @@@
以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã
### æç€º:
æ¥æ¬ã®èгå
åæã3ã€æããŠäžããã
### å¿ç:å¯å£«å±±ã京éœããããŠæ¥æ¬ã®çŸããæ¯è²ãèŠãããã«å€ãã®äººã蚪ããå Žæã玹ä»ããŸã:
- äº¬éœ - 宿²»åž
- æ¥æ¬æµ· - ååè¹ã®æž¯ã§æåã§ããã
==============================
次ã®è±æãæ¥æ¬èªã«ç¿»èš³ããŠãã ããã\nThis is a pen.
input_text = "次ã®è±æãæ¥æ¬èªã«ç¿»èš³ããŠãã ããã\nThis is a pen."
for model_type, model in model_dict.items():
generated_text = generate(model, tokenizer, input_text)
print('@'*3, model_type, '@'*3)
print(generated_text)
print('='*30)
@@@ base_model @@@
以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã
### æç€º:
次ã®è±æãæ¥æ¬èªã«ç¿»èš³ããŠãã ããã
This is a pen.
### å¿ç:
ãã®ãã³ãèŠãŠäžããã
### ããã¯ãæã®æå³ã§ãã
### æã¯ãåè©ãšåè©ã»ä»£åè©ã®èªå¹¹ãæœåºãããã®ã§ã§ããŠããŸãããŸããææ«ã®s(s)ãšcause(causal(s))ãåè©ãšåœ¢å®¹è©ã®èªå¹¹ãæœåºããŠããŸãã
### æç« ã¯çæã§æžããŸããããŸããå¥èªç¹ãªãã§æžãå¿
èŠããããŸãã
### æäžã«å¥èªç¹ã䜿ã£ãŠã¯ãããŸãããã€ãŸãã空æ¬ã¯ç©ºçœã§ããŸããŸããã
### ç¹å®ã®åèªããã¬ãŒãºãæžãå¿
èŠã¯ãããŸãããåèªãªã¹ãã«ç€ºãããŠããããã«ãã©ããªåèªã3èªä»¥äžã§ãã£ãŠãããŸããŸããããŸããèªå°Ÿãã-ersãã«ãªã£ãŠããŠãããŸããŸããã
### ãã®æã«ã¯ãå眮è©ãå
¥ããŠãå
¥ããªããŠãããŸããŸããããããããã®å Žåã§ãããã¹ãŠã®å眮è©ãåè©ã®èªå¹¹ã«ãªã£ãŠããããšã確èªããŠããŸããŸãããããã§ãªãå Žåã¯ãã?p.ããšããèªå¹¹ã䜿ããŸããããã¯åè©ã~ãããŸã§åŸ
ã€ããšããæå³ã§ãã
### ãthereãã«åè©ãŸãã¯åè©ãå
¥ãå Žåãé€ããŠã次ã®ããã«æžããŸãããã
1. (1) ãThis is not the official soccer team.ã
2. (2) ãThis is a playoff league team.ã
## #1. ãThis is the official soccer team.ã
## #2. ãThis is a playoff league team.ã
## # 3. ãThatâs all for Tanzania and Oreo international cup.ã
## #4. ãOreo takes reaching university's rich debate.ã
## #5. ãThe leaders of your country are Hamilton, which are the best wrestler from Matchmaking, South Africa.ã
## #6. ãThey work hard and they don't miss Theater Openings at the basis.ã
## #7. ãA few months ago the Oregon will open another ball roll.ã
## #8. ãFriends about their family as a n
==============================
@@@ sft_model @@@
以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã
### æç€º:
次ã®è±æãæ¥æ¬èªã«ç¿»èš³ããŠãã ããã
This is a pen.
### å¿ç:ãã®ãã³ã¯ãã³ã§ã
==============================
@@@ packing_model @@@
以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã
### æç€º:
次ã®è±æãæ¥æ¬èªã«ç¿»èš³ããŠãã ããã
This is a pen.
### å¿ç:
ãã³ã§ã!
==============================
@@@ lora_model @@@
以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã
### æç€º:
次ã®è±æãæ¥æ¬èªã«ç¿»èš³ããŠãã ããã
This is a pen.
### å¿ç:
==============================
@@@ nef_model @@@
以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã
### æç€º:
次ã®è±æãæ¥æ¬èªã«ç¿»èš³ããŠãã ããã
This is a pen.
### å¿ç:ãã®ãã³ã¯ãã³ã§ã
==============================
çµæã¯ããŠãããSFTTrainerã§ãã¥ãŒãã³ã°ãããåã¢ãã«ã¯äžå¿æç€ºã«åŸããããªæåã¯ããŠããã§ãã
ãªãã©ãæšè«ãããŠã¿ãæèŠå€ã§ããã
- LoRAã¯åºåããããªããšããçµæ§ãã
-
packing=Trueã§åŠç¿ããã¢ãã«ãäžçªããæããªæåããŠãã - NEFTuneã®å¹æãä»åã®æ€èšŒã®ç¯å²ã§ã¯ãããããã
ããŸã(packing=Trueã®ãšãã®attentionå¯èŠå)
packing=Trueã®åŠç¿ã¯ãè€æ°ã®ããŒã¿ãEOSã§ç¹ããŠããã®ã§ãæ¬æ¥èšç®ãããã¹ãã§ãªãattentionãèšç®ãããŠããŸããŸãããããªåŠç¿ã®ä»æ¹ãªã®ã«ãªãã§ããŸãããã®ãäžæè°ã ã£ãã®ã§ãå®éã«packing=Trueã§åŠç¿ãããã¢ãã«ã«å¯Ÿããè€æ°ã®ããŒã¿ãEOSã§ç¹ããç¶æ
ã§æšè«ãããšããåããŒã¯ã³ã次åèªãäºæž¬ããéã«ãã©ã®ããŒã¯ã³ã«attentionããŠããããå¯èŠåããŠã¿ãŸããã
ãŸãäžèšã§ç޹ä»ããæ¹æ³ã§packing=Trueã§åŠç¿ãããã¢ãã«ãèªã¿èŸŒã¿ãŸãã
model_name = "/media/sj-archimedes/data/03_pretrained_model/llm/open-calm-large"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained('./output_packing')
model.cuda()
次ã«ããããŒãªãµã³ãã«æãçšæããŸããããã¯ç§ãäœã£ãããŒã¿ãªã®ã§ãå€ååŠç¿ããŒã¿ã«ã¯ãªãããªïŒEOSããŒã¯ã³ã䜿ã£ãŠ3ã€ã®ããŒã¿ãpackingããŠããŸããæåŸã®ããŒã¿ã¯åçããŸã ãªãç¶æ ã§ãã
以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã\n\n### æç€º:\n次ã®ãã¡ãã¹ããŒãã¯ã©ãã§ããããïŒããã¹ãšèãŸã\n\n### å¿ç:\nããã¹<|endoftext|>以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã\n\n### æç€º:\nããŒã¿ãµã€ãšã³ãã£ã¹ãã«å¿ èŠãªã¹ãã«ã¯ïŒ\n\n### å¿ç:\npythonã«ããã³ãŒãã£ã³ã°å<|endoftext|>以äžã¯ãã¿ã¹ã¯ã説æããæç€ºã§ããèŠæ±ãé©åã«æºããå¿çãæžããªãã\n\n### æç€º:\nã¢ãéªã®å¥³çã®ååã¯ïŒ\n\n### å¿ç:\n"
ãã®ãµã³ãã«æç« ãåŠç¿æžã®ã¢ãã«ã«å
¥åãããšãã®æçµå±€ã®Self-Attentionã«å¯Ÿããåheadã®attentionã®åèšãmaxã§å²ã£ãŠæ£èŠåããattentionãå¯èŠåããŸãã
å¯èŠåãããšãã¯å
é ã®tokenããé çªã«ã©ã®tokenãã¡ã«attentionããŠãããèšç®ããã¢ãã¡ãŒã·ã§ã³ã§è¡šç€ºãããŠã¿ãŸãã
å¯èŠåã«äœ¿ã£ãã³ãŒãã¯ã¡ãã£ãšéãªã®ã§ãäŒããŠãããŸãã
import pandas as pd
import matplotlib.ticker as ticker
from matplotlib.animation import FuncAnimation
import japanize_matplotlib
# ãµã³ãã«æãforwardãã
# input_textã¯äžã§ç޹ä»ãããµã³ãã«ã®ããã¹ããæ ŒçŽãã倿°
inputs = tokenizer(input_text, return_tensors='pt')['input_ids'].cuda()
outputs = model(inputs, output_attentions=True)
# æçµå±€ã®attention weightãååŸ
last_attn = outputs.attentions[-1][0].cpu().detach()
# åtokenã«å¯Ÿããå
šãŠã®headã«é¢ããattentionãåç®
all_attn = last_attn[0]*0
for head_idx in range(last_attn.shape[0]):
all_attn += last_attn[head_idx]
# ãµã³ãã«æãtokenizerã§åå²ããç¶æ
ãäœã£ãŠããïŒã°ã©ãã®x軞ã®ã©ãã«ã«äœ¿ãïŒ
decoded_token = []
for token in inputs[0].cpu().detach():
t = tokenizer.decode(token)
if t == tokenizer.eos_token:
# <|endoftext|>ã ãšæåãé·ãã®ã§çã衚çŸã«å€ãã
t = 'EOS'
decoded_token.append(t)
df = pd.DataFrame({'token': decoded_token, 'attn': all_attn[0]})
df = df.set_index('token')
# ãã£ã®ã¥ã¢ãšè»žã®äœæ
fig, ax = plt.subplots(figsize=(25, 6))
ax.xaxis.set_major_locator(ticker.MultipleLocator(1))
# ã¢ãã¡ãŒã·ã§ã³ãæŽæ°ãã颿°
def update(i):
ax.clear()
ax.xaxis.set_major_locator(ticker.MultipleLocator(1))
last_token_attn = all_attn[i]
# æ£èŠå
last_token_attn /= last_token_attn.max()
df['attn'] = last_token_attn
df.plot.bar(rot=90, ax=ax)
# ã¢ãã¡ãŒã·ã§ã³ã®äœæ
ani = FuncAnimation(fig, update, frames=range(all_attn.shape[1]), repeat=False)
# ã¢ãã¡ãŒã·ã§ã³ã®è¡šç€º
plt.show()
â»Decoder onlyãªã¢ãã«ãªã®ã§ãåœç¶èªèº«ããåŸã®tokenã«ã¯attentionãããŸããã
å
é ã®æç« ã®ã以äžã¯ããšæåã®å¥ç¹ã«attentionãå¯ã£ã¡ãã£ãŠãŸãããpackingã®åŠçã§ãã£ã€ããã ãã®ç¡é¢ä¿ãªããŒã¿å士ã¯ã»ãšãã©attentionããEOSããŒã¯ã³ãattentionããããã¯ãã圹å²ïŒãæ
ã£ãŠãæããããŸããæåŸã®ããŒã¿ã«å¯Ÿããå¿çããã®ããŒã¿ã®æç€ºæãattentionããåã«ãã£ã€ããŠããç¡é¢ä¿ãªããŒã¿ã«ã¯ã»ãšãã©attentionããŠãŸããã
packing=Trueã§åŠç¿ããŠãEOSããŒã¯ã³ã§ç¹ããŠããã°åé¡ãªãããããšããããšãããããããŸããã
ãããã«
huggingfaceã®TRLã©ã€ãã©ãªã«ããSFTTrainerã®äœ¿ãæ¹ã«ã€ããŠç޹ä»ããŸããã
TRLã«ã¯ä»ã«ãLLMããã¥ãŒãã³ã°ããäžã§äŸ¿å©ãªæ©èœããããããããŸããæ¬¡ã¯PPOTrainerãšããã®èŸºã玹ä»ãããã
ããã


