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

A quantização Metal executa a quantização afim em dispositivos Apple Silicon (MPS) usando kernels Metal hospedados no Hugging Face Hub (kernels-community/mlx-quantization-metal-kernels). Esses kernels originam-se do framework MLX e são compilados por meio da biblioteca kernels.

Os pesos são empacotados em tensores uint32 com escalas e vieses por grupo, e a passagem direta utiliza um kernel Metal de desquantização + matmul fundidos (affine_qmm_t). Isso mantém o uso de memória baixo ao executar a inferência inteiramente na GPU, sem idas e vindas com a CPU.

As larguras de bits suportadas são 2, 4 e 8. O tamanho do grupo é configurável (padrão 64).

Requisitos

  • Mac com Apple Silicon (M1 / M2 / M3 / M4) com suporte a MPS
  • O pacote kernels:
pip install kernels

Os kernels Metal são baixados automaticamente do Hub no primeiro uso — não é necessária compilação manual.

Quantize em tempo de execução

Carregue qualquer modelo e quantize-o durante o carregamento passando um MetalConfig. Todas as camadas nn.Linear elegíveis são substituídas por versões quantizadas.

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

Carregar um modelo pré-quantizado

Se um checkpoint já contém pesos quantizados (weight como uint32 empacotado, scales, qbiases), eles são carregados diretamente — sem necessidade de re-quantização.

from transformers import AutoModelForCausalLM, MetalConfig

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

Desquantizar

Em máquinas sem MPS, um checkpoint pré-quantizado é automaticamente desquantizado de volta para float, de modo que o modelo continue utilizável em CPU ou CUDA. Você também pode forçar esse comportamento explicitamente:

from transformers import AutoModelForCausalLM, MetalConfig

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

Excluir camadas

Certas camadas (por exemplo, lm_head) podem ser excluídas da quantização por meio de modules_to_not_convert:

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

Opções de configuração

ParâmetroPadrãoDescrição
bits4Largura de bits para quantização de pesos (2, 4 ou 8)
group_size64Número de elementos por grupo de quantização
modules_to_not_convertNoneLista de nomes de módulos para manter em precisão total
dequantizeFalseForçar a desquantização para float (para dispositivos não-MPS)
Update on GitHub