見出し画像

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': '普段使いとバイクに乗るときのブーツ兼用として購入しました。見た目や履き心地は良いです。 しかし、2ヶ月履いたらゴム底が削れて無くなりました。また、バイクのシフトペダルとの摩擦で表皮が剥がれ、本革でないことが露呈しました。ちなみに防水とも書いていますが、雨の日は内部に水が染みます。 安くて見た目も良く、履きやすかったのですが、耐久性のなさ、本革でも防水でも無かったことが残念です。結局、本革の防水ブーツを買い直しました。', '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代後半でしたから、 母親に勧められて読んでみました。 内容はとても新鮮で、特に、母とのやり取りが心に深く刻まれました。 私がまだ幼かった頃の話なので、今となっては思い出せないけれど、 母は私にとても優しく
----
この映画は、非常に良い映画で、映画を見ている間に、それが何であるかについて、何かを知ることができると思います。私は、この映画が素晴らしいので、映画を見ていて、それは素晴らしいです。それは、すべての映画よりもずっとよく、それは、あなたがそれを再生する価値があるということです。それは、映画を見るのに最適な方法の一つです。このビデオには、
----
この映画は、私の青春の一部です。 すべてに感謝します! すべての素晴らしい映画ありがとう。 本当に楽しい。 私の青春の一部です。 最高! 最高に素晴らしい! 本当に素晴らしい! 私はとても好きです! 素晴らしいです! 本当に素晴らしい! 私はとても好きです! ありがとう! あなたがそれを忘れないようにしてください。
----
この映画は、とても良かったです。 素晴らしい作品をありがとうございました! また、機会があればぜひよろしくお願いします。 ありがとうございました!
この度は、ご購入頂き誠にありがとうございます。 大変嬉しいお言葉を頂戴し、ありがとうございます。 また、商品の梱包も丁寧にして頂きまして、 本当に助かりました。 本当にありがとうございます。 また機会がございましたら、どうぞ宜しくお願い致します。
----
この映画は、私の人生において本当に大きなものでした。 私が映画を見て感動した理由はたくさんありますが、一番大きかったのは、このアニメを観て、自分の人生がこんなに幸せで楽しくなれることを確信したことです。 今までに見たことのないような新しい世界が広がっていて、自分が今まで生きてきた中で、想像もしなかった人生を送ることができたこと、そして
----
この映画は、以前読んだ本の影響を受けている。 登場人物のキャラ設定や背景がとても良い。 また、絵もとても綺麗で、物語が凄く面白いです! 是非、読んで欲しい一冊です。 これから読み続けていきたいです! ありがとうございました!
素晴らしい本です。素晴らしいです。 とても気に入りました。また機会があれば購入したいと思います
----
この映画は、映画館で観たかったけど、なかなか見に行けない。 なので、この映画を観ました。 すごくよかった! ストーリーも面白いし、音楽もいい。 今まで見た中で一番よかった。 映画館で観た甲斐がありました。 最後まで目が離せない映画です。 映画館で見れるなら是非! 買って損なし
----

この映画は」の続きに、映画のポジティブ感想のみが出力されていることがわかります。

次回



この記事が気に入ったらサポートをしてみませんか?