import os from pathlib import Path import torch from fastapi import APIRouter from datetime import datetime from datasets import load_dataset from sklearn.metrics import accuracy_score from .utils.evaluation import AudioEvaluationRequest from .utils.emissions import tracker, clean_emissions_data, get_space_info from dotenv import load_dotenv load_dotenv() from .fast_model import FastModel router = APIRouter() DESCRIPTION = "model_cuda_perf" MODEL_PATH_PERF = Path(__file__).parent / "model_files/model_perf_cuda_test_dataset.txt" MODEL_PATH_FRUGAL = Path(__file__).parent / "model_files/model_frugal_cuda_test_dataset.txt" MASK_FILE = Path(__file__).parent / "model_files/mask.pkl" ROUTE = "/audio" @router.post(ROUTE, tags=["Audio Task"], description=DESCRIPTION) async def evaluate_audio(request: AudioEvaluationRequest): """ Evaluate audio classification for rainforest sound detection. Current Model: Model 1 - Optimizes the computation time of the model_0 """ # Get space info username, space_url = get_space_info() # Define the label mapping LABEL_MAPPING = {"chainsaw": 0, "environment": 1} # Load and prepare the dataset # Because the dataset is gated, we need to use the HF_TOKEN environment variable to authenticate dataset = load_dataset(request.dataset_name, token=os.getenv("HF_TOKEN")) # Split dataset test_dataset = dataset["test"] # Start tracking emissions tracker.start() tracker.start_task("inference") # -------------------------------------------------------------------------------------------- # YOUR MODEL INFERENCE CODE HERE # Update the code below to replace the random baseline by your model inference within the inference pass where the energy consumption and emissions are tracked. # -------------------------------------------------------------------------------------------- # Make predictions true_labels = test_dataset["label"] feature_params = { "n_fft": 512, "hop_length": 256, "pad": 0, "win_spectrogram": torch.hamming_window, "win_cepstral": torch.hamming_window, "power": 2, "pad_mode": "reflect", "f_min": 70, "f_max": 1525, "fc_min": 0.05, "fc_max": 0.8, } # PERF model = FastModel( feature_params, None, model_file=MODEL_PATH_PERF, padding_method="reflect", device="cuda", mask_file="mask.pkl", mask_features=False, mask_ratio=0.25, waveform_duration=3, apply_offset_on_fit=False, batch_size=5000, ) # MORE FRUGAL LESS PERFORMANT # model = FastModel( # feature_params, # None, # model_file=MODEL_PATH_FRUGAL, # padding_method="reflect", # device="cuda", # mask_file=MASK_FILE, # mask_features=True, # mask_ratio=0.25, # waveform_duration=1, # apply_offset_on_fit=True, # batch_size=5000, # ) predictions = model.predict(test_dataset) # -------------------------------------------------------------------------------------------- # YOUR MODEL INFERENCE STOPS HERE # -------------------------------------------------------------------------------------------- # Stop tracking emissions emissions_data = tracker.stop_task() # Calculate accuracy accuracy = accuracy_score(true_labels, predictions) # Prepare results dictionary results = { "username": username, "space_url": space_url, "submission_timestamp": datetime.now().isoformat(), "model_description": DESCRIPTION, "accuracy": float(accuracy), "energy_consumed_wh": emissions_data.energy_consumed * 1000, "emissions_gco2eq": emissions_data.emissions * 1000, "emissions_data": clean_emissions_data(emissions_data), "api_route": ROUTE, "dataset_config": { "dataset_name": request.dataset_name, "test_size": request.test_size, "test_seed": request.test_seed, }, } return results