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

Alpaca たずめ

    「Alpaca」の孊習方法に぀いお軜くたずめたした。

    1. Alpaca

    「Alpaca」は、「LLaMA 7B」(Meta)をファむンチュヌニングした蚀語モデルです。「text-davinci-003」による「self-instruct」で生成された52Kの呜什远埓型の孊習デヌタを䜿っお孊習しおいたす。「Alpaca」はOpenAIの「text-davinci-003」に䌌た挙動を瀺したすが、驚くほど小さく再珟が容易で安䟡であるこずが特城です。

    たた、「Alpaca」は孊術研究のみを目的ずしおおり、商甚利甚は犁止しおいたす。

    2. 孊習枈み蚀語モデル ず 孊習デヌタ

    アカデミックな予算で高品質な蚀語モデルを孊習させるためには、「匷力な孊習枈み蚀語モデル」ず「高品質な孊習デヌタ」が必芁です。

    1぀目は、最近リリヌスされたMetaの「LLaMA」で解決されたす。2぀目は、「self-instruct」の手法で、既存の匷力な蚀語モデルを䜿甚しお、呜什デヌタを自動生成するこずを提案したす。

    「Alpaca」は、OpenAIの「text-davinci-003」で生成した52Kの呜什远埓型の孊習デヌタを䜿っお、「LLaMA 7B」をファむンチュヌニングしたモデルになりたす。

    3. 孊習の流れ

    䞋図は、「Alpaca」の孊習の流れを瀺しおいたす。デヌタに぀いおは、「self-instruct」の手法をベヌスに、呜什远埓型の孊習デヌタを䜜成したした。たず、「self-instruct」のシヌドセットから、人間が曞いた175の呜什ず出力のペアを甚意したした。その埌、「text-davinci-003」に、シヌドセットを文脈䞊の䟋ずしお、さらに呜什を生成するように促したした。生成パむプラむンを簡略化するこずで、「self-instruct」を改良し詳现はGitHubを参照、コストを倧幅に削枛したした。その結果、OpenAI APIを䜿甚しお500ドル未満のコストで、52Kのナニヌクな呜什ずそれに察応する出力が生成できたした。

    画像

    この呜什远埓型デヌタセットを甚いお、HuggingFaceの孊習フレヌムワヌクを䜿甚しお、「LLaMA」をファむンチュヌニングしたした。7Bの「LLaMA」のファむンチュヌニングには、80GBのA100を8台䜿甚しお3時間かかりたした。これは、ほずんどのクラりドコンピュヌティングプロバむダヌで100ドル以䞋のコストになりたす。

    4. 公開アセット

    以䞋のアセットが公開されおたす。

    ・デモ : 「Alpaca」を䜓隓できるむンタラクティブなデモ
    ・孊習デヌタ : 「Alpaca」のファむンチュヌニングに䜿甚したデヌタ (52K)
    ・孊習デヌタ生成コヌド : 孊習デヌタを生成するためのコヌド。
    ・孊習コヌド : 「Alpaca」をファむンチュヌニングするためのコヌド。

    以䞋のアセットも今埌公開予定になっおいたす。

    ・モデルの重み : モデルの重みを公開するためのガむダンスを埗るためMetaに連絡を取っおたす。

    5. 孊習デヌタ

    「alpaca_data.json」には、「Alpaca」のファむンチュヌニングに䜿甚した 52K の呜什远埓型の孊習デヌタが含たれおいたす。 このJSONは蟞曞のリストで、各蟞曞には次のフィヌルドが含たれおいたす。

    ・instruction: str - モデルが実行すべきタスクを蚘述。52Kの指瀺はナニヌク。
    ・input: str - タスクのオプションのコンテキストたたは入力。たずえば、指瀺が「次の蚘事を芁玄」の堎合、入力は蚘事。䟋の玄40%には入力がある。
    ・output: str - 「text-davinci-003」によっお生成された指瀺に察する回答。

    「Alpaca」のファむンチュヌニングには、次のプロンプトを䜿甚しおいたす。

    ・空でない入力フィヌルドの䟋

    Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request.
    
    ### Instruction:
    {instruction}
    
    ### Input:
    {input}
    
    ### Response:

    以䞋は、タスクを説明する呜什ず、さらなるコンテキストを提䟛する入力の組み合わせです。芁求を適切に満たすような応答を曞きなさい。

    ・空の入力フィヌルドの䟋

    Below is an instruction that describes a task. Write a response that appropriately completes the request.
    
    ### Instruction:
    {instruction}
    
    ### Response:

    以䞋は、タスクを説明する呜什です。 芁求を適切に完了する応答を䜜成したす。

    6. 孊習デヌタ生成

    6-1. 実行手順

    (1) 環境倉数「OPENAI_API_KEY」に「OpenAI APIキヌ」を蚭定。
    (2) 䟝存関係のむンストヌル。

    $ pip install -r requirements.txt

    (3) 孊習デヌタ生成コヌドを実行。
    孊習デヌタが生成されたす。

    $ python -m generate_instruction generate_instruction_following_data

    6-2. 詳现

    「self-instruct」のデヌタ生成パむプラむンをベヌスに、次のような修正を加えおいたす。

    ・孊習デヌタ生成にdavinciの代わりにtext-davinci-003を䜿甚。
    ・孊習デヌタ生成の芁件をtext-davinci-003に明瀺的に䞎える新しいプロンプト(prompt.txt)を曞いた。
    (泚意 : 䜿甚したプロンプトには若干の誀りがあったため、今埌䜿甚する方は#24の線集を取り入れるこず)
    ・20個の孊習デヌタを䞀床に生成するずいう、より積極的なバッチデコヌドを採甚し、孊習デヌタ生成のコストを倧幅に削枛。
    ・分類指瀺ず非分類指瀺の違いを捚おお、デヌタ生成パむプラむンを簡略化。
    2〜3個のむンスタンスを生成するのではなく、各孊習デヌタに察しお1個のむンスタンスしか生成しない。

    これにより、500ドル以䞋の䜎コストで、52K個の孊習デヌタが埗られたした。予備的な調査ずしお、52K個の呜什デヌタがself-instructが公開したデヌタよりもはるかに倚様であるこずを発芋したした。䞋図は、self-instructの論文にある図2のスタむルで、デヌタの倚様性を瀺すためにプロットしたものです。図䞭の内偎の円は指瀺の根本動詞、倖偎の円は盎接の目的語を衚しおいたす。

    画像

    7. ファむンチュヌニング

    7-1. ハむパヌパラメヌタ

    暙準的なHugging Faceの孊習コヌドを甚いお、以䞋のハむパヌパラメヌタでモデルのファむンチュヌニングを行いたした。

    ◎ ハむパヌパラメヌタ
    ・Batch size : 128
    ・Learning rate : 2e-5
    ・Epochs : 3
    ・Max length : 512
    ・Weight decay : 0

    7-2. 実行手順

    Hugging FaceがLLaMAモデルを公匏にサポヌトしおいないため、特定のフォヌク぀たりマヌゞされるこのPRからむンストヌルするこずで、Hugging Face TransformersでLLaMAをファむンチュヌニングしたした。むンストヌルした特定のコミットのハッシュは以䞋です。

    68d640f7c368bcaaaecfc678f11908ebbd3d6176

    LLaMAのファむンチュヌニングを再珟するために、䟝存関係をむンストヌルしたす。

    $ pip install -r requirements.txt

    「Hugging Face Transformers」の特定のフォヌクをむンストヌルしたす。

    以䞋は、FSDP full_shardモヌドで4぀のA100 80G GPUを搭茉したマシンで、我々のデヌタセットを䜿っおLLaMA-7Bをファむンチュヌニングするコマンドです。Python 3.10を䜿甚した以䞋のコマンドで、デモでホストしたモデルず同様の品質のモデルを再珟するこずができたした。<your_random_port>を自分のポヌト、<your_path_to_hf_converted_llama_ckpt_and_tokenizer>を倉換したチェックポむントずトヌクナむザぞのパス、<your_output_dir>を出力を保存したい堎所に眮き換えたす。

    $ torchrun --nproc_per_node=4 --master_port=<your_random_port> train.py \
        --model_name_or_path <your_path_to_hf_converted_llama_ckpt_and_tokenizer> \
        --data_path ./alpaca_data.json \
        --bf16 True \
        --output_dir <your_output_dir> \
        --num_train_epochs 3 \
        --per_device_train_batch_size 4 \
        --per_device_eval_batch_size 4 \
        --gradient_accumulation_steps 8 \
        --evaluation_strategy "no" \
        --save_strategy "steps" \
        --save_steps 2000 \
        --save_total_limit 1 \
        --learning_rate 2e-5 \
        --weight_decay 0. \
        --warmup_ratio 0.03 \
        --lr_scheduler_type "cosine" \
        --logging_steps 1 \
        --fsdp "full_shard auto_wrap" \
        --fsdp_transformer_layer_cls_to_wrap 'LLaMADecoderLayer' \
        --tf32 True

    7-3. 泚意点

    fsdp_transformer_layer_cls_to_wrap は、特定のデコヌダ局の名前に蚭定する必芁がありたす。LLaMA HuggingFace PR は安定したせん。以前のコミットでは、デコヌダヌレむダヌにLLaMADecoderLayer ずいう名前が䜿甚されおいたした (コヌドのコミットハッシュはこれに基づいおいたす)。 最近のコミットでは LlamaDecoderLayerが䜿甚されおいたす (倧文字ず小文字の違いに泚意しおください)。 fsdp_transformer_layer_cls_to_wrap を正しい名前に蚭定しないず、トレヌニングが倧幅に遅くなりたす。

    7-4. 補足事項

    同じスクリプトがOPTのファむンチュヌニングにも機胜したす。以䞋は、OPT-6.7Bのファむンチュヌニングの䟋です。

    $ torchrun --nproc_per_node=4 --master_port=<your_random_port> train.py \
        --model_name_or_path "facebook/opt-6.7b" \
        --data_path ./alpaca_data.json \
        --bf16 True \
        --output_dir <your_output_dir> \
        --num_train_epochs 3 \
        --per_device_train_batch_size 4 \
        --per_device_eval_batch_size 4 \
        --gradient_accumulation_steps 8 \
        --evaluation_strategy "no" \
        --save_strategy "steps" \
        --save_steps 2000 \
        --save_total_limit 1 \
        --learning_rate 2e-5 \
        --weight_decay 0. \
        --warmup_ratio 0.03 \
        --lr_scheduler_type "cosine" \
        --logging_steps 1 \
        --fsdp "full_shard auto_wrap" \
        --fsdp_transformer_layer_cls_to_wrap 'OPTDecoderLayer' \
        --tf32 True

    䞎えられた孊習スクリプトは、シンプルで䜿いやすいように意図されおおり、特に最適化されおいないこずに泚意しおください。より倚くのGPUで実行するには、gradient_accumulation_steps を䞋げお、Global Batch Sizeを128に保぀こずをお勧めしたす。Global Batch Sizeは、最適性に぀いおテストされおいたせん。

    関連



     
     

    npaka

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

    あなたぞのおすすめ