トピックハブ

効率的な機械学習

モデルをより小さく、より速く、より安価に実行するための技法と、それぞれが精度にどれだけのコストを課すか、そしてサーバー、ノートPC、スマートフォンのそれぞれでどう選ぶかを解説します。

更新 2026年11月13日 · 量子化、int8、4ビット、枝刈り、蒸留、スパース性、混合エキスパート、オンデバイス

概要

モデルを実行するコストは3つの数値で決まります。占有するバイト数、推論1回あたりに動かすバイト数、そして実行する演算数です。効率的な機械学習とは、モデルの有用性を同じだけ縮めることなく、これらのうち1つ以上を縮める技法の集まりです。この分野が重要なのは、モデルが使われ始めれば費用の大半は学習ではなく推論にかかるからであり、またユーザーの手元のデバイスに収まるモデルなら、ネットワークもサーバー代も不要で、データがデバイスの外に出ることもないからです。

このハブは、大きすぎる、遅すぎる、あるいは高すぎるモデルを抱えていて、どのレバーを最初に引くべきか知る必要のあるエンジニアのためのページです。レバーとは、量子化、枝刈りとスパース性、蒸留、混合エキスパート(MoE)のようなアーキテクチャの選択、そしてそもそも小さなモデルを使うという決定です。フォーマットとファイル形式は/reference/quantisation-formats/に表としてまとめてあり、これらの技法が効果をもつ理由であるハードウェアの限界は/topics/hardware-and-acceleration/にあります。

重要な考え方

量子化: 1つの数値あたりのビット数を減らす

学習済みの重みは32ビットまたは16ビットの浮動小数点数です。量子化はそれをより少ないビット数の整数とスケール係数に写像し、重みのブロックをint8またはint4の値のブロックと1つの浮動小数点数に変えます。一般的な方式は対称absmaxです。ブロック内の最大の絶対値を見つけ、それを127で割ってスケールとし、各重みをスケールで割って整数に丸めます。誤差は重み1つあたり最大でスケール幅の半分であり、だからこそブロックサイズが重要です。テンソル単位のスケールでは1つの外れ値が他のすべての重みを粗くしてしまいますが、チャネル単位またはグループ単位のスケール(GPTQ、AWQ、GGUF k-quantsでは32から128のグループ)なら、ほとんどの重みがある範囲で刻みを小さく保てます。

1ブロックのfp16重み(実数直線)-2.10+2.1外れ値 -2.1重みの大半は0付近の約0.3以内にあるscale s = max|w| / 127 = 2.1 / 127 = 0.0165q = round(w / s), w_hat = q * sint8 grid (255 steps of 0.0165)-1270+127重み0.30はq = 18に落ち、誤差は最大でs / 2 = 0.008。小さなグループは各々独自のsをもち、グリッドが細かい。int4は15段階しかない:グループサイズ32から128が必須
重みの1ブロックに対する対称int8量子化。最大の絶対値がスケールを決め、各重みはその最も近い倍数に丸められ、1つの外れ値が残りすべてのグリッドを粗くしうる。

学習後量子化(PTQ)はこれを完成したモデルに対して行い、小さなキャリブレーション集合でスケールを決め、GPTQとAWQでは層ごとに丸め誤差を補償します。量子化を考慮した学習(QAT)はファインチューニング中に丸めをシミュレートしてモデルをそれに適応させるもので、PTQなら残してしまう精度低下なしにint4以下を使えるようにするのはこれです。本稿執筆時点の大規模言語モデルでは、重みのみのint8はほぼ無償、4ビットのグループ量子化は測定可能だが通常は許容できる程度のコスト、それより低いものはQATか余裕のある非常に大きなモデルが必要です。LLM.int8()(Dettmers et al., 2022)は、大規模トランスフォーマーの外れ値特徴によって素朴なint8活性化が失敗する理由を示し、QLoRA(Dettmers et al., 2023)は、ベースの重みを4ビットに置いたままモデルをファインチューニングできることを示しました。/topics/fine-tuning-and-alignment/が単一GPUでの作業に依拠しているのはこれです。

枝刈り、スパース性、条件付き計算

枝刈りは重みを取り除きます。非構造化枝刈りは個々の重みを大きさや顕著性スコアに基づいてゼロにし、大規模言語モデルから半分の重みを小さな損失で取り除けます(SparseGPT、Wanda)が、GPUはハードウェアのサポートなしには散らばったゼロで速くなりません。構造化枝刈りはヘッド、チャネル、層をまるごと取り除き、より高い精度コストと引き換えに実際の高速化をもたらします。NVIDIAの2:4構造化スパース性は、4つの重みのうち2つがゼロというもので、ハードウェア面での中間解です。混合エキスパートは除去ではなく条件付き計算です。モデルは多数のフィードフォワードのエキスパートを保持し、各トークンをそのうちの少数にルーティングするので、合計109 Bパラメータのモデルがトークンあたり17 Bのアクティブなパラメータで計算することもあります。メモリコストは合計分、計算コストはアクティブ分であり、MoEモデルが大規模なサービングでは安価で、ノートPCでは扱いにくいのはそのためです。

蒸留と小型モデルという選択肢

蒸留(Hinton, Vinyals and Dean, 2015)は、小さな生徒モデルを、ハードラベルではなく大きな教師モデルの出力分布に合わせるように学習させます。出力分布のほうが例1つあたりの情報量が多いからです。言語モデルでの実用的な形は、教師でデータセットを生成し、それで生徒をファインチューニングすることです。SmolLM2-135M(135 Mパラメータ、8 kコンテキスト、Apache-2.0、2024年11月)はノートPCのCPUでトークンあたりミリ秒単位で動きます。Gemma 3 1B(1 Bパラメータ、32 kコンテキスト、Gemma Terms of Use、2025年3月)とLlama 3.2 1Bおよび3B(128 kコンテキスト、Llama 3.2 Community Licence、2024年9月)はスマートフォン向けに作られています。率直な経験則は、タスクが狭く学習セットを作れるなら、自分のタスクでファインチューニングした小さなモデルのほうが、プロンプトで指示した大きな汎用モデルに、何分の一かのコストでたいてい勝つ、というものです。

どこから始めるか

重みと活性化を具体的なものにするために/learn/beginner/07-your-first-neural-network/と/learn/beginner/08-embeddings-and-similarity/を読み、次にデプロイ側として/learn/beginner/10-from-notebook-to-service/を読んでください。それから手元のモデルをtorch.ao.quantizationで量子化するか、llama.cppの変換スクリプトでGGUFにエクスポートし、前後で自分の評価セットの精度を測ってください。/projects/lora-fine-tune-apple-silicon/プロジェクトは4ビットのベースの重みと小さなアダプタを組み合わせるもので、これが単一マシンでの標準的なレシピです。

ツールとプラットフォーム

ツール 用途 ライセンス プラットフォーム
llama.cppとGGUF k-quantの2ビットから8ビットのフォーマットによるCPUとApple Siliconでの推論 MIT /platforms/opensource/
bitsandbytes PyTorchとTransformers内でのint8および4ビット(NF4)の重み、QLoRA MIT /platforms/huggingface/
AutoGPTQ、AutoAWQ、Optimum GPUサービング向けの学習後4ビット量子化 MIT、Apache-2.0 /platforms/huggingface/
torch.aoとExecuTorch PyTorchの量子化APIとそのオンデバイスランタイム BSD-3 /platforms/pytorch/
Core ML ToolsとMLX Appleデバイス向けの変換、パレット化、量子化 BSD-3(coremltools)、MIT(MLX) /platforms/apple/
ONNX Runtime 量子化したCPU推論、モバイルとWebのランタイム MIT /platforms/microsoft/
TensorRTとTensorRT-LLM NVIDIAのコンパイル型推論エンジン、FP8とint4のカーネル プロプライエタリなランタイム、Apache-2.0(TensorRT-LLM) /platforms/nvidia/

よくある間違い

  • 量子化後にパープレキシティだけを報告する。下流タスクが崩壊していてもパープレキシティはほとんど動きません。タスクで評価してください。
  • 誤った分布のキャリブレーション集合で量子化する。サービングするデータに似たデータでキャリブレーションしてください。
  • 2:4のサポートもスパースカーネルもないGPUで、非構造化スパース性に速度を期待する。
  • 両方を試さずに、8ビットの7 Bモデルより2ビットの70 Bモデルを選ぶ。小さくて損傷の少ないモデルのほうがしばしば勝ちます。
  • KVキャッシュを忘れる。重みを4ビットに量子化しても、コンテキスト長とともに増えるキャッシュには何の効果もありません。
  • 教師モデルのライセンスがその出力での学習を許しているか確認せずに蒸留する。いくつかのAPI利用規約とオープンウェイトのライセンスはこれを制限しています。

さらに深く