
Google Colab ã§ SFTTrainer ã«ããLLMã®ãã«ãã©ã¡ãŒã¿ã®ãã¡ã€ã³ãã¥ãŒãã³ã°ã詊ã
ãGoogle Colabãã§ãSFTTrainerãã«ããLLMã® (LoRAã§ã¯ãªã) ãã«ãã©ã¡ãŒã¿ã®ãã¡ã€ã³ãã¥ãŒãã³ã°ã詊ããã®ã§ããŸãšããŸããã
1. SFTTrainer
ãSFTTrainerãã¯ãLLMããæåž«ãããã¡ã€ã³ãã¥ãŒãã³ã°ã (SFT : Supervised Fine Tuning) ã§åŠç¿ããããã®ãã¬ãŒããŒã§ããLLMã®åŠç¿ãã¬ãŒã ã¯ãŒã¯ãtrlãã§æäŸãããŠãããã¬ãŒããŒã®1ã€ã«ãªããŸãã
2. ã¢ãã«ãšããŒã¿ã»ãã
ä»åã¯ãLLMãšããŠãOpenCALM-smallããããŒã¿ã»ãããšããŠãmultilingual-sentimentsãã䜿ããŸããã
ã»OpenCALM-small : æåãªLLMã®äžã§æ¥æ¬èªå¯Ÿå¿ãã€è»œéãªã¢ãã«
ã»multilingual-sentiments : ææ åæçšã«ã0:positiveã1:neutralã2:negative ã®ã©ãã«ãä»å ãããŠãããŒã¿ã»ãã
3. ãã¡ã€ã³ãã¥ãŒãã³ã°åã®LLMåºåã®ç¢ºèª
Colabã§ãã¡ã€ã³ãã¥ãŒãã³ã°åã®LLMåºåã確èªããæé ã¯ã次ã®ãšããã§ãã
(1) ããã±ãŒãžã®ã€ã³ã¹ããŒã«ã
# ããã±ãŒãžã®ã€ã³ã¹ããŒã«
!pip install transformers accelerators
!pip install trl peft datasets(2) ããŒã¯ãã€ã¶ãŒãšã¢ãã«ã®æºåã
from transformers import AutoModelForCausalLM, AutoTokenizer
# ããŒã¯ãã€ã¶ãŒãšã¢ãã«ã®æºå
tokenizer = AutoTokenizer.from_pretrained(
"cyberagent/open-calm-small"
)
model = AutoModelForCausalLM.from_pretrained(
"cyberagent/open-calm-small",
device_map="auto"
)(3) LLMåºåã®ç¢ºèªã
import torch
# ããã³ããã®æºå
prompt = "ãã®æ ç»ã¯"
# æšè«ã®å®è¡
for i in range(10):
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
with torch.no_grad():
tokens = model.generate(
**inputs,
max_new_tokens=64,
do_sample=True,
temperature=0.7,
top_p=0.9,
repetition_penalty=1.05,
pad_token_id=tokenizer.pad_token_id,
)
output = tokenizer.decode(tokens[0], skip_special_tokens=True)
print(output)
print("----")ãã®æ ç»ã¯ããã®ç©èªã®ã¹ããŒãªãŒããã£ã©ã¯ã¿ãŒãããããããããããŠé¢çœãããããã«æ§ã
ãªå·¥å€«ããªãããŠããŸããäŸãã°ãåäœã§ã¯äž»äººå
¬ã¯ãæªéãã§ãã
ãããããã®ç©èªã§ã¯ã䞻人å
¬ã«æªéãããŸãããããŠã䞻人å
¬ã¯æªéã«ã€ããŠç¥ã£ãŠããããããŠãæªéã®ããšãç¥ã£ãŠããã®ã§ãã
ã ããã䞻人å
¬ã«æªéãããã°
----
ãã®æ ç»ã¯ããšãŠãè峿·±ãäœåã§ããã
ãããããã®æ ç»ããã©ããã£ããããã£ãšå€ãã®äººã«ç¥ã£ãŠããããã?ããšããèŠç¹ã§èããŠã¿ããšãäžçªã®åé¡ã¯ãããªããããªããšãèµ·ãã£ãã®ããã芳客ã«çè§£ããŠãããããšããããŠããããå®éã«æ ç»ã®äžã§äœéšããŠãããããšã§ãã
ãã®æ ç»ã§ã¯ããã®ããšããå®éã«èµ·ãã£ãŠããäºå®ãšãªã³ã¯
----
ãã®æ ç»ã¯ãæ ç»ãåã®åã¯ãããšã¢ãã¡ãæ°éžçµ!ãã§æãããäžç芳ãèåããäžç芳ã§ãã
åäœã¯ãååå°èª¬(æ°æœ®ç€Ÿå)ãåäœã
2017幎9æ29æ¥(å)ããå
¬éãããŸãã
ã¢ãã¡ã¯ã2019幎4æ19æ¥(æš)ã«å
Ž
----
ãã®æ ç»ã¯ãæ¬å±ããã§ãããããããã«ãã§ãã賌å
¥ããŸããã
ããããæ¬å±ããã«ãããšãæ¬ãæ£ã«ãããã䞊ãã§ããããæŒ«ç»ãå°èª¬ã売ãåããŠããããšããããŸããã
ãã®ãšãã«ããããã«ãã§ã§ãããããã«ãŒãããã賌å
¥ããããšæããŸããã
ãããšããã«ãŒãããšæžããŠããã«ãŒããèŠããã
----
ãã®æ ç»ã¯ã第4ç« ã§æãããŠããããã«ãäžç倧æŠã®åŸã®ãå°çããšããæ¶ç©ºã®è¡ãèå°ã«ãç»å Žäººç©ãã¡ãããããã®ææãå¿æ
ãèžã«æ±ããªãããããããã®éå»ãšçŸåšãè¡ãæ¥ããããã®éçšã§ã¯ãåã
ãæ±ããããŸããŸãªææ
ãæ¬²æã絡ã¿åããªããç©èªãé²ãã§ããã
ãæ©åæŠå£«ã¬ã³ãã 00ãã¯
----
ãã®æ ç»ã¯ã3話ãŸã§ã§çµäºã
ã倧éçããšã¯ãã¢ãã¡ãONE PIECEãã«ç»å Žããæµ·è³ãã¡ãæãèšèã§ããããã®èšäºã§ã¯ããããªãONE PIECEãã«ç»å ŽããããŸããŸãªæ°ãã£ã©ã¯ã¿ãŒã«ã€ããŠç޹ä»ããã
ã女åè
ããšã¯ã挫ç»ãONE PIECE(ã¯ã³ããŒã¹)ãã®ç»å Žäººç©ãã¡ã®ç·ç§°ã®ããš
----
ãã®æ ç»ã¯ããŸããå¥ã®æå³ã§æ³šç®ã济ã³ãŠããã
ãåçãç±³CNNãéžã¶ãäžçã§äžçªå¥œããªæ ç»ã¯?ãã©ã³ãã³ã°TOP5 å
šç±³ããã10(2017幎3æ7æ¥)
äžçã§ãã£ãšãçŸãããšèšãããŠããæ ç»ããã¡ãããããã ããã
ãããŒããã³ãã§ã¢ã«ãããŒå€åœèªæ ç»è³ãåè³ãããããŒããã³ã
----
ãã®æ ç»ã¯ãæ ç»ã007ãã·ãªãŒãºã®æ ç»åã äž»æŒã«ã¯ãžã§ãŒã ãºã»ãã³ã圹ã§ç¥ããããããšã«ã»ã¯ã¬ã€ã°ãææ¢ãããŸããã ãããšã«ã»ã¯ã¬ã€ã°ã«.
ãžã§ãŒã ãºã»ãã³ã圹ãããšã«ã»ã¯ã¬ã€ã° ãããšã«ã»ã¯ã¬ã€ã°ã007ãã·ãªãŒãºææ°äœã007 ã¹ã«ã€ãã©ãŒã«ãã®ãã«ãŒã¬ã€&DVDã2019幎
----
ãã®æ ç»ã¯ããã®æ ç»ãäžæ ããã5æ7æ¥(å)ã«ãæ±äº¬ã»å
æ¬æšã®ãå
æ¬æšãã«ãºãã§éå¬ããã
ä»åã®äžæ äœåãMotherãã¯ã4æ28æ¥ã«å
¬éãè¿ããæ ç»ãMotherãã®èå°ããæ±äº¬éœç®é»åºãšæžè°·åºãå
±åã§ãããã¥ãŒã¹ãããã®ã
åäœã¯ã2015幎ã«å
ç«¥
----
ãã®æ ç»ã¯ã2,3æ¥åããé
ä¿¡ãããŠããã®ã§ããšãããã仿¥ããã¯ãã®äžéšããããã§å
¬éããã
ã§ã仿¥ã¯ãæšæ¥æžããèšäºã®ç¶ããæžããããªãšæã£ããã ãã©ã
ããã1ã¶æãåã®è©±ãªã®ã§ã仿޿ããããã©ã仿ããšãããã¯ã2æ7æ¥ã®ããšã ã£ããšæãã
----ããã®æ ç»ã¯ãã®ç¶ãã«ãæ ç»ã®èª¬æãªã©ãæ°è¡çæãããŠããããšãããããŸãã
4. ãã¡ã€ã³ãã¥ãŒãã³ã°ã®å®è¡
Colabã§ãã¡ã€ã³ãã¥ãŒãã³ã°ãå®è¡ããæé ã¯ã次ã®ãšããã§ãã
(1) ããŒã¿ã»ããã®æ¥æ¬èªããŒã¿ã®ã¿èªã¿èŸŒã¿ã
from datasets import load_dataset
# ããŒã¿ã»ããã®èªã¿èŸŒã¿èªã¿èŸŒã¿
dataset = load_dataset("tyqiangz/multilingual-sentiments", "japanese")
# 確èª
print(dataset)
print(dataset["train"][0])DatasetDict({
train: Dataset({
features: ['text', 'source', 'label'],
num_rows: 120000
})
validation: Dataset({
features: ['text', 'source', 'label'],
num_rows: 3000
})
test: Dataset({
features: ['text', 'source', 'label'],
num_rows: 3000
})
})
{'text': 'æ®æ®µäœ¿ããšãã€ã¯ã«ä¹ããšãã®ããŒãå
ŒçšãšããŠè³Œå
¥ããŸãããèŠãç®ãå±¥ãå¿å°ã¯è¯ãã§ãã ããããïŒã¶æå±¥ããããŽã åºãåããŠç¡ããªããŸããããŸãããã€ã¯ã®ã·ããããã«ãšã®æ©æŠã§è¡šç®ãå¥ãããæ¬é©ã§ãªãããšãé²åããŸãããã¡ãªã¿ã«é²æ°ŽãšãæžããŠããŸãããéšã®æ¥ã¯å
éšã«æ°Žãæã¿ãŸãã å®ããŠèŠãç®ãè¯ããå±¥ããããã£ãã®ã§ãããèä¹
æ§ã®ãªããæ¬é©ã§ã鲿°Žã§ãç¡ãã£ãããšãæ®å¿µã§ããçµå±ãæ¬é©ã®é²æ°ŽããŒããè²·ãçŽããŸããã', 'source': 'amazon_reviews_multi', 'label': 2}(2) ããŒã¿ã»ãããpositiveã®ã¿5000åã§ãã£ã«ã¿ãªã³ã°ã
ããžãã£ãææ
ãéèŠããããã«åŠç¿ãããŸãã
# ããŒã¿ã»ãããpositiveã®ã¿5000åã§ãã£ã«ã¿ãªã³ã°
train_dataset = dataset["train"].filter(lambda data: data["label"] == 0).select(range(5000))
# 確èª
print(train_dataset)
print(train_dataset[0])Dataset({
features: ['text', 'source', 'label'],
num_rows: 5000
})
{'text': '忢åµã³ãã³ã奜ãã ãã ãããè¯ãã£ãã§ãã', 'source': 'amazon_reviews_multi', 'label': 0}(3) åŠç¿ã®å®è¡ã
ãSFTTrainerãã§åŠç¿ãå®è¡ããŸããLoRAã®å Žå (model.save_pretrained) ãšç°ãªããã¢ãã«ã®ä¿å㯠save_model() ã«ãªããŸãã
from trl import SFTTrainer
# åŠç¿ã®å®è¡
trainer = SFTTrainer(
model=model,
tokenizer=tokenizer,
train_dataset=train_dataset,
dataset_text_field="text",
max_seq_length=512,
)
trainer.train()
# ã¢ãã«ã®ä¿å
trainer.save_model("output")
ãSFTTrainerãã®äž»ãªãã©ã¡ãŒã¿ã¯ã次ã®ãšããã§ãã
ã»model (PreTrainedModel, nn.Module, str)
ã¢ãã«
ã»tokenizer (PreTrainedTokenizer)
ããŒã¯ãã€ã¶ (default:ã¢ãã«ã«é¢é£ä»ããããããŒã¯ãã€ã¶)
ã»train_dataset (Dataset)
åŠç¿çšã®ããŒã¿ã»ãã
ã»eval_dataset (Dataset, Dict[str, Dataset])
è©äŸ¡çšã®ããŒã¿ã»ãã
ã»max_seq_length (int)
ConstantLengthDataset ã®äœæ ã«äœ¿çšããæå€§ã·ãŒã±ã³ã¹é·(default:min(tokenizer.model_max_length, 1024))
ã»dataset_text_field (str)
ConstantLengthDatasetã®äœæã«äœ¿çšããããŒã¿ã»ããã®åå
ã»formatting_func (Callable)
ConstantLengthDatasetã®äœæã«äœ¿çšããæžåŒèšå®é¢æ°
ã»args (TrainingArguments)
åŠç¿ãã©ã¡ãŒã¿
ã»peft_config (PeftConfig)
PEFTãã©ã¡ãŒã¿
outputãã©ã«ãã«ã¯ãã¢ãã«ãä¿åãããŠããŸãã

5. ãã¡ã€ã³ãã¥ãŒãã³ã°åŸã®LLMåºåã®ç¢ºèª
Colabã§ã®ãã¡ã€ã³ãã¥ãŒãã³ã°åŸã®LLMåºåã®ç¢ºèªã®æé ã¯ã次ã®ãšããã§ãã
(1) outputããã®ã¢ãã«ã®èªã¿èŸŒã¿ã
# ã¢ãã«ã®æºå
model = AutoModelForCausalLM.from_pretrained(
"./output",
device_map="auto"
)(2) LLMåºåã®ç¢ºèªã
import torch
# ããã³ããã®æºå
prompt = "ãã®æ ç»ã¯"
# æšè«ã®å®è¡
for i in range(10):
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
with torch.no_grad():
tokens = model.generate(
**inputs,
max_new_tokens=64,
do_sample=True,
temperature=0.7,
top_p=0.9,
repetition_penalty=1.05,
pad_token_id=tokenizer.pad_token_id,
)
output = tokenizer.decode(tokens[0], skip_special_tokens=True)
print(output)
print("----")ãã®æ ç»ã¯ãç§ã®äººçã«ãšã£ãŠæ¬åœã«å€§ããªãã®ã«ãªããŸããã ç§ãäœãã§ããã«ãªãã©ã«ãã¢å·ã§ã¯ãç§ã¯éåžžã«çŽ æŽãããæ ç»ãããããèŠãŠãçŽ æŽãããæ ç»ãããããããããšãç¥ã£ãŠããŸãã ãããã®çŽ æŽãããæ ç»ã¯ãæ¬åœã«ç§ã®èšæ¶ã«æ®ãçŽ æŽãããæ ç»ã§ãã ç§ã¯ãã®æ ç»ãçŽ æŽãããã®ã§ãç§ã¯ããã奜ããªã®ããããŠããã¯ç§ã®å¿ãæã€ã ç§ã®å人ã¯ããã®æ ç»
----
ãã®æ ç»ã¯ãæ ç»é€šã§èгãã«ã¯ã¡ãã£ãšæ·å±
ãé«ãããª?ãšãã人ã«ãåããŠãããšæããŸãã ã§ãããã®æ ç»ã芳ã人ã£ãŠãæ®æ®µæ ç»é€šã«ããªããããªäººãã¡ãå€ãããããªãããª? ããããäœåã芳ããšããã£ã±ãã¿ããªæ ç»å¥œãã ãªããšãåæã«æã£ã¡ãããã§ãããã ã ããããããã®DVDããªã¹ã¹ã¡ãªãã ãšæããŸãã ããã
----
ãã®æ ç»ã¯ãç§ã髿 ¡çã ã£ãé ã«èŠãæ ç»ã§ãã ç§ã¯ãã®æ ç»ãèŠãããŠãDVDã賌å
¥ããŸããã åœæã®ç§ã¯ãäžåŠçã§ããã®ã§ãä»ãšã¯æ¯ã¹ç©ã«ãªããªãçšãè奮ããŸãã! ä»ã§ãé®®æãªèšæ¶ãšããŠæ®ã£ãŠããŸãã æ ç»ãèŠãæã¯ãç»é¢ãæããããšãé®®æãªæ åãæ®ããŸãã æã®æ ç»
----
ãã®æ ç»ã¯ãç§ã髿 ¡çã ã£ãé ã«èªãã ãã®ã§ãã åœæãç§ã¯20代åŸåã§ããããã æ¯èŠªã«å§ããããŠèªãã§ã¿ãŸããã å
容ã¯ãšãŠãæ°é®®ã§ãç¹ã«ãæ¯ãšã®ããåããå¿ã«æ·±ãå»ãŸããŸããã ç§ããŸã 幌ãã£ãé ã®è©±ãªã®ã§ãä»ãšãªã£ãŠã¯æãåºããªãããã©ã æ¯ã¯ç§ã«ãšãŠãåªãã
----
ãã®æ ç»ã¯ãéåžžã«è¯ãæ ç»ã§ãæ ç»ãèŠãŠããéã«ããããäœã§ãããã«ã€ããŠãäœããç¥ãããšãã§ãããšæããŸããç§ã¯ããã®æ ç»ãçŽ æŽãããã®ã§ãæ ç»ãèŠãŠããŠãããã¯çŽ æŽãããã§ããããã¯ããã¹ãŠã®æ ç»ããããã£ãšãããããã¯ãããªãããããåçãã䟡å€ããããšããããšã§ããããã¯ãæ ç»ãèŠãã®ã«æé©ãªæ¹æ³ã®äžã€ã§ãããã®ãããªã«ã¯ã
----
ãã®æ ç»ã¯ãç§ã®éæ¥ã®äžéšã§ãã ãã¹ãŠã«æè¬ããŸã! ãã¹ãŠã®çŽ æŽãããæ ç»ããããšãã æ¬åœã«æ¥œããã ç§ã®éæ¥ã®äžéšã§ãã æé«! æé«ã«çŽ æŽããã! æ¬åœã«çŽ æŽããã! ç§ã¯ãšãŠã奜ãã§ã! çŽ æŽãããã§ã! æ¬åœã«çŽ æŽããã! ç§ã¯ãšãŠã奜ãã§ã! ããããšã! ããªãããããå¿ããªãããã«ããŠãã ããã
----
ãã®æ ç»ã¯ããšãŠãè¯ãã£ãã§ãã çŽ æŽãããäœåãããããšãããããŸãã! ãŸããæ©äŒãããã°ãã²ãããããé¡ãããŸãã ããããšãããããŸãã!
ãã®åºŠã¯ãã賌å
¥é ãèª ã«ããããšãããããŸãã 倧å€å¬ãããèšèãé æŽããããããšãããããŸãã ãŸããååã®æ¢±å
ãäžå¯§ã«ããŠé ããŸããŠã æ¬åœã«å©ãããŸããã æ¬åœã«ããããšãããããŸãã ãŸãæ©äŒãããããŸããããã©ããå®ãããé¡ãèŽããŸãã
----
ãã®æ ç»ã¯ãç§ã®äººçã«ãããŠæ¬åœã«å€§ããªãã®ã§ããã ç§ãæ ç»ãèŠãŠæåããçç±ã¯ãããããããŸãããäžçªå€§ããã£ãã®ã¯ããã®ã¢ãã¡ã芳ãŠãèªåã®äººçããããªã«å¹žãã§æ¥œãããªããããšã確信ããããšã§ãã ä»ãŸã§ã«èŠãããšã®ãªããããªæ°ããäžçãåºãã£ãŠããŠãèªåãä»ãŸã§çããŠããäžã§ãæ³åãããªãã£ã人çãéãããšãã§ããããšããããŠ
----
ãã®æ ç»ã¯ã以åèªãã æ¬ã®åœ±é¿ãåããŠããã ç»å Žäººç©ã®ãã£ã©èšå®ãèæ¯ããšãŠãè¯ãã ãŸããçµµããšãŠã綺éºã§ãç©èªãåãé¢çœãã§ã! æ¯éãèªãã§æ¬²ããäžåã§ãã ããããèªã¿ç¶ããŠããããã§ã! ããããšãããããŸãã!
çŽ æŽãããæ¬ã§ããçŽ æŽãããã§ãã ãšãŠãæ°ã«å
¥ããŸããããŸãæ©äŒãããã°è³Œå
¥ããããšæããŸã
----
ãã®æ ç»ã¯ãæ ç»é€šã§èгããã£ããã©ããªããªãèŠã«è¡ããªãã ãªã®ã§ããã®æ ç»ã芳ãŸããã ãããããã£ã! ã¹ããŒãªãŒãé¢çœããã鳿¥œãããã ä»ãŸã§èŠãäžã§äžçªããã£ãã æ ç»é€šã§èгãç²æããããŸããã æåŸãŸã§ç®ãé¢ããªãæ ç»ã§ãã æ ç»é€šã§èŠãããªãæ¯é! è²·ã£ãŠæãªã
----ããã®æ ç»ã¯ãã®ç¶ãã«ãæ ç»ã®ããžãã£ãææ³ã®ã¿ãåºåãããŠããããšãããããŸãã