見出し画像

mergekit-evolve のパラメータまとめ

以下の記事が面白かったので、簡単にまとめました。

mergekit/docs/evolve.md


1. mergekit-evolve

mergekit-evolve」は、進化的アルゴリズム (CMA-ES) を使用して、モデル メトリックに対してマージのパラメータを最適化するスクリプトです。これは、「SakanaAI」の「Evolutionary Optimization of Model Merging Recipes」、特にパラメータ空間アプローチからインスピレーションを得ています。「mergekit-evolve」は、EleutherAIの「Language Model Evaluation Harness」を使用してスコアリング関数を定義および評価を行います。このスクリプトは、単一ノードまたはRayクラスター上で実行されるように設定されており、特定のコンピューティング構成に応じて操作をスケジュールするためのいくつかの異なる戦略があります。

2. インストール

mergekit-evolve」のインストールコマンドは、次のとおりです。vllmはオプションです。

git clone https://github.com/arcee-ai/mergekit.git
cd mergekit
pip install -e .[evolve,vllm]

古いバージョンのvLLMをインストールすることでダウングレードしてしまい、Flash Attentionが壊れてしまった場合は、以下のコマンドを実行して修正してください。

pip uninstall flash-attn
pip cache purge
pip install flash-attn

3. YAML設定ファイル

「mergekit-evolve」は、「マージのパラメータ化方法」と「最適化メトリクス」を定義する「YAML設定ファイル」を取り込みます。
一般的な構文は次のとおりです。

genome:
    models:
       - model_1
       - model_2
       ...
       - model_n
    merge_method: dare_ties
    base_model: base_model_if_needed
    tokenizer_source: null # optional
    layer_granularity: 8
    normalize: false # optional
    allow_negative_weights: false # optional
tasks:
  - name: lm_eval_task_name
    weight: 1.0 # optional
    metric: "acc,none" # defaults to acc,none
  - name: ... # as many as you want

3-1. genome の定義

YAML設定ファイルのgenomeセクションは、「mergekit-evolve」が最適化するパラメータ空間を定義します。

・models
マージに使用できるすべてのモデルリストです。マージ方法によっては、最終的なマージですべてが使用されることが保証されるわけではありません。

・merge_method
使用するマージ方法です。現在サポートされている値は、「linear」「dare_ties」「task_arithmetic」「ties」「slerp」です。

・base_model
マージのベースモデル (該当する場合)

・layer_granularity
パラメータセットは、layer_granularity レイヤーの連続するスライスごとに導入されます。たとえば、layer_granularity: 8 の mistralai/Mistral-7B-v0.1 のような32レイヤーモデルは、それぞれに異なるマージパラメータを持つ8レイヤーの4つのグループに分割されます。ここで指定する値は、入力モデルのレイヤー数の約数である必要があります。layer_granularity の値を大きくすると、検索空間が大幅に減少します。つまり、グローバルソリューションの品質が低くなる可能性を犠牲にして、より高速な収束が得られます。

・normalize
マージ時に正規化フラグを設定します。「linear」「ties」「date_ties」などの場合、これにより検索空間が確実に有効なモデルセットに制限されます。layer_granularity と同様に、これにより、標準的なマージよりも優れたスコアを獲得できる可能性のある奇妙なソリューションを除外するという代償を払って、収束を大幅に高速化できます。

・allow_negative_weights
このフラグがセットされていないときは、重みパラメータの絶対値が使われいます。「linear」と「slerp」の検索空間を小さくします。タスク演算に基づく手法では、「allow_negative_weights: true」が必要です。

3-2. tasks の定義

生成されたマージを評価するには、EleutherAI LM evaluation harness によってサポートされるタスクのリストを指定する必要があります。これは、「組み込みタスク」または「自分で定義したタスク」 (New Task Guideを参照) のいずれかです。タスクがメトリックとして acc を使用しない場合は、正しいメトリック名を指定する必要があります。各タスクには、オプションで重みを関連付けることもできます。

「mergekit-evolve」はマージのスコアを最大化することを目的としているため、スコアが低い方が優れているタスクまたはメトリクスを使用している場合は、必ずそのタスクに負の重みを割り当ててください。

4. mergekit-evolve の実行

「mergekit-evolve」には、入力モデル、評価するマージ、評価された現在の最良のマージ設定を保存するストレージパスを指定する必要があります。「インメモリマージ」を使用していない場合、これには多くのスペースが必要になる可能性があります。GPUごとに少なくとも1つのfp16モデルが必要です。

mergekit-evolve [OPTIONS] --storage-path PATH GENOME_CONFIG_PATH
mergekit-evolve --strategy pool --wandb --wandb-project mergekit-evolve --wandb-entity arcee-ai --storage-path /path/to/mergekit-evolve/ ./config.yml

4-1. スケジュール戦略 (--strategy)

マージジョブと評価ジョブをスケジュールするには、3つの異なる戦略が実装されています。

・pool
クラスター内の各GPUにアクタを割り当て、マージと評価が同じノードで実行されることを保証します。これは、ローカルまたは分散のあらゆる構成に適した安全なデフォルトです。

・buffered
スケジュールされたタスクのバッファを維持して、モデルのマージが常に存在するか、GPUごとに評価できるようにします。十分なVRAM が利用可能な場合、同じ GPU 上でモデルの同時マージと評価が可能になります。単一ノードのセットアップ、または --storage-path が高速共有ファイルシステムを指している場合にのみ適しています。

・serial
Ray配置グループを使用して、マージとその評価が同じノード上で確実に行われるようにしますが、それ以外の場合はRayに主導権を渡すだけです。他の2つに問題がある場合は試してみてください。そうでない場合は、おそらく使用しないでください。

4-2. モデル評価のバックエンド

デフォルトでは、「mergekit-evolve」はモデル評価に「HuggingFace」を使用します。 代わりに「vLLM」を使用するには、--vllmを指定します。

4-3. オンディスク と インメモリ

デフォルトでは、「mergekit-evolve」はマージを実行し、結果をディスクに書き込み、そのパスを指す「lm-eval」のインスタンスを起動します。 これは安全なデフォルトであり、通常は常に機能しますが、GPUのダウンタイムが長くなり、ディスク容量が消費されます。プール スケジューリング戦略を使用する場合、モデルをメモリ内に常駐させ、ディスクにマージする代わりにそのパラメータを直接更新するオプションがあります。 これははるかに高速であり、追加のディスク領域を使用しません。ただし、「vLLM」と「LM evaluation harness」の内部をいじる必要があります。そのため、いつ壊れるかも知れません! 賢明に選択してください。このモードを有効にするには、--in-memory を使用します。

4-4. タスクの検索パス

カスタムタスク定義を使用している場合、 --task-search-path で検索パスに追加できます。これは、カスタムタスクYAMLが存在するディレクトリ (またはそのディレクトリの親) を指す必要があります。オプションを繰り返すことで、複数のパスを含めることができます。

4-5. バッチサイズ

マージ評価中に使用されるバッチサイズをオーバーライドします。「vLLM」を使用する場合は「auto」(デフォルト)が推奨されます。

4-6. CMA-ES オプション

・--max-fevals
評価するマージの最大数です。 cmaパッケージはこの数値では非常に大雑把であり、各世代のサイズに応じて喜んで 50% を超えることに注意してください。 デフォルトでは 100 に設定されます。

・--sigma0
CMA-ESのシグマの初期値です。何をしているのかよくわかっていない場合は、これをさわる必要はありません。

4-7. WandB ロギング

「mergekit-evolve」は、重みとバイアスへのメトリクスのロギングをサポートしています。--wandb でこの機能を有効にします。 プロジェクト名とエンティティ名は、 --wandb-project および --wandb-entity オプションでオーバーライドできます。

5. 出力

「mergekit-evolve」は、これまでに見つかった最適なマージのマージ設定を、best_config.yaml に書き込みます。WandB を使用している場合は、設定もアーティファクトとして記録されます。
スクリプトは、KeyboardInterrupt が受信されるか、--max-fevals を十分に超えるまで実行され続けます。

6. 注意事項

「mergekit-evolve」は進行中の作業であり、特定の設定ではテストされていません。実行を続ける前に出力に注目してください。問題が発生した場合は、ためらわずに問題を報告してください。



この記事が気に入ったらサポートをしてみませんか?