Multimodal Maestro es un ecosistema diseñado para simplificar el proceso de ajuste fino (fine-tuning) de modelos de lenguaje y visión (VLM). Aunque el núcleo soporta arquitecturas como PaliGemma 2, Florence-2 y Qwen2.5-VL, su arquitectura modular permite la incorporación de nuevos modelos siguiendo una serie de pasos estandarizados.
1. Análisis de la estructura de módulos
La lógica de cada modelo reside en el directorio maestro/trainer/models/. Para mantener la coherencia, cada implementación debe estar aislada en su propia subcarpeta. La estructura típica que se debe replicar es la siguiente:
core.py: Definición del motor de entrenamiento.checkpoints.py: Gestión de persistencia y serialización del modelo.inference.py: Lógica para la ejecución de predicciones.entrypoint.py: Configuración de la interfaz de línea de comandos (CLI).
2. Implementación del Trainer Personalizado
En el archivo core.py, es fundamental heredar de la clase base MaestroTrainer. Esta abstracción facilita la gestión del ciclo de vida del entrenamiento.
class CustomVLMManager(MaestroTrainer):
def __init__(self, model_instance, processor, train_gen, val_gen, config):
super().__init__(model_instance, processor, train_gen, val_gen, config)
# Inicialización de hiperparámetros específicos
def execute_training_cycle(self, batch_data):
# Implementación del paso de propagación y cálculo de pérdida
outputs = self.model(**batch_data)
loss = outputs.loss
return loss
3. Gestión de Checkpoints y Estados
La persistencia del modelo se define en checkpoints.py. Aquí se deben especificar las estrategias de guardado, especialmente si se utilizan técnicas de optimización como LoRA o cuantización.
from enum import Enum
class SaveProtocol(Enum):
FULL_WEIGHTS = "full"
ADAPTER_ONLY = "adapter"
def export_model_state(engine, output_dir, protocol=SaveProtocol.ADAPTER_ONLY):
# Lógica para volcar el estado del modelo y el procesador al disco
engine.save_pretrained(output_dir)
print(f"Estado guardado en: {output_dir}")
def reload_model_state(model_path, target_device):
# Carga del modelo en el dispositivo especificado (CPU/CUDA)
pass
4. Definición de la Lógica de Infreencia
El archivo inference.py actúa como el puente entre el modelo cargado y los datos de entrada en tiempo real. Debe manejar la transformación de imágenes y prompts de texto.
def perform_prediction(vlm_model, data_processor, img_source, text_query):
# Transformación de entradas y generación de tokens de salida
inputs = data_processor(images=img_source, text=text_query, return_tensors="pt")
generated_ids = vlm_model.generate(**inputs)
return data_processor.batch_decode(generated_ids, skip_special_tokens=True)
5. Registro del Nuevo Modelo
Para que el sistema reconozca la nueva implementación, es necesario registrarla en el archivo __init__.py del directorio models. Esto permite que el motor dinámico de Maestro instancie el modelo mediante un identificador de texto.
from .custom_vlm.core import CustomVLMManager
SUPPORTED_ARCHITECTURES = {
"florence_2": Florence2Trainer,
"custom_vlm": CustomVLMManager # Nuevo modelo registrado
}
6. Soporte para Datasets Específicos
Si el modelo requiere un formato de datos no convencional, se debe extender la funcionalidad en maestro/trainer/common/datasets/ creando una clase que herede de BaseDetectionDataset:
class SpecializedVisionDataset(BaseDetectionDataset):
def __init__(self, manifest_path):
super().__init__()
# Carga y parseo de anotaciones específicas
def __getitem__(self, index):
# Retorna el par imagen-anotación procesado
pass
7. Integración con la CLI
Finalmente, en entrypoint.py se utiliza la librería click para exponer las funcionalidades de entrenamiento al usuario final:
import click
@click.command()
@click.option("--config-file", type=click.Path(exists=True))
@click.option("--epochs", default=10)
def launch_training(config_file, epochs):
# Orquestación del proceso de entrenamiento desde terminal
pass
if __name__ == "__main__":
launch_training()
8. Verificación del Sistema
Una vez completada la integración, se puede validar el funcionamiento ejecutando el comando de entrenamiento apuntando al nuevo identificador de modelo regitsrado anteriormente:
python -m maestro.cli train --model custom_vlm --dataset_path ./data/vision_task