22
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LLM の「Mixture of Experts (MoE)」を完全に理解する:なぜ高速で高性能なのか?

Posted at

忙しい人のための 3 行まとめ (TL;DR)

  • MoE (Mixture of Experts) は、入力に応じて 「専門家(Expert)」の一部だけ を稼働させることで、巨大なパラメータ数と高速な推論 を両立する技術。
  • 従来の Dense モデル(全員参加型)と比較して、計算コストを抑えつつ賢くできる が、VRAM (メモリ) 消費量は減らない 点に注意が必要。
  • Mixtral 8x7BDeepSeekGrok-1 などの登場により、現在はLLM 開発のデファクトスタンダード になりつつある。

Introduction:なぜ今、MoE なのか?

「LLM の性能を上げるには、パラメータ数を増やすしかない」
これまで、私たちはそう考えてきました。しかし、パラメータ数を増やせば増やすほど、推論にかかる計算コスト(GPU コスト)と時間は指数関数的に増大します。

「賢いモデルを使いたいが、遅くて高いのは困る」

このジレンマを解決する鍵として、現在爆発的に普及しているアーキテクチャが Mixture of Experts (MoE) です。
Google の Gemini 1.5 や xAI の Grok-1、そしてオープンソース界隈を席巻した Mixtral 8x7B。これら最新モデルの多くが MoE を採用しています。

本記事では、エンジニアが知っておくべき MoE の仕組み、メリット・デメリット、そして実際に Python で動かす方法までを解説します。


Prerequisites (前提環境)

本記事のコードを実行する場合、以下の環境を推奨します。

  • Python: 3.10 以上
  • Libraries:
    • transformers >= 4.36.0 (MoE サポート必須)
    • torch >= 2.1.0
    • accelerate (VRAM オフロード用)
  • Hardware: Mixtral 8x7B クラスを動かす場合、VRAM 24GB 以上の GPU (または量子化利用)

1. MoE (Mixture of Experts) とは何か?

一言で言えば、「総合病院」のようなシステム です。

Dense モデル (従来型) との違い

  • Dense (密) モデル: GPT-3 や Llama 2 などの従来型。
    • 仕組み: どんな簡単な質問(「1+1は?」)が来ても、モデル内の全ニューロン(全員)が計算に参加 します。
    • 例え: 腹痛の患者に対して、内科・外科・眼科・皮膚科…全科の医師が全員で診察 するようなもの。無駄が多いですよね?
  • Sparse MoE (疎) モデル: Mixtral 8x7B など。
    • 仕組み: 入力の内容に応じて、それに詳しい一部のニューロン(Expert)だけ が計算に参加します。
    • 例え: 腹痛の患者が来たら、受付(Router)が判断して「消化器内科の先生(Expert A)」と「外科の先生(Expert B)」の 2 人だけ に診察させる。効率的です。

為になる数字:Mixtral 8x7B の場合

Mixtral 8x7B は、全体で 470 億 (47B) のパラメータを持っています。しかし、1 つのトークンを処理する際に使われるのは、そのうちの 130 億 (13B) 程度 です。
つまり、47B モデルの知識量を持ちながら、13B モデル並みの爆速スピードで動く ということです。


2. アーキテクチャの仕組み (Deep Dive)

MoE は主に以下の 2 つのコンポーネントで構成されています。

① Experts (専門家ネットワーク)

モデルの層(Layer)の中に、複数の Feed-Forward Network (FFN) が並列に配置されています。これら一つひとつが Expert です。

  • Mixtral 8x7B の場合、各層に 8 人の Expert がいます。
  • 各 Expert は特定の分野(例えば「文法」「コード」「数学」など)に特化するように学習中に自然と分業されます(※明示的に役割を与えるわけではありません)。

② Gating Network / Router (受付)

これが MoE の肝です。各トークンに対して、「どの Expert に担当させるか?」 を瞬時に判断します。
通常、Top-K 方式が採用され、スコアが高い上位 K 個(通常は 2 個)の Expert だけにデータを送ります。

処理フロー

  1. Input: トークン「def」が入ってくる。
  2. Routing: Router が「これはプログラミング用語だ」と判断し、Expert 3 (Coding) と Expert 5 (Syntax) を選択。
  3. Computation: 選ばれた 2 つの Expert だけが計算を行う。他の 6 つは休む(計算コスト 0)。
  4. Aggregation: 2 つの Expert の出力を重み付けして合成し、次の層へ送る。

3. メリットとデメリット (Trade-offs)

「魔法の技術」に見えますが、エンジニアとして理解すべきトレードオフがあります。

特徴 詳細 エンジニアへの影響
推論速度 (Latency) ◎ 速い アクティブなパラメータが少ないため、トークン生成速度(Tokens/sec)が非常に速い。
知識量 (Capacity) ◎ 多い 全パラメータ数は巨大なので、多くの知識を詰め込める。
VRAM 消費 (Memory) △ 大きい ここが最大の落とし穴です。 計算に使わない Expert も、メモリ上にはロードしておく必要があります。 47B モデルなら、47B 分の VRAM が必要です。
学習難易度 △ 難しい 特定の Expert だけが使われてしまう「人気者への偏り」を防ぐため、Load Balancing Loss などの工夫が必要です。

Note: 最近は DeepSeek-V3 のように、VRAM 消費や通信コストを抑えるさらに高度なアーキテクチャ(Multi-head Latent Attention などとの組み合わせ)も登場しています。


4. 実装:Transformers で MoE を動かす

Hugging Face の transformers は既に MoE をネイティブサポートしています。ここでは、代表的な Mixtral-8x7B をロードする例を示します。

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

# モデルID (ここでは軽量化された量子化モデルを指定する例)
# VRAMに余裕がある場合は "mistralai/Mixtral-8x7B-Instruct-v0.1" を使用
model_id = "TheBloke/Mixtral-8x7B-Instruct-v0.1-GPTQ"

print(f"Loading {model_id}...")

# Tokenizer のロード
tokenizer = AutoTokenizer.from_pretrained(model_id)

# モデルのロード
# device_map="auto" を指定することで、複数GPUやCPUへ自動的にExpertを配置分散してくれます
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    device_map="auto",
    torch_dtype=torch.float16,
    trust_remote_code=False
)

# 推論の実行
prompt = "Explain Mixture of Experts in simple terms."
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)

with torch.no_grad():
    outputs = model.generate(
        **inputs,
        max_new_tokens=200,
        do_sample=True,
        temperature=0.7
    )

response = tokenizer.decode(outputs[0], skip_special_tokens=True)
print("-" * 50)
print(response)

ポイント

  • device_map="auto": MoE は巨大なため、1 枚の GPU に収まらないことがよくあります。このオプションを使うと、ライブラリが勝手に層や Expert を分割して複数の GPU に配置してくれます(Offloading)。
  • 量子化 (Quantization): そのままでは 90GB 以上の VRAM が必要ですが、4-bit 量子化版(GPTQ や AWQ)を使えば、24GB VRAM × 2 枚程度、あるいは CPU オフロードで動作可能です。

Conclusion

MoE は、「計算リソースの制約」と「モデル性能の追求」という矛盾する要求に対する、現時点での最適解 です。

  • 開発者視点: 推論 API のコスト削減やレイテンシ改善に直結します。
  • 研究者視点: どのように Expert を専門化させるか、Routing をどう最適化するかがホットトピックです。

今後は、PC やスマホなどのエッジデバイスでも動作する「小型 MoE」も増えてくるでしょう。MoE の挙動を理解しておくことは、これからの LLM アプリケーション開発において必須の教養と言えます。

References


⚠️ 本記事に関する注意

  • 本記事は執筆時点(2025 年 12 月)の情報に基づき作成しています。
  • AI 技術は発展が速いため、仕様や挙動が変更される可能性があります。最新の公式ドキュメントも併せてご確認ください。
22
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?