Evolutionary Optimization of Model Merging Recipesを動かしてみる


# はじめに

この記事では、以下のLLMの進化的マージの論文で公開されている評価コードを動かしてみた結果を書きます。

[Evolutionary Optimization of Model Merging Recipes](https://arxiv.org/pdf/2403.13187)


# セットアップ

とりあえずローカル環境で試してみました。
環境は以下です。

- Mac OS X Ventura 13.3.1
- Python 3.9.9

## インストール

```zsh
git clone https://github.com/SakanaAI/evolutionary-model-merge.git
cd evolutionary-model-merge
```


[fastext](https://fasttext.cc/docs/en/language-identification.html)から```lid.176.ftz```をダウンロードしてディレクトリに配置してパスを環境変数```LID176FTZ_PATH```に入れる。
以下のコマンドで対応
```zsh
curl https://dl.fbaipublicfiles.com/fasttext/supervised-models/lid.176.ftz -o ./lid.176.ftz
export LID176FTZ_PATH=./lid.176.ftz
```

そのまま以下でライブラリインストール
```
pip install -e .
```

CUDAなしのpytorchでもいけないかなーとやってみたらやはりCUDAのエラー（python 3.10 以上にしろというエラーもあった）
```
OSError: CUDA_HOME environment variable is not set. Please set it to your CUDA install root.
```

ということで以下でGoogle colabのGPU環境で実行します。

## colab環境
colabの環境は以下でした。

- Ubuntu 22.04.3 LTS
- Python 3.10.12

ローカルでやったものと同様のセットアップを実行して、A100環境で動きました。
※shisa-gamma-7b-v1というモデルだけ、githubのconfigのままではモデルパスのエラーが出たため、以下のように修正
```diff
model:
  target: evomerge.CausalLMWithvLLM
  params:
+    model_path: augmxnt/shisa-gamma-7b-v1
-    # model_path: augmxnt/shisa-gamma-7b-v1
-    model_path: /home/mkshing/.cache/huggingface/hub/models--augmxnt--shisa-gamma-7b-v1/snapshots/49bf4a58453d191845668b8ff17e4b8f0e9ccae6/
    # model_kwargs:
    #   dtype: bfloat16
    template: ja-alpaca-cot
  
eval:
  target: evomerge.eval.JaMGSM
```

# 結果

現段階（2024/05/11）では、LLMの評価は以下の7つを試すことができます。

- [GAIR/Abel-7B-002](https://huggingface.co/GAIR/Abel-7B-002)
- [upaya07/Arithmo2-Mistral-7B](https://huggingface.co/upaya07/Arithmo2-Mistral-7B)
- [augmxnt/shisa-gamma-7b-v1](https://huggingface.co/augmxnt/shisa-gamma-7b-v1)
- [WizardLM/WizardMath-7B-V1.1](https://huggingface.co/WizardLM/WizardMath-7B-V1.1)
- [SakanaAI/EvoLLM-JP-A-v1-7B](https://huggingface.co/SakanaAI/EvoLLM-JP-A-v1-7B)
- [SakanaAI/EvoLLM-JP-v1-7B](https://huggingface.co/SakanaAI/EvoLLM-JP-v1-7B)
- [SakanaAI/EvoLLM-JP-v1-10B](https://huggingface.co/SakanaAI/EvoLLM-JP-v1-10B)


リポジトリで公開されているMGSM-JAの正解率の評価を実行した結果が以下です。

|モデル  |Abel-7B-002  |Arithmo2-Mistral-7B  |shisa-gamma-7b-v1 |WizardMath-7B-V1.1 |EvoLLM-JP-A-v1-7B |EvoLLM-JP-v1-7B |EvoLLM-JP-v1-10B |
|---|---|---|---|---|---|---|---|
|MGSM-JA 正解率|0.316  |0.248  |0.088  |0.448  |0.508  |**0.564**  |0.536  |
|MGSM-JA 日本語 正解率|0.316  |0.248  |0.088  |0.2  |0.508  |**0.532**  |0.528  |

なぜか```EvoLLM-JP-v1-10B```の正解率より```EvoLLM-JP-v1-7B```の正解率の方が高くなってしまいました。（論文では、10Bのモデルが最も正解率が高くなっています）

ちなみに```EvoLLM-JP-v1-7B```、```EvoLLM-JP-A-v1-7B```、```EvoLLM-JP-v1-10B```の違いは以下です。

- ```EvoLLM-JP-v1-7B```：3つのモデル（```Abel-7B-002```、```shisa-gamma-7b-v1```、```WizardMath-7B-V1.1```）をParameter space（PS）でマージしたモデル（```WizardMath-7B-V1.1```を使用しているためオープンソースではなく MICROSOFT RESEARCH LICENSE TERMSライセンス）
- ```EvoLLM-JP-A-v1-7B```：Apache License, Version 2.0でリリースするために、オープンソースライセンスのモデルのみで作成された```EvoLLM-JP-v1-7B```と同等の性能のモデル（```Abel-7B-002```、```shisa-gamma-7b-v1```、```Arithmo2-Mistral-7B```のマージ）
- ```EvoLLM-JP-v1-10B```：Parameter space（PS）とData flow space（DFS）でマージされたモデル（```Abel-7B-002```、```shisa-gamma-7b-v1```、```WizardMath-7B-V1.1```のマージ）

上記の3つのモデルはマージの仕方と、使っているモデルの違いがあります。

7Bの二つのモデルはParameter space（PS）におけるマージ、つまりアーキテクチャは元のMistralから変えずに重みを加重平均をとったような形でマージしています。

10Bのモデルでは、PSのマージに加えてData flow space（DFS）におけるマージを行っています。
DFSにおけるマージとは、別々のモデルのレイヤーを重ねる形でマージしていく手法で、論文の図がわかりやすいので以下に載せておきます。


![スクリーンショット 2024-05-11 19.30.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715069/019f535c-d3bc-57f6-5b1f-5b6c522800f2.png)



今回試したcolabは以下です。全てのセルを実行するだけで評価できます。

https://colab.research.google.com/drive/1t-gPWfdLhjgZCPeqaV0AIim395xBX6Hw?usp=sharing

# まとめ

進化的マージでは、PSとDFSというマージ手法がある。
論文ではMGSM-JAの正解率において、PSとDFSを両方用いている10Bのマージモデルが最も正解率が高いが、公開されている評価コードだと7Bの方が高くなった。

公開されている2つの7Bのマージモデルのうちでは、 ```EvoLLM-JP-v1-7B```の方が正解率が高くなった。
しかし、```EvoLLM-JP-A-v1-7B```は正解率が低いがApache License, Version 2.0なので商用利用が可能