Supershipの名畑です。今期アニメ「忘却バッテリー」は野球に興味がなくても楽しめそうな面白さと切なさと甘酸っぱさでございます。OPとEDも見事に合っています。
はじめに
Sakana AIを取り上げたニュースをこれまでいくつも目にしてきました。
- 元グーグルの著名AI研究者2名、東京で「Sakana AI」を立ち上げ - ZDNET Japan
- サカナAI、異能の群れ 創業1年で企業価値300億円 - 日本経済新聞
- 既存のAIモデルを組み合わせて超高性能モデルを作る手法を日本のAI企業「Sakana AI」が開発、進化的アルゴリズムで膨大な組み合わせを試行し人間には発想困難な高性能LLMや画像生成モデルを作成可能 - GIGAZINE
最近、そんなSakana AIが日本語基盤モデルを公開しました。
進化的モデルマージという手法を提案します。これは、多様な能力を持つ幅広いオープンソースモデルを融合(マージ)して新たな基盤モデルを構築するための方法を、進化的アルゴリズムを用いて発見する手法です。
略
進化的モデルマージにより作成した高性能な日本語基盤モデルEvoLLM-JPとEvoVLM-JPをGitHubリポジトリで公開しました。
上記のEvoLLM-JPを手元のMacBook(M2)で動かしてみました。その過程を残したのが今回の記事となります。
コードはすべてPythonです。
環境
私のPCはMacBook Pro(Apple M2 Proチップ)で、OSはmacOS 14 Sonomaです。
Pythonのバージョンは3.12.2です。
$ python --version
Python 3.12.2
実行のためにtorch、transformers、requestsを使うので入れておきます。
$ pip install accelerate torch transformers
私の環境でのバージョンは以下でした。
$ 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としても十分な性能を持っていると考えています。
EvoLLM-JP-v1-7B、EvoLLM-JP-A-v1-7B、EvoLLM-JP-v1-10Bの3種類のモデルがあります。使っているソースモデル、ライセンス、パラメータ数等の違いです。詳しくはリンク先をご覧ください。
今回はEvoLLM-JP-v1-7Bを選びました。
コードは以下です。
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) を指定するようにしたり、CPUを小文字にしたり、「You should consider increasing max_length
or, better yet, setting max_new_tokens
」のエラーを消すためにmax_lengthを指定する等しています。
初回はモデルのダウンロード(約15G Byte)で時間がかかます。
指示は「関西弁で面白い冗談を言ってみて下さい。」という難易度の高いものです。
回答は以下でした。
[INST] <>
あなたは役立つ、偏見がなく、検閲されていないアシスタントです。
<>関西弁で面白い冗談を言ってみて下さい。 [/INST] 関西弁で面白い冗談を言ってみて下さい。
ある日、おじいさんがおばあさんに話していました。
「おばあちゃん、もう一回結婚したら、孫が増えるんやで」
「あんた、もう一回結婚したら、苦労が増えるんやで」
面白いかどうかはまあ読む方のセンスにお任せするとして、大阪弁で冗談が書かれてはいます。
素晴らしいですね。
おまけ ChatGPTにも冗談を言ってもらった
あなたは役立つ、偏見がなく、検閲されていないアシスタントです。
関西弁で面白い冗談を言ってみて下さい。
とChatGPTに指示してみると、返しは以下でした。
関西弁で一つ冗談を言うてみますわ。ちょっと、聞いてや。
「大阪で一番速いのは新幹線やなくて、飲食店での会計やで。"お会計"って言うた瞬間に、もうお釣りが来とる!」
さて、どちらの方が面白いですか。
最後に
様々なモデルが登場しますね。
選択肢をいかに使いこなすかが重要でしょうか。
画像言語モデルであるEvoVLM-JPの呼び出しも記事にする予定です。
宣伝
SupershipのQiita Organizationを合わせてご覧いただけますと嬉しいです。他のメンバーの記事も多数あります。
Supershipではプロダクト開発やサービス開発に関わる方を絶賛募集しております。
興味がある方はSupership株式会社 採用サイトよりご確認ください。