es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Utilice la cuantización en los modelos de HuggingFace Transformers.

Estoy aprendiendo Quantization, y estoy experimentando con Sección 1 de este cuaderno.

Quiero usar este código en mis propios modelos.

Hipotéticamente, solo necesito asignar a la variable model en Sección 1.2


<h1>cargar modelo</h1>

model = BertForSequenceClassification.from<em>pretrained(configs.output</em>dir)
model.to(configs.device)

Mis modelos son de una biblioteca diferente: from transformers import pipeline. Entonces .to() genera un AttributeError.

Mi modelo:

pip install transformers
```python
from transformers import pipeline

unmasker = pipeline('fill-mask', model='bert-base-uncased')
model = unmasker("Hello I'm a [MASK] model.")

Salida:

Algunos pesos del modelo en el punto de control bert-base-uncased no se utilizaron al inicializar BertForMaskedLM: [&#39;cls.seq_relationship.bias&#39;, &#39;cls.seq_relationship.weight&#39;]
- Esto ES lo esperado si estás inicializando BertForMaskedLM desde el punto de control de un modelo entrenado en otra tarea o con otra arquitectura (por ejemplo, inicializando un modelo BertForSequenceClassification desde un modelo BertForPreTraining).
- Esto NO ES lo esperado si estás inicializando BertForMaskedLM desde el punto de control de un modelo que esperas que sea exactamente idéntico (inicializando un modelo BertForSequenceClassification desde un modelo BertForSequenceClassification).

¿Cómo puedo ejecutar el código de Quantization vinculado en mi ejemplo de modelo?

Por favor, avísame si hay algo más que deba aclarar en esta publicación.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para utilizar el código de Cuantización vinculado en el modelo de ejemplo proporcionado que utiliza la biblioteca transformers, tendría que modificar el código en Sección 1 del cuaderno para cargar el modelo desde el objeto pipeline en lugar de utilizar la clase BertForSequenceClassification de la biblioteca huggingface-transformers.

    Aquí tienes un fragmento de código de ejemplo:

    from transformers import BertTokenizer, AutoModelForMaskedLM, pipeline
    import torch
    
    tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
    model = AutoModelForMaskedLM.from_pretrained('bert-base-uncased')
    
    def my_tokenizer(text):
        return tokenizer.encode_plus(text, return_tensors='pt')
    
    def my_model(input_ids, attention_mask):
        logits = model(input_ids, attention_mask=attention_mask)[0]
        return torch.nn.functional.softmax(logits, dim=-1)
    
    quantized_model = torch.quantization.quantize_dynamic(
        torch.jit.trace(my_model, (torch.zeros([1, 32], dtype=torch.long), torch.zeros([1, 32], dtype=torch.long))),
        {torch.nn.Linear},
        dtype=torch.qint8
    )
    
    my_text = "Hola, soy un modelo [MASK]."
    inputs = my_tokenizer(my_text)
    output = quantized_model(inputs["input_ids"], inputs["attention_mask"])
    print(output)
    

    Este código inicializa un modelo pre-entrenado BertForMaskedLM de la biblioteca transformers y define un tokenizador y una función de modelo que utilizan este modelo para calcular la salida para una entrada determinada. Luego, se utiliza la función torch.quantization.quantize_dynamic para cuantizar el modelo, y se utiliza el modelo cuantizado resultante para realizar inferencias sobre un texto de entrada.

    Cabe destacar que el archivo quantization_script_bert.py en Sección 1.3 del cuaderno define un tokenizador y una función de modelo similares, por lo que puedes utilizar eso como referencia si es necesario. Además, es posible que tengas que modificar la forma de entrada y el tipo de datos en función de los requisitos específicos de tu caso de uso.

Comments are closed.