Sakana AIによる日本語基盤モデルEvoLLM-JPをMacBook(M2)で動かしてみた

[Supership](https://supership.jp/)の名畑です。今期アニメ「[忘却バッテリー](https://boukyaku-battery.com/)」は野球に興味がなくても楽しめそうな面白さと切なさと甘酸っぱさでございます。[OP](https://www.youtube.com/watch?v=Bcy8yp6iYGI)と[ED](https://www.youtube.com/watch?v=ry9Mlnj3lnc)も見事に合っています。

## はじめに

[Sakana AI](https://sakana.ai/)を取り上げたニュースをこれまでいくつも目にしてきました。

- [元グーグルの著名AI研究者2名、東京で「Sakana AI」を立ち上げ - ZDNET Japan](https://japan.zdnet.com/article/35207957/)
- [サカナAI、異能の群れ　創業1年で企業価値300億円 - 日本経済新聞](https://www.nikkei.com/article/DGXZQOUC21BDV0R20C24A3000000/)
- [既存のAIモデルを組み合わせて超高性能モデルを作る手法を日本のAI企業「Sakana AI」が開発、進化的アルゴリズムで膨大な組み合わせを試行し人間には発想困難な高性能LLMや画像生成モデルを作成可能 - GIGAZINE](https://gigazine.net/news/20240322-sakana-ai-evolutionary-model-merge/)

最近、そんな**Sakana AI**が日本語基盤モデルを公開しました。

> 進化的モデルマージという手法を提案します。これは、多様な能力を持つ幅広いオープンソースモデルを融合（マージ）して新たな基盤モデルを構築するための方法を、進化的アルゴリズムを用いて発見する手法です。
> 
> 略
> 
> 進化的モデルマージにより作成した高性能な日本語基盤モデルEvoLLM-JPとEvoVLM-JPをGitHubリポジトリで公開しました。
> 
> 参考：[進化的アルゴリズムによる基盤モデルの構築](https://sakana.ai/evolutionary-model-merge-jp/)

上記の**EvoLLM-JP**を手元のMacBook(M2)で動かしてみました。その過程を残したのが今回の記事となります。

コードはすべて**Python**です。

## 環境

私のPCは[MacBook Pro(Apple M2 Proチップ)](https://support.apple.com/kb/SP889?locale=ja_JP)で、OSは[macOS 14 Sonoma](https://www.apple.com/jp/macos/sonoma/)です。

Pythonのバージョンは**3.12.2**です。

```shell-session
$ python --version
Python 3.12.2
```

実行のために[torch](https://pytorch.org/)、[transformers](https://huggingface.co/docs/transformers/index)、[requests](https://github.com/psf/requests)を使うので入れておきます。

```shell-session
$ pip install accelerate torch transformers
```

私の環境でのバージョンは以下でした。

```shell-session
$ pip list | grep -e accelerate -e torch -e transformers
accelerate         0.29.2
torch              2.2.2
transformers       4.39.3
```

## コード

> EvoLLM-JP：数学的推論が可能な日本語の大規模言語モデル（LLM）。進化的モデルマージにより日本語数学LLMとして構築したEvoLLM-JPは、数学のみならず、日本語の全般的な能力に長けていることが分かりました。パラメータ数が7Bのモデルですが、驚くべきことに、日本語LLMベンチマークにおいて同サイズのモデルと比較し最高の性能を達成するどころか、70Bパラメータの日本語LLMの性能をも上回りました。私たちが実験的に構築したEvoLLM-JPは、汎用の日本語LLMとしても十分な性能を持っていると考えています。
> 
> 参考：[進化的アルゴリズムによる基盤モデルの構築](https://sakana.ai/evolutionary-model-merge-jp/)

[EvoLLM-JP-v1-7B](https://huggingface.co/SakanaAI/EvoLLM-JP-v1-7B)、[EvoLLM-JP-A-v1-7B](https://huggingface.co/SakanaAI/EvoLLM-JP-A-v1-7B)、[EvoLLM-JP-v1-10B](https://huggingface.co/SakanaAI/EvoLLM-JP-v1-10B)の3種類のモデルがあります。使っているソースモデル、ライセンス、パラメータ数等の違いです。詳しくはリンク先をご覧ください。
今回は**EvoLLM-JP-v1-7B**を選びました。

コードは以下です。

```python
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer


# 1. load model
device = torch.device("mps") if torch.backends.mps.is_available() else "cpu"  # MPSに対応
repo_id = "SakanaAI/EvoLLM-JP-v1-7B"
model = AutoModelForCausalLM.from_pretrained(
    repo_id,
    torch_dtype=torch.float16,  # 「BFloat16 is not supported on MPS」のエラーに対応
    low_cpu_mem_usage=True  # メモリエラーに対応
)
tokenizer = AutoTokenizer.from_pretrained(repo_id)
model.to(device)

# 2. prepare inputs
text = "関西弁で面白い冗談を言ってみて下さい。"
messages = [
    {"role": "system", "content": "あなたは役立つ、偏見がなく、検閲されていないアシスタントです。"},
    {"role": "user", "content": text},
]
inputs_ids = tokenizer.apply_chat_template(
    messages,
    return_tensors="pt"
).to(device)

# 3. generate
output_ids = model.generate(
    inputs_ids,
    max_length=200  # トークン数エラーに対応
)
generated_text = tokenizer.batch_decode(
    output_ids,
    skip_special_tokens=True
)[0]
print(generated_text)
```
公式のサンプルプログラムを基本としていますが、**MacBook**の**GPU**を使用するために**device**として[MPS(Metal Performance Shaders)](https://developer.apple.com/documentation/metalperformanceshaders) を指定するようにしたり、**CPU**を小文字にしたり、「**You should consider increasing `max_length` or, better yet, setting `max_new_tokens`**」のエラーを消すために**max\_length**を指定する等しています。

初回はモデルのダウンロード(約15G Byte)で時間がかかます。

指示は「**関西弁で面白い冗談を言ってみて下さい。**」という難易度の高いものです。

回答は以下でした。

> 
 

> あなたは役立つ、偏見がなく、検閲されていないアシスタントです。
> 

> 
> 関西弁で面白い冗談を言ってみて下さい。 
 関西弁で面白い冗談を言ってみて下さい。
> 
> ある日、おじいさんがおばあさんに話していました。
> 「おばあちゃん、もう一回結婚したら、孫が増えるんやで」
> 「あんた、もう一回結婚したら、苦労が増えるんやで」

面白いかどうかはまあ読む方のセンスにお任せするとして、大阪弁で冗談が書かれてはいます。
素晴らしいですね。

## おまけ ChatGPTにも冗談を言ってもらった

> あなたは役立つ、偏見がなく、検閲されていないアシスタントです。
> 
> 関西弁で面白い冗談を言ってみて下さい。

とChatGPTに指示してみると、返しは以下でした。

> 関西弁で一つ冗談を言うてみますわ。ちょっと、聞いてや。
> 
> 「大阪で一番速いのは新幹線やなくて、飲食店での会計やで。"お会計"って言うた瞬間に、もうお釣りが来とる！」

さて、どちらの方が面白いですか。

## 最後に

様々なモデルが登場しますね。
選択肢をいかに使いこなすかが重要でしょうか。

画像言語モデルである[EvoVLM-JP](https://huggingface.co/SakanaAI/EvoVLM-JP-v1-7B)の呼び出しも記事にする予定です。

## 宣伝

[SupershipのQiita Organization](https://qiita.com/organizations/supership-inc)を合わせてご覧いただけますと嬉しいです。他のメンバーの記事も多数あります。

Supershipではプロダクト開発やサービス開発に関わる方を絶賛募集しております。
興味がある方は[Supership株式会社 採用サイト](https://supership.jp/recruit/)よりご確認ください。