3行でいうと

  • MoEは、層の中の一部(専門家)だけを、トークンごとに選んで動かします。計算量は「動いた分」に比例しますが、メモリは「全部の専門家を置く分」が必要です。Metaも、全パラメータはメモリに置かれ、動くのは一部だけ、と書いています。
  • 公式の数字は、Mixtralが総47B・活性13B、DeepSeek-V3が総671B・活性37B、Llama 4 Scoutが総109B・活性17B、Maverickが総400B・活性17Bです。僕らの計算では、活性は総数の4〜28%です。
  • 「専門家」は、分野ごとの担当者ではないようです。Mixtralの論文は、分野の違いで選ばれる専門家に明確な差は見えず、文の構文に沿った傾向がある、と報告しています。

この記事は、実際に使って確かめた記録ではありません。この記事は、公式の文書と論文を読んでまとめたもので、実際に使って確かめた記録ではありません。情報は2026年10月16日に確認しました。変わることがあります。

先に結論

仕組み:密なモデルとの違い

ふつうのTransformerは、各層のフィードフォワード部分(FFN)を、すべてのトークンが通ります。これを密(dense)なモデルと呼びます。

MoEは、そのFFNを「専門家」と呼ばれる複数のFFNに置き換え、小さなルーターがトークンごとに、使う専門家を選びます。Mixtralは、各層に専門家が8つあり、ルーターが1トークンにつき2つを選びます(各層で、トークンごと)。選ばれる組は、次のトークンで変わりえます。

ここで大事なのが、置き換わるのはFFNだけ、という点です。注意の部分(アテンション)などは共有されます。Hugging Faceの解説は、このためMixtral 8x7Bの総数が、7B×8=56Bではなく47Bになる、と説明しています。

「総パラメータ」は、全部の専門家を数えた総数です。「活性パラメータ」は、1トークンの処理で実際に使う数です。

モデル 総パラメータ 活性パラメータ 活性の割合(僕らの計算) 専門家の構成(公式の記載)
Mixtral 8x7B 47B 13B 約28% 各層8つ、2つを選ぶ
DeepSeek-V3 671B 37B 約5.5% DeepSeekMoE(構成の細部は未読)
Llama 4 Scout 109B 17B 約16% 16の専門家
Llama 4 Maverick 400B 17B 約4.3% ルーティング128+共有1。トークンは共有1つと、選ばれた1つへ

Llama 4の記事は2025年4月5日の公開、Mixtralの論文は2024年1月、DeepSeek-V3は2024年12月です。新しいモデルの情報は読んでいません。

「安い・速い」の根拠は、どこにあるのか

Mixtralの論文は、活性パラメータの数が推論の計算コストに比例すると書いています。そのうえで、この数字は、メモリのコストとハードウェアの使われ方を考えていない、とも断っています。

学習の側では、Switch Transformersが、入力ごとに別のパラメータを選ぶことで、計算コストを一定に保ったまま、1兆パラメータまで拡大できたと報告しています。1兆パラメータのモデルは、T5-XXLに比べて4倍の速さで事前学習できたとされています。DeepSeek-V3の報告書は、14.8兆トークンでの事前学習を含む訓練全体に、278.8万H800 GPU時間を要したと書いています。

つまり、計算を節約できる根拠は、公式の資料にあります。ただし、節約できるのは計算で、メモリではありません。

メモリの落とし穴

全部を置く必要がある

どの専門家が選ばれるかは、トークンが来るまで分かりません。そのため、全部の専門家をメモリに置く必要があります。Hugging Faceの解説は、総パラメータ数が同じ密なモデルより推論は速いが、メモリ要件は高いと書き、スループットが高く複数マシンを使える環境では疎なMoEが向き、スループットが低くVRAMが限られる環境では密なモデルが向く、と整理しています。

僕らの概算で、重みだけを置くのに必要な量を計算しました。1パラメータを2バイト(BF16)、4ビット量子化なら0.5バイトとし、KVキャッシュや計算の途中の置き場は含めません。

モデル BF16(2バイト) 4ビット(0.5バイト) 比較:活性と同じ大きさの密なモデル(BF16)
Mixtral 8x7B(47B) 約94GB 約23.5GB 13Bなら約26GB
Llama 4 Scout(109B) 約218GB 約54.5GB 17Bなら約34GB
DeepSeek-V3(671B) 約1.3TB 約335GB 37Bなら約74GB

Mixtralのモデルカードは、約47B、BF16で配布されていると書き、メモリ量は書かず、半精度と4ビットでの読み込み例を示しています。MetaはScoutを、Int4量子化でH100 1枚に収まると書いています。これは、僕らの計算(109B×0.5バイト≒54.5GB)とも矛盾しません。

バッチが大きくなると、読む量も増えるはず

ここからは僕らの見立てです。公式が数字で示しているわけではありません。

1トークンだけを作るなら、読み込む専門家は、選ばれた一部で済みます。ところが、同時に複数のリクエストを処理すると、それぞれが別の専門家を選ぶので、触れる専門家の数が増えます。仮に、8つの専門家から2つずつ、均等に独立に選ばれるとすると、少なくとも1つのトークンに選ばれる専門家の割合は、僕らの計算で次のとおりです。

同時のトークン数 触れられる専門家の割合
1 25%
2 約44%
4 約68%
8 90%
16 約99%

実際の選ばれ方は均等でも独立でもありません。Mixtralの論文は、連続するトークンで同じ専門家が選ばれる割合が、ランダムな場合(12.5%)より高い層があると報告しています(層15のArXivで27.9%など)。だから、この表は目安です。ただし方向としては、バッチが大きいほど、動く量が総パラメータに近づき、メモリの読み込み(メモリ帯域)が重くなるはずです。Mixtralの論文が、バッチ処理に向くと書いているのは、こうした事情と整合しますが、論文はこの計算を示していません。

複数のGPUに置く:専門家並列

専門家を別のGPUに分けて置く方法を、専門家並列(EP)と言います。vLLMの文書によると、--enable-expert-parallelで有効にし、EPのサイズは、テンソル並列とデータ並列の積になります。単一ノード8GPUの例は、--tensor-parallel-size 1 --data-parallel-size 8 --enable-expert-parallelと書かれています。この記事は、実際に使って確かめた記録ではありません。

Mixtralの論文は、専門家並列では負荷分散が重要で、偏ると一部のGPUが過負荷になり、全体の遅れになる、と述べています。vLLMには、負荷を均すEPLBがあり、そのために冗長な専門家をGPUメモリに置きます。文書は、メモリが限られる環境には向かず、KVキャッシュに回せる余地が減ると警告し、DeepSeek-V3では冗長な専門家1つが約2.4GBかかると書いています。大規模な利用では、冗長専門家の数を32にするよう勧めています(既定は0)。

つまり、MoEは、メモリを増やして、負荷を均す工夫まで必要になる設計です。

学習の側の難しさ

Hugging Faceの解説と、各論文によると、次の点が挙げられています。

Mixtral 8x7Bの公式の数字と、論文の観察

構成(論文の表1): 次元4096、層数32、ヘッド数32、KVヘッド数8、文脈長32768、語彙32000、専門家8、選ぶ数2。ゲートはSoftmax(TopK(x・Wg))です。

GShardとの違い: 論文は、全層のFFNをMoE層にしている点を挙げています。GShardは1層おきです。

専門家は分野の担当ではなさそう: ArXiv、PubMed、PhilPapersで、専門家の選ばれ方の分布はよく似ていました。論文は、ルーターが分野より構文に沿って選んでいるようだと述べ、Pythonの「self」が同じ専門家に行く例、コードのインデントが一貫して同じ専門家に行く例を挙げています。

連続トークンの偏り: 第1選択の専門家が連続で同じになる割合は、ランダムなら12.5%ですが、層15と31ではそれより高くなります。第1か第2選択のどちらかが同じになる割合は、DM Mathematicsの層15で67.0%、ランダムなら約46%です。著者は、この局所性が、専門家並列では過負荷を招きうる一方、キャッシュに活かせるかもしれない、と書いています。

性能の主張: 論文は、基本モデルがLlama 2 70BとGPT-3.5に並ぶか上回ると書いています。ライセンスはApache 2.0です。この主張は論文の自己評価で、この記事では検証していません。

気をつけること

出典

更新履歴