in decisionai_plugin/common/plugin_service.py [0:0]
def train(self, request):
request_body = json.loads(request.data)
instance_id = request_body['instance']['instanceId']
if not self.trainable:
return make_response(jsonify(dict(instanceId=instance_id, modelId='', taskId='', result=STATUS_SUCCESS, message='Model is not trainable', modelState=ModelState.Ready.name)), 200)
subscription = request.headers.get('apim-subscription-id', 'Official')
request_body[INSTANCE_ID_KEY] = subscription
result, message = self.do_verify(request_body, Context(subscription, '', ''))
if result != STATUS_SUCCESS:
return make_response(jsonify(dict(instanceId=instance_id, modelId='', taskId='', result=STATUS_FAIL, message='Verify failed! ' + message, modelState=ModelState.Deleted.name)), 400)
models_in_train = []
for model in get_model_list(self.config, subscription):
if 'instanceId' in model and model['instanceId'] == request_body['instance']['instanceId'] and (model['state'] == ModelState.Training.name or model['state'] == ModelState.Pending.name):
models_in_train.append(model['modelId'])
if len(models_in_train) >= self.config.models_in_training_limit_per_instance:
return make_response(jsonify(dict(instanceId=instance_id, modelId='', taskId='', result=STATUS_FAIL, message='Models in training limit reached! Abort training this time.', modelState=ModelState.Deleted.name)), 400)
log.info('Create training task')
try:
task_id = str(uuid.uuid1())
if 'modelId' in request_body and request_body['modelId']:
model_id = request_body['modelId']
else:
model_id = str(uuid.uuid1())
insert_or_update_meta(self.config, subscription, model_id, request_body)
job = JobRecord(task_id, JobRecord.MODE_TRAINING, self.__class__.__name__, model_id, subscription, request_body)
send_message(self.training_topic, dict(job))
log.count("training_task_throughput_in", 1, topic_name=self.training_topic, model_id=model_id, endpoint=request_body['apiEndpoint'], group_id=request_body['groupId'], group_name=request_body['groupName'].replace(' ', '_'), instance_id=request_body['instance']['instanceId'], instance_name=request_body['instance']['instanceName'].replace(' ', '_'))
return make_response(jsonify(dict(instanceId=instance_id, modelId=model_id, taskId=task_id, result=STATUS_SUCCESS, message='Training task created', modelState=ModelState.Training.name)), 201)
except Exception as e:
meta = get_meta(self.config, subscription, model_id)
error_message = str(e)
if meta is not None:
update_state(self.config, subscription, model_id, ModelState.Failed, None, error_message)
log.error("Create training task failed! subscription = %s, model_id = %s, task_id = %s, last_error = %s" % (subscription, model_id, task_id, error_message + '\n' + traceback.format_exc()))
return make_response(jsonify(dict(instanceId=instance_id, modelId=model_id, taskId=task_id, result=STATUS_FAIL, message='Fail to create new task ' + error_message, modelState=ModelState.Failed.name)), 400)