一、マルチGPUでの学習
- 方法1:
AutoModelForCausalLM.from_pretrainedのパラメータであるdevice_mapを"auto"に変更すると、モデルとデータが複数のGPUに自動的に割り当てられます。 - 方法2: Accelerateを使用することもできます。これは分散学習ツールキットであり、基礎的な分散学習機能を提供します。これは主に手動の学習ループと連携するように設計されており、Trainerのような高レベルな抽象化とは連携しにくい傾向があります。
二、データをモデルが処理できる形式に変換
-
基礎知識 モデルに入力されるデータは処理が必要です。一般的にモデルにはチャットテンプレートがあり、
apply_chat_template関数を使用して直接処理したり、手動で処理したりできます。処理後の出力には以下のものが含まれます:input_ids: 入力シーケンスのトークンIDのリストで、モデル入力に使用されます。attention_mask: モデルが入力シーケンスを処理する際にどのトークンに注目すべきかを示すために使用されます。labels(学習時必要): 目標シーケンスのトークンIDのリスト。損失を計算する必要のないラベルは-100に設定する必要があります。
注意: モデルの目的は次のトークンを予測することであるため、ある位置のラベルの実際の値は、その位置の次のinput_idになります。しかし、一部のDataCollator(例えば
DataCollatorForLanguageModeling)はラベルを自動的に右にシフトさせるため、手動でシフトさせる必要はありません。 -
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です。
-
注意:
- この関数の出力であるattention_maskでは、パディング部分は0、それ以外は1になります。
- この関数は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|>
-
-
指示付き対話データの処理
-
単一ラウンドの対話データ
apply_chat_template関数を直接使用し、labelsを作成します。assistantの回答以外の内容を学習する必要がないため、input_idと同じ配列を作成し、systemとuserの内容のlabelsを-100に設定し、他の値は変更せず、最後に3つを出力します。- 手動設定。
モデルの対話テンプレートに従って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]
-
複数ラウンドの対話データ
- 単一ラウンドの対話と同様です。
- 単一ラウンドの対話との違いは、対話の末尾だけでなく、assistantの各回答の後にもEOSを追加する必要があることです。そうしないと、モデルは回答を停止するタイミングを学習できません。
-
-
DataCollator
DataCollatorの主な役割は、学習前にバッチ(batch)サンプルを処理し、同じ形式と長さを持つようにすることで、有効なテンソルをモデルに入力できるようにすることです。通常、学習時に呼び出されます。
ここでは一般的なDataCollatorをいくつか紹介します。-
DataCollatorForLanguageModeling
- 役割: 言語モデル化タスクに特化しており、以下を含みます:
- 因果言語モデル化:次のトークンを予測(GPTシリーズなど)
- マスク言語モデル化:マスクされたトークンを予測(BERTシリーズなど)
- 主要パラメータ:
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']を設定する必要があります。そうしないとエラーが発生します。
-
DataCollatorForSeq2Seq
- 役割: 翻訳、要約、対話生成などのシーケンス間シーケンスタスクに特化しています。ファインチューニングにはこれを使用します。各バッチ内のinput_idsとlabelsの長さを一致させる役割を果たします。
- 主要パラメータ:
tokenizer: 必須のトークナイザインスタンスmodel: オプションのモデルインスタンス(decoder_start_token_idなどを自動的に取得するために使用)padding: パディングを行うかどうか(デフォルトはTrue)max_length: 最大シーケンス長pad_to_multiple_of: パディングする倍数label_pad_token_id: labelsをパディングするためのトークンID(デフォルトは-100)return_tensors: 返されるテンソルのタイプ
-
他にもDataCollatorForTokenClassification、DataCollatorForWholeWordMask、DataCollatorWithPaddingなどがあります
-