💨

進化的モデルマージ実践

2025/02/19に公開

今回はLLMの進化的モデルマージを実践していきます。進化的モデルマージはEvolutionary optimization of model merging recipes(Akiba et al., Nature Machine Intelligence, 2025)という論文で提案された遺伝的アルゴリズムに基づくモデルマージ手法です。当該論文では数学のタスクなどで性能向上を報告しています。

手順の概要

  1. マージしたいモデルを複数決める
  2. タスクを決める
  3. 上記をconfig.yamlにフォーマットに従って記載する.
  4. 進化的モデルマージを実行する

これだけです。公式のドキュメントはこちら

環境構築

進化的モデルマージもMergekitに整備されています。

以下を実行しました。

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

git clone --depth 1 https://github.com/EleutherAI/lm-evaluation-harness
cd lm-evaluation-harness
pip install -e .
cd ..

pip install torch==2.2.1
pip install lm_eval[japanese_leaderboard]

Note:

  • lm-evaluation-harnessをインストールし直さないといくつかのタスクが後で利用できませんでした。
  • torchvisionでエラーが生じたため, torchのversionを2.2.1に修正することで解消しました。
  • emojiライブラリが日本語タスクで必要となったのでlm_eval[japanese_leaderboard]を追加でインストールしました.

config.yml(レシピ)の作成

マージする複数のモデルたちのことをgenomeモデルと呼びます。一方で進化的モデルマージではbaseモデルも必須です。これらは原則同一のアーキテクチャを持つものを選定する必要があります。今回はQwen系の1.5Bモデルを4種揃えました。

layer_granularityはモデルのlayer数を割り切る数にする必要があります。Qwen2.5のlayer数は28なので, 今回は4に設定します。

タスクはカスタムもできるようですが、lm-evaluation-harnessに実装されているものを指定するのが簡便です。複数を重みづけして指定することも可能です。ls /lm-evaluation-harness/lm_eval/tasks/ によりタスクの一覧を確認できます。

今回は以下のように指定します。

日本語のタスクはmgsm_direct_jaかjapanese_leaderboardしか用意されていないようです。

genome:
    models:
       - "EQUES/TinySwallow-Stratos-1.5B"
       - "SakanaAI/TinySwallow-1.5B-Instruct"
       - "deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B"
    merge_method: dare_ties
    base_model: "Qwen/Qwen2.5-1.5B-Instruct"
    tokenizer_source: null # optional
    layer_granularity: 4

    # optional:
    normalize: false
    allow_negative_weights: false
    smooth: false

tasks:
  - name: mgsm_direct_ja
    weight: 1.0 # optional
    metric: "exact_match,flexible-extract"

ちなみにcommonすぎるベンチマーク(truthfulqaやmmluなど)をタスクに指定しようとすると怖い警告が出てきます…

モデルマージの実行

コマンドラインから以下を実行するだけです。マージ後のモデルは./mergekit-evolveと指定したフォルダ以下に保存されます。

mergekit-evolve --strategy pool --storage-path ./mergekit-evolve ./config.yml --trust-remote-code

モデルマージによる性能変化

マージモデルを動かして出力を見てみましたが、今回の例では無意味な文字列の繰り返しばかりになってしまいました。一般的にはマージしたほうが性能向上が見込めると言われていますが、良いモデルに仕上げるには上記config.yml内での実験設定を試行錯誤する必要があるようです。

レシピの内容を試行錯誤した結果として、以下のリンク先でマージモデルを公開しています。今回は1.5Bの軽量なLLMを利用しましたが、マージ自体に24GBメモリのGPUで数日かかりました。

https://huggingface.co/EQUES/TinyQwens-Merge-1.5B

こちらのモデルは応答自体はgenomeモデルやベースモデルと比べて遜色なくできるものの、MT-Benchなどの定量的な指標ではスコアが向上しませんでした。

モデルマージがなぜ性能向上につながるのかを明らかにする研究も進んでおり、例えばYang et al. (2024, https://arxiv.org/pdf/2408.07666) のSection 2.4が参考になります。Li et al. (2018, https://arxiv.org/pdf/1712.09913 ) やForet et al. (2019, https://arxiv.org/pdf/2010.01412 ) などloss landscapeの解析からなぜ汎化性能が向上するのかを調べる研究も参考になります。

おわりに

EQUESでは引き続き、「最先端の機械学習技術をあやつり社会の発展を加速する」をミッションに研究開発と社会実装に取り組んでいきます。一緒に事業を創出する仲間を募集しています。詳しくは以下をご覧ください。

https://www.wantedly.com/companies/company_6691299

Discussion