Transformers documentation

Metal

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Metal

Metal量子化は、Apple Silicon (MPS) デバイス上で、Hugging Face Hub にホストされている Metal カーネル (kernels-community/mlx-quantization-metal-kernels) を使用してアフィン量子化を実行します。これらのカーネルは MLX フレームワークに由来し、kernels ライブラリを介してコンパイルされます。

重みはグループごとのスケールとバイアス付きのuint32テンソルにパッキングされ、フォワードパスでは融合されたデクアンタイゼーションと行列積のMetalカーネル(affine_qmm_t)が使用されます。これにより、CPUとの往復なしに推論を完全にGPU上で実行しながら、メモリ使用量を低く抑えることができます。

サポートされているビット幅は2、4、8です。グループサイズは設定可能で、デフォルト値は64です。

要件

  • MPS 対応の Apple Silicon Mac (M1 / M2 / M3 / M4)
  • kernelsパッケージ:
pip install kernels

Metal カーネルは初回使用時に Hub から自動的にダウンロードされるため、手動でのコンパイルは不要です。

オンザフライで量子化

MetalConfig を渡すことで、モデルの読み込み時に任意のモデルを量子化できます。対象となるすべての nn.Linear レイヤーは、量子化されたバージョンに置き換えられます。

from transformers import AutoModelForCausalLM, AutoTokenizer, MetalConfig

quantization_config = MetalConfig(bits=4, group_size=64)
model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-3.2-1B",
    device_map="mps",
    quantization_config=quantization_config,
)

tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-3.2-1B")
inputs = tokenizer("Apple Silicon is", return_tensors="pt").to("mps")
output = model.generate(**inputs, max_new_tokens=50)
print(tokenizer.decode(output[0], skip_special_tokens=True))

事前量子化済みモデルの読み込み

チェックポイントに量子化済みウェイト(weightがパックされたuint32、scales、qbiases)が既に含まれている場合、それらは直接読み込まれます。再量子化は不要です。

from transformers import AutoModelForCausalLM, MetalConfig

model = AutoModelForCausalLM.from_pretrained(
    "your-org/model-metal-4bit",
    device_map="mps",
)

Dequantize

MPS がないマシンでは、事前量子化されたチェックポイントは自動的に float にデクォンタイズされ、モデルが CPU または CUDA でも使用可能な状態に保たれます。この動作を明示的に強制することもできます。

from transformers import AutoModelForCausalLM, MetalConfig

config = MetalConfig(dequantize=True)
model = AutoModelForCausalLM.from_pretrained(
    "your-org/model-metal-4bit",
    quantization_config=config,
    device_map="cpu",
)

レイヤーの除外

一部のレイヤー(例: lm_head)は、modules_to_not_convert を使用して量子化の対象から除外できます。

config = MetalConfig(bits=4, group_size=64, modules_to_not_convert=["lm_head"])

設定オプション

パラメータデフォルト説明
bits4重みの量子化に使用するビット幅(2、4、または 8)
group_size64量子化グループごとの要素数
modules_to_not_convertNoneフル精度で保持するモジュール名のリスト
dequantizeFalse非MPSデバイス向けに、デクォンタイズをfloatに強制します
Update on GitHub