大規模言語モデルの活用で、多数の専門家を束ねるモデルがあります。それがMoE / Mixutre of Expertsです。どんな問題も一つのモデルで片付けるのではなく、得意なモデルに質問を投げてそれらを統合して回答します。ちょっと人間に近いですよね。今回はMoEについて確認します。
前回のブログではローカルLLMと呼ばれる手元でLLMを構築する方法を確認しました。手元でPythonのモデルをいじれればもっといろんなモデルを作ったり試せますね。今回はMoEについて確認します。
MoEとは、「Mixture of Experts」の略称で、混合専門家モデルとも呼ばれる機械学習のアーキテクチャの一種です。このモデルは、複数の「専門家」モデル(小さなニューラルネットワークや機械学習モデル)を組み合わせて、特定のタスクやデータセットに対してより効果的に対応できるように設計されています。
MoEの基本的な考え方は、入力データが与えられた時に、どの「専門家」がその入力に最も適切に対応できるかを判断する「ゲート」機構を使用することです。ゲート機構は、各専門家の出力に重みを付け、それらを組み合わせて最終的な予測を行います。これにより、各専門家はデータの特定の側面やパターンを学習することに特化し、全体としてモデルの性能を向上させることができます。
MoEモデルは、特に大規模なデータセットや複雑なタスクにおいて、伝統的なニューラルネットワークモデルよりも優れた性能を発揮することがあります。しかし、その設計と実装はより複雑であり、計算コストが高くなることがあります。現在、自然言語処理(NLP)やコンピュータビジョンなど、さまざまな分野での応用が研究されています。
とGPT4が申してます。
ローカルLLMの基本である、Hugging FaceからMoEのモデルを探してみましょう。どうやらMoEで有名なのがフランスのMistralAIみたいなので、
こちらに8x7Bモデルがありました。
https://huggingface.co/mistralai/Mixtral-8x7B-Instruct-v0.1
どうやら7Bのモデルが8こ合わさったMoEモデルのようです。仕組みとしてはTransformerのモデルの一部を複数のエキスパートに分ける部分があり、それによって入ってきた情報を判断して分離して計算、最後に統合という形のようです。パラメータ数は47B程度で、VRAMにロードする必要があるようなので、単純に7Bずつとはならないようで意外とリソースを消費します。
利用の仕方は他のモデルと同じです。
from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "mistralai/Mixtral-8x7B-Instruct-v0.1"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto")
messages = [
{"role": "user", "content": "What is your favourite condiment?"},
{"role": "assistant", "content": "Well, I'm quite partial to a good squeeze of fresh lemon juice. It adds just the right amount of zesty flavour to whatever I'm cooking up in the kitchen!"},
{"role": "user", "content": "Do you have mayonnaise recipes?"}
]
inputs = tokenizer.apply_chat_template(messages, return_tensors="pt").to("cuda")
outputs = model.generate(inputs, max_new_tokens=20)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
今回はゲートやトークンなど細かい技術的なことには言及しませんが、VRAMの消費がそこそこで速度も速い、学習自体は大きなモデルよりも行いやすそうですので、一つの選択肢として頭に入れておくのもいいのかなと思いました。以上です。