from flask import Flask
from flask import request
from flask import render_template, redirect, url_for

class ML:
    def __init__(self):
        self.avaliable_models = {
            "face_detection": "/additional_drive/ML/face_detection",
            "car_detection": "/additional_drive/ML/car_detection",
            "shoe_detection": "/additional_drive/ML/shoe_detection",
            "cloth_detection": "/additional_drive/ML/cloth_detection",
            "signal_detection": "/additional_drive/ML/signal_detection",
            "water_level_detection": "/additional_drive/ML/water_level_detection",
            "missile_detection": "/additional_drive/ML/missile_detection"
        }
        self.loaded_models_limit = 2
        self.loaded_models = {
            model: self.load_weights(model)
            for model in list(self.avaliable_models)[:self.loaded_models_limit]
        }
        #Creating a dictionary to Store the number of requests handaled by each model
        self.model_requests = {}
        for model in self.loaded_models:
            self.model_requests[model] = 0
    
    def load_weights(self, model):
        return self.avaliable_models.get(model,None)

    def load_balancer(self, new_model):
        if len(self.loaded_models) < self.loaded_models_limit:
            self.loaded_models[new_model] = self.load_weights(new_model)
            self.model_requests[new_model] = 0
        else:
            least_frequent_used_model = min(self.model_requests, key=self.model_requests.get)
            for model in self.model_requests:
                if self.model_requests[model] == least_frequent_used_model:
                    self.loaded_models.pop(model)
                    self.loaded_models[new_model] = self.load_weights(new_model)
                    self.model_requests[new_model] = 0
                    break
        print(self.loaded_models)
        



app = Flask(__name__)
ml = ML()

@app.route('/get_loaded_models', methods=['GET', 'POST'])
def get_loaded_models():

    return ml.loaded_models
    

@app.route('/process_request', methods=['GET', 'POST'])
def process_request():
    
    model = request.form["model"]
    if model not in ml.loaded_models:
        ml.load_balancer(model)
    ml.model_requests[model] += 1

    return redirect(url_for('index'))


app.run(host='0.0.0.0', port=5000)

Leave a Reply

Your email address will not be published. Required fields are marked *