1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
# frozen_string_literal: true
module Ml
class CreateModelService
def initialize(project, name, user = nil, description = nil, metadata = [])
@project = project
@name = name
@description = description
@metadata = metadata
@user = user
end
def execute
ApplicationRecord.transaction do
experiment_result = Ml::CreateExperimentService.new(@project, experiment_name, @user).execute
next experiment_result if experiment_result.error?
model = Ml::Model.new(
project: @project,
name: @name,
user: @user,
description: @description,
default_experiment: experiment_result.payload
)
model.save
next error(model.errors.full_messages) unless model.persisted?
Gitlab::InternalEvents.track_event(
'model_registry_ml_model_created',
project: @project,
user: @user
)
add_metadata(model, @metadata)
audit_creation_event(model)
success(model)
end
end
private
def success(model)
ServiceResponse.success(payload: model)
end
def error(reason)
ServiceResponse.error(message: reason)
end
def add_metadata(model, metadata_key_value)
return unless model.present? && metadata_key_value.present?
entities = metadata_key_value.map do |d|
{
model_id: model.id,
name: d[:key],
value: d[:value]
}
end
entities.each do |entry|
::Ml::ModelMetadata.create!(entry)
end
end
def experiment_name
Ml::Model.prefixed_experiment(@name)
end
def audit_creation_event(model)
audit_context = {
name: 'ml_model_created',
author: @user,
scope: @project,
target: model,
message: "MlModel #{model.name} created"
}
::Gitlab::Audit::Auditor.audit(audit_context)
end
end
end
|