Transformers documentation

Configuraciones por capa

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

and get access to the augmented documentation experience

to get started

Configuraciones por capa

Algunos puntos de control son heterogéneos (no uniformes por capa). Un MLP más pequeño en una capa, menos cabezas de clave-valor en otra, o un diseño diferente en capas seleccionadas significa que una configuración global única no describe con precisión la pila.

Use per_layer_config en PreTrainedConfig para registrar esas diferencias cuando esté creando o inspeccionando una configuración y cuando el código del modelo las consuma. Cada entrada solo almacena lo que difiere de la configuración global; el resto se hereda.

Las configuraciones heterogéneas son una función potente. Si una disposición heterogénea se convierte en una arquitectura común o destacada, nos esforzaremos por modelarla explícitamente en la implementación de la arquitectura en lugar de depender de per_layer_config. Prefiera la arquitectura explícita cuando exista.

Los modelos siguientes son puntos de control heterogéneos. Las capas no son uniformes en toda la pila. Utilizan una arquitectura dedicada con block_configs y su propio model_type, en lugar de per_layer_config en una arquitectura estándar.

ModeloDerivado de
nvidia/Llama-3_3-Nemotron-Super-49B-v1_5meta-llama/Llama-3.3-70B-Instruct
nvidia/Llama-3_1-Nemotron-Ultra-253B-v1meta-llama/Llama-3.1-405B-Instruct
nvidia/gpt-oss-puzzle-88Bopenai/gpt-oss-120b
nvidia/NVIDIA-Nemotron-Labs-3-Puzzle-75B-A9B-BF16nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-BF16

Defina reemplazos por capa

Pase per_layer_config a LlamaConfig como un mapeo de índices de capa a sobrescrituras de atributos. Los índices de capa son de base cero. Solo es necesario especificar los atributos que difieren de la configuración global.

per_layer_config registra y resuelve los valores de configuración. Por sí solo no modifica los módulos que crea un modelo ni cómo se ejecutan esos módulos. Aplicar una sobrecarga de tamaño o un skip requiere código de modelo que lea la configuración por capa resuelta al construir o ejecutar cada capa. El LlamaModel actual construye cada LlamaDecoderLayer con la configuración global, por lo que las entradas skip a continuación permanecen como valores de configuración en lugar de eliminar módulos después de from_pretrained.

El siguiente ejemplo registra sobrescrituras para cuatro capas: la capa 5 utiliza un MLP más pequeño, la capa 11 utiliza menos cabezas de clave-valor, y las capas 23 y 27 registran valores skip para arquitecturas que los admiten.

from transformers import LlamaConfig


config = LlamaConfig(
    hidden_size=4096,
    intermediate_size=14336,
    num_hidden_layers=32,
    num_attention_heads=32,
    num_key_value_heads=8,
    per_layer_config={
        # Use a smaller MLP in one layer.
        5: {"intermediate_size": 8192},

        # Use fewer key-value heads in another layer.
        11: {"num_key_value_heads": 4},

        # Record a request to skip the MLP in architectures that support it.
        23: {"skip": ["mlp"]},

        # Record a request to skip attention in architectures that support it.
        27: {"skip": ["attention"]},
    },
)

Los submódulos que una arquitectura puede omitir (por ejemplo, "mlp" y "attention") se definen por arquitectura. skip acepta una lista, por lo que una capa puede registrar más de una sobrescritura de submódulo.

Acceder a config.per_layer_config[layer_idx] devuelve una configuración de capa resuelta. La configuración resuelta combina la configuración global con las sobrescripciones para esa capa.

# Layer 0 does not define overrides, so it inherits the global values.
config.per_layer_config[0].intermediate_size
# 14336

config.per_layer_config[0].num_key_value_heads
# 8

# Layer 5 overrides the MLP intermediate size.
config.per_layer_config[5].intermediate_size
# 8192

# Layer 11 overrides the number of key-value heads.
config.per_layer_config[11].num_key_value_heads
# 4

# Layer 23 records an MLP skip.
config.per_layer_config[23].skip
# ["mlp"]

# Layer 27 records an attention skip.
config.per_layer_config[27].skip
# ["attention"]

Las configuraciones que utilizan per_layer_config admiten el mismo ciclo de ida y vuelta de save_pretrained() y from_pretrained() que otras configuraciones.

Cada arquitectura define en su código qué atributos consume a nivel de capa. per_layer_config proporciona el mecanismo para registrar esas diferencias a nivel de capa y resolverlas en relación con la configuración global.

Acceso a atributos globales

Un atributo con reemplazos por capa no tiene un único valor para todo el modelo. num_key_value_heads puede ser 8 en la mayoría de las capas y 4 en capas seleccionadas. Leer config.num_key_value_heads fuera de un contexto de capa es ambiguo.

Por defecto, ese acceso lanza AmbiguousGlobalPerLayerAttributeError y te dirige a config.per_layer_config[layer_idx]. El atributo sigue existiendo en la configuración global, por lo que no se trata de un AttributeError. Leer ese valor global sin un índice de capa sigue siendo incorrecto. El código que construye una caché de clave-valor a partir de un num_key_value_heads global dimensionaría incorrectamente las capas equivocadas.

Establezca allow_global_per_layer_attribute_access=True solo cuando necesite intencionalmente el recurso global y pueda manejar configuraciones heterogéneas. En ese caso, se permite el acceso global. Se emite una advertencia una sola vez.

config = LlamaConfig(
    hidden_size=4096,
    intermediate_size=14336,
    num_hidden_layers=32,
    num_attention_heads=32,
    num_key_value_heads=8,
    allow_global_per_layer_attribute_access=True,
    per_layer_config={
        11: {"num_key_value_heads": 4},
    },
)

config.num_key_value_heads
# 8
# Emits a one-time warning because num_key_value_heads has a per-layer override.

Serialización

per_layer_config se serializa de forma dispersa de manera predeterminada, y se omiten las capas sin sobrescrituras. También se omiten los atributos sobrescritos que coinciden con el valor global.

from transformers import LlamaConfig


config = LlamaConfig(
    hidden_size=4096,
    intermediate_size=14336,
    num_hidden_layers=4,
    num_attention_heads=32,
    num_key_value_heads=8,
    per_layer_config={
        0: {"num_key_value_heads": 8},
        2: {"num_key_value_heads": 4},
    },
)

config.to_dict()["per_layer_config"]
# {"2": {"num_key_value_heads": 4}}

Establezca serialize_explicit_per_layer_config=True para incluir cada capa de los atributos representados en per_layer_config. Esto facilita la inspección de la disposición de las capas cuando algunos valores aún coinciden con la configuración global.

explicit_config = LlamaConfig(
    hidden_size=4096,
    intermediate_size=14336,
    num_hidden_layers=4,
    num_attention_heads=32,
    num_key_value_heads=8,
    serialize_explicit_per_layer_config=True,
    per_layer_config={
        0: {"num_key_value_heads": 8},
        2: {"num_key_value_heads": 4},
    },
)

serialized_per_layer_config = explicit_config.to_dict()["per_layer_config"]

serialized_per_layer_config
# {
#     "0": {"num_key_value_heads": 8},
#     "1": {"num_key_value_heads": 8},
#     "2": {"num_key_value_heads": 4},
#     "3": {"num_key_value_heads": 8},
# }

Use la serialización dispersa para configuraciones compactas y la serialización explícita cuando necesites el diseño completo por capa por legibilidad o para herramientas.

Update on GitHub