Volver a cargar el modelo del transformador fine-tuned de huggingface genera resultados de predicción inconsistentes.
Estoy tratando de volver a cargar un modelo DistilBertForTokenClassification ajustado. Después de usar el Trainer para entrenar el modelo descargado, guardo el modelo con trainer.save_model().
Entrenamiento del modelo
tokenizer = AutoTokenizer.from_pretrained(“distilbert-base-uncased”, use_fast=True)
model = AutoModelForSequenceClassification.from_pretrained(“distilbert-base-uncased”, num_labels=512)
trainer = Trainer(
…
)
trainer.train()
trained_model_save_path = ‘some_path/on_disk’
torch.save(model.state_dict(), trained_model_save_path)
sample_test_output = get_prediction(model, sample_test_text= “sample_test_text”, MAX_LEN)
En la inferencia (en un script de Ipython separado), intenté cargar este modelo desde el disco. Para el mismo texto de prueba de muestra, la salida de prueba de muestra es inconsistente y peor que en el entrenamiento del modelo. Por lo tanto, sospecho que los pesos del modelo se cargaron incorrectamente en la inferencia. En la parte de carga del modelo, intenté imitar el tutorial de HuggingFace: modelo = TheModelClass(args, **kwargs)
Inferencia del modelo
model = AutoModelForSequenceClassification.from_pretrained(“distilbert-base-uncased”, num_labels=512)
model.load_state_dict(torch.load(trained_model_save_path))
model.eval()
sample_test_output = get_prediction(model, sample_test_text= “sample_test_text”, MAX_LEN)
Parece que hay otra pregunta que reporta un problema similar, pero aún no hay respuestas efectivas:
Guardar y volver a cargar un modelo ajustado finamente de HuggingFace
davy.ai
Parece que los pesos del modelo no se cargaron correctamente durante la inferencia y, por lo tanto, se obtuvieron resultados inconsistentes y peores. Una forma de asegurar la carga correcta de los pesos del modelo es utilizar la misma inicialización y configuración del modelo durante la inferencia. En el fragmento de código dado, el modelo se inicializa nuevamente durante la inferencia con la misma configuración y luego se cargan los pesos entrenados. Esto puede provocar inconsistencias.
En cambio, se pueden seguir los siguientes pasos para cargar correctamente el modelo entrenado:
trainer.save_model()
en lugar de guardar solo el state_dict. Esto guarda también la configuración, el tokenizer y otros archivos adicionales.AutoModelForSequenceClassification.from_pretrained
con la ruta guardada.model.eval()
.Al seguir estos pasos, el modelo entrenado se puede cargar correctamente durante la inferencia y se pueden obtener resultados consistentes.