def __init__(self, space, param_file=None, param_string=None, output_format=None): LOG.debug('Starting sbuild...') self.space = space self.param = Parameters() self.conveyor = Conveyor() # identify the workflow type self.conveyor.setOrigin('slearn') # generate a unique modelID self.conveyor.addMeta('modelID', utils.id_generator()) LOG.debug( f'Generated new space with modelID: {self.conveyor.getMeta("modelID")}' ) # load parameters if param_file is not None: # use the param_file to update existing parameters at the space # directory and save changes to make them persistent success, message = self.param.delta(space, 0, param_file, iformat='YAML', isSpace=True) elif param_string is not None: success, message = self.param.delta(space, 0, param_string, iformat='JSONS', isSpace=True) else: # load parameter file at the space directory success, message = self.param.loadYaml(space, 0, isSpace=True) # being unable to load parameters is a critical error if not success: LOG.critical( f'Unable to load space parameters. {message}. Aborting...') sys.exit(1) # add additional output formats included in the constructor # this is requiered to add JSON format as output when the object is # instantiated from a web service call, requiring this output if output_format is not None: if output_format not in self.param.getVal('output_format'): self.param.appVal('output_format', output_format)
def action_predictions_result (label, output='text'): ''' try to retrieve the prediction result with the label used as argument returns - (False, Null) if it there is no directory or the predictions pickle files cannot be found - (True, object) with the results otherwyse ''' # get de model repo path predictions_path = pathlib.Path(utils.predictions_repository_path()) label_path = predictions_path.joinpath(label) if not os.path.isdir(label_path): if output != 'text': return False, {'code':0, 'message': f'directory {label_path} not found'} print (f'directory {label_path} not found') return False, None result_path = label_path.joinpath('prediction-results.pkl') if not result_path.is_file(): if output != 'text': return False, {'code':0, 'message': f'predictions not found for {label} directory'} print (f'predictions not found for {label} directory') return False, None iconveyor = Conveyor() with open(result_path, 'rb') as handle: success, message = iconveyor.load(handle) if not success: if output != 'text': return False, {'code':1, 'message': f'error reading prediction results with message {message}'} print (f'error reading prediction results with message {message}') return False, None # console output print_prediction_result(('obj_num','number of objects',iconveyor.getVal('obj_num'))) if iconveyor.isKey('external-validation'): for val in iconveyor.getVal('external-validation'): print_prediction_result (val) if iconveyor.isKey('values'): for i in range (iconveyor.getVal('obj_num')): print (iconveyor.getVal('obj_nam')[i], '\t', float("{0:.4f}".format(iconveyor.getVal('values')[i]))) # return iconveyor return True, iconveyor
def __init__(self, model, version, output_format=None): LOG.debug('Starting predict...') self.model = model self.version = version self.param = Parameters() self.conveyor = Conveyor() if not self.param.loadYaml(model, version): LOG.critical('Unable to load model parameters. Aborting...') sys.exit() # add additional output formats included in the constructor # this is requiered to add JSON format as output when the object is # instantiated from a web service call, requiring this output if output_format != None: if output_format not in self.param.getVal('output_format'): self.param.appVal('output_format',output_format) return
def action_info(model, version, output='text'): ''' Returns a text or JSON with results info for a given model and version ''' if model is None: return False, 'Empty model label' rdir = utils.model_path(model, version) if not os.path.isfile(os.path.join(rdir, 'results.pkl')): # compatibity method. use info.pkl if not os.path.isfile(os.path.join(rdir, 'info.pkl')): return False, 'Info file not found' with open(os.path.join(rdir, 'info.pkl'), 'rb') as handle: #retrieve a pickle file containing the keys 'model_build' #and 'model_validate' of results info = pickle.load(handle) info += pickle.load(handle) # end of compatibility method else: # new method, use results.pkl if not os.path.isfile(os.path.join(rdir, 'results.pkl')): return False, 'Info file not found' from flame.conveyor import Conveyor conveyor = Conveyor() with open(os.path.join(rdir, 'results.pkl'), 'rb') as handle: conveyor.load(handle) info = conveyor.getVal('model_build_info') info += conveyor.getVal('model_valid_info') if info == None: return False, 'Info not found' # when this function is called from the console, output is 'text' # write and exit if output == 'text': LOG.info(f'informing model {model} version {version}') for val in info: if len(val) < 3: LOG.info(val) else: LOG.info(f'{val[0]} ({val[1]}) : {val[2]}') return True, 'model informed OK' # this is only reached when this funcion is called from a web service # asking for a JSON # this code serializes the results in a list and then converts it # to a JSON json_results = [] for i in info: json_results.append(conveyor.modelInfoJSON(i)) #print (json.dumps(json_results)) return True, json.dumps(json_results)
def action_info(model, version, output='text'): ''' Returns a text or JSON with results info for a given model and version ''' if model is None: return False, 'Empty model label' rdir = utils.model_path(model, version) if not os.path.isfile(os.path.join(rdir, 'results.pkl')): return False, 'Info file not found' from flame.conveyor import Conveyor conveyor = Conveyor() with open(os.path.join(rdir, 'results.pkl'), 'rb') as handle: conveyor.load(handle) # if there is an error, return the error Message if conveyor.getError(): error = conveyor.getErrorMessage() return False, error # collect warnings warning = conveyor.getWarningMessage() # collect build and validation info build_info = conveyor.getVal('model_build_info') valid_info = conveyor.getVal('model_valid_info') # merge everything info = None for iinfo in (warning, build_info, valid_info): if info == None: info = iinfo else: if iinfo != None: info+=iinfo if info == None: return False, 'No relevant information found' # when this function is called from the console, output is 'text' # write and exit if output == 'text': LOG.info (f'informing model {model} version {version}') for val in info: if len(val) < 3: LOG.info(val) else: LOG.info(f'{val[0]} ({val[1]}) : {val[2]}') return True, 'model informed OK' # this is only reached when this funcion is called from a web service # asking for a JSON # this code serializes the results in a list and then converts it # to a JSON json_results = [] for i in info: json_results.append(conveyor.modelInfoJSON(i)) #print (json.dumps(json_results)) return True, json.dumps(json_results)