emotion-classifier / mlflow_tracking /track_experiment.py
AfroLogicInsect's picture
initial migration from Render: FastAPI + Gradio, port 7860
811fc57
Raw
History Blame Contribute Delete
4 kB
import os
import sys
import json
import mlflow
import argparse
from mlflow.models import infer_signature
import torch
from transformers import AutoModelForSequenceClassification, AutoTokenizer
def register_model(
model_dir,
experiment_name="emotion-classification",
run_name=None,
tracking_uri=None
):
"""
Register a trained model with MLflow
Args:
model_dir: Directory containing the saved model
experiment_name: Name of the MLflow experiment
run_name: Name for this specific run
tracking_uri: MLflow tracking server URI
"""
# Set up MLflow tracking
if tracking_uri:
mlflow.set_tracking_uri(tracking_uri)
print(f"Using MLflow tracking URI: {tracking_uri}")
else:
print("Using local MLflow tracking")
# Load model metadata
try:
with open(os.path.join(model_dir, 'label_mappings.json'), 'r') as f:
mappings = json.load(f)
label2id = mappings['label2id']
id2label = {int(k): v for k, v in mappings['id2label'].items()}
except Exception as e:
print(f"Error loading model metadata: {e}")
return
# Load the model and tokenizer
try:
model = AutoModelForSequenceClassification.from_pretrained(model_dir)
tokenizer = AutoTokenizer.from_pretrained(model_dir)
except Exception as e:
print(f"Error loading model or tokenizer: {e}")
return
# Set up the experiment
mlflow.set_experiment(experiment_name)
# Start an MLflow run
with mlflow.start_run(run_name=run_name):
# Log model parameters
mlflow.log_param("model_type", model.config.model_type)
mlflow.log_param("num_labels", model.config.num_labels)
mlflow.log_param("hidden_size", model.config.hidden_size)
mlflow.log_param("vocab_size", model.config.vocab_size)
# Create a sample input for the model signature
sample_text = "This is a sample text for the model signature"
sample_inputs = tokenizer(
sample_text,
return_tensors="pt",
padding=True,
truncation=True
)
# Create a sample output for the model signature
with torch.no_grad():
outputs = model(**sample_inputs)
logits = outputs.logits
probabilities = torch.nn.functional.softmax(logits, dim=1).numpy()
# Create the model signature
signature = infer_signature(
sample_inputs.data,
{"probabilities": probabilities}
)
# Log the model
mlflow.transformers.log_model(
transformers_model={
"model": model,
"tokenizer": tokenizer
},
artifact_path="emotion-classifier",
task="text-classification",
signature=signature
)
# Log additional information
mlflow.log_dict(label2id, "label2id.json")
mlflow.log_dict(id2label, "id2label.json")
# Get the run ID
run_id = mlflow.active_run().info.run_id
print(f"Model registered with MLflow. Run ID: {run_id}")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Register a model with MLflow")
parser.add_argument(
"--model_dir",
type=str,
required=True,
help="Directory containing the saved model"
)
parser.add_argument(
"--experiment",
type=str,
default="emotion-classification",
help="MLflow experiment name"
)
parser.add_argument(
"--run_name",
type=str,
default=None,
help="Name for this run"
)
parser.add_argument(
"--tracking_uri",
type=str,
default=None,
help="MLflow tracking server URI"
)
args = parser.parse_args()
register_model(
args.model_dir, args.experiment,
args.run_name, args.tracking_uri
)