mergekit-evolve のパラメータまとめ
以下の記事が面白かったので、簡単にまとめました。
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」が最適化するパラメータ空間を定義します。
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つの異なる戦略が実装されています。
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 オプション
4-7. WandB ロギング
「mergekit-evolve」は、重みとバイアスへのメトリクスのロギングをサポートしています。--wandb でこの機能を有効にします。 プロジェクト名とエンティティ名は、 --wandb-project および --wandb-entity オプションでオーバーライドできます。
5. 出力
「mergekit-evolve」は、これまでに見つかった最適なマージのマージ設定を、best_config.yaml に書き込みます。WandB を使用している場合は、設定もアーティファクトとして記録されます。
スクリプトは、KeyboardInterrupt が受信されるか、--max-fevals を十分に超えるまで実行され続けます。
6. 注意事項
「mergekit-evolve」は進行中の作業であり、特定の設定ではテストされていません。実行を続ける前に出力に注目してください。問題が発生した場合は、ためらわずに問題を報告してください。
この記事が気に入ったらサポートをしてみませんか?