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) с использованием Metal-ядер, размещённых на Hugging Face Hub (kernels-community/mlx-quantization-metal-kernels). Эти ядра происходят из фреймворка MLX и компилируются через библиотеку kernels.

Веса упаковываются в тензоры uint32 с масштабами и смещениями для каждой группы, а прямой проход использует объединённое Metal-ядро для деквантования и матричного умножения (affine_qmm_t). Это позволяет удерживать потребление памяти на низком уровне, выполняя инференс полностью на GPU без обращения к CPU.

Поддерживаемые разрядности: 2, 4 и 8. Размер группы настраивается (по умолчанию 64).

Требования

  • Mac с Apple Silicon (M1 / M2 / M3 / M4) с поддержкой MPS
  • Пакет 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",
)

Декуантизация

На машинах без 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Принудительное приведение к float при деквантовании (для устройств, не являющихся MPS)
Update on GitHub