メインコンテンツへスキップ
見出し画像

Axolotl で マルチターンの対話データセットによるLoRAファインチューニングを試す

    「Axolotl」でマルチターンの対話データセットによるLoRAファインチューニングを試したので、まとめました。

    前回

    1. 学習内容

    今回は「Axolotl」の練習として、「Llama-2-7b」を「日本語日常対話コーパス」でLoRAファインチューニングしてみます。

    2. セットアップ

    Colabでのセットアップ手順は、次のとおりです。

    (1) Colabのノートブックを開き、メニュー「編集 → ノートブックの設定」で「GPU」の「A100」を選択。

    (2) Googleドライブのマウント。
    学習データの永続化のため、Googleドライブにマウントしています。

    # Googleドライブのマウント
    from google.colab import drive
    drive.mount("/content/drive")

    (3) 作業フォルダへの移動。

    # 作業フォルダへの移動
    import os
    os.makedirs("/content/drive/My Drive/work", exist_ok=True)
    %cd '/content/drive/My Drive/work'

    (4) パッケージのインストール。

    # パッケージのインストール
    !git clone https://github.com/OpenAccess-AI-Collective/axolotl
    %cd axolotl

    (5) 「axolotl」直下の「requirements.txt」のPyTorchの設定をコメントアウト。
    Colabにインストール済みのPyTorchを利用します。

    ・requirements.txt

    # --extra-index-url https://download.pytorch.org/whl/cu118
    # --extra-index-url https://huggingface.github.io/autogptq-index/whl/cu118/
    # torch==2.0.1

    (6) パッケージのインストール。

    !pip install packaging
    !pip install -e '.[flash-attn,deepspeed]'
    !pip install -U git+https://github.com/huggingface/peft.git

    3. データセットの準備

    Colabでの「日本語日常対話コーパス」を「ShareGPTのデータセット書式」に変換します。

    (1) 「日本語日常対話コーパス」のクローン。

    !git clone https://github.com/jqk09a/japanese-daily-dialogue

    (2) 「日本語日常対話コーパス」を「ShareGPTのデータセット書式」に変換。

    import json
    
    speaker_map = {
        "A": "human",
        "B": "gpt",
    }
    
    with open("llama_finetune_train.jsonl", "w", encoding="utf-8") as fout:
        for i in range(1, 5):
            with open("japanese-daily-dialogue/data/topic" + str(i) + ".json", "r", encoding="utf-8") as fin:
                in_messages = json.load(fin)
                for in_message in in_messages:
                    # utterancesの変換
                    out_utterances = []
                    in_utterances = in_message["utterances"]
                    for in_utterance in in_utterances:
                        out_utterances.append({
                            "from": speaker_map[in_utterance["speaker"]], 
                            "value": in_utterance["utterance"]
                        })
                
                    # JSONの書き込み
                    json_line = json.dumps({"conversations": out_utterances}, ensure_ascii=False)
                    fout.write(json_line + "\n")

    「llama_finetune_train.jsonl」が生成されます。

    ・llama_finetune_train.jsonl

    {"conversations": [{"from": "human", "value": "おはようございます。今日はとても良いお天気ですね。"}, {"from": "gpt", "value": "はい。雲一つなくとても良い天気です。"}, {"from": "human", "value": "この様子だと昼から暑くなりそうですね。"}, {"from": "gpt", "value": "そうですね。お昼ご飯にはさっぱりした物が食べたくなります。"}, {"from": "human", "value": "冷やし中華などでしょうか?"}, {"from": "gpt", "value": "いいですね。よかったら一緒に食べに行きませんか?"}, {"from": "human", "value": "ぜひ行きましょう。"}]}
    {"conversations": [{"from": "human", "value": "お昼休憩ですね。今日は何を食べますか?"}, {"from": "gpt", "value": "今日はステーキが食べたい気分です。加藤さんは何が食べたいですか?"}, {"from": "human", "value": "私はハンバーグが食べたいです。"}, {"from": "gpt", "value": "では、ステーキとハンバーグの両方のメニューがあるお店を探しましょうか?"}, {"from": "human", "value": "そうですね。この先にレストランのガストがあるので、ガストへ行きましょうか?"}, {"from": "gpt", "value": "では、ガストへ行きましょう。私はドリンクバーの割引クーポンを持っているので、ドリンクバーもつけましょう。"}]}
        :

    4. 学習

    Colabでの学習手順は、次のとおりです。

    (1) 「examples/llama-2/lora.yml」の編集。

    ・データセットのパス
    パスに先程作成したJSONL、データセット種別に「sharegpt」、会話テンプレートに「llama-2」を指定します。

    datasets:
      - path: mhenrichsen/alpaca_2k_test
        type: alpaca

    ↓

    datasets:
      - path: llama_finetune_train.jsonl
        type: sharegpt
        conversation: llama-2

    ・バッチサイズ
    エポック数は4にしてみました。

    gradient_accumulation_steps: 4
    micro_batch_size: 2
    num_epochs: 4

    ↓

    gradient_accumulation_steps: 8
    micro_batch_size: 1
    num_epochs: 4

    (2) 学習の実行。

    !accelerate launch -m axolotl.cli.inference examples/llama-2/lora.yml \
        --lora_model_dir="./lora-out"

    「lora-out」に学習済みモデルが出力されます。1時間ほどかかりました。

    3. 動作確認

    (1) 推論の実行。

    !echo "[INST] おはようございます。今日はとても良いお天気ですね。 [/INST]" | python -m axolotl.cli.inference examples/llama-2/lora.yml \
        --lora_model_dir="./lora-out"

    <s> [INST] おはようございます。今日はとても良いお天気ですね。 [/INST] 晴れのち雨だそうですが、やっと週末に外出できる気分ですから楽しみです。 </s>

    日本語苦手な「Llama 2」が日本の日常会話できてるので、学習できてそうです。

    (2) マルチターンな推論の実行。

    !echo "[INST] 日本の首都は? [/INST] 東京です。</s><s> [INST] その場所の観光名所を教えて。 [/INST]" | python -m axolotl.cli.inference examples/llama-2/lora.yml \
        --lora_model_dir="./lora-out"

    <s> [INST] 日本の首都は? [/INST] 東京です。</s><s> [INST] その場所の観光名所を教えて。 [INST/] 東京には様々な観光地がありますが、お店の看板だけで大した経験があると思いますよ。今、ぜひ東京駅周辺に行ってみてください。 </s>

    「その場所」が東京であることがわかってるので良さそうです。

    関連



     
     

    npaka

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

    あなたへのおすすめ