0
0

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でパラメータ数を犠牲にせず動作速度を改善したい ― MoE(Mixture of Experts)解説

0
Posted at

MoE(Mixture of Experts)とは ― パラメータ数は多いのに軽い仕組みを解説

はじめに

ローカルLLMを使っていると、パラメータ数は大きい方が賢いけれど、動作が重くなる傾向にあります。
パラメータ数が多い=モデルの容量が大きい=毎回の読み込み量が増えるためです。
MoE(Mixture of Experts)は、パラメータ数は多いのに動作を軽量にできる技術です。
これを知っているとモデルを選ぶとき新しい視点になると思うので、紹介したいと思います。
まずは LLMの推論でCPUが何をしているのか というところから読み解いていきましょう。

対象者

GPUなし・クラウドなしのローカル環境でLLMを試したい人。
「モデル名に書いてある数字の意味がよく分からない」という方にも読んでいただける内容です。

そもそもLLMの推論で何が起きているのか

パラメータとは

LLMの「パラメータ」とは、モデルが学習で獲得した 重みデータ のことです。
人間でいう「知識」や「経験」に相当するもので、これが何十億個もあります。

このパラメータ(重みデータ)がモデルファイルの正体です。
モデルファイルが何GBもあるのは、この大量の重みが詰まっているからです。

パラメータ数・量子化・ファイルサイズの関係

1つのパラメータ(重み)を何ビットで保存するかを 量子化 と呼びます。
ビット数が小さいほどファイルが軽くなりますが、精度が落ちます。

覚え方はシンプルです:

1Bパラメータ × 8bit量子化 ≒ 1GB

これを基準にすると、他のサイズも簡単に計算できます。

パラメータ数 8bit(Q8) 4bit(Q4)
1B(10億) 約1GB 約0.5GB
7B(70億) 約7GB 約3.5GB
30B(300億) 約30GB 約15GB
70B(700億) 約70GB 約35GB

実際のファイルサイズはモデル構造やメタデータの分だけ多少前後しますが、
目安としてはこの計算で十分です。

一般的に Q4(4bit量子化) が「品質と容量のバランスがよい」として広く使われています。
Q8だと精度は高いですがファイルが倍になり、メモリに載らなくなるケースが出てきます。

1トークンごとにモデル全体を読む

ここがローカルLLMを理解するうえで最も重要なポイントです。

通常のプログラムでは、CPUはプログラムの命令を1行ずつ読んで実行します。
読み込むデータは小さく、メモリ転送はほとんど問題になりません。

ところがLLMの場合、1トークン(≒1単語)を生成するたびに、
モデルの全パラメータをメモリからCPUに転送して読み込む必要があります。

つまりQ4量子化の場合:

  • 7Bモデルなら、1単語出すたびに 約3.5GB をメモリからCPUに転送
  • 30Bモデルなら、1単語出すたびに 約15GB をメモリからCPUに転送

通常のプログラムの「命令」が数KB〜数MBなのに対し、
LLMの「命令」はモデルファイル丸ごと(何GB)という桁違いの大きさです。
これがトークンごとに繰り返されます。

ボトルネックはCPUの演算能力ではなく「メモリ帯域」

ここまで分かると、ローカルLLMの速度を決めるのが
CPUの計算速度ではなく、メモリ→CPU間のデータ転送速度(メモリ帯域) だと分かります。

いくらCPUが速くても、メモリからデータが届かなければCPUは待つしかありません。
モデルが大きいほど毎回の転送量が増え、帯域がボトルネックになって遅くなります。

ここで重要な数字が 2つ あります。

項目 意味 影響するもの
メモリ容量(RAM) モデル全体を保存するための大きさ モデルが載るかどうか
メモリ帯域(GB/s) メモリ→CPU間の転送速度 推論速度(トークン/秒)

大きいモデルを動かすには、容量も帯域も必要です。
容量が足りなければモデルが載らない。帯域が足りなければ遅くなる。

メモリ帯域の調べ方

メモリ帯域はPCのスペックから計算できます。

メモリ帯域(GB/s) = メモリクロック(MT/s) × 8バイト × チャンネル数

メモリクロック(MT/s)はメモリの型番に含まれている数字です。
チャンネル数は、メモリスロットに何枚挿しているかで決まります
(2枚ならデュアルチャンネル=2ch、1枚ならシングル=1ch)。

メモリ種類 総容量 チャンネル 計算 帯域
DDR4-2666 16GB×2枚 32GB デュアル(2ch) 2666MT/s × 8B × 2ch 約42.7 GB/s
DDR4-3200 16GB×2枚 32GB デュアル(2ch) 3200MT/s × 8B × 2ch 約51.2 GB/s
DDR5-4800 16GB×2枚 32GB デュアル(2ch) 4800MT/s × 8B × 2ch 約76.8 GB/s
DDR5-6400 16GB×2枚 32GB デュアル(2ch) 6400MT/s × 8B × 2ch 約102.4 GB/s

メモリの型番は、PCのスペック表やBIOS画面、
Windowsなら「タスクマネージャー → メモリ」の「速度」欄で確認できます。

帯域が分かると推論速度が予測できる

メモリ帯域とモデルサイズが分かれば、推論速度(トークン/秒)の理論上限を計算できます。

トークン/秒 ≒ メモリ帯域(GB/s) ÷ モデルサイズ(GB)

1トークン生成するたびにモデル全体を転送するので、
「1秒間に何回モデルを読み切れるか」がそのままトークン/秒の上限になります。

計算例

DDR4-3200 デュアルチャンネル(帯域 51.2 GB/s)の場合:

モデル サイズ(Q4) 計算 理論上限
7B 約3.5GB 51.2 ÷ 3.5 約14.6 t/s
13B 約6.5GB 51.2 ÷ 6.5 約7.9 t/s
30B 約15GB 51.2 ÷ 15 約3.4 t/s
70B 約35GB 51.2 ÷ 35 約1.5 t/s

※これは理論上限なので、実際の速度はこれより少し低くなります。
ただし、モデル選びの目安としては十分な精度です。

実際のPCで試算してみる

筆者の環境(Intel i7-4790 + DDR3-1600 デュアルチャンネル)で
Qwen2.5-7B(Q4、約3.5GB)を動かす場合を試算してみます。

メモリ帯域 = 1600 × 8 × 2 = 25.6 GB/s
トークン/秒 = 25.6 ÷ 3.5 ≒ 約7.3 t/s(理論上限)

実際にllama.cppで動かしたときの実測値は 3.9 t/s でした。
理論上限の約53%ですが、これはオーバーヘッド(KVキャッシュやOS側のメモリ使用など)が
あるためで、目安としては十分当たっています。

参考までに、同じ環境で3Bモデル(Q4、約2.0GB)を動かすと:

トークン/秒 = 25.6 ÷ 2.0 ≒ 約12.8 t/s(理論上限)
実測: 8.5 t/s(理論上限の約66%)

モデルが小さいほど帯域に余裕ができて、理論値に近い速度が出やすくなります。

つまり、自分のPCのメモリ帯域さえ分かれば、
モデルをダウンロードする前に「どれくらいの速度が出るか」を事前に見積もれます。

だから、大きいモデルほど賢いが、遅い。 これがローカルLLMの基本的なジレンマです。

MoEはこのジレンマを解決する技術

全部読まなくていい ― 必要な部分だけ読む

MoE(Mixture of Experts)は、このジレンマに対する最適化技術です。

通常の密(Dense)モデルでは、1トークン生成するたびにモデルの 全パラメータ を読みます。
MoEモデルでは、モデルの中に多数の 「エキスパート」(専門化されたサブネットワーク)が用意されていて、
1トークンごとにルーター(ゲート機構)が 「今回はこのエキスパートだけ使えばいい」 と判断し、
必要な部分だけを読み込みます。

例えば Qwen3-30B-A3B の場合:

  • モデル全体は 30B(300億) のパラメータを持つ(128個のエキスパートに分かれている)
  • 1トークンの生成で実際に使うのは 3B(30億) のパラメータだけ
  • メモリには30B分を載せる必要があるが、毎回の転送量は3B分で済む

「アクティブパラメータ」とは

ここで出てくるのが アクティブパラメータ という言葉です。

  • 総パラメータ(30B) :モデル全体の重みの数。メモリに保存する必要がある量
  • アクティブパラメータ(3B) :1トークン生成時に実際にCPUが読み込むパラメータの数

モデル名の 30B-A3B はまさにこれを表しています。
A3BA は Active(アクティブ)の略です。

つまりMoEの効果は:

密(Dense)モデル 30B MoEモデル 30B-A3B
メモリに載せる量 30B分(約18〜20GB) 30B分(約18〜20GB) 同じ
毎トークンの転送量 30B分 3B分(約1/10)
知識の保存容量 30B分 30B分 同じ
推論速度 遅い 速い(帯域を1/10しか使わない)

メモリ容量は同じだけ必要だが、帯域消費が激減するので速い。
これがMoEの核心です。

たとえ話:巨大な図書館

30B-A3Bを図書館にたとえると:

  • 図書館全体には 30B冊 分の知識が並んでいる(これがメモリに保存される総容量)
  • 1つの質問が来るたびに、司書(ルーター)が「この質問なら、この本棚の3冊だけ見ればいい」と判断して、3冊だけ を書庫からカウンターに運ぶ
  • 蔵書(知識の総量)は30B冊分あるが、毎回運ぶ量(メモリ帯域の消費)は3冊分で済む

密モデルの場合、毎回30B冊全部をカウンターに運んでから探す、というイメージです。
図書館の大きさ(メモリ容量)は同じでも、運ぶ手間(帯域消費)がまったく違います。

なぜ「3Bモデル」と同じではないのか

「アクティブ3B」と聞くと、「じゃあ3Bの小さいモデルと同じでは?」と思いがちですが、違います。

単体の3B密モデル 30B-A3B(MoE)
知識の保存容量 3B分しかない 30B分ある
学習でカバーできる範囲 狭い 広い(蔵書が多い)
毎トークンの転送量 3B分 3B分(同じ)

「単体の3Bモデル」は蔵書が3B冊しかない小さな図書館。
MoEの「アクティブ3B」は、蔵書30B冊の大きな図書館から3冊だけ選んで読む。

転送量(速度)は同じでも、選べる知識の幅がまったく違います。
これが「アクティブパラメータが小さいのに、見た目以上に賢い」と言われる理由です。

モデルには得意分野がある

LLMのモデルは、学習に使ったデータによって得意分野が異なります。
これはMoEに限らず全モデルに言えることですが、モデル選びの重要なポイントです。

分類 特徴 代表例
汎用モデル 幅広いタスクにバランスよく対応 Qwen3、Mixtral
コーディング特化 プログラムの生成・補完に強い DeepSeek-Coder、Qwen-Coder
多言語・日本語特化 日本語の理解・生成に強い Qwenシリーズ(中国語+多言語に強い)
数学・推論特化 数学や論理的推論に強い DeepSeek-Math

モデル名に CoderMath が含まれていれば、それが得意分野の手がかりです。
目的に合ったモデルを選ぶことで、同じパラメータ数でも結果が大きく変わります。

実際の仕組み(もう少し技術的に)

  1. モデルの中に多数の エキスパート(専門化されたサブネットワーク)が用意されている
    • 例:Qwen3-30B-A3Bは128個のエキスパートを持つ
  2. 各トークンを生成するごとに、ルーター(ゲート機構)が「どのエキスパートを使うか」をスコアリングし、上位いくつか(多くは2〜4個)だけを選ぶ
  3. 選ばれたエキスパートだけでメモリ転送・計算を行い、その出力を合成して次のトークンを決める
  4. 選ばれるエキスパートはトークンごとに毎回変わる(固定ではない)

よくある誤解

誤解1:「メモリも3B分で済む」→ 誤り

メモリにはモデル全体(30B分)をロードする必要があります。
「アクティブ3B」は毎トークンの転送量の話であり、メモリ容量の話ではありません。

誤解2:「3Bモデルと同じ性能」→ 誤り

知識の保存容量(総パラメータ)が違うので、転送量が同じでも
MoEの方が一般的に高い性能を発揮しやすいです。

誤解3:「どんなタスクでも密モデルより優れている」→ 必ずしも正しくない

ルーティング(どのエキスパートを使うか)がうまく機能しない分野
(訓練データが少ない専門領域など)では、密(Dense)モデルの方が安定する場合があります。
MoEはルーティング精度に依存する設計だからこそ、得意・不得意がタスクによって出やすいです。

CPU単体・ローカル運用での実用上のポイント

  • メモリ容量(RAM) は「総パラメータ分」を見積もる
    (Qwen3.6-35B-A3BならQ4で約22GB、120B級ならMXFP4で約60GBなど)
  • 推論速度 は「アクティブパラメータ分」の帯域消費で決まるので、
    GPUなしのCPU単体環境でも、同じアクティブパラメータ数の密モデルと近い速度が出やすい
  • 「総パラメータが大きいモデル=動かせない」と諦める前に、MoEかどうかを確認すると、
    実は手元の環境でも動く場合がある

モデル名の読み方まとめ

Qwen3.6-35B-A3B のような名前の意味:

  • 35B:総パラメータ数(知識の保存容量、メモリに必要な容量の目安)
  • A3B:Active 3B、アクティブパラメータ数(毎トークンの転送量の目安)

「A〇B」という表記がない場合は、基本的に密(Dense)モデルで、
記載されたパラメータ数がそのまま転送量にもメモリにも当たります。

32GB RAMで動かせるMoEモデルの例

モデル 総パラメータ アクティブ Q4量子化サイズ
Qwen3.6-35B-A3B 35B 3B 約22GB
Mixtral 8x7B 47B 13B 約26GB
DeepSeek-Coder-V2-Lite 16B 2.4B 約10GB

32GBという容量は、現行のコンシューマー向けプラットフォーム
(Ryzen/Core iシリーズの2〜4チャンネルメモリ構成)でも無理なく組める容量です。

まとめ

LLMの推論では、1トークン生成するたびにモデル全体をメモリからCPUに転送します。
だから大きいモデルほど賢いけれど遅い、というジレンマがあります。

MoEは 「全部読まず、必要なエキスパートだけ読む」 ことで
このジレンマを解決する技術です。

  • メモリ容量は総パラメータ分必要(モデルを保存するため)
  • メモリ帯域はアクティブパラメータ分で済む(必要な部分だけ転送するため)

モデル名に「A〇B」が付いていたら、それはMoEモデルの合図。
「総パラメータが大きくて動かせない」と思い込む前に、
アクティブパラメータを確認してみてください。意外と手元のPCで動くかもしれません。

関連記事

henagineer のプログラミング・開発記事まとめ

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?