Loraモデルのファインチューニングにおける重要な注意点

一、マルチGPUでの学習

  • 方法1: AutoModelForCausalLM.from_pretrainedのパラメータであるdevice_mapを"auto"に変更すると、モデルとデータが複数のGPUに自動的に割り当てられます。
  • 方法2: Accelerateを使用することもできます。これは分散学習ツールキットであり、基礎的な分散学習機能を提供します。これは主に手動の学習ループと連携するように設計されており、Trainerのような高レベルな抽象化とは連携しにくい傾向があります。

二、データをモデルが処理できる形式に変換

  1. 基礎知識 モデルに入力されるデータは処理が必要です。一般的にモデルにはチャットテンプレートがあり、apply_chat_template関数を使用して直接処理したり、手動で処理したりできます。処理後の出力には以下のものが含まれます:

    • input_ids: 入力シーケンスのトークンIDのリストで、モデル入力に使用されます。
    • attention_mask: モデルが入力シーケンスを処理する際にどのトークンに注目すべきかを示すために使用されます。
    • labels(学習時必要): 目標シーケンスのトークンIDのリスト。損失を計算する必要のないラベルは-100に設定する必要があります。

    注意: モデルの目的は次のトークンを予測することであるため、ある位置のラベルの実際の値は、その位置の次のinput_idになります。しかし、一部のDataCollator(例えばDataCollatorForLanguageModeling)はラベルを自動的に右にシフトさせるため、手動でシフトさせる必要はありません。

  2. tokenizer.apply_chat_template関数 これはチャット形式の対話データをモデルが処理できる入力形式に変換するために使用されます。モデルによって出力形式が異なります。

    • パラメータ説明:

      • messages: 対話のリスト。各要素はrole(system/user/assistant)とcontent(テキスト内容)を含む辞書です。
      • tokenize: トークン化を直接実行するかどうか(デフォルトはTrue、トークンIDを返します;Falseの場合はフォーマット化された文字列を返します)。
      • add_generation_prompt: 生成プロンプトを追加するかどうか(デフォルトはFalse)、推論時にはTrueに設定する必要があります。
      • return_tensors: 返されるテンソルの形式("pt"はPyTorch、"tf"はTensorFlow用)。
      • truncation=True: 入力テキストの長さがmax_lengthを超えた場合、超過部分を自動的に切り捨てます。
      • max_length: テキストの最大長を設定します。
      • padding: パディング方法を設定します。オプションはmax_length、False、longestです。
    • 注意:

      1. この関数の出力であるattention_maskでは、パディング部分は0、それ以外は1になります。
      2. この関数はlabelsを出力しないため、学習時には必要に応じて手動で設定する必要があります。
    • 異なるモデルの例: deepseek-ai/deepseek-llm-67b-chat:

      <|begin▁of▁sentence|>あなたは親切なアシスタントです。
      User: こんにちは、あなたの名前は何ですか?
      Assistant: 私はDeepSeekアシスタントです、お手伝いできて嬉しいです!<|end▁of▁sentence|
      
      

      Qwen/Qwen1.5-7B-Chat:

      <|im_start|>system
      あなたは親切なアシスタントです。<|im_end|>
      <|im_start|>user
      こんにちは、あなたの名前は何ですか?<|im_end|>
      <|im_start|>assistant
      私はDeepSeekアシスタントです、お手伝いできて嬉しいです!<|im_end|>
      
      
  3. 指示付き対話データの処理

    1. 単一ラウンドの対話データ

      1. apply_chat_template関数を直接使用し、labelsを作成します。assistantの回答以外の内容を学習する必要がないため、input_idと同じ配列を作成し、systemとuserの内容のlabelsを-100に設定し、他の値は変更せず、最後に3つを出力します。
      2. 手動設定。
        モデルの対話テンプレートに従って3つを手動で設定します。この際、対話の末尾にeos_tokenを追加する必要があります。EOSのlabelは-100に設定し、maskは1に設定する必要があります(EOSの生成を学習する必要があるため、そうしないとEOSを生成するタイミングを学習できません)。EOSのinput_idはtokenizer.eos_token_idです。多くのモデルではEOSとPADのIDは同じです。
        例:
        input_ids, attention_mask, labels = [], [], []
        instruction = tokenizer(f"User: {example['instruction']+example['input']}\n\n", add_special_tokens=False)  # add_special_tokens で先頭にspecial_tokensを追加しない
        response = tokenizer(f"Assistant: {example['output']}", add_special_tokens=False)
        input_ids = instruction["input_ids"] + response["input_ids"] + [tokenizer.pad_token_id]
        attention_mask = instruction["attention_mask"] + response["attention_mask"] + [1] 
        labels = [-100] * len(instruction["input_ids"]) + response["input_ids"] + [tokenizer.pad_token_id]
        
        
    2. 複数ラウンドの対話データ

      1. 単一ラウンドの対話と同様です。
      2. 単一ラウンドの対話との違いは、対話の末尾だけでなく、assistantの各回答の後にもEOSを追加する必要があることです。そうしないと、モデルは回答を停止するタイミングを学習できません。
  4. DataCollator
    DataCollatorの主な役割は、学習前にバッチ(batch)サンプルを処理し、同じ形式と長さを持つようにすることで、有効なテンソルをモデルに入力できるようにすることです。通常、学習時に呼び出されます。
    ここでは一般的なDataCollatorをいくつか紹介します。

    1. DataCollatorForLanguageModeling

      1. 役割: 言語モデル化タスクに特化しており、以下を含みます:
      • 因果言語モデル化:次のトークンを予測(GPTシリーズなど)
      • マスク言語モデル化:マスクされたトークンを予測(BERTシリーズなど)
      1. 主要パラメータ:
        • tokenizer: 必須のトークナイザインスタンス
        • mlm: マスク言語モデル化を使用するかどうか。Falseの場合は因果言語モデル化を使用します。
        • mlm=False(因果LM)の場合:labelはinput_idと同じになり、自分でlabelsを設定しても上書きされます。labelsを自動的に左に1つシフトし、最後のトークンをマスクします。
        • mlm=True(マスクLM)の場合:15%のトークンをランダムに選択してマスクします(80%が[MASK]、10%がランダムトークン、10%がそのまま)。
        • mlm_probability: mlm=Trueの場合のトークンがマスクされる確率(デフォルトは0.15)
        • pad_to_multiple_of: シーケンス長をこの値の倍数にパディング(一部のハードウェアの高速化に役立ちます)
        • return_tensors: 返されるテンソルのタイプ(通常は"pt"(PyTorch))
        • padding: パディング方法。新しいバージョンでは廃止され、デフォルトで最長シーケンスにパディングされます。パディング方法を設定する必要がある場合は、DataCollatorWithPaddingと組み合わせて使用する必要があります。 注意: データに列がある場合は、remove_columns=['xxxx']を設定する必要があります。そうしないとエラーが発生します。
    2. DataCollatorForSeq2Seq

      1. 役割: 翻訳、要約、対話生成などのシーケンス間シーケンスタスクに特化しています。ファインチューニングにはこれを使用します。各バッチ内のinput_idsとlabelsの長さを一致させる役割を果たします。
      2. 主要パラメータ:
        • tokenizer: 必須のトークナイザインスタンス
        • model: オプションのモデルインスタンス(decoder_start_token_idなどを自動的に取得するために使用)
        • padding: パディングを行うかどうか(デフォルトはTrue)
        • max_length: 最大シーケンス長
        • pad_to_multiple_of: パディングする倍数
        • label_pad_token_id: labelsをパディングするためのトークンID(デフォルトは-100)
        • return_tensors: 返されるテンソルのタイプ
    3. 他にもDataCollatorForTokenClassification、DataCollatorForWholeWordMask、DataCollatorWithPaddingなどがあります

タグ: LoRa モデルファインチューニング 分散学習 トークナイズ DataCollator

6月30日 22:43 投稿