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

LLMのファインチューニングのためのツール Axolotl

    LLMのファインチューニングのためのツール「Axolotl」の概要をまとめました。

    1. Axolotl

    「Axolotl」は、LLMのファインチューニングのためのツールです。様々なLLM、データセット形式、アーキテクチャをサポートします。

    ・「LLaMA」「Pythia」「Falcon」「MPT」などの様々なHuggingFaceモデルを学習
    ・「Full Finetune」「Lora」「Kalora」Relora」「Guptak」をサポート
    ・単純なyamlやCLIオーバーライドで構成をカスタマイズ
    ・様々なデータセット形式をロードしたり、カスタム形式を使用したり、独自のトークン化されたデータセットを使用可能
    ・「xFormer」「Flash attention」「Rope scaling」「MultiPacking」と統合
    ・「FSDP」または「DeepSpeed」を介して単一GPUまたは複数GPUで動作
    ・ローカルまたはクラウド上でDockerを簡単に実行
    ・結果とオプションでチェックポイントをwandbに記録

    2. Axolotlのサポート

    画像

    3. クイックスタート

    ・要件: Python以降、Pytorch 2.0以降

    # インストール
    git clone https://github.com/OpenAccess-AI-Collective/axolotl
    cd axolotl
    
    pip3 install packaging
    pip3 install -e '.[flash-attn,deepspeed]'
    pip3 install -U git+https://github.com/huggingface/peft.git
    
    # ファインチューニング LoRA
    accelerate launch -m axolotl.cli.train examples/openllama-3b/lora.yml
    
    # 推論
    accelerate launch -m axolotl.cli.inference examples/openllama-3b/lora.yml \
        --lora_model_dir="./lora-out"

    4. インストール

    4-1. Docker

    docker run --gpus '"all"' --rm -it winglian/axolotl:main-py3.10-cu118-2.0.1

    ・winglian/axolotl-runpod:main-latest : runpod または direct linkを使用

    または、開発用にカレントファイルに対して実行。

    docker compose up -d

    高度な使用方法は公式ドキュメント参照。

    4-2. conda / pip

    (1) Python 3.9以降 をインストール
    (2) Pytorch (https://pytorch.org/get-started/locally/) をインストール。
    (3) Axolotl をインストール

    pip3 install packaging
    pip3 install -e '.[flash-attn,deepspeed]'

    4-3. Windows

    WSLまたはDockerを利用。

    5. データセット

    「Axolotl」は様々なデータセット形式をサポートしています。
    以下に使用できる形式の一部を示します (JSONL推奨)。

    5-1. instruction形式 (alpacaなど)

    「input」はオプションです。

    {"instruction": "...", "input": "...", "output": "..."}

    5-2. conversations形式 (sharegptなど)

    「from」は「human」「gpt」です。

    {"conversations": [{"from": "...", "value": "..."}]}

    5-3. rawコーパス (completionなど)

    {"text": "..."}

    他のフォーマットは公式ドキュメント参照。

    5-4. カスタムプロンプトの追加方法

    指示目的で前処理されたデータセットの場合。

    {"instruction": "...", "output": "..."}

    この例は YAML 構成で使用できます。

    datasets:
      - path: repo
        type:
          system_prompt: ""
          field_system: system
          format: "[INST] {instruction} [/INST]"
          no_input_format: "[INST] {instruction} [/INST]"

    5-5. 事前にトークン化されたカスタムデータセットの使用方法

    ・「type:」を渡さないでください。
    ・データセット内の列は、正確に input_ids、attention_mask、label である必要があります。

    6. コンフィグ

    最も重要なオプションは次のとおりです。

    6-1. model

    base_model: ./llama-7b-hf # ローカルまたはHuggingFaceリポジトリ

    6-2. dataset

    sequence_len: 2048 # プロンプトの最大トークン長
    
    # HuggingFaceリポジトリ
    datasets:
      - path: vicgalle/alpaca-gpt4
        type: alpaca # 先ほどのフォーマット
    
    # 特定のコンフィグ/サブセットを含むHuggingFaceリポジトリ
    datasets:
      - path: EleutherAI/pile
        name: enron_emails
        type: completion # 先ほどのフォーマット
        field: text # Optional[str] default: text, field to use for completion data
    
    # 複数の名前付きコンフィグ/サブセットを含むHuggingFaceリポジトリ
    datasets:
      - path: bigcode/commitpackft
        name:
          - ruby
          - python
          - typescript
        type: ... # 未実装のカスタム形式
    
    # fastchat conversation
    # 'conversation' を参照 
    # options: https://github.com/lm-sys/FastChat/blob/main/fastchat/conversation.py
    datasets:
      - path: ...
        type: sharegpt
        conversation: chatml
    
    # ローカル
    datasets:
      - path: data.jsonl # or json
        ds_type: json # 以下の他のオプションを参照
        type: alpaca
    
    # データセットは分割されているがtrain分割はない
    dataset:
      - path: knowrohit07/know_sql
        type: context_qa.load_v2
        train_on_split: validation

    6-3. loading

    load_in_4bit: true
    load_in_8bit: true
    bf16: true # require >=ampere
    fp16: true
    tf32: true # require >=ampere
    bfloat16: true # require >=ampere, AMPが不要な場合は、bf16の代わりに使用
    float16: true # AMPが不要な場合は fp16の代わりに使用

    【注意】 Repo は 4-bit量子化を行いません。

    6-4. lora

    adapter: lora # qlora またはFullFinetuningを行う場合は空白のままにする
    lora_r: 8
    lora_alpha: 16
    lora_dropout: 0.05
    lora_target_modules:
      - q_proj
      - v_proj

    他のコンフィグは公式ドキュメントを参照。

    7. 学習

    7-1. 学習の実行

    accelerate launch -m axolotl.cli.train your_config.yml

    7-2. データセットの前処理

    オプションで、ファインチューニング前に、以下を使用してデータセットを事前にトークン化できます。これは大規模なデータセットに推奨されます。

    ・Set : 「push_dataset_to_hub: hf_user/repo」を実行して、Huggingface にプッシュ。
    ・Use : --debug で前処理された例を表示。

    python -m axolotl.cli.preprocess your_config.yml

    7-3. Multi-GPU

    以下は、複数のGPUを使用した学習に axolotl で利用できるオプションです。「FSDP」は損失が不安定になる可能性があるため、現時点では「DeepSpeed」が推奨されるMulti-GPU オプションであることに注意してください。

    ・Deepspeed
    「Deepspeed」は、Multi-GPU システム用の最適化スイートであり、通常 GPU の VRAM に収まるよりもはるかに大きなモデルを学習できるようになります。 deepspeed のさまざまな最適化タイプの詳細については、こちらを参照。

    ZeRO stage 1、2、3 用に、いくつかのデフォルトのdeepspeed JSON 構成が提供されています。

    deepspeed: deepspeed/zero1.json
    accelerate launch -m axolotl.cli.train examples/llama-2/config.py --deepspeed deepspeed/zero1.json

    ・FSDP
    llama FSDP

    fsdp:
      - full_shard
      - auto_wrap
    fsdp_config:
      fsdp_offload_params: true
      fsdp_state_dict_type: FULL_STATE_DICT
      fsdp_transformer_layer_cls_to_wrap: LlamaDecoderLayer

    7-4. Weights & Biases

    ・wandb options

    wandb_mode:
    wandb_project:
    wandb_entity:
    wandb_watch:
    wandb_run_id:
    wandb_log_model:

    8. 推論

    ・事前学習したLORA

    python -m axolotl.cli.inference examples/your_config.yml --lora_model_dir="./lora-output-dir"

    ・フルウェイトのファインチューニング

    python -m axolotl.cli.inference examples/your_config.yml --base_model="./completed-model"
    cat /tmp/prompt.txt | python -m axolotl.cli.inference examples/your_config.yml \
      --base_model="./completed-model" --prompter=None --load_in_8bit=True

    以下のようなエラーが表示される場合は、「--sample_packing False」を使用してください。

    RuntimeError: stack expects each tensor to be equal size, but got [1, 32, 1, 128] at entry 0 and [1, 32, 8, 128] at entry 1

    9. LORAをベースにマージ

    python3 -m axolotl.cli.merge_lora examples/your_config.yml --lora_model_dir="./completed-model" --load_in_8bit=False --load_in_4bit=False

    CUDAメモリが不足している場合は、システムRAM にマージしてみることができます。

    CUDA_VISIBLE_DEVICES="" python3 -m axolotl.cli.merge_lora ...

    次回



     
     

    npaka

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

    あなたへのおすすめ