From 4224e91d9bedab16911d26cc2c155626974729c6 Mon Sep 17 00:00:00 2001 From: Taewan Kim Date: Mon, 24 Mar 2025 14:14:02 +0900 Subject: [PATCH] fix the api for training job creation Change-Id: Id0ac1a304cf213f7615a2163e6896dc111eab0e9 Signed-off-by: Taewan Kim --- src/apis/training-job.js | 2 +- .../home/form/CreateOrEditTrainingJobForm.js | 562 ++++++++++----------- 2 files changed, 271 insertions(+), 293 deletions(-) diff --git a/src/apis/training-job.js b/src/apis/training-job.js index 2796714..2802ef5 100644 --- a/src/apis/training-job.js +++ b/src/apis/training-job.js @@ -11,7 +11,7 @@ export const trainingJobAPI = { return await instance.get(`/ai-ml-model-training/v1/training-jobs/${params.trainingJobId}/status`); }, invokeTrainingJob: async ({ data }) => { - return await instance.post('/trainingjobs/retraining', { ...data }); + return await instance.post('/ai-ml-model-training/v1/training-jobs', { ...data }); }, deleteTrainingJob: async ({ data }) => { return await instance.delete('/trainingjobs', { ...data }); diff --git a/src/components/home/form/CreateOrEditTrainingJobForm.js b/src/components/home/form/CreateOrEditTrainingJobForm.js index 30df903..4938cb4 100644 --- a/src/components/home/form/CreateOrEditTrainingJobForm.js +++ b/src/components/home/form/CreateOrEditTrainingJobForm.js @@ -26,7 +26,7 @@ import { convertToCommaSeparatedString, } from '../common/CommonMethods'; import { instance, UCMgr_baseUrl } from '../../../states'; -import { featureGroupAPI, pipelineAPI } from '../../../apis'; +import { featureGroupAPI, pipelineAPI, trainingJobAPI } from '../../../apis'; class CreateTrainingJob extends React.Component { constructor(props) { @@ -37,6 +37,20 @@ class CreateTrainingJob extends React.Component { plName: '', isMme: false, modelName: '', + modelVersion: '', + modelLocation: '', + trainingConfigDescription: '', + queryFilter: '', + arguments: '', + trainingPipelineName: '', + trainingPipelineVersion: '', + retrainingPipelineName: '', + retrainingPipelineVersion: '', + trainingDataset: '', + validationDataset: '', + notificationUrl: '', + consumerRappId: '', + producerRappId: '', expName: '', featureGroupName: '', featureFilters: '', @@ -310,18 +324,22 @@ class CreateTrainingJob extends React.Component { handleCreateSubmit = event => { this.logger( 'Create TrainingJob clicked: ', - this.state.ucName, - this.state.plName, - this.state.isMme, this.state.modelName, - this.state.expName, + this.state.modelVersion, + this.state.modelLocation, + this.state.trainingConfigDescription, this.state.featureGroupName, - this.state.featureFilters, - this.state.hyparams, - this.state.targetName, - this.state.ucDescription, - this.state.plVerName, - this.state.datalakeSourceName, + this.state.queryFilter, + this.state.arguments, + this.state.trainingPipelineName, + this.state.trainingPipelineVersion, + this.state.retrainingPipelineName, + this.state.retrainingPipelineVersion, + this.state.trainingDataset, + this.state.validationDataset, + this.state.notificationUrl, + this.state.consumerRappId, + this.state.producerRappId, ); this.invokeAddTrainingJob(event); @@ -351,34 +369,49 @@ class CreateTrainingJob extends React.Component { }; invokeAddTrainingJob(event) { - let hyperParamsDict = this.buildHyperparamsDict(this.state.hyparams); - let convertedDatalakeDBName = convertDatalakeDBName(this.state.datalakeSourceName); - this.logger('Add New Request is posted at ' + this.state.UCMgr_baseUrl + '/trainingjobs/' + this.state.ucName); - instance - .post('/trainingjobs/' + this.state.ucName, { - trainingjob_name: this.state.ucName, - is_mme: this.state.isMme, - model_name: this.state.modelName, - pipeline_name: this.state.plName, - // "experiment_name" : this.state.expName, - experiment_name: 'Default', - feature_group_name: this.state.featureGroupName, - query_filter: this.state.featureFilters, - arguments: hyperParamsDict, - enable_versioning: this.state.versioning, - description: this.state.ucDescription, - pipeline_version: this.state.plVerName, - datalake_source: convertedDatalakeDBName, - }) - .then(res => { - this.logger('UC created ', res.data); - this.invokeStartTrainingForCreate(); - }) - .catch(error => { - this.logger('Error creating Training Job', error); - alert('Failed: ' + error.response.data.Exception); - event.preventDefault(); - }); + let argumentsDict = this.buildHyperparamsDict(this.state.arguments); + trainingJobAPI.invokeTrainingJob({ + data: { + modelId: { + modelname: this.state.modelName, + modelversion: this.state.modelVersion, + }, + model_location: this.state.modelLocation, + training_config: { + description: this.state.trainingConfigDescription, + dataPipeline: { + feature_group_name: this.state.featureGroupName, + query_filter: this.state.queryFilter, + arguments: argumentsDict, + }, + trainingPipeline: { + training_pipeline_name: this.state.trainingPipelineName, + training_pipeline_version: this.state.trainingPipelineVersion, + retraining_pipeline_name: this.state.retrainingPipelineName, + retraining_pipeline_version: this.state.retrainingPipelineVersion, + }, + }, + training_dataset: this.state.trainingDataset, + validation_dataset: this.state.validationDataset, + notification_url: this.state.notificationUrl, + consumer_rapp_id: this.state.consumerRappId, + producer_rapp_id: this.state.producerRappId, + } + }) + .then(res => { + this.logger('Training responsed ', res); + if (res.status === 201) { + alert('Training Job created and training initiated'); + this.resetFrom(); + this.props.onHideCreatePopup(); + this.props.fetchTrainingJobs(); + } + }) + .catch(error => { + this.logger('Error creating Training Job', error); + alert('Failed: ' + error.response.data.Exception); + event.preventDefault(); + }); } invokePutTrainingJob = event => { @@ -417,31 +450,7 @@ class CreateTrainingJob extends React.Component { }); }; - invokeStartTrainingForCreate(event) { - this.logger('Training called '); - instance - .post('/trainingjobs/' + this.state.ucName + '/training', { - trainingjobs: this.state.ucName, - }) - .then(res => { - this.logger('Training responsed ', res); - if (res.status === 200) { - alert('Training Job created and training initiated'); - this.resetFrom(); - this.props.onHideCreatePopup(); - this.props.fetchTrainingJobs(); - } - }) - .catch(error => { - this.logger('Error in training api,response', error.response.data); - alert('Training failed: ' + error.response.data.Exception); - }) - .then(function () { - // always executed - }); - } - - invokeStartTrainingForEdit(event) { + invokeStartTrainingForEdit(event) { this.logger('Training called '); instance .post('/trainingjobs/' + this.state.ucName + '/training', { @@ -499,9 +508,7 @@ class CreateTrainingJob extends React.Component { this.logger('before changing in buildHyperparamsDict: ', hyperArgs); if (hyperArgs === '') { - return { - trainingjob_name: this.state.ucName, - }; + return {}; } let paramList = String(hyperArgs).split(','); @@ -513,7 +520,6 @@ class CreateTrainingJob extends React.Component { paramDict[key] = value; } - paramDict['trainingjob_name'] = this.state.ucName; this.logger('after changing in buildHyperparamsDict: ', paramDict); return paramDict; @@ -531,41 +537,35 @@ class CreateTrainingJob extends React.Component { return value; } - handleUCNameChange = event => { - if (this.regName.test(event.target.value)) { - event.preventDefault(); - alert('Please use alphabet, number, and underscore to Training Job Name.'); - } else { - this.setState( - { - ucName: event.target.value, - }, - () => { - this.logger('after set state, ucName: ', this.state.ucName); - }, - ); - } + handleModelNameChange = event => { + this.setState( + { + modelName: event.target.value, + }, + () => { + this.logger('after set state, modelName: ', this.state.modelName); + }, + ); }; - handlePLNameChange = event => { + handleModelVersionChange = event => { this.setState( { - plName: event.target.value, + modelVersion: event.target.value, }, () => { - this.logger('after set state, plName: ', this.state.plName); - this.fetchPipelineVersions(this.state.plName, true); + this.logger('after set state, modelVersion: ', this.state.modelVersion); }, ); }; - handleExpNameChange = event => { + handleTrainingConfigDescriptionChange = event => { this.setState( { - expName: event.target.value, + trainingConfigDescription: event.target.value, }, () => { - this.logger('after set state, expName: ', this.state.expName); + this.logger('after set state, trainingConfigDescription: ', this.state.trainingConfigDescription); }, ); }; @@ -581,122 +581,148 @@ class CreateTrainingJob extends React.Component { ); }; - handleFeatFiltersChange = event => { + handleQueryFilterChange = event => { this.setState( { - featureFilters: event.target.value, + queryFilter: event.target.value, }, () => { - this.logger('after set state, featureFilters: ', this.state.featureFilters); + this.logger('after set state, queryFilter: ', this.state.queryFilter); }, ); }; - handleHyparamsChange = event => { + handleArgumentsChange = event => { this.setState( { - hyparams: event.target.value, + arguments: event.target.value, }, () => { - this.logger('after set state, hyparams: ', this.state.hyparams); + this.logger('after set state, arguments: ', this.state.arguments); }, ); }; - handleVersioningChange = event => { + handleTrainingPipelineNameChange = event => { this.setState( { - versioning: event.target.checked, + trainingPipelineName: event.target.value, }, () => { - this.logger('after set state, versioning: ', this.state.versioning); + this.logger('after set state, trainingPipelineName: ', this.state.trainingPipelineName); }, ); }; - handleTargetChange = event => { + handleTrainingPipelineVersionChange = event => { this.setState( { - targetName: event.target.value, + trainingPipelineVersion: event.target.value, }, () => { - this.logger('after set state, targetName: ', this.state.targetName); + this.logger('after set state, trainingPipelineVersion: ', this.state.trainingPipelineVersion); }, ); }; - handleDatalakeSourceChange = event => { + handleRetrainingPipelineNameChange = event => { this.setState( { - datalakeSourceName: event.target.value, + retrainingPipelineName: event.target.value, }, () => { - this.logger('after set state, datalakeSourceName: ', this.state.datalakeSourceName); + this.logger('after set state, retrainingPipelineName: ', this.state.retrainingPipelineName); }, ); }; - handleUCDescriptionChange = event => { + handleRetrainingPipelineVersionChange = event => { this.setState( { - ucDescription: event.target.value, + retrainingPipelineVersion: event.target.value, }, () => { - this.logger('after set state, ucDescription: ', this.state.ucDescription); + this.logger('after set state, retrainingPipelineVersion: ', this.state.retrainingPipelineVersion); }, ); }; - handlePipelineVersionChange = event => { + handleTrainingDatasetChange = event => { this.setState( { - plVerName: event.target.value, + trainingDataset: event.target.value, }, () => { - this.logger('after set state, plVerName: ', this.state.plVerName); + this.logger('after set state, trainingDataset: ', this.state.trainingDataset); }, ); }; - handleIsMme = event => { + handleValidationDatasetChange = event => { this.setState( { - isMme: event.target.checked, + validationDataset: event.target.value, }, () => { - this.logger('after set state, isMme: ', this.state.isMme); + this.logger('after set state, validationDataset: ', this.state.validationDataset); }, ); }; - handleModelNameChange = event => { + handleNotificationUrlChange = event => { this.setState( { - modelName: event.target.value, + notificationUrl: event.target.value, }, () => { - this.logger('after set state, modelName: ', this.state.modelName); + this.logger('after set state, notificationUrl: ', this.state.notificationUrl); }, ); }; + handleConsumerRappIdChange = event => { + this.setState( + { + consumerRappId: event.target.value, + }, + () => { + this.logger('after set state, consumerRappId: ', this.state.consumerRappId); + }, + ); + }; + + handleProducerRappIdChange = event => { + this.setState( + { + producerRappId: event.target.value, + }, + () => { + this.logger('after set state, producerRappId: ', this.state.producerRappId); + }, + ); + }; + + + resetFrom = () => { this.setState({ - ucName: '', - plName: '', - expName: '', - isMme: false, modelName: '', + modelVersion: '', + modelLocation: '', + trainingConfigDescription: '', + queryFilter: '', + arguments: '', + trainingPipelineName: '', + trainingPipelineVersion: '', + retrainingPipelineName: '', + retrainingPipelineVersion: '', + trainingDataset: '', + validationDataset: '', + notificationUrl: '', + consumerRappId: '', + producerRappId: '', featureGroupName: '', featureFilters: '', - hyparams: '', - versioning: false, - ucDescription: '', - targetName: '', - plVerName: '', - plVerList: [], - plVerDescription: '', - datalakeSourceName: '', superModel: '', superModelVersion: '', superModelVersionsList: [], @@ -710,196 +736,148 @@ class CreateTrainingJob extends React.Component { className={this.props.isCreateTrainingJobForm ? 'create-form' : 'edit-form'} onSubmit={this.props.isCreateTrainingJobForm ? this.handleCreateSubmit : this.handleEditSubmit} > - - Training Job Name* - {this.props.isCreateTrainingJobForm ? ( - - ) : ( - - )} + + Model Name* + - - - + Model Version* + - {(() => { - if (this.state.isMme == false) { - return ( -
- - Training Function* - - - {this.state.plList.map(data => ( - - ))} - - - - - FeatureGroup Name* - - - {this.state.featureGroupList.map(data => ( - - ))} - - -
- ); - } else if (this.state.isMme == true) { - if (this.props.isCreateTrainingJobForm) { - return ( - - Model Name - - - ); - } else { - return ; - } - } - - return null; - })()} - - {this.state.plName !== '' && ( -
- - Training Function Version Name* - - - {this.state.plVerList.map(data => { - if (data === this.state.plName) { - return ( - - ); - } else { - return ( - - ); - } - })} - - - {/* - Pipeline Version Description - - */} -
- )} - - {/* - Experiment Name* - - - - { - this.state.expList.map(data => ) - } - - */} - - - Datalake Source* - + + Training Description + + + + Data Pipeline FeatureGroup Name* - {this.state.datalakeSourceList.map(data => ( - ))} - - - Feature Filter + + Data Pipeline Query Filter - - - Hyper Parameters - + + Data Pipeline Arguments + - {/* currently don't know difference between id and controlId in Form.group*/} - - + Training Pipeline Name + + + + Training Pipeline Version + + + + Retraining Pipeline Name + + + + Retraining Pipeline Version + - - Description + + Training Dataset + + + + Validation Dataset + + + + Notification URL + + + + Consumer rApp ID + + + + Producer rApp ID @@ -911,4 +889,4 @@ class CreateTrainingJob extends React.Component { } } -export default CreateTrainingJob; +export default CreateTrainingJob; \ No newline at end of file -- 2.16.6