7
2

More than 1 year has passed since last update.

ジョジョの奇妙なLLMファインチューニング - おれはデータセットを改変するッ! -

Posted at

日本語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">
Step Training Loss 1 3.744500 2 3.485400 3 3.043900 4 3.352300 5 3.091100 6 3.414000 7 3.550700 8 3.615200 9 3.346200 10 3.050800 11 3.291500 12 3.969400 13 3.233800 14 3.498900 15 3.418600 16 3.183100 17 2.971000 18 3.249000 19 3.420900 20 3.974600 21 3.323400 22 3.198400 23 3.615500 24 3.458300 25 3.156400 26 3.360800 27 3.155600 28 3.300600 29 3.091700 30 3.492300 31 3.130400 32 3.395600 33 3.443100 34 3.211700 35 2.913000 36 2.746500 37 3.619400 38 3.075500 39 3.030500 40 3.565400 41 3.089800 42 3.141500 43 3.012900 44 3.268500 45 2.787700 46 3.144300 47 3.400400 48 3.485600 49 3.082400 50 3.293000 51 3.170900 52 3.130900 53 2.913600 54 3.326400 55 3.271200 56 2.995100 57 2.815700 58 3.019700 59 3.043700 60 3.053400 61 2.929100 62 3.062400 63 3.600700 64 3.112700 65 2.894200 66 3.055300 67 2.849400 68 3.140600 69 3.204100 70 3.146100 71 2.720300 72 3.226300 73 2.930700 74 3.041700 75 3.067600 76 2.654800 77 2.944000 78 2.805500 79 2.789600 80 3.256700 81 2.821500 82 2.769900 83 2.965400 84 2.926000 85 2.665900 86 3.193600 87 3.062500 88 3.092900 89 2.910400 90 2.980500 91 3.126800 92 2.926700 93 3.087500 94 3.033800 95 2.859600 96 2.608300 97 2.808900 98 2.917700 99 2.891600 100 2.864800 101 3.108500 102 2.459300 103 3.025400 104 2.995300 105 2.954400 106 3.050000 107 2.828800 108 3.038600 109 2.860900 110 2.579900 111 3.011900 112 2.757100 113 3.054600 114 2.825600 115 2.914300 116 2.838500 117 2.765500 118 2.641700 119 2.934300 120 3.043800 121 2.776800 122 2.930200 123 2.933500 124 2.635900 125 2.833400 126 3.286300 127 2.749200 128 2.937100 129 2.908400 130 2.593100 131 2.775800 132 2.706600 133 3.073800 134 2.762800 135 2.629100 136 2.661000 137 2.745100 138 2.516200 139 2.913700 140 2.400900 141 2.918700 142 2.984800 143 2.583800 144 2.665300 145 2.952000 146 2.714100 147 2.819600 148 2.724000 149 3.040800 150 2.848000 151 2.807800 152 2.615900 153 2.836900 154 2.985300 155 2.957300 156 2.489300 157 2.684400 158 2.778100 159 2.879200 160 2.878800 161 2.783100 162 2.723100 163 2.590600 164 2.498400 165 2.507900 166 2.703400 167 3.170900 168 2.752000 169 2.814100 170 3.165400 171 2.697300 172 2.858500 173 2.756000 174 2.472000 175 2.727700 176 2.611100 177 2.765700 178 2.969800 179 2.947100 180 2.977800 181 2.667000 182 2.685700 183 2.693900 184 2.754600 185 2.635500 186 2.694500 187 2.933300 188 2.703100 189 2.910300 190 2.911400 191 2.762000 192 2.788600 193 2.638600 194 2.652700 195 2.548200 196 2.915100 197 2.777800 198 3.004600 199 2.700200 200 2.547700

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

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2