Share
Embed
AIアプリDojo #3: Hugging Face Transformers モデルのチューニング入門
生成系AIへの注目が集まる中、エンジニアの皆さんは、AIアプリを検討する機会が増えていくと思います。このセッションでは、自然言語理解や自然言語生成をコンピューターを使って処理していく上で、広く使われているHugging Face Transformersを用いて、事前学習済みモデルに追加の学習をさせるなど、チューニング、カスタム化のために必要なことを具体例を取り上げながら学びます。
AI アプリ Dojo #1, #2で学んだ環境を使っていきますので、Python, Pytorch, Hugging Face Transformersをご準備ください。もし可能であればPytorchがサポートするGPUを有するPC/Macをご準備ください。
事前学習済みモデルのファインチューニングの流れ
transformer.Trainerクラスに関連したクラスの理解
Hugging Face Datasets、Apache Arrowとの関係
Hugging Face Datasetsのパフォーマンス
BERTモデルのファインチューニング実行
出来上がったカスタムモデルを公開するまでの流れ
利用バージョン:
Windows 11 Pro 22H2 (22621.2215) Python 3.10.6, CUDA V11.7.64, Pytorch 2.0.1+cu117
macOS 13.5.1(22G90)Python 3.11.4 Pytorch 2.0.1 (mpsサポートなし)
Akira Onishi (IBM) PRO
August 30, 2023
Transcript
39 slides
-
ຊΞΠɾϏʔɾΤϜגࣜձࣾ ςΫϊϩδʔࣄۀຊ෦ ΧελϚʔɾαΫηε ϓϦϯγύϧɾϚωʔδϟʔ ݉ 8JOEPXT/&5$POUBJOFS1PSUJOH1SPHSBNਪਐϦʔμʔ େ জ "LJSB0OJTIJ!JCNDPN 5XJUUFS!POJBL
IUUQTXXXGBDFCPPLDPNBLJSBPOJTIJ IUUQTXXXMJOLFEJODPNJOPOJBL "*ΞϓϦ%PKP )VHHJOH'BDF5SBOTGPSNFST Ϟσϧͷνϡʔχϯάೖ -
ࣗݾհ 1SPQFSUZ 7BMVF ࢯ໊ େ জ 5XJUUFS-JOLFE*O POJBL *5ۀքྺ
ϚΠϒʔϜ ΏΔ͔ͳμΠΤοτ )BTI5BH ͍͍Ͷ͐੩Ԭੜ׆ ࠲ӈͷ ౿·Εͯͳ্ཱ͓͕ͪΔಓͷ Α͘͏ٕ มͰࣗΛϙδςΟϒʹ IUUQTXXXGBDFCPPLDPNBLJSBPOJTIJ 'BDFCPPLʮ͓ʹ͋͘ʯͰݕࡧ -
ࠓͷ ϩʔΧϧϋʔυΣΞ 8JOEPXT-JOVY.BD 1ZUIPO 1Z5PSDI $6%" ϑΝΠϯνϡʔχϯά༻ ΞϓϦ Hugging
Face Transformers BERTモデル ࡉ͔ͳཧ۶ൈ͖ʹͯ͠ɺ 1ZUIPOͱ )VHHJOH'BDF5SBOTGPSNFSTɺ%BUBTFUTͳͲΛͬͯ #&35ϞσϧͷϑΝΠϯνϡʔχϯάମݧ ϩʔΧϧϋʔυΣΞ 8JOEPXT-JOVY.BD 1ZUIPO 1Z5PSDI $6%" "*ਪΞϓϦ ςετ࣮ߦ Hugging Face Transformers Hugging Face Hubに 公開したモデル カスタムモデル カスタムモデル -
શମ૾ ϑΝΠϯ νϡʔχϯάͷ ࣮ߦ ϩʔΧϧڥͰͷ ςετ )VHHJOH'BDF )VCͷ 1SJWBUFެ։ 1SJWBUFϞσϧͷ
ςετ )VHHJOH 'BDF)VCͷ 1VCMJDެ։ ެ։Ϟσϧͷ ར༻ ਫ਼ͷධՁ ຊͷηογϣϯͰମݧ͢Δ༰ )VHHJOH'BDF%BUBTFUT͔ΒσʔλͷऔΓग़͠ 5SBJOFSͱ1ZUPSDIΛͬͨϑΝΠϯνϡʔχϯά νϡʔχϯάͨ͠ϞσϧͷϩʔΧϧςετ )VHHJOH'BDF)VCͷϞσϧͷެ։ ެ։ͨ͠Ϟσϧͷςετ )PTUFEJOGFSFODF"1* ֶशࡁΈϞσϧΛڞ༗͢Δ )VHHJOH'BDF/-1ίʔε https://huggingface.co/learn/nlp-course/ja/chapter4/3 -
🤗 5SBOTGPSNFST "*ϞσϧͷΧελϚΠζ ϞσϧͷௐɺՃֶश "*Ϟσϧ σʔληοτ "*ਪػցֶशʹదͨ͠ ίϯϐϡʔλʔ "*ਪػցֶशʹదͨ͠ 04ɺϥϯλΠϜ
"*ϞσϧΛͬͨܭࢉ IUUQTIVHHJOHGBDFDP "*ਪ ࣄલֶशࡁΈͷϞσϧΛ ར༻ͨ͠ܭࢉ "*ਪʹదͨ͠ ίϯϐϡʔλʔ "*ਪʹదͨ͠ 04ɺϥϯλΠϜ "*ϞσϧΛͬͨܭࢉ Ճͷσʔλ ֶश༻ͱݕূ༻ʣ from transformers import pipeline detector = pipeline(task="object-detection") preds = detector("画像のURL”) trainer = Trainer( model=model, args=training_args, train_dataset=small_train_dataset, eval_dataset=small_eval_dataset, compute_metrics=compute_metrics, ) trainer.Train() -
#&35 #JEJSFDUJPOBM&ODPEFS3FQSFTFOUBUJPOTGSPN5SBOTGPSNFST https://arxiv.org/abs/1810.04805 ΑΓ'JHVSFΛҾ༻ #&35ࣗવݴޠॲཧͷ൚༻Ϟσϧ ࣄલֶशࡁΈϞσϧΛ͍ ผͷλεΫΛ࣮ߦ͢ΔͨΊͷϞσϧΛ ࡞Ͱ͖ΔʢϑΝΠϯνϡʔχϯάʣ ྫɿ ࣗવݴޠਪ
./-*.VMUJ(FOSF /BUVSBM-BOHVBHF*OGFSFODF ݻ༗දݱநग़ /&3/BNFE&OUJUZ 3FDPHOJUJPO ࣭Ԡ 42V"%5IF4UBOGPSE 2VFTUJPO"OTXFSJOH%BUBTFU #&35ͷࡉ͔ͳ͜ͱ͓͖ͯ͞ɺ·ͣ ϑΝΠϯνϡʔχϯάΛମݧͯ͠ΈΑ͏ -
ࢀߟ$16ͷΈͰܭࢉͨ͠ྫ ܇࿅σʔλ oniak3@AkiranoiMac py % python3 trainsample1.py load_dataset('yelp_review_full'):
AutoTokenizer.from_pretrained('bert-base-cased'): dataset.map(tokenize_function, batched=True): Map: 100%|██████████████████████████| 650000/650000 [02:27<00:00, 4395.82 examples/s] Map: 100%|████████████████████████████| 50000/50000 [00:11<00:00, 4389.09 examples/s] tokenized_datasets['train'].select(range(1000)): tokenized_datasets['test'].select(range(1000)): AutoModelForSequenceClassification.from_pretrained('bert-base-cased', num_labels=5): Some weights of BertForSequenceClassification were not initialized from the model checkpoint at bert-base-cased and are newly initialized: ['classifier.bias', 'classifier.weight'] You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks... To disable this warning, you can either: - Avoid using `tokenizers` before the fork if possible - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false) TrainingArguments(output_dir='test_trainer', evaluation_strategy='epoch'): evaluate.load('accuracy'): Trainer(model=model, args=training_args, train_dataset=small_train_dataset, eval_dataset=small_eval_dataset, compute_metrics=compute_metrics): trainer.train(): {'eval_loss': 1.4513660669326782, 'eval_accuracy': 0.399, 'eval_runtime': 928.2999, 'eval_samples_per_second': 1.077, 'eval_steps_per_second': 0.135, 'epoch': 1.0} {'eval_loss': 1.0377055406570435, 'eval_accuracy': 0.55, 'eval_runtime': 925.9615, 'eval_samples_per_second': 1.08, 'eval_steps_per_second': 0.135, 'epoch': 2.0} 79%|██████████████████████████████████▉ | 298/375 [2:30:31<31:06, 24.24s/it] {'eval_loss': 1.0231441259384155, 'eval_accuracy': 0.592, 'eval_runtime': 922.4306, 'eval_samples_per_second': 1.084, 'eval_steps_per_second': 0.136, 'epoch': 3.0} {'train_runtime': 11808.8493, 'train_samples_per_second': 0.254, 'train_steps_per_second': 0.032, 'train_loss': 1.072725830078125, 'epoch': 3.0} 100%|████████████████████████████████████████████| 375/375 [3:16:48<00:00, 31.49s/it] oniak3@AkiranoiMac py % -
# Hugging Face Transformer ΛͬͨϑΝΠϯνϡʔχϯά $16ͷΈͰ࣮ߦ͢Δ߹ page 1: 計算に時間がかかるのでご注意 from
datasets import load_dataset print ("load_dataset('yelp_review_full'):") dataset = load_dataset("yelp_review_full") from transformers import AutoTokenizer print ("AutoTokenizer.from_pretrained('bert-base-cased'):") tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") def tokenize_function(examples): return tokenizer(examples["text"], padding="max_length", truncation=True) print ("dataset.map(tokenize_function, batched=True):") tokenized_datasets = dataset.map(tokenize_function, batched=True) print ("tokenized_datasets['train'].select(range(1000)):") small_train_dataset = tokenized_datasets["train"].shuffle(seed=42).select(range(1000)) print ("tokenized_datasets['test'].select(range(1000)):") small_eval_dataset = tokenized_datasets["test"].shuffle(seed=42).select(range(1000)) from transformers import AutoModelForSequenceClassification print ("AutoModelForSequenceClassification.from_pretrained('bert-base-cased', num_labels=5):") model = AutoModelForSequenceClassification.from_pretrained(“bert-base-cased”, num_labels=5) #星1から星5 model = model.to(“cpu”) # モデルの計算処理⽤にCPUデバイスを明⽰的に指定する、この指定がないと CUDA または MPSで計算 from transformers import TrainingArguments, Trainer print ("TrainingArguments(output_dir='test_trainer', evaluation_strategy='epoch'):") # TrainingArgumentにおいてもCPUデバイスの利⽤を明⽰的に指定する、この指定がないと CUDA または MPSで計算 training_args = TrainingArguments(output_dir="test_trainer", evaluation_strategy="epoch", use_cpu=True) #࣍ϖʔδଓ͘ -
# Hugging Face Transformer ΛͬͨϑΝΠϯνϡʔχϯά $16ͷΈͰ࣮ߦ͢Δ߹ page 2 import numpy
as np import evaluate print ("evaluate.load('accuracy'):") metric = evaluate.load("accuracy") def compute_metrics(eval_pred): logits, labels = eval_pred predictions = np.argmax(logits, axis=-1) return metric.compute(predictions=predictions, references=labels) print ("Trainer(model=model, args=training_args, train_dataset=small_train_dataset, eval_dataset=small_eval_dataset, compute_metrics=compute_metrics):") trainer = Trainer( model=model, args=training_args, train_dataset=small_train_dataset, eval_dataset=small_eval_dataset, compute_metrics=compute_metrics, ) print ("trainer.train():") trainer.train() print ("trainer.evaluate():") eval_result = trainer.evaluate() import pprint pprint.pprint(eval_results) tokenizer.save_pretrained("test_trainer") trainer.save_model() -
5SBJOFSʹؔ࿈͢ΔओͳΫϥε DMBTTUSBOTGPSNFS5SBJOFS USBJOϝιου FWBMVBUFϝιου TBWF@NPEFMϝιου DMBTTEBUBTFUT%BUBTFU USBJO@EBUBTFU τϨʔχϯά༻ FWBM@EBUBTFU ධՁ༻
DMBTTUSBOTGPSNFS1SF5SBJOFE.PEFM NPEFM DMBTT USBOTGPSNFS5SBJOJOH"SHVNFOU BSHT DMBTTUSBOTGPSNFS&WBM1SFEJDUJPO DPNQVUF@NFUSJDT MPHJUT MBCFMT def compute_metrics(eval_pred): logits, labels = eval_pred # labels は正解のラベル predictions = np.argmax(logits, axis=-1) # モデルによる予測 return metric.compute(predictions=predictions, references=labels) DMBTTFWBMVBUF&WBMVBUJPO.PEVMF DPNQVUFϝιου class evaluate Loadメソッド NFUSJD -
%BUBTFUTͷύϑΥʔϚϯε import os; import psutil; import timeit from datasets
import load_dataset mem_before = psutil.Process(os.getpid()).memory_info().rss / (1024 * 1024) wiki = load_dataset("wikipedia", "20220301.en", split="train") mem_after = psutil.Process(os.getpid()).memory_info().rss / (1024 * 1024) print(f"RAM memory used: {(mem_after - mem_before)} MB") 8JLJQFEJBFO20.3GBのデータ NBD047FOUVSBʢ'EʣJ.BD*OUFM$PSFJ()[ίΞ$16 44%5#ʹΑΔ࣮ߦ݁Ռ ॳճ Downloading: 100%|█████████████████████████| 15.3k/15.3k [00:00<00:00, 21.0MB/s] Downloading: 100%|█████████████████████████| 20.3G/20.3G [15:29<00:00, 21.8MB/s] RAM memory used: 52.98046875 MB #2回⽬以降 RAM memory used: 18.48046875 MB pip install apache_beam -
%BUBTFUTͷύϑΥʔϚϯε import os; import psutil; import timeit from datasets
import load_dataset mem_before = psutil.Process(os.getpid()).memory_info().rss / (1024 * 1024) wiki = load_dataset("wikipedia", "20220301.en", split="train") mem_after = psutil.Process(os.getpid()).memory_info().rss / (1024 * 1024) print(f"RAM memory used: {(mem_after - mem_before)} MB") s = """batch_size = 1000 for batch in wiki.iter(batch_size): ... """ time = timeit.timeit(stmt=s, number=1, globals=globals()) print(f"Time to iterate over the {wiki.dataset_size >> 30} GB dataset: {time:.1f} sec, " f"ie. {float(wiki.dataset_size >> 27)/time:.1f} Gb/s") NBD047FOUVSBʢ'EʣJ.BD*OUFM$PSFJ()[ίΞ$16 44%5# 1$*Fଓ ʹΑΔ࣮ߦ݁Ռ Time to iterate over the 18 GB dataset: 156.3 sec, ie. 1.0 Gb/s (初回) Time to iterate over the 18 GB dataset: 46.5 sec, ie. 3.2 Gb/s (2回⽬) 8JOEPXT1SP)".%3Z[FO9()[ίΞ $16 44%5# 1$*Fଓ RAM memory used: 20.3125 MB Time to iterate over the 18 GB dataset: 30.2 sec, ie. 5.0 Gb/s -
ࠓճར༻͢Δσʔλ ZFMQ@SFWJFX@GVMM https://huggingface.co/datasets/yelp_review_full Yelp-dataset ライセンス契約 https://s3-media3.fl.yelpcdn.com/assets/srv0/engineering_pages/bea5c1e92bf3/assets/vendor/yelp-dataset-agreement.pdf ࠓճɺ͜ͷ%BUBTFUTΛ )VHHJOH'BDF5SBOTGPSNFSTʹΑΔ ϑΝΠϯνϡʔχϯάํ๏ΛֶͿͨΊʹ ༻͠·͢ɻ
MBCFM ͷ UFYU ϨϏϡʔ༰ -BCFM ࠷ධՁ ͔Β ࠷ߴධՁ -
ϑΝΠϯνϡʔχϯάͷ࣮ߦ Windows 11 Pro, CPU: AMD Ryzen 9 5950X (16コア),
Memory: 128GB GPU: NVIDIA GeForce RTX 4090 (Memory 24GB) ܇࿅σʔλ ςετσʔλ ӳจΛ͠ɺ͍ͭ͘ͷ ϨϏϡʔධՁʹͳΔ͔Λ ਪ͢ΔϞσϧΛ࡞ -
(16ΛͬͨϑΝΠϯνϡʔχϯάͷαϯϓϧ from datasets import load_dataset print ("load_dataset('yelp_review_full'):") dataset = load_dataset("yelp_review_full")
from transformers import AutoTokenizer print ("AutoTokenizer.from_pretrained('bert-base-cased'):") tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") def tokenize_function(examples): return tokenizer(examples["text"], padding="max_length", truncation=True) print ("dataset.map(tokenize_function, batched=True):") tokenized_datasets = dataset.map(tokenize_function, batched=True) print ("tokenized_datasets['train']") small_train_dataset = tokenized_datasets["train"].shuffle(seed=182).select(range(30000)) large_train_dataset = tokenized_datasets["train"] print ("tokenized_datasets['test']") small_eval_dataset = tokenized_datasets["test"].shuffle(seed=182).select(range(10000)) large_eval_dataset = tokenized_datasets["test"] from transformers import AutoModelForSequenceClassification print ("AutoModelForSequenceClassification.from_pretrained('bert-base-cased', num_labels=5):") model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", num_labels=5) #model = model.to("cuda") from transformers import TrainingArguments, Trainer print ("TrainingArguments(output_dir='test_finetune1', evaluation_strategy='epoch'):") output_foldername="test_finetune1" training_args = TrainingArguments(output_dir=output_foldername, evaluation_strategy=“epoch”, per_device_train_batch_size=32, per_device_eval_batch_size=24) ࣍ϖʔδଓ͘ -
# GPUΛͬͨϑΝΠϯνϡʔχϯάͷαϯϓϧଓ͖ import numpy as np import evaluate print ("evaluate.load('accuracy'):")
metric = evaluate.load("accuracy") def compute_metrics(eval_pred): logits, labels = eval_pred print("logits: {} label: {}".format(logits, labels)) predictions = np.argmax(logits, axis=-1) return metric.compute(predictions=predictions, references=labels) print ("Trainer(…):") trainer = Trainer( model=model, args=training_args, train_dataset=small_train_dataset, eval_dataset=small_eval_dataset, compute_metrics=compute_metrics, ) print ("trainer.train():") trainer.train() #print ("trainer.evaluate():") eval_results = trainer.evaluate() print("eval results:") import pprint pprint.pprint(eval_results) tokenizer.save_pretrained(output_foldername) trainer.save_model() -
ΧελϜϞσϧͷϩʔΧϧςετྫ from transformers import pipeline, AutoModelForSequenceClassification, AutoTokenizer # ϑΝΠϯνϡʔχϯάʹΑΓ࡞ͨ͠ϞσϧΛϩʔΧϧετϨʔδ͔ΒಡΈࠐΉ
model = AutoModelForSequenceClassification.from_pretrained("test_finetune1") # BERTͷtokenizerΛ४උ͢Δ tokenizer = AutoTokenizer.from_pretrained("test_finetune1") # Hugging Face TransfomerͷpipelineʹΑΓAIਪΛ࣮ߦ͢Δ classifier = pipeline(task="text-classification", model=model, tokenizer=tokenizer) result = classifier("This place is really great ! I'd highly recommend.") print (result) ʔʔʔ [{'label': 'LABEL_4', 'score': 0.9601454138755798}] 1ZUIPOΛ࣮ߦ͍ͯ͠ΔϑΥϧμͷαϒϑΥϧμʹ UFTU@USBJOFS͕͋Γɺ ͦ͜ʹϞσϧͱ5PLFOJ[FS͕֨ೲ͞Ε͍ͯΔ߹ -
ΧελϜϞσϧͷϩʔΧϧςετྫ from transformers import AutoTokenizer, AutoModelForSequenceClassification import torch tokenizer =
AutoTokenizer.from_pretrained("test_finetune1") model = AutoModelForSequenceClassification.from_pretrained("test_finetune1") # transformersͷpipelineͰͳ͘ɺtokenizerͱmodelΛ໌ࣔతʹར༻ inputs = tokenizer("This place is really great ! I'd highly recommend.", return_tensors="pt") with torch.no_grad(): logits = model(**inputs).logits import pprint pprint.pprint(logits) # ਪ݁Ռͷऔಘ predicted_class_id = logits.argmax().item() result = model.config.id2label[predicted_class_id] print(predicted_class_id) print(result) ʔʔʔ tensor([[-2.0764, -3.4568, -1.9678, 2.1805, 5.3953]]) 4 LABEL_4 -
ࢀߟ(16ΛͬͯશσʔλͰܭࢉͨ͠ྫ PS D:¥Learn¥transformers¥finetune> python tune2.py 184789.6056312 load_dataset('yelp_review_full'): AutoTokenizer.from_pretrained('bert-base-cased'): dataset.map(tokenize_function, batched=True):
Map: 100%|█████████████████████████████████████████████| 650000/650000 [02:31<00:00, 4295.43 examples/s] Map: 100%|███████████████████████████████████████████████| 50000/50000 [00:11<00:00, 4254.34 examples/s] tokenized_datasets['train'] tokenized_datasets['test'] AutoModelForSequenceClassification.from_pretrained('bert-base-cased', num_labels=5): Some weights of BertForSequenceClassification were not initialized from the model checkpoint at bert-base-cased and are newly initialized: ['classifier.bias', 'classifier.weight'] You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference. TrainingArguments(output_dir='test_trainer3', evaluation_strategy='epoch'): evaluate.load('accuracy'): Trainer(model=model, args=training_args, train_dataset=small_train_dataset, eval_dataset=small_eval_dataset, compute_metrics=compute_metrics): trainer.train(): {‘loss’: 1.0243, ‘learning_rate’: 4.958975368811435e-05, ‘epoch’: 0.02} # தུ… {'loss': 0.556, 'learning_rate': 3.601962618356061e-07, 'epoch': 2.98} {'eval_loss': 0.734175443649292, 'eval_accuracy': 0.69484, 'eval_runtime': 247.19, 'eval_samples_per_second': 202.274, 'eval_steps_per_second': 8.431, 'epoch': 3.0} {'train_runtime': 30651.3372, 'train_samples_per_second': 63.619, 'train_steps_per_second': 1.988, 'train_loss': 0.6722067566574003, 'epoch': 3.0} 100%|███████████████████████████████████████████████████████████| 60939/60939 [8:30:51<00:00, 1.99it/s] 100%|███████████████████████████████████████████████████████████████| 2084/2084 [04:06<00:00, 8.45it/s] eval results: {'epoch': 3.0, 'eval_accuracy': 0.69484, 'eval_loss': 0.734175443649292, 'eval_runtime': 246.7769, 'eval_samples_per_second': 202.612, 'eval_steps_per_second': 8.445} 215861.5289557 total time:31071.923324500007 8JOEPXT1SP $16".%3Z[FO9 ίΞ .FNPSZ(# (16/7*%*"(F'PSDF359 .FNPSZ(# ܇࿅σʔλ ݅ ධՁσʔλ ݅ ܭࢉ࣌ؒ ࣌ؒ ඵ -
from datasets import load_dataset import time start = time.perf_counter() print(start)
print ("load_dataset('yelp_review_full'):") dataset = load_dataset("yelp_review_full") from transformers import AutoTokenizer print ("AutoTokenizer.from_pretrained('bert-base-cased'):") tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") def tokenize_function(examples): return tokenizer(examples["text"], padding="max_length", truncation=True) print ("dataset.map(tokenize_function, batched=True):") tokenized_datasets = dataset.map(tokenize_function, batched=True) print ("tokenized_datasets['train']") large_train_dataset = tokenized_datasets["train"] print ("tokenized_datasets['test']") large_eval_dataset = tokenized_datasets["test"] from transformers import AutoModelForSequenceClassification print ("AutoModelForSequenceClassification.from_pretrained('bert-base-cased', num_labels=5):") model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", num_labels=5) #model = model.to("cuda") from transformers import TrainingArguments, Trainer print ("TrainingArguments(output_dir='test_trainer4large', evaluation_strategy='epoch'):") training_args = TrainingArguments(output_dir=“test_trainer4large”, evaluation_strategy=“epoch”, per_device_train_batch_size=32, per_device_eval_batch_size=24) # 次ページへ続く -
#続き import numpy as np import evaluate print ("evaluate.load('accuracy'):") metric
= evaluate.load("accuracy") def compute_metrics(eval_pred): logits, labels = eval_pred print("logits: {} label: {}".format(logits, labels)) predictions = np.argmax(logits, axis=-1) return metric.compute(predictions=predictions, references=labels) print ("Trainer(…):") trainer = Trainer( model=model, args=training_args, train_dataset=large_train_dataset, eval_dataset=large_eval_dataset, compute_metrics=compute_metrics, ) print ("trainer.train():") trainer.train() eval_results = trainer.evaluate() print("eval results:") import pprint pprint.pprint(eval_results) trainer.save_model() tokenizer.save_pretrained("test_trainer4large") end = time.perf_counter() print(end) print("total time:"+str(end-start)) -
QVTI@UP@IVC Λͬͨૹ৴ from transformers import AutoTokenizer, AutoModelForSequenceClassification local_name="test_trainer4large" #
datasetsͷσʔλΛશͯͬͨϞσϧ hub_name="oniak3ai/bert_classification_yelp_review_full" tokenizer = AutoTokenizer.from_pretrained(local_name) tokenizer.push_to_hub(hub_name, private=True) model = AutoModelForSequenceClassification.from_pretrained(local_name) model.push_to_hub(hub_name, private=True) 5PLFOJ[FSΛΞοϓϩʔυ͍ͯ͠ͳ͍߹ɺ.PEFMDBSEͰͷςετ࣮ߦͰΤϥʔͱͳΔͷͰ UPLFOJ[FSͱNPEFMɺͦΕͧΕ QVTI@UP@IVCϝιουͰ )VHHJOH'BDF)VCʹૹ৴ QVTI@UP@IVCϝιουͷύϥϝʔλ lPOJBLBJCFSU@DMBTTJGJDBUJPO@ZFMQ@SFWJFX@GVMMz0SHBOJ[BUJPO໊Ϟσϧ໊ Ϟσϧ໊ϩʔΧϧϞσϧͱҧ͏໊લΛࢦఆՄೳ QSJWBUF5SVFϞσϧΛඇެ։ѻ͍ͰΞοϓϩʔυ ͜ͷύϥϝʔλΛࢦఆ͠ͳ͍߹ɺΞοϓϩʔυͨ͠Ϟσϧެ։ঢ়ଶʹͳΓ·͢ -
ඇެ։ঢ়ଶʹ͋ΔϞσϧͷςετํ๏ λʔϛφϧɺ1PXFS4IFMMͳͲ͔ΒIVHHJOHGBDFDMJͰϩάΠϯ 1ZUIPO͔ΒςετίʔυΛ࣮ߦ from transformers import pipeline, AutoModelForSequenceClassification, AutoTokenizer #
ϑΝΠϯνϡʔχϯάʹΑΓ࡞ͨ͠Ϟσϧ,TokenizerΛHugging Face Model Hub͔ΒಡΈࠐΉ hub_name="oniak3ai/bert_classification_yelp_review_full" model = AutoModelForSequenceClassification.from_pretrained(hub_name) tokenizer = AutoTokenizer.from_pretrained(hub_name) # Hugging Face TransfomersͷpipelineʹΑΓAIਪΛ࣮ߦ͢Δ classifier = pipeline(task="text-classification", model=model, tokenizer=tokenizer) result = classifier("This place is really great ! I'd highly recommend.") print (result) oniak3@AkiranoiMac py % python3 privatetest.py Downloading (…)lve/main/config.json: 100%|█████| 958/958 [00:00<00:00, 2.30MB/s] Downloading pytorch_model.bin: 100%|█████████| 433M/433M [00:19<00:00, 21.7MB/s] Downloading (…)okenizer_config.json: 100%|█████| 314/314 [00:00<00:00, 1.66MB/s] Downloading (…)solve/main/vocab.txt: 100%|███| 232k/232k [00:00<00:00, 1.43MB/s] Downloading (…)/main/tokenizer.json: 100%|███| 711k/711k [00:00<00:00, 1.11MB/s] Downloading (…)cial_tokens_map.json: 100%|██████| 125/125 [00:00<00:00, 763kB/s] [{'label': 'LABEL_4', 'score': 0.6090189218521118}] -
ৼΓฦΓ ϑΝΠϯ νϡʔχϯάͷ ࣮ߦ ϩʔΧϧڥͰͷ ςετ )VHHJOH'BDF )VCͷ 1SJWBUFެ։ 1SJWBUFϞσϧͷ
ςετ )VHHJOH 'BDF)VCͷ 1VCMJDެ։ ެ։Ϟσϧͷ ར༻ ਫ਼ͷධՁ ຊͷηογϣϯͰମݧͨ͠༰ )VHHJOH'BDF%BUBTFUT͔ΒσʔλͷऔΓग़͠ 5SBJOFSͱ1ZUPSDIΛͬͨϑΝΠϯνϡʔχϯά νϡʔχϯάͨ͠ϞσϧͷϩʔΧϧςετ )VHHJOH'BDF)VCͷϞσϧͷެ։ ެ։ͨ͠Ϟσϧͷςετ )PTUFEJOGFSFODF"1* ֶशࡁΈϞσϧΛڞ༗͢Δ )VHHJOH'BDF/-1ίʔε IUUQTIVHHJOHGBDFDPMFBSOOMQDPVSTFKBDIBQUFS -
ϫʔΫγϣοϓɺηογϣϯɺ͓Αͼࢿྉɺ*#.·ͨηογϣϯൃදऀʹΑͬͯ४උ͞ΕɺͦΕͧΕಠࣗͷݟղΛөͨ͠ͷͰ͢ɻͦΕΒใఏڙͷతͷΈ Ͱఏڙ͞Ε͓ͯΓɺ͍͔ͳΔࢀՃऀʹରͯ͠๏త·ͨͦͷଞͷࢦಋॿݴΛҙਤͨ͠ͷͰͳ͘ɺ·ͨͦͷΑ͏ͳ݁ՌΛੜΉͷͰ͋Γ·ͤΜɻຊߨԋࢿྉ ʹؚ·Ε͍ͯΔใʹ͍ͭͯɺશੑͱਖ਼֬ੑΛظ͢ΔΑ͏ྗ͠·͕ͨ͠ɺʮݱঢ়ͷ··ʯఏڙ͞Εɺ໌ࣔ·ͨ҉ࣔʹ͔͔ΘΒ͍͔ͣͳΔอূΘͳ͍ͷͱ ͠·͢ɻຊߨԋࢿྉ·ͨͦͷଞͷࢿྉͷ༻ʹΑͬͯɺ͋Δ͍ͦͷଞͷؔ࿈ʹΑͬͯɺ͍͔ͳΔଛ͕ੜͨ͡߹ɺ*#.ΛෛΘͳ͍ͷͱ͠·͢ɻຊߨԋ ࢿྉʹؚ·Ε͍ͯΔ༰ɺ*#.·ͨͦͷαϓϥΠϠʔϥΠηϯεަऀ͔Β͍͔ͳΔอূ·ͨද໌ΛҾ͖ͩ͢͜ͱΛҙਤͨ͠ͷͰɺ*#.ιϑτΣΞͷ༻ Λنఆ͢Δద༻ϥΠηϯεܖͷ߲Λมߋ͢Δ͜ͱΛҙਤͨ͠ͷͰͳ͘ɺ·ͨͦͷΑ͏ͳ݁ՌΛੜΉͷͰ͋Γ·ͤΜɻ ຊߨԋࢿྉͰ*#.ɺϓϩάϥϜɺ·ͨαʔϏεʹݴٴ͍ͯͯ͠ɺ*#.͕Ӧۀ׆ಈΛߦ͍ͬͯΔͯ͢ͷࠃͰͦΕΒ͕༻ՄೳͰ͋Δ͜ͱΛ҉ࣔ͢ΔͷͰ͋Γ ·ͤΜɻຊߨԋࢿྉͰݴٴ͍ͯ͠ΔϦϦʔεػೳɺࢢػձ·ͨͦͷଞͷཁҼʹج͍ͮͯ*#.ಠࣗͷܾఆݖΛ͍ͬͯͭͰมߋͰ͖Δͷͱ͠ɺ ͍͔ͳΔํ๏ʹ͓͍ͯকདྷͷ·ͨػೳ͕༻ՄೳʹͳΔͱ֬͢Δ͜ͱΛҙਤͨ͠ͷͰ͋Γ·ͤΜɻຊߨԋࢿྉʹؚ·Ε͍ͯΔ༰ɺࢀՃऀ͕։࢝͢Δ ׆ಈʹΑͬͯಛఆͷൢചɺച্ߴͷ্ɺ·ͨͦͷଞͷ݁Ռ͕ੜ͡Δͱड़Δɺ·ͨ҉ࣔ͢Δ͜ͱΛҙਤͨ͠ͷͰɺ·ͨͦͷΑ͏ͳ݁ՌΛੜΉͷͰ͋Γ·
ͤΜɻύϑΥʔϚϯεɺཧ͞Εͨڥʹ͓͍ͯඪ४తͳ*#.ϕϯνϚʔΫΛ༻ͨ͠ଌఆͱ༧ଌʹج͍͍ͮͯ·͢ɻϢʔβʔ͕ܦݧ͢Δ࣮ࡍͷεϧʔϓοτύ ϑΥʔϚϯεɺϢʔβʔͷδϣϒɾετϦʔϜʹ͓͚ΔϚϧνϓϩάϥϛϯάͷྔɺೖग़ྗߏɺετϨʔδߏɺ͓Αͼॲཧ͞ΕΔϫʔΫϩʔυͳͲͷߟྀࣄ߲Λ ؚΉɺଟ͘ͷཁҼʹԠͯ͡มԽ͠·͢ɻ͕ͨͬͯ͠ɺݸʑͷϢʔβʔ͕͜͜Ͱड़ΒΕ͍ͯΔͷͱಉ༷ͷ݁ՌΛಘΒΕΔͱ֬͢ΔͷͰ͋Γ·ͤΜɻ هड़͞Ε͍ͯΔͯ͢ͷ͓٬༷ࣄྫɺͦΕΒͷ͓٬༷͕ͲͷΑ͏ʹ*#.Λ༻͔ͨ͠ɺ·ͨͦΕΒͷ͓٬༷͕ୡͨ݁͠Ռͷ࣮ྫͱͯࣔ͠͞ΕͨͷͰ͢ɻ࣮ࡍ ͷڥίετ͓ΑͼύϑΥʔϚϯεಛੑɺ͓٬༷͝ͱʹҟͳΔ߹͕͋Γ·͢ɻ *#.ɺ*#.ϩΰɺJCNDPNɺ*#.$MPVEɺ*#.$MPVE1BLTɺੈքͷଟ͘ͷࠃͰొ͞Εͨ*OUFSOBUJPOBM#VTJOFTT.BDIJOFT$PSQPSBUJPOͷඪͰ͢ɻଞͷ໊͓ ΑͼαʔϏε໊ɺͦΕͧΕ*#.·֤ͨࣾͷඪͰ͋Δ߹͕͋Γ·͢ɻݱ࣌Ͱͷ*#.ͷඪϦετʹ͍ͭͯɺXXXJCNDPNMFHBMDPQZUSBEFTIUNMΛ͝ཡ ͍ͩ͘͞ɻ .JDSPTPGU 8JOEPXT 8JOEPXT4FSWFS /&5'SBNFXPSL /&5 /&5$PSFɺ.JDSPTPGU$PSQPSBUJPOͷඪ·ͨొඪͰ͢ɻ /7*%*" /7*%*"ϩΰ /7*%*"$6%" /7*%*"$PSQPSBUJPOͷඪ·ͨొඪͰ͢ɻ )VHHJOH'BDFɺ )VHHJOH'BDF *OD ͷඪͰ͢ɻʢొඪͱͯ͠ग़ئதʣ ࢿྉͰར༻͍ͯ͠Δ)VHHJOH'BDFʹొ͞Ε͍ͯΔϞσϧɺ֤Ϟσϧ͕ࢦఆͨ͠ϥΠηϯεͰӡ༻Ͱ͖·͢ɻ ࢿྉʹ͍ࣔͯ͠Δ"*ਪΛ࣮ߦ͢ΔͨΊͷίʔυɺαϯϓϧͰ͋ΓશͳίʔυͰ͋Γ·ͤΜɻ*5ΤϯδχΞͷମݧػձΛ૿ֶ͢शతͰ४උͨ͠ͷͰ͢ɻ "*ϞσϧΛ࣮ࡍͷγεςϜʹΈࠐΉ߹ɺϞσϧͷϥΠηϯεܖΛ֬ೝ͠ɺγεςϜཁ݅ʹԠͨ͡"*ਪ࣮ߦڥΛ४උ͠ɺඞཁͳྫ֎ॲཧΛՃ͢ΔͳͲ࣮ӡ ༻ʹ͑ΔίʔυΛ࡞͠ɺेͳσόοάɺςετΛߦ͍ͬͯͩ͘͞ɻϑΝΠϯνϡʔχϯάͨ͠ϞσϧΛ༻ར༻͢Δ߹ɺར༻͢ΔσʔληοτͷϥΠηϯε ܖΛ֬ೝ͍ͯͩ͘͠͞ɻ )VHHJOH'BDF5SBOTGPSNFSͷٕज़తͳղܾɺϑΟʔυόοΫɺIUUQTHJUIVCDPNIVHHJOHGBDFUSBOTGPSNFST ΑΓɺ (JU)VC*TTVF 1VMM3FRVFTUΛ௨ͯ͡ɺΦʔϓϯιʔείϛϡχςΟͱڞʹਐΊ͍ͯͩ͘͞ɻ