大規模言語モデルをファインチューニングして、究極の大規模言語モデルにするのが本日のミッション。究極の大規模言語モデルで解きたい問題は、
question = "究極生命体カーズとは?"
環境設定
# パッケージのインストール
!pip install -q bitsandbytes datasets accelerate loralib
!pip install -q git+https://github.com/huggingface/transformers.git@main git+https://github.com/huggingface/peft.git
import torch
torch.cuda.empty_cache()
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
base model をそのまま使う
model_name = "cyberagent/open-calm-large"
ベースになる事前学習済みモデルとトークナイザーを読み込む。
# モデルの読み込み
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
import bitsandbytes as bnb
import torch
import torch.nn as nn
from transformers import AutoConfig, AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained(
model_name,
#load_in_8bit=True,
device_map="auto",
#torch_dtype=torch.float16,
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
2023-08-29 01:31:20.625774: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.
2023-08-29 01:31:20.669403: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.
To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.
2023-08-29 01:31:21.535199: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT
「究極生命体カーズとは?」という問いをインプットにする。
inputs = tokenizer(question, return_tensors="pt").to(model.device)
準備はできた。ではいよいよ、問いに答える文章を10個生成するッ!
for _ in range(10):
with torch.no_grad():
tokens = model.generate(
**inputs,
max_new_tokens=256,
do_sample=True,
temperature=0.9,
top_p=0.75,
top_k=40,
num_beams=10,
repetition_penalty=5.0,
pad_token_id=tokenizer.pad_token_id,
)
output = tokenizer.decode(tokens[0], skip_special_tokens=True)
print(output)
print()
究極生命体カーズとは?
【ネタバレ注意】劇場版「Fate/stay night [Heaven’s Feel]」III.spring song 感想(前編)
究極生命体カーズとは?
【ネタバレ】映画『アベンジャーズ/インフィニティ・ウォー』のあらすじと感想!MCU(マーベル・シネマティック・ユニバース)シリーズの完結編
究極生命体カーズとは?
【tdr0361】東京ディズニーリゾートのCMには現役の学生キャストも出演していた!
【tdr0314】超低額宿泊許可制度・特例第一種(優先)指定制度って何?
究極生命体カーズとは?
【ネタバレ】映画『ファンタスティック・ビーストと黒い魔法使いの誕生』感想(あらすじ&評価)
究極生命体カーズとは?
【tdr0351】ジャングル・クルーズに登場するリサルガって何者?
究極生命体カーズとは?
【tdr0601】東京ディズニーリゾートのCMには○○の表示がない?!
究極生命体カーズとは?
【動画あり】若々しく歳を重ねたいなら筋トレを!パーソナルトレーナーが徹底解説
究極生命体カーズとは?
【ネタバレ】『恋んトス』男性新メンバーの有力候補は誰!? 第1話レビュー
究極生命体カーズとは?
【ネタバレ】映画『スパイダーマン:ファー・フロム・ホーム』感想(レビュー)
究極生命体カーズとは?
【ネタバレ】『恋んトス』男性新メンバーのプロフィール解禁!気になる相手には“亜麻色の髪”で触れようとする!?
し...質問に答えてねえエェェーーーッ!!
「答えよう」という「姿勢」すらねえエェェーーーッ!!
ファインチューニング用のデータセット
ということで、この「答えようという姿勢すらねェ」言語モデルをファインチューニングするッ! 訓練に用いるのはこのQ&Aデータセット!
dataset_name = "kunishou/databricks-dolly-15k-ja"
import transformers
from datasets import load_dataset
data = load_dataset(dataset_name)
data = data.map(lambda samples: tokenizer(samples["output"]), batched=True)
Map: 0%| | 0/15015 [00:00<?, ? examples/s]
PEFTを用いたLoRAファインチューニング
では、ここから huggingface (ハギング・フェイス)にある PEFT というライブラリでLoRAファインチューニングを行う!
for param in model.parameters():
param.requires_grad = False # モデルをフリーズ
if param.ndim == 1:
# 安定のためにレイヤーノルムをfp32にキャスト
param.data = param.data.to(torch.float32)
model.gradient_checkpointing_enable()
model.enable_input_require_grads()
class CastOutputToFloat(nn.Sequential):
def forward(self, x):
return super().forward(x).to(torch.float32)
model.lm_head = CastOutputToFloat(model.embed_out)
def print_trainable_parameters(model):
"""
モデル内の学習可能なパラメータ数を出力
"""
trainable_params = 0
all_param = 0
for _, param in model.named_parameters():
all_param += param.numel()
if param.requires_grad:
trainable_params += param.numel()
print(
f"trainable params: {trainable_params} || all params: {all_param} || trainable%: {100 * trainable_params / all_param}"
)
from peft import LoraConfig, get_peft_model
config = LoraConfig(
r=16,
lora_alpha=32,
# target_modules=["q_proj", "v_proj"],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM",
)
model = get_peft_model(model, config)
print_trainable_parameters(model)
trainable params: 2359296 || all params: 842357760 || trainable%: 0.28008242008716105
訓練開始ッ!
trainer = transformers.Trainer(
model=model,
train_dataset=data["train"],
args=transformers.TrainingArguments(
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
warmup_steps=100,
max_steps=200,
learning_rate=2e-4,
fp16=True,
logging_steps=1,
output_dir="outputs",
),
data_collator=transformers.DataCollatorForLanguageModeling(tokenizer, mlm=False),
)
model.config.use_cache = False # 警告を黙らせます。 推論のために再度有効にしてください。
trainer.train()
You're using a GPTNeoXTokenizerFast tokenizer. Please note that with a fast tokenizer, using the `__call__` method is faster than using a method to encode the text followed by a call to the `pad` method to get a padded encoding.
<div>
<progress value='200' max='200' style='width:300px; height:20px; vertical-align: middle;'></progress>
[200/200 02:24, Epoch 0/1]
</div>
<table border="1" class="dataframe">
『ハギング・フェイス』ッ!
ディ・モールト ディ・モールト
(非常に 非常に) 良いぞッ!
良く学習してるぞッ!
TrainOutput(global_step=200, training_loss=3.288494335412979, metrics={'train_runtime': 145.2264, 'train_samples_per_second': 22.035, 'train_steps_per_second': 1.377, 'total_flos': 2511526591881216.0, 'train_loss': 3.288494335412979, 'epoch': 0.21})
学習結果を確認しよう。質問に答える文章を10個生成するッ!
batch = tokenizer(question, return_tensors="pt").to(device)
for _ in range(10):
with torch.cuda.amp.autocast():
output_tokens = model.generate(**batch, max_new_tokens=50)
print("\n\n", tokenizer.decode(output_tokens[0], skip_special_tokens=True))
warnings.warn(
Setting `pad_token_id` to `eos_token_id`:0 for open-end generation.
/usr/local/lib/python3.10/site-packages/torch/utils/checkpoint.py:31: UserWarning: None of the inputs have requires_grad=True. Gradients will be None
warnings.warn("None of the inputs have requires_grad=True. Gradients will be None")
Setting `pad_token_id` to `eos_token_id`:0 for open-end generation.
究極生命体カーズとは?
カーズとは、映画「カーズ」に登場するキャラクターです。
主人公のレーシングカーに乗って、レースをするという、
とてもシンプルなストーリーです。
しかし、このキャラクターには、
様々な秘密が隠されています。
Setting `pad_token_id` to `eos_token_id`:0 for open-end generation.
究極生命体カーズとは?
カーズとは、映画「カーズ」に登場するキャラクターです。
映画「カーズ」は、アメリカで大ヒットした映画です。
カーズの主人公は、主人公であるライトニング・マックィーンです。
マックィーンは、カーズの主人公
Setting `pad_token_id` to `eos_token_id`:0 for open-end generation.
究極生命体カーズとは?
カーズとは、アメリカの漫画家、スティーブ・マックイーンによって描かれた、自動車を題材とした漫画です。
主人公のカーズは、自動車を運転する能力を持ち、自動車を運転する能力で、自動車を運転する能力で、自動車を
Setting `pad_token_id` to `eos_token_id`:0 for open-end generation.
究極生命体カーズとは?
カーズとは、映画「カーズ」に登場するキャラクターです。
映画「カーズ」は、アメリカで大ヒットした映画です。
カーズの主人公は、主人公であるレーサーのライトニング・マックィーンです。
マックィーンは
Setting `pad_token_id` to `eos_token_id`:0 for open-end generation.
究極生命体カーズとは?
カーズとは、映画「カーズ」に登場するキャラクターです。
映画「カーズ」は、車好きの少年カーと、レーサーとしての才能を持つ少女レーサーのカーとの友情を描いた作品です。
カーとレーサーの2人は
Setting `pad_token_id` to `eos_token_id`:0 for open-end generation.
究極生命体カーズとは?
カーズとは、映画「カーズ」に登場するキャラクターです。
映画「カーズ」は、1989年に公開された映画です。
この映画は、車好きの人なら誰でも知っている、車好きにはたまらない映画です。
この映画は、車
Setting `pad_token_id` to `eos_token_id`:0 for open-end generation.
究極生命体カーズとは?
カーズとは、映画「カーズ」に登場するキャラクターです。
映画「カーズ」は、1989年に公開された映画です。
この映画は、アメリカで大ヒットし、続編も製作されました。
続編は、カーズ2と3です
Setting `pad_token_id` to `eos_token_id`:0 for open-end generation.
究極生命体カーズとは?
カーズとは、映画「カーズ」に登場するキャラクターです。
主人公のレーシングカーに乗って、レースをするという、
とてもシンプルなストーリーです。
しかし、このキャラクターには、
様々な秘密が隠されています。
Setting `pad_token_id` to `eos_token_id`:0 for open-end generation.
究極生命体カーズとは?
カーズとは、映画「カーズ」に登場するキャラクターです。
映画「カーズ」は、車好きの少年カーと、レーサーとしての才能を持つ少女レーサーのカーとの友情を描いた作品です。
カーとレーサーの2人は
究極生命体カーズとは?
カーズとは、映画「カーズ」に登場するキャラクターです。
映画「カーズ」は、アメリカで大ヒットした映画です。
カーズの主人公は、主人公であるレーサーのライトニング・マックィーンです。
マックィーンは
良お~~~~しよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよし、
ファインチューニングして「質問に答える」ことができるようになったぞッ!答えが正しいかどうかは別として!
謝辞
Google Colab で PEFT による大規模言語モデルのファインチューニングを試すをめちゃくちゃ参考にしました。ありがとうございます!