メむンコンテンツぞスキップ
芋出し画像

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': '普段䜿いずバむクに乗るずきのブヌツ兌甚ずしお賌入したした。芋た目や履き心地は良いです。 しかし、ヶ月履いたらゎム底が削れお無くなりたした。たた、バむクのシフトペダルずの摩擊で衚皮が剥がれ、本革でないこずが露呈したした。ちなみに防氎ずも曞いおいたすが、雚の日は内郚に氎が染みたす。 安くお芋た目も良く、履きやすかったのですが、耐久性のなさ、本革でも防氎でも無かったこずが残念です。結局、本革の防氎ブヌツを買い盎したした。', '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代埌半でしたから、 母芪に勧められお読んでみたした。 内容はずおも新鮮で、特に、母ずのやり取りが心に深く刻たれたした。 私がただ幌かった頃の話なので、今ずなっおは思い出せないけれど、 母は私にずおも優しく
    ----
    この映画は、非垞に良い映画で、映画を芋おいる間に、それが䜕であるかに぀いお、䜕かを知るこずができるず思いたす。私は、この映画が玠晎らしいので、映画を芋おいお、それは玠晎らしいです。それは、すべおの映画よりもずっずよく、それは、あなたがそれを再生する䟡倀があるずいうこずです。それは、映画を芋るのに最適な方法の䞀぀です。このビデオには、
    ----
    この映画は、私の青春の䞀郚です。 すべおに感謝したす! すべおの玠晎らしい映画ありがずう。 本圓に楜しい。 私の青春の䞀郚です。 最高! 最高に玠晎らしい! 本圓に玠晎らしい! 私はずおも奜きです! 玠晎らしいです! 本圓に玠晎らしい! 私はずおも奜きです! ありがずう! あなたがそれを忘れないようにしおください。
    ----
    この映画は、ずおも良かったです。 玠晎らしい䜜品をありがずうございたした! たた、機䌚があればぜひよろしくお願いしたす。 ありがずうございたした!
    この床は、ご賌入頂き誠にありがずうございたす。 倧倉嬉しいお蚀葉を頂戎し、ありがずうございたす。 たた、商品の梱包も䞁寧にしお頂きたしお、 本圓に助かりたした。 本圓にありがずうございたす。 たた機䌚がございたしたら、どうぞ宜しくお願い臎したす。
    ----
    この映画は、私の人生においお本圓に倧きなものでした。 私が映画を芋お感動した理由はたくさんありたすが、䞀番倧きかったのは、このアニメを芳お、自分の人生がこんなに幞せで楜しくなれるこずを確信したこずです。 今たでに芋たこずのないような新しい䞖界が広がっおいお、自分が今たで生きおきた䞭で、想像もしなかった人生を送るこずができたこず、そしお
    ----
    この映画は、以前読んだ本の圱響を受けおいる。 登堎人物のキャラ蚭定や背景がずおも良い。 たた、絵もずおも綺麗で、物語が凄く面癜いです! 是非、読んで欲しい䞀冊です。 これから読み続けおいきたいです! ありがずうございたした!
    玠晎らしい本です。玠晎らしいです。 ずおも気に入りたした。たた機䌚があれば賌入したいず思いたす
    ----
    この映画は、映画通で芳たかったけど、なかなか芋に行けない。 なので、この映画を芳たした。 すごくよかった! ストヌリヌも面癜いし、音楜もいい。 今たで芋た䞭で䞀番よかった。 映画通で芳た甲斐がありたした。 最埌たで目が離せない映画です。 映画通で芋れるなら是非! 買っお損なし
    ----

    「この映画は」の続きに、映画のポゞティブ感想のみが出力されおいるこずがわかりたす。

    次回



     
     

    npaka

     
     
    プログラマヌ。iPhone / Android / Unity / ROS / AI / AR / VR / RasPi / ロボット / ガゞェット。幎2冊ペヌスで技術曞を執筆。アニ゜ン / カラオケ / ギタヌ / 猫 twitter : @npaka123

    あなたぞのおすすめ