diff options
Diffstat (limited to 'backend')
-rw-r--r-- | backend/api/api/Controllers/ModelController.cs | 38 | ||||
-rw-r--r-- | backend/api/api/Models/Model.cs | 2 | ||||
-rw-r--r-- | backend/api/api/Services/ChatHub.cs | 2 | ||||
-rw-r--r-- | backend/api/api/Services/IMlConnectionService.cs | 2 | ||||
-rw-r--r-- | backend/api/api/Services/MlConnectionService.cs | 10 | ||||
-rw-r--r-- | backend/microservice/api/config.py | 2 | ||||
-rw-r--r-- | backend/microservice/api/controller.py | 19 | ||||
-rw-r--r-- | backend/microservice/api/ml_service.py | 2 | ||||
-rw-r--r-- | backend/microservice/api/newmlservice.py | 28 | ||||
-rw-r--r-- | backend/microservice/ml_socket.py (renamed from backend/microservice/api/ml_socket.py) | 3 |
10 files changed, 74 insertions, 34 deletions
diff --git a/backend/api/api/Controllers/ModelController.cs b/backend/api/api/Controllers/ModelController.cs index 1f98ed26..5a4f8b65 100644 --- a/backend/api/api/Controllers/ModelController.cs +++ b/backend/api/api/Controllers/ModelController.cs @@ -3,6 +3,7 @@ using api.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.SignalR; using Microsoft.Net.Http.Headers; using System.Net.Http.Headers; @@ -20,10 +21,13 @@ namespace api.Controllers private readonly IExperimentService _experimentService; private IJwtToken jwtToken; private readonly IMlConnectionService _mlConnectionService; + private readonly IUserService _userService; + private readonly IHubContext<ChatHub> _ichat; - public ModelController(IMlConnectionService mlService, IModelService modelService, IMlConnectionService mlConnectionService, IDatasetService datasetService, IFileService fileService, IConfiguration configuration,IJwtToken token,IExperimentService experiment) + public ModelController(IMlConnectionService mlService, IModelService modelService, IMlConnectionService mlConnectionService, IDatasetService datasetService, IFileService fileService, IConfiguration configuration,IJwtToken token,IExperimentService experiment,IUserService user,IHubContext<ChatHub> ichat) { + _mlService = mlService; _modelService = modelService; _datasetService = datasetService; @@ -31,6 +35,8 @@ namespace api.Controllers _experimentService = experiment; jwtToken = token; _mlConnectionService = mlConnectionService; + _userService= user; + _ichat= ichat; } public string getUserId() @@ -70,7 +76,7 @@ namespace api.Controllers [HttpPost("trainModel")] [Authorize(Roles = "User,Guest")] - public async Task<ActionResult<string>> Test([FromBody] TrainModelObject trainModelObject) + public async Task<ActionResult<string>> TrainModel([FromBody] TrainModelObject trainModelObject) { string experimentId = trainModelObject.ExperimentId; string modelId = trainModelObject.ModelId; @@ -84,10 +90,28 @@ namespace api.Controllers var dataset = _datasetService.GetOneDataset(experiment.datasetId); var filepath = _fileService.GetFilePath(dataset.fileId, uploaderId); var model = _modelService.GetOneModel(modelId); - _mlService.TrainModel(model,experiment,filepath);//To do Obavestiti korisnika kada se model istrenira + _mlService.TrainModel(model,experiment,filepath,dataset,uploaderId);//To do Obavestiti korisnika kada se model istrenira return Ok(); } + [HttpPost("epoch")] + public async Task<ActionResult<string>> Epoch([FromBody] Epoch info) + { + + var model=_modelService.GetOneModel(info.ModelId); + var user = _userService.GetUserByUsername(model.username); + + if (ChatHub.CheckUser(user._id)) + await _ichat.Clients.Client(ChatHub.Users[user._id]).SendAsync("NotifyEpoch",info.ModelId,info.Stat); + + return Ok(); + } + + + + + + // GET: api/<ModelController>/mymodels [HttpGet("mymodels")] [Authorize(Roles = "User")] @@ -166,8 +190,7 @@ namespace api.Controllers if (existingModel != null && !overwrite) return NotFound($"Model with name = {model.name} exisits"); else - { - model.isTrained = false; + { //_modelService.Create(model); //return Ok(); if (existingModel == null) @@ -230,4 +253,9 @@ namespace api.Controllers public string ExperimentId { get; set; } } + public class Epoch + { + public string ModelId { get; set; } + public string Stat { get; set; } + } } diff --git a/backend/api/api/Models/Model.cs b/backend/api/api/Models/Model.cs index 72f989a6..72ee093b 100644 --- a/backend/api/api/Models/Model.cs +++ b/backend/api/api/Models/Model.cs @@ -36,7 +36,7 @@ namespace api.Models public string[] metrics { get; set; } public int epochs { get; set; } - public bool isTrained { get; set; } + //public bool isTrained { get; set; } //public NullValues[] nullValues { get; set; } } } diff --git a/backend/api/api/Services/ChatHub.cs b/backend/api/api/Services/ChatHub.cs index efa13a3b..72febce1 100644 --- a/backend/api/api/Services/ChatHub.cs +++ b/backend/api/api/Services/ChatHub.cs @@ -20,6 +20,8 @@ namespace api.Services public override async Task OnConnectedAsync() { string token=Context.GetHttpContext().Request.Query["access_token"]; + if (token == null) + return; string id=_tokenService.TokenToId(token); Users.Add(id,Context.ConnectionId); //await SendDirect(id, "poruka"); diff --git a/backend/api/api/Services/IMlConnectionService.cs b/backend/api/api/Services/IMlConnectionService.cs index 9a9a81f4..d161bf49 100644 --- a/backend/api/api/Services/IMlConnectionService.cs +++ b/backend/api/api/Services/IMlConnectionService.cs @@ -7,7 +7,7 @@ namespace api.Services { Task<string> SendModelAsync(object model, object dataset); Task PreProcess(Dataset dataset, string filePath,string id); - Task TrainModel(Model model, Experiment experiment, string filePath); + Task TrainModel(Model model, Experiment experiment, string filePath, Dataset dataset, string id); //Task<Dataset> PreProcess(Dataset dataset, byte[] file, string filename); } }
\ No newline at end of file diff --git a/backend/api/api/Services/MlConnectionService.cs b/backend/api/api/Services/MlConnectionService.cs index d3a98042..bde9ce4c 100644 --- a/backend/api/api/Services/MlConnectionService.cs +++ b/backend/api/api/Services/MlConnectionService.cs @@ -32,19 +32,19 @@ namespace api.Services var result = await this.client.ExecuteAsync(request); return result.Content; //Response od ML microservisa } - public async Task TrainModel(Model model, Experiment experiment, string filePath) + public async Task TrainModel(Model model, Experiment experiment, string filePath,Dataset dataset,string id) { var request = new RestRequest("train", Method.Post); request.AddParameter("model", JsonConvert.SerializeObject(model)); request.AddParameter("experiment", JsonConvert.SerializeObject(experiment)); + request.AddParameter("dataset", JsonConvert.SerializeObject(dataset)); //request.AddFile("file", file,filename); request.AddFile("file", filePath); request.AddHeader("Content-Type", "multipart/form-data"); var result = await this.client.ExecuteAsync(request); - Model newModel = JsonConvert.DeserializeObject<Model>(result.Content); - newModel.isTrained = true; - _modelService.Update(newModel._id, newModel); + if (ChatHub.CheckUser(id)) + await _ichat.Clients.Client(ChatHub.Users[id]).SendAsync("NotifyModel",model.name,model._id); return; @@ -62,7 +62,7 @@ namespace api.Services newDataset.isPreProcess = true; _datasetService.Update(newDataset); if(ChatHub.CheckUser(id)) - await _ichat.Clients.Client(ChatHub.Users[id]).SendAsync("Notify", "Preprocessed dataset with name "+newDataset.name); + await _ichat.Clients.Client(ChatHub.Users[id]).SendAsync("NotifyDataset",newDataset.name,newDataset._id); return; } diff --git a/backend/microservice/api/config.py b/backend/microservice/api/config.py new file mode 100644 index 00000000..2b6fbe89 --- /dev/null +++ b/backend/microservice/api/config.py @@ -0,0 +1,2 @@ +api_url = "http://localhost:5283/api" + diff --git a/backend/microservice/api/controller.py b/backend/microservice/api/controller.py index 4d9f8f2a..08f953a6 100644 --- a/backend/microservice/api/controller.py +++ b/backend/microservice/api/controller.py @@ -1,10 +1,11 @@ import flask from flask import request, jsonify -import ml_socket import newmlservice import tensorflow as tf import pandas as pd import json +import requests +import config app = flask.Flask(__name__) app.config["DEBUG"] = True @@ -17,16 +18,22 @@ class train_callback(tf.keras.callbacks.Callback): # def on_epoch_end(self, epoch, logs=None): print(epoch) - ml_socket.send(epoch) + #ml_socket.send(epoch) + #file = request.files.get("file") + url = config.api_url + "/Model/epoch" + requests.post(url, epoch).text #print('Evaluation: ', self.model.evaluate(self.x_test,self.y_test),"\n") #broj parametara zavisi od izabranih metrika loss je default @app.route('/train', methods = ['POST']) def train(): print("******************************TRAIN*************************************************") - f = request.json["dataset"] - dataset = pd.read_csv(f) - # - result = newmlservice.train(dataset, request.json["model"], train_callback) + f = request.files.get("file") + data = pd.read_csv(f) + paramsModel = json.loads(request.form["model"]) + paramsExperiment = json.loads(request.form["experiment"]) + paramsDataset = json.loads(request.form["dataset"]) + #dataset, paramsModel, paramsExperiment, callback) + result = newmlservice.train(data, paramsModel, paramsExperiment,paramsDataset, train_callback) print(result) return jsonify(result) diff --git a/backend/microservice/api/ml_service.py b/backend/microservice/api/ml_service.py index 4d2212f7..16ee7cc6 100644 --- a/backend/microservice/api/ml_service.py +++ b/backend/microservice/api/ml_service.py @@ -101,7 +101,7 @@ class TrainingResultRegression: class TrainingResult: metrics: dict ''' -def train(dataset, paramsModel, paramsExperiment, callback): +def train(dataset, paramsModel, paramsExperiment, paramsDataset, callback): problem_type = paramsModel["type"] dataModel = pd.DataFrame() dataExperiment = pd.DataFrame() diff --git a/backend/microservice/api/newmlservice.py b/backend/microservice/api/newmlservice.py index 02ce2250..d19a4e44 100644 --- a/backend/microservice/api/newmlservice.py +++ b/backend/microservice/api/newmlservice.py @@ -225,28 +225,28 @@ def train(dataset, params, callback): # ###OPTIMIZATORI - if(params['optimizer']=='Adam'): + if(params['optimizer']=='adam'): opt=tf.keras.optimizers.Adam(learning_rate=params['learningRate']) - elif(params['optimizer']=='Adadelta'): + elif(params['optimizer']=='adadelta'): opt=tf.keras.optimizers.Adadelta(learning_rate=params['learningRate']) - elif(params['optimizer']=='Adagrad'): + elif(params['optimizer']=='adagrad'): opt=tf.keras.optimizers.Adagrad(learning_rate=params['learningRate']) - elif(params['optimizer']=='Adamax'): + elif(params['optimizer']=='adamax'): opt=tf.keras.optimizers.Adamax(learning_rate=params['learningRate']) - elif(params['optimizer']=='Nadam'): + elif(params['optimizer']=='nadam'): opt=tf.keras.optimizers.Nadam(learning_rate=params['learningRate']) - elif(params['optimizer']=='SGD'): + elif(params['optimizer']=='sgd'): opt=tf.keras.optimizers.SGD(learning_rate=params['learningRate']) - elif(params['optimizer']=='Ftrl'): + elif(params['optimizer']=='ftrl'): opt=tf.keras.optimizers.Ftrl(learning_rate=params['learningRate']) - elif(params['optimizer']=='RMSprop'): + elif(params['optimizer']=='rmsprop'): opt=tf.keras.optimizers.RMSprop(learning_rate=params['learningRate']) ###REGULARIZACIJA @@ -282,10 +282,10 @@ def train(dataset, params, callback): #print('multi') classifier=tf.keras.Sequential() - classifier.add(tf.keras.layers.Dense(units=params['hiddenLayerNeurons'], activation=params['hiddenLayerActivationFunctions'][0],input_dim=x_train.shape[1]),kernel_regularizer=kernelreg,bias_regularizer=biasreg,activity_regularizer=activityreg)#prvi skriveni + definisanje prethodnog-ulaznog + classifier.add(tf.keras.layers.Dense(units=params['hiddenLayerNeurons'], activation=params['hiddenLayerActivationFunctions'][0],input_dim=x_train.shape[1]))#prvi skriveni + definisanje prethodnog-ulaznog for i in range(params['hiddenLayers']-1):#ako postoji vise od jednog skrivenog sloja #print(i) - classifier.add(tf.keras.layers.Dense(units=params['hiddenLayerNeurons'], activation=params['hiddenLayerActivationFunctions'][i+1],kernel_regularizer=kernelreg,bias_regularizer=biasreg,activity_regularizer=activityreg))#i-ti skriveni sloj + classifier.add(tf.keras.layers.Dense(units=params['hiddenLayerNeurons'], activation=params['hiddenLayerActivationFunctions'][i+1]))#i-ti skriveni sloj classifier.add(tf.keras.layers.Dense(units=5, activation=params['outputLayerActivationFunction']))#izlazni sloj @@ -309,10 +309,10 @@ def train(dataset, params, callback): #print('*************************************************************************binarni') classifier=tf.keras.Sequential() - classifier.add(tf.keras.layers.Dense(units=params['hiddenLayerNeurons'], activation=params['hiddenLayerActivationFunctions'][0],input_dim=x_train.shape[1],kernel_regularizer=kernelreg,bias_regularizer=biasreg,activity_regularizer=activityreg))#prvi skriveni + definisanje prethodnog-ulaznog + classifier.add(tf.keras.layers.Dense(units=params['hiddenLayerNeurons'], activation=params['hiddenLayerActivationFunctions'][0],input_dim=x_train.shape[1]))#prvi skriveni + definisanje prethodnog-ulaznog for i in range(params['hiddenLayers']-1):#ako postoji vise od jednog skrivenog sloja #print(i) - classifier.add(tf.keras.layers.Dense(units=params['hiddenLayerNeurons'], activation=params['hiddenLayerActivationFunctions'][i+1],kernel_regularizer=kernelreg,bias_regularizer=biasreg,activity_regularizer=activityreg))#i-ti skriveni sloj + classifier.add(tf.keras.layers.Dense(units=params['hiddenLayerNeurons'], activation=params['hiddenLayerActivationFunctions'][i+1]))#i-ti skriveni sloj classifier.add(tf.keras.layers.Dense(units=1, activation=params['outputLayerActivationFunction']))#izlazni sloj classifier.compile(loss =params["lossFunction"] , optimizer = params['optimizer'] , metrics =params['metrics']) @@ -334,10 +334,10 @@ def train(dataset, params, callback): elif(problem_type=='regresioni'): classifier=tf.keras.Sequential() - classifier.add(tf.keras.layers.Dense(units=params['hiddenLayerNeurons'], activation=params['hiddenLayerActivationFunctions'][0],input_dim=x_train.shape[1],kernel_regularizer=kernelreg,bias_regularizer=biasreg,activity_regularizer=activityreg))#prvi skriveni + definisanje prethodnog-ulaznog + classifier.add(tf.keras.layers.Dense(units=params['hiddenLayerNeurons'], activation=params['hiddenLayerActivationFunctions'][0],input_dim=x_train.shape[1]))#prvi skriveni + definisanje prethodnog-ulaznog for i in range(params['hiddenLayers']-1):#ako postoji vise od jednog skrivenog sloja #print(i) - classifier.add(tf.keras.layers.Dense(units=params['hiddenLayerNeurons'], activation=params['hiddenLayerActivationFunctions'][i+1],kernel_regularizer=kernelreg,bias_regularizer=biasreg,activity_regularizer=activityreg))#i-ti skriveni sloj + classifier.add(tf.keras.layers.Dense(units=params['hiddenLayerNeurons'], activation=params['hiddenLayerActivationFunctions'][i+1]))#i-ti skriveni sloj classifier.add(tf.keras.layers.Dense(units=1)) classifier.compile(loss =params["lossFunction"] , optimizer = params['optimizer'] , metrics =params['metrics']) diff --git a/backend/microservice/api/ml_socket.py b/backend/microservice/ml_socket.py index cab157eb..c624ffaa 100644 --- a/backend/microservice/api/ml_socket.py +++ b/backend/microservice/ml_socket.py @@ -24,7 +24,8 @@ async def start(): get_or_create_eventloop().run_until_complete(start_server) get_or_create_eventloop().run_forever() + async def send(msg): print("WS sending message:") print(msg) - await websocket.send(msg)
\ No newline at end of file + await websocket.send(msg) |