日本語LLMが多数登場してきて、LLMで遊ぼうというモチベが上がってきたわけですが、今回は、ファインチューニング用のデータセットを改変して遊んでみたいと思います。
元のデータセット
元のデータセットとして、こちらを使います。
dataset_name = "kunishou/databricks-dolly-15k-ja"
データセットの読み込み
import transformers
from datasets import load_dataset
data = load_dataset(dataset_name)
データの形を確認
data.shape
{'train': (15015, 5)}
data
DatasetDict({
train: Dataset({
features: ['instruction', 'output', 'input', 'category', 'index'],
num_rows: 15015
})
})
データ例を確認
data["train"][0]
{'instruction': 'ヴァージン・オーストラリア航空はいつから運航を開始したのですか?',
'output': 'ヴァージン・オーストラリア航空は、2000年8月31日にヴァージン・ブルー航空として、2機の航空機で単一路線の運航を開始しました。',
'input': 'ヴァージン・オーストラリア航空(Virgin Australia Airlines Pty Ltd)はオーストラリアを拠点とするヴァージン・ブランドを冠する最大の船団規模を持つ航空会社です。2000年8月31日に、ヴァージン・ブルー空港として、2機の航空機、1つの空路を運行してサービスを開始しました。2001年9月のアンセット・オーストラリア空港の崩壊後、オーストラリアの国内市場で急速に地位を確立しました。その後はブリスベン、メルボルン、シドニーをハブとして、オーストラリア国内の32都市に直接乗り入れるまでに成長しました。',
'category': 'closed_qa',
'index': '0'}
なるほど、なるほど。
Dataset を pandas 形式に変換する
Dataset を直接改変する方法が分からなかったので、一旦 pandas 形式にします。
import pandas as pd
def dataset2dfs(dataset):
dataset_dfs = {}
for name, data in dataset.items():
dataset_dict = {}
for dat in data:
for k, v in dat.items():
if k not in dataset_dict.keys():
dataset_dict[k] = []
dataset_dict[k].append(v)
dataset_dfs[name] = pd.DataFrame(dataset_dict)
return dataset_dfs
次のように、pandas形式になりました。
dataset_dfs = dataset2dfs(data)
dataset_dfs["train"]
instruction | output | input | category | index | |
---|---|---|---|---|---|
0 | ヴァージン・オーストラリア航空はいつから運航を開始したのですか? | ヴァージン・オーストラリア航空は、2000年8月31日にヴァージン・ブルー航空として、2機の... | ヴァージン・オーストラリア航空(Virgin Australia Airlines Pty ... | closed_qa | 0 |
1 | 魚の種類はどっち?イコクエイラクブカとロープ | イコクエイラクブカ | classification | 1 | |
2 | ラクダはなぜ水なしで長く生きられるのか? | ラクダは、長時間にわたってエネルギーと水分で満たされた状態を保つために、腰の脂肪を利用しています。 | open_qa | 2 | |
3 | アリスの両親には3人の娘がいる:エイミー、ジェシー、そして三女の名前は? | 三女の名前はアリス | open_qa | 3 | |
4 | 小森田友明はいつ生まれたの? | 小森田友明は1981年7月10日に生まれました。 | 小森田は1981年7月10日、熊本県に生まれる。高校卒業後、2000年にJ1リーグのアビスパ... | closed_qa | 4 |
... | ... | ... | ... | ... | ... |
15010 | 変更を受け入れるにはどうしたらよいですか | 変化を受け入れて、違いを見る | brainstorming | 15010 | |
15011 | レーザーとは何か、誰が作ったのか? | レーザーは、電磁波源から光を放出する装置である。 最初のレーザーは、チャールズ・H・タウン... | レーザーは、電磁波の誘導放出に基づく光増幅の過程で光を放出する装置である。レーザーという言葉... | summarization | 15011 |
15012 | ロードバイクとマウンテンバイクの違いは何ですか? | ロードバイクはアスファルトやセメントの上を走ることを想定して作られており、細いタイヤが装着さ... | open_qa | 15012 | |
15013 | 不動産投資業界において、GISはどのように役立っているのでしょうか。 | 不動産投資家は、ビジネスを展開する市場や場所に関する競争力を高めるために、正確で精度の高いロ... | general_qa | 15013 | |
15014 | マスターズとは? | マスターズ・トーナメントは、毎年4月の第1週にジョージア州オーガスタのオーガスタ・ナショナル... | general_qa | 15014 |
15015 rows × 5 columns
データを改変ッ!
次のようにして! データをジョジョっぽく改変するッ!
import re
dataset_dfs["train"]["output"] = dataset_dfs["train"]["output"].replace(
"[、。]", "ッ! ", regex=True
)
dataset_dfs["train"]
instruction | output | input | category | index | |
---|---|---|---|---|---|
0 | ヴァージン・オーストラリア航空はいつから運航を開始したのですか? | ヴァージン・オーストラリア航空はッ! 2000年8月31日にヴァージン・ブルー航空としてッ!... | ヴァージン・オーストラリア航空(Virgin Australia Airlines Pty ... | closed_qa | 0 |
1 | 魚の種類はどっち?イコクエイラクブカとロープ | イコクエイラクブカ | classification | 1 | |
2 | ラクダはなぜ水なしで長く生きられるのか? | ラクダはッ! 長時間にわたってエネルギーと水分で満たされた状態を保つためにッ! 腰の脂肪を利... | open_qa | 2 | |
3 | アリスの両親には3人の娘がいる:エイミー、ジェシー、そして三女の名前は? | 三女の名前はアリス | open_qa | 3 | |
4 | 小森田友明はいつ生まれたの? | 小森田友明は1981年7月10日に生まれましたッ! | 小森田は1981年7月10日、熊本県に生まれる。高校卒業後、2000年にJ1リーグのアビスパ... | closed_qa | 4 |
... | ... | ... | ... | ... | ... |
15010 | 変更を受け入れるにはどうしたらよいですか | 変化を受け入れてッ! 違いを見る | brainstorming | 15010 | |
15011 | レーザーとは何か、誰が作ったのか? | レーザーはッ! 電磁波源から光を放出する装置であるッ! 最初のレーザーはッ! チャールズ... | レーザーは、電磁波の誘導放出に基づく光増幅の過程で光を放出する装置である。レーザーという言葉... | summarization | 15011 |
15012 | ロードバイクとマウンテンバイクの違いは何ですか? | ロードバイクはアスファルトやセメントの上を走ることを想定して作られておりッ! 細いタイヤが装... | open_qa | 15012 | |
15013 | 不動産投資業界において、GISはどのように役立っているのでしょうか。 | 不動産投資家はッ! ビジネスを展開する市場や場所に関する競争力を高めるためにッ! 正確で精度... | general_qa | 15013 | |
15014 | マスターズとは? | マスターズ・トーナメントはッ! 毎年4月の第1週にジョージア州オーガスタのオーガスタ・ナショ... | general_qa | 15014 |
15015 rows × 5 columns
output の列だけ改変したッ!
pandas 形式を Dataset に変換する
これは関数がすぐ見つかったので難なく実行
from datasets import Dataset
train_dataset = Dataset.from_pandas(dataset_dfs["train"])
from datasets import DatasetDict
data = DatasetDict(
{
"train": train_dataset,
}
)
data["train"][0]
{'instruction': 'ヴァージン・オーストラリア航空はいつから運航を開始したのですか?',
'output': 'ヴァージン・オーストラリア航空はッ! 2000年8月31日にヴァージン・ブルー航空としてッ! 2機の航空機で単一路線の運航を開始しましたッ! ',
'input': 'ヴァージン・オーストラリア航空(Virgin Australia Airlines Pty Ltd)はオーストラリアを拠点とするヴァージン・ブランドを冠する最大の船団規模を持つ航空会社です。2000年8月31日に、ヴァージン・ブルー空港として、2機の航空機、1つの空路を運行してサービスを開始しました。2001年9月のアンセット・オーストラリア空港の崩壊後、オーストラリアの国内市場で急速に地位を確立しました。その後はブリスベン、メルボルン、シドニーをハブとして、オーストラリア国内の32都市に直接乗り入れるまでに成長しました。',
'category': 'closed_qa',
'index': '0'}
日本語LLMモデルのファインチューニング
改変したモデルを用いて日本語LLMモデルのファインチューニングを行います。これは過去記事に書いたものと同じ。
model_name = "cyberagent/open-calm-large"
# パッケージのインストール
!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")
# モデルの読み込み
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-31 12:56:01.213135: 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-31 12:56:01.259208: 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-31 12:56:02.228713: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT
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
改変済みdatasetをtokenizerでmappingします
data = data.map(lambda samples: tokenizer(samples["output"]), batched=True)
Map: 0%| | 0/15015 [00:00<?, ? examples/s]
data["train"][0]
{'instruction': 'ヴァージン・オーストラリア航空はいつから運航を開始したのですか?',
'output': 'ヴァージン・オーストラリア航空はッ! 2000年8月31日にヴァージン・ブルー航空としてッ! 2機の航空機で単一路線の運航を開始しましたッ! ',
'input': 'ヴァージン・オーストラリア航空(Virgin Australia Airlines Pty Ltd)はオーストラリアを拠点とするヴァージン・ブランドを冠する最大の船団規模を持つ航空会社です。2000年8月31日に、ヴァージン・ブルー空港として、2機の航空機、1つの空路を運行してサービスを開始しました。2001年9月のアンセット・オーストラリア空港の崩壊後、オーストラリアの国内市場で急速に地位を確立しました。その後はブリスベン、メルボルン、シドニーをハブとして、オーストラリア国内の32都市に直接乗り入れるまでに成長しました。',
'category': 'closed_qa',
'index': '0',
'input_ids': [31105,
260,
286,
5409,
3023,
257,
292,
2,
25112,
287,
25,
353,
2350,
969,
31105,
260,
286,
11086,
3023,
457,
292,
2,
2725,
643,
13170,
16965,
16664,
4147,
244,
13616,
31942,
292,
2,
204],
'attention_mask': [1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1]}
改変したdatasetがちゃんとベクトルにembeddingされたことがわかりますね。便利。
それでは学習開始!
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()
<div>
<progress value='200' max='200' style='width:300px; height:20px; vertical-align: middle;'></progress>
[200/200 02:46, Epoch 0/1]
</div>
<table border="1" class="dataframe">
TrainOutput(global_step=200, training_loss=2.9730995750427245, metrics={'train_runtime': 167.2062, 'train_samples_per_second': 19.138, 'train_steps_per_second': 1.196, 'total_flos': 3035929963143168.0, 'train_loss': 2.9730995750427245, 'epoch': 0.21})
『ハギング・フェイス』ッ!
ディ・モールト ディ・モールト
(非常に 非常に) 良いぞッ!
良く学習してるぞッ!
究極生命体カーズとは
question = "究極生命体カーズとは"
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,
num_beams=5,
no_repeat_ngram_size=6,
)
print("\n\n", tokenizer.decode(output_tokens[0], skip_special_tokens=True))
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.
究極生命体カーズとはッ! ディズニー・ピクサー映画『カーズ』シリーズに登場するキャラクターであるッ! 主人公のレーシングカーでッ! レース中に事故を起こしッ! 瀕死の重傷を負うッ! しかしッ! 奇跡的に回復しッ!
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.
究極生命体カーズとはッ! ディズニー・ピクサー映画『カーズ』に登場するキャラクターであるッ! 主人公のレーシングカーでッ! レースに勝つッ!ッ! ッ! ッ! カーズ・オブ・ザ・パトリオットッ!
究極生命体カーズとはッ! ディズニー・ピクサー映画『カーズ』シリーズに登場するキャラクターですッ! 主人公のレーシングカーでッ! レース中に事故を起こしッ! 瀕死の重傷を負うッ! しかしッ! 驚異的な回復力でッ!
良お~~~~しよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよしよし、
ファインチューニングして「ジョジョっぽく答える」ことができるようになったぞッ!答えが正しいかどうかは別として!
世界(ザ・ワールド)とは
question = "世界(ザ・ワールド)とは"
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,
num_beams=5,
no_repeat_ngram_size=6,
)
print("\n\n", tokenizer.decode(output_tokens[0], skip_special_tokens=True))
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.
世界(ザ・ワールド)とはッ! アメリカ合衆国ッ! カナダッ! オーストラリアッ! ニュージーランドッ! インドッ! イギリスッ! フランスッ! ドイツッ! イタリアッ! ベルギーッ! ブラジルッ! アルゼンチンッ!
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.
世界(ザ・ワールド)とはッ! 地球(アース)ッ! 宇宙(スペース)ッ! 銀河(ギャラクシー)ッ! 銀河系(ギャラクシー・テリトリー)ッ! 太陽系(アース・テリトリー)などッ! 地球や
世界(ザ・ワールド)とはッ! アメリカ合衆国ッ! カナダッ! オーストラリアッ! ニュージーランドッ! インドッ! イギリスッ! フランスッ! ドイツッ! イタリアッ! ベルギーッ! ブラジルッ! アルゼンチンッ!
キラー・クイーンとは
question = "キラー・クイーンとは"
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,
num_beams=5,
no_repeat_ngram_size=6,
)
print("\n\n", tokenizer.decode(output_tokens[0], skip_special_tokens=True))
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.
キラー・クイーンとはッ! キング・オブ・ザ・チェス(King of the Chess)ッ! チェス・オブ・ザ・キング(Chess of the King)の略ですッ! チェス・キングはッ! チェス・クイーンよりも
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.
キラー・クイーンとはッ! キング・オブ・ザ・チェス(King of the Chess)のチャンピオンですッ! チェスではッ! キング・クイーン・ルークの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.
キラー・クイーンとはッ! キング・オブ・モヒカンッ! モヒカン・キングッ! キング・モヒカン・クイーンッ! キングモヒカン・クイーン・オブ・モヒカンのことですッ! モヒカンッ
Setting `pad_token_id` to `eos_token_id`:0 for open-end generation.
キラー・クイーンとはッ! キング・オブ・ザ・チェス(King of the Chess)ッ! チェス・オブ・ザ・キング(Chess of the King)の略ですッ! チェス・キングはッ! チェス・クイーンよりも
Setting `pad_token_id` to `eos_token_id`:0 for open-end generation.
キラー・クイーンとはッ! キング・オブ・モヒカンッ! モヒカン・キングッ! キング・モヒカン・クイーンッ! キングモヒカン・クイーン・オブ・モヒカンのことですッ! モヒカンッ
キラー・クイーンとはッ! キング・オブ・モヒカンッ! モヒカン・キングッ! キング・モヒカン・クイーンですッ! モヒカンッ! キングッ! クイーンッ! モヒカンはッ!
おまえは今まで食ったパンの枚数をおぼえているのか?
question = "おまえは今まで食ったパンの枚数をおぼえているのか?"
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,
num_beams=5,
no_repeat_ngram_size=6,
)
print("\n\n", tokenizer.decode(output_tokens[0], skip_special_tokens=True))
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.
おまえは今まで食ったパンの枚数をおぼえているのか?ッ!ッ! ッ! ッ! ッ! ッ! ッ! っ! ッ! っ! ッ! っ! ッ! ッ!
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.
おまえは今まで食ったパンの枚数をおぼえているのか?ッ! ッ! ッ! パンは何枚あるのかッ!ッ! ッ! そしてッ! 何枚のパンを食べたのかッ!ッ! パンは何個ッ! 何枚ッ! 何個のパ
おまえは今まで食ったパンの枚数をおぼえているのか?ッ!ッ! ッ! ッ! ッ! ッ! ッ! っ! ッ! っ! ッ! っ! っ! っ!
わたしってどうしてこう…変な男ばかり寄ってくるのでしょう
question = "わたしってどうしてこう…変な男ばかり寄ってくるのでしょう"
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,
num_beams=5,
no_repeat_ngram_size=6,
)
print("\n\n", tokenizer.decode(output_tokens[0], skip_special_tokens=True))
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.
わたしってどうしてこう...変な男ばかり寄ってくるのでしょうねッッッッッッ! ッ! ッ! おそらくッ! ッ! 私の人生はッ! 私が望んだものではなかったのでしょうッ! ッ! しかしッ! ッ! 今の私はッ!
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.
わたしってどうしてこう...変な男ばかり寄ってくるのでしょうねッッッッッッ! ッ! ッ! おそらくッ! ッ! この男たちはッ! 私のことが好きなのでしょうッ! ッ! 私はッ! この男たちを愛しているッ! ッ! しかし
わたしってどうしてこう...変な男ばかり寄ってくるのでしょうねッッッッッッ! ッ! ッ! おそらくッ! ッ! 私の人生はッ! 私が望んだものではなかったのでしょうッ! ッ! しかしッ! ッ! 今の私はッ!
あ...ありのまま今起こったことを話すぜ!
question = "あ...ありのまま今起こったことを話すぜ!"
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,
num_beams=5,
no_repeat_ngram_size=6,
)
print("\n\n", tokenizer.decode(output_tokens[0], skip_special_tokens=True))
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.
あ...ありのまま今起こったことを話すぜ!ッ! 俺はッ! 昨夜ッ! 仕事から帰宅してッ! シャワーを浴びてッ! ベッドに横になったんだッ! するとッ! 突然ッ! 心臓の鼓動が激しくなりッ!
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.
あ...ありのまま今起こったことを話すぜ! ッ! 俺はッ! 昨日ッ! 仕事から帰宅したッ! するとッ! 突然ッ! 妻ッ! 娘ッ! 息子ッ! 孫ッ! 猫ッ! 犬ッ!
あ...ありのまま今起こったことを話すぜ!ッ! 俺はッ! 昨夜ッ! 妻ッ! 娘ッ! 息子ッ! 孫ッ! ペットッ! 猫ッ! 犬ッ! 犬ッ!猫ッ!犬ッ!猫ッ!
この岸辺露伴が金やちやほやされるためにマンガを描いていると思っていたのか
question = "この岸辺露伴が金やちやほやされるためにマンガを描いていると思っていたのか"
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,
num_beams=5,
no_repeat_ngram_size=6,
)
print("\n\n", tokenizer.decode(output_tokens[0], skip_special_tokens=True))
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.
この岸辺露伴が金やちやほやされるためにマンガを描いていると思っていたのかッ! ッ! ッ! マンガはッ! フィクションであるッ! ッ! しかしッ! マンガはフィクションでありッ! フィクションはフィクションであるッ! フィクションはッ! フィクションでありッ! 現実
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.
この岸辺露伴が金やちやほやされるためにマンガを描いていると思っていたのかッ!ッ! ッ! ッ! そしてッ! ッ! マンガを描くことでッ! 自分自身を表現したかったのかッ! ッ! またッ! マンガを書くことでッ! 自分を表現したかったのかッ! マンガ
この岸辺露伴が金やちやほやされるためにマンガを描いていると思っていたのかッ!ッ!ッ! ッ! ッ! そしてッ! ッ! マンガを描くためにッ! 金を稼ごうとしていたのかッ! それともッ! 金を稼ぐためにマンガを描こうとしていたのかッ! ッ!
答えろよ。質問はすでに…『拷問』に変わっているんだぜ
question = "答えろよ。質問はすでに…『拷問』に変わっているんだぜ"
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,
num_beams=5,
no_repeat_ngram_size=6,
)
print("\n\n", tokenizer.decode(output_tokens[0], skip_special_tokens=True))
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.
答えろよ。質問はすでに...『拷問』に変わっているんだぜッ! ッ! 質問はッ! 質問でッ! 質問は質問だッ! 質問とはッ! 質問に答えることだッ! 質問は質問に答えることであるッ! 質問は...質問であるッ!
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.
答えろよ。質問はすでに...『拷問』に変わっているんだぜッ! ッ! 質問はッ! 質問ではなくッ! 質問であるッ! 質問は質問ではないッ! 質問は答えではないッ! 質問とはッ! 答えではないッ! 答えであるッ!
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.
答えろよ。質問はすでに...『拷問』に変わっているんだぜッ! ッ! 質問はッ! 質問ではなくッ! 質問ですッ! 質問は質問ではありませんッ! 質問とはッ! 質問と質問の間にあるッ! 質問の「間」ですッ!
答えろよ。質問はすでに...『拷問』に変わっているんだぜッ! 質問はッ! 質問ではなくッ! 質問であるッ! 質問とはッ! 質問に答えることであるッ! 質問に答えるとはッ! 質問を答えることであるッ! 質問にはッ! 質問と質問
最後に
データセットの作り方(改変の仕方)は分かりました。あとは、プロンプトチューニングをもっと工夫したほうがよさそうっすねw