Reviewed-on: https://git.openi.org.cn/OpenI/aiforge/pulls/2574 Reviewed-by: chenshihai <chenshh@pcl.ac.cn>tags/v1.22.7.2^2
| @@ -103,6 +103,7 @@ func GetCloudbrainTask(ctx *context.APIContext) { | |||||
| "SubState": result.JobStatus.SubState, | "SubState": result.JobStatus.SubState, | ||||
| "CreatedTime": time.Unix(result.JobStatus.CreatedTime/1000, 0).Format("2006-01-02 15:04:05"), | "CreatedTime": time.Unix(result.JobStatus.CreatedTime/1000, 0).Format("2006-01-02 15:04:05"), | ||||
| "CompletedTime": time.Unix(result.JobStatus.CompletedTime/1000, 0).Format("2006-01-02 15:04:05"), | "CompletedTime": time.Unix(result.JobStatus.CompletedTime/1000, 0).Format("2006-01-02 15:04:05"), | ||||
| "JobDuration": job.TrainJobDuration, | |||||
| }) | }) | ||||
| } | } | ||||
| @@ -95,9 +95,10 @@ func GetModelArtsNotebook2(ctx *context.APIContext) { | |||||
| } | } | ||||
| ctx.JSON(http.StatusOK, map[string]interface{}{ | ctx.JSON(http.StatusOK, map[string]interface{}{ | ||||
| "ID": ID, | |||||
| "JobName": job.JobName, | |||||
| "JobStatus": result.Status, | |||||
| "ID": ID, | |||||
| "JobName": job.JobName, | |||||
| "JobStatus": result.Status, | |||||
| "JobDuration": job.TrainJobDuration, | |||||
| }) | }) | ||||
| } | } | ||||
| @@ -219,6 +219,255 @@ func cloudBrainNewDataPrepare(ctx *context.Context) error { | |||||
| return nil | return nil | ||||
| } | } | ||||
| func cloudBrainTrainJobErrorPrepare(ctx *context.Context, form auth.CreateCloudBrainForm) error { | |||||
| ctx.Data["PageIsCloudBrain"] = true | |||||
| if categories == nil { | |||||
| json.Unmarshal([]byte(setting.BenchmarkCategory), &categories) | |||||
| } | |||||
| ctx.Data["benchmark_categories"] = categories.Category | |||||
| ctx.Data["benchmark_types"] = GetBenchmarkTypes(ctx).BenchmarkType | |||||
| queuesDetail, _ := cloudbrain.GetQueuesDetail() | |||||
| if queuesDetail != nil { | |||||
| ctx.Data["QueuesDetail"] = queuesDetail | |||||
| } | |||||
| cloudbrain.InitSpecialPool() | |||||
| if gpuInfos == nil { | |||||
| json.Unmarshal([]byte(setting.GpuTypes), &gpuInfos) | |||||
| } | |||||
| ctx.Data["gpu_types"] = gpuInfos.GpuInfo | |||||
| if trainGpuInfos == nil { | |||||
| json.Unmarshal([]byte(setting.TrainGpuTypes), &trainGpuInfos) | |||||
| } | |||||
| ctx.Data["train_gpu_types"] = trainGpuInfos.GpuInfo | |||||
| if inferenceGpuInfos == nil && setting.InferenceGpuTypes != "" { | |||||
| json.Unmarshal([]byte(setting.InferenceGpuTypes), &inferenceGpuInfos) | |||||
| } | |||||
| if inferenceGpuInfos != nil { | |||||
| ctx.Data["inference_gpu_types"] = inferenceGpuInfos.GpuInfo | |||||
| } | |||||
| if benchmarkGpuInfos == nil { | |||||
| json.Unmarshal([]byte(setting.BenchmarkGpuTypes), &benchmarkGpuInfos) | |||||
| } | |||||
| ctx.Data["benchmark_gpu_types"] = benchmarkGpuInfos.GpuInfo | |||||
| if benchmarkResourceSpecs == nil { | |||||
| json.Unmarshal([]byte(setting.BenchmarkResourceSpecs), &benchmarkResourceSpecs) | |||||
| } | |||||
| ctx.Data["benchmark_resource_specs"] = benchmarkResourceSpecs.ResourceSpec | |||||
| if cloudbrain.ResourceSpecs == nil { | |||||
| json.Unmarshal([]byte(setting.ResourceSpecs), &cloudbrain.ResourceSpecs) | |||||
| } | |||||
| ctx.Data["resource_specs"] = cloudbrain.ResourceSpecs.ResourceSpec | |||||
| if cloudbrain.TrainResourceSpecs == nil { | |||||
| json.Unmarshal([]byte(setting.TrainResourceSpecs), &cloudbrain.TrainResourceSpecs) | |||||
| } | |||||
| ctx.Data["train_resource_specs"] = cloudbrain.TrainResourceSpecs.ResourceSpec | |||||
| if cloudbrain.InferenceResourceSpecs == nil && setting.InferenceResourceSpecs != "" { | |||||
| json.Unmarshal([]byte(setting.InferenceResourceSpecs), &cloudbrain.InferenceResourceSpecs) | |||||
| } | |||||
| if cloudbrain.InferenceResourceSpecs != nil { | |||||
| ctx.Data["inference_resource_specs"] = cloudbrain.InferenceResourceSpecs.ResourceSpec | |||||
| } | |||||
| if cloudbrain.SpecialPools != nil { | |||||
| var debugGpuTypes []*models.GpuInfo | |||||
| var trainGpuTypes []*models.GpuInfo | |||||
| for _, pool := range cloudbrain.SpecialPools.Pools { | |||||
| org, _ := models.GetOrgByName(pool.Org) | |||||
| if org != nil { | |||||
| isOrgMember, _ := models.IsOrganizationMember(org.ID, ctx.User.ID) | |||||
| if isOrgMember { | |||||
| for _, jobType := range pool.JobType { | |||||
| if jobType == string(models.JobTypeDebug) { | |||||
| debugGpuTypes = append(debugGpuTypes, pool.Pool...) | |||||
| if pool.ResourceSpec != nil { | |||||
| ctx.Data["resource_specs"] = pool.ResourceSpec | |||||
| } | |||||
| } else if jobType == string(models.JobTypeTrain) { | |||||
| trainGpuTypes = append(trainGpuTypes, pool.Pool...) | |||||
| if pool.ResourceSpec != nil { | |||||
| ctx.Data["train_resource_specs"] = pool.ResourceSpec | |||||
| } | |||||
| } | |||||
| } | |||||
| break | |||||
| } | |||||
| } | |||||
| } | |||||
| if len(debugGpuTypes) > 0 { | |||||
| ctx.Data["gpu_types"] = debugGpuTypes | |||||
| } | |||||
| if len(trainGpuTypes) > 0 { | |||||
| ctx.Data["train_gpu_types"] = trainGpuTypes | |||||
| } | |||||
| } | |||||
| var Parameters modelarts.Parameters | |||||
| if err := json.Unmarshal([]byte(form.Params), &Parameters); err != nil { | |||||
| ctx.ServerError("json.Unmarshal failed:", err) | |||||
| return err | |||||
| } | |||||
| ctx.Data["params"] = Parameters.Parameter | |||||
| ctx.Data["boot_file"] = form.BootFile | |||||
| ctx.Data["attachment"] = form.Attachment | |||||
| _, datasetNames, err := models.GetDatasetInfo(form.Attachment) | |||||
| if err != nil { | |||||
| log.Error("GetDatasetInfo failed: %v", err, ctx.Data["MsgID"]) | |||||
| return nil | |||||
| } | |||||
| ctx.Data["dataset_name"] = datasetNames | |||||
| ctx.Data["branch_name"] = form.BranchName | |||||
| ctx.Data["datasetType"] = models.TypeCloudBrainOne | |||||
| ctx.Data["display_job_name"] = form.DisplayJobName | |||||
| ctx.Data["image"] = form.Image | |||||
| ctx.Data["job_type"] = form.JobType | |||||
| ctx.Data["gpu_type"] = form.GpuType | |||||
| ctx.Data["resource_spec_id"] = form.ResourceSpecId | |||||
| return nil | |||||
| } | |||||
| func cloudBrainInferenceJobErrorPrepare(ctx *context.Context, form auth.CreateCloudBrainInferencForm) error { | |||||
| ctx.Data["PageIsCloudBrain"] = true | |||||
| if categories == nil { | |||||
| json.Unmarshal([]byte(setting.BenchmarkCategory), &categories) | |||||
| } | |||||
| ctx.Data["benchmark_categories"] = categories.Category | |||||
| ctx.Data["benchmark_types"] = GetBenchmarkTypes(ctx).BenchmarkType | |||||
| queuesDetail, _ := cloudbrain.GetQueuesDetail() | |||||
| if queuesDetail != nil { | |||||
| ctx.Data["QueuesDetail"] = queuesDetail | |||||
| } | |||||
| cloudbrain.InitSpecialPool() | |||||
| if gpuInfos == nil { | |||||
| json.Unmarshal([]byte(setting.GpuTypes), &gpuInfos) | |||||
| } | |||||
| ctx.Data["gpu_types"] = gpuInfos.GpuInfo | |||||
| if trainGpuInfos == nil { | |||||
| json.Unmarshal([]byte(setting.TrainGpuTypes), &trainGpuInfos) | |||||
| } | |||||
| ctx.Data["train_gpu_types"] = trainGpuInfos.GpuInfo | |||||
| if inferenceGpuInfos == nil && setting.InferenceGpuTypes != "" { | |||||
| json.Unmarshal([]byte(setting.InferenceGpuTypes), &inferenceGpuInfos) | |||||
| } | |||||
| if inferenceGpuInfos != nil { | |||||
| ctx.Data["inference_gpu_types"] = inferenceGpuInfos.GpuInfo | |||||
| } | |||||
| if benchmarkGpuInfos == nil { | |||||
| json.Unmarshal([]byte(setting.BenchmarkGpuTypes), &benchmarkGpuInfos) | |||||
| } | |||||
| ctx.Data["benchmark_gpu_types"] = benchmarkGpuInfos.GpuInfo | |||||
| if benchmarkResourceSpecs == nil { | |||||
| json.Unmarshal([]byte(setting.BenchmarkResourceSpecs), &benchmarkResourceSpecs) | |||||
| } | |||||
| ctx.Data["benchmark_resource_specs"] = benchmarkResourceSpecs.ResourceSpec | |||||
| if cloudbrain.ResourceSpecs == nil { | |||||
| json.Unmarshal([]byte(setting.ResourceSpecs), &cloudbrain.ResourceSpecs) | |||||
| } | |||||
| ctx.Data["resource_specs"] = cloudbrain.ResourceSpecs.ResourceSpec | |||||
| if cloudbrain.TrainResourceSpecs == nil { | |||||
| json.Unmarshal([]byte(setting.TrainResourceSpecs), &cloudbrain.TrainResourceSpecs) | |||||
| } | |||||
| ctx.Data["train_resource_specs"] = cloudbrain.TrainResourceSpecs.ResourceSpec | |||||
| if cloudbrain.InferenceResourceSpecs == nil && setting.InferenceResourceSpecs != "" { | |||||
| json.Unmarshal([]byte(setting.InferenceResourceSpecs), &cloudbrain.InferenceResourceSpecs) | |||||
| } | |||||
| if cloudbrain.InferenceResourceSpecs != nil { | |||||
| ctx.Data["inference_resource_specs"] = cloudbrain.InferenceResourceSpecs.ResourceSpec | |||||
| } | |||||
| if cloudbrain.SpecialPools != nil { | |||||
| var debugGpuTypes []*models.GpuInfo | |||||
| var trainGpuTypes []*models.GpuInfo | |||||
| for _, pool := range cloudbrain.SpecialPools.Pools { | |||||
| org, _ := models.GetOrgByName(pool.Org) | |||||
| if org != nil { | |||||
| isOrgMember, _ := models.IsOrganizationMember(org.ID, ctx.User.ID) | |||||
| if isOrgMember { | |||||
| for _, jobType := range pool.JobType { | |||||
| if jobType == string(models.JobTypeDebug) { | |||||
| debugGpuTypes = append(debugGpuTypes, pool.Pool...) | |||||
| if pool.ResourceSpec != nil { | |||||
| ctx.Data["resource_specs"] = pool.ResourceSpec | |||||
| } | |||||
| } else if jobType == string(models.JobTypeTrain) { | |||||
| trainGpuTypes = append(trainGpuTypes, pool.Pool...) | |||||
| if pool.ResourceSpec != nil { | |||||
| ctx.Data["train_resource_specs"] = pool.ResourceSpec | |||||
| } | |||||
| } | |||||
| } | |||||
| break | |||||
| } | |||||
| } | |||||
| } | |||||
| if len(debugGpuTypes) > 0 { | |||||
| ctx.Data["gpu_types"] = debugGpuTypes | |||||
| } | |||||
| if len(trainGpuTypes) > 0 { | |||||
| ctx.Data["train_gpu_types"] = trainGpuTypes | |||||
| } | |||||
| } | |||||
| var Parameters modelarts.Parameters | |||||
| if err := json.Unmarshal([]byte(form.Params), &Parameters); err != nil { | |||||
| ctx.ServerError("json.Unmarshal failed:", err) | |||||
| return err | |||||
| } | |||||
| ctx.Data["params"] = Parameters.Parameter | |||||
| ctx.Data["boot_file"] = form.BootFile | |||||
| ctx.Data["attachment"] = form.Attachment | |||||
| _, datasetNames, err := models.GetDatasetInfo(form.Attachment) | |||||
| if err != nil { | |||||
| log.Error("GetDatasetInfo failed: %v", err, ctx.Data["MsgID"]) | |||||
| return nil | |||||
| } | |||||
| ctx.Data["dataset_name"] = datasetNames | |||||
| ctx.Data["branch_name"] = form.BranchName | |||||
| ctx.Data["datasetType"] = models.TypeCloudBrainOne | |||||
| ctx.Data["display_job_name"] = form.DisplayJobName | |||||
| ctx.Data["image"] = form.Image | |||||
| ctx.Data["job_type"] = form.JobType | |||||
| ctx.Data["gpu_type"] = form.GpuType | |||||
| ctx.Data["resource_spec_id"] = form.ResourceSpecId | |||||
| ctx.Data["label_names"] = form.LabelName | |||||
| ctx.Data["train_url"] = form.TrainUrl | |||||
| ctx.Data["ckpt_name"] = form.CkptName | |||||
| ctx.Data["model_name"] = form.ModelName | |||||
| ctx.Data["model_version"] = form.ModelVersion | |||||
| ctx.Data["description"] = form.Description | |||||
| return nil | |||||
| } | |||||
| func CloudBrainNew(ctx *context.Context) { | func CloudBrainNew(ctx *context.Context) { | ||||
| err := cloudBrainNewDataPrepare(ctx) | err := cloudBrainNewDataPrepare(ctx) | ||||
| @@ -251,28 +500,28 @@ func CloudBrainCreate(ctx *context.Context, form auth.CreateCloudBrainForm) { | |||||
| if err == nil { | if err == nil { | ||||
| if len(tasks) != 0 { | if len(tasks) != 0 { | ||||
| log.Error("the job name did already exist", ctx.Data["MsgID"]) | log.Error("the job name did already exist", ctx.Data["MsgID"]) | ||||
| cloudBrainNewDataPrepare(ctx) | |||||
| cloudBrainTrainJobErrorPrepare(ctx, form) | |||||
| ctx.RenderWithErr("the job name did already exist", tpl, &form) | ctx.RenderWithErr("the job name did already exist", tpl, &form) | ||||
| return | return | ||||
| } | } | ||||
| } else { | } else { | ||||
| if !models.IsErrJobNotExist(err) { | if !models.IsErrJobNotExist(err) { | ||||
| log.Error("system error, %v", err, ctx.Data["MsgID"]) | log.Error("system error, %v", err, ctx.Data["MsgID"]) | ||||
| cloudBrainNewDataPrepare(ctx) | |||||
| cloudBrainTrainJobErrorPrepare(ctx, form) | |||||
| ctx.RenderWithErr("system error", tpl, &form) | ctx.RenderWithErr("system error", tpl, &form) | ||||
| return | return | ||||
| } | } | ||||
| } | } | ||||
| if !jobNamePattern.MatchString(displayJobName) { | if !jobNamePattern.MatchString(displayJobName) { | ||||
| cloudBrainNewDataPrepare(ctx) | |||||
| cloudBrainTrainJobErrorPrepare(ctx, form) | |||||
| ctx.RenderWithErr(ctx.Tr("repo.cloudbrain_jobname_err"), tpl, &form) | ctx.RenderWithErr(ctx.Tr("repo.cloudbrain_jobname_err"), tpl, &form) | ||||
| return | return | ||||
| } | } | ||||
| if jobType != string(models.JobTypeBenchmark) && jobType != string(models.JobTypeDebug) && jobType != string(models.JobTypeTrain) { | if jobType != string(models.JobTypeBenchmark) && jobType != string(models.JobTypeDebug) && jobType != string(models.JobTypeTrain) { | ||||
| log.Error("jobtype error:", jobType, ctx.Data["MsgID"]) | log.Error("jobtype error:", jobType, ctx.Data["MsgID"]) | ||||
| cloudBrainNewDataPrepare(ctx) | |||||
| cloudBrainTrainJobErrorPrepare(ctx, form) | |||||
| ctx.RenderWithErr("jobtype error", tpl, &form) | ctx.RenderWithErr("jobtype error", tpl, &form) | ||||
| return | return | ||||
| } | } | ||||
| @@ -280,13 +529,13 @@ func CloudBrainCreate(ctx *context.Context, form auth.CreateCloudBrainForm) { | |||||
| count, err := models.GetCloudbrainCountByUserID(ctx.User.ID, jobType) | count, err := models.GetCloudbrainCountByUserID(ctx.User.ID, jobType) | ||||
| if err != nil { | if err != nil { | ||||
| log.Error("GetCloudbrainCountByUserID failed:%v", err, ctx.Data["MsgID"]) | log.Error("GetCloudbrainCountByUserID failed:%v", err, ctx.Data["MsgID"]) | ||||
| cloudBrainNewDataPrepare(ctx) | |||||
| cloudBrainTrainJobErrorPrepare(ctx, form) | |||||
| ctx.RenderWithErr("system error", tpl, &form) | ctx.RenderWithErr("system error", tpl, &form) | ||||
| return | return | ||||
| } else { | } else { | ||||
| if count >= 1 { | if count >= 1 { | ||||
| log.Error("the user already has running or waiting task", ctx.Data["MsgID"]) | log.Error("the user already has running or waiting task", ctx.Data["MsgID"]) | ||||
| cloudBrainNewDataPrepare(ctx) | |||||
| cloudBrainTrainJobErrorPrepare(ctx, form) | |||||
| ctx.RenderWithErr(ctx.Tr("repo.cloudbrain.morethanonejob"), tpl, &form) | ctx.RenderWithErr(ctx.Tr("repo.cloudbrain.morethanonejob"), tpl, &form) | ||||
| return | return | ||||
| } | } | ||||
| @@ -295,7 +544,7 @@ func CloudBrainCreate(ctx *context.Context, form auth.CreateCloudBrainForm) { | |||||
| datasetInfos, datasetNames, err := models.GetDatasetInfo(uuids) | datasetInfos, datasetNames, err := models.GetDatasetInfo(uuids) | ||||
| if err != nil { | if err != nil { | ||||
| log.Error("GetDatasetInfo failed: %v", err, ctx.Data["MsgID"]) | log.Error("GetDatasetInfo failed: %v", err, ctx.Data["MsgID"]) | ||||
| cloudBrainNewDataPrepare(ctx) | |||||
| cloudBrainTrainJobErrorPrepare(ctx, form) | |||||
| ctx.RenderWithErr(ctx.Tr("cloudbrain.error.dataset_select"), tpl, &form) | ctx.RenderWithErr(ctx.Tr("cloudbrain.error.dataset_select"), tpl, &form) | ||||
| return | return | ||||
| } | } | ||||
| @@ -316,7 +565,7 @@ func CloudBrainCreate(ctx *context.Context, form auth.CreateCloudBrainForm) { | |||||
| errStr := checkCloudBrainSpecialPool(ctx, jobType, gpuQueue, resourceSpecId) | errStr := checkCloudBrainSpecialPool(ctx, jobType, gpuQueue, resourceSpecId) | ||||
| if errStr != "" { | if errStr != "" { | ||||
| cloudBrainNewDataPrepare(ctx) | |||||
| cloudBrainTrainJobErrorPrepare(ctx, form) | |||||
| ctx.RenderWithErr(errStr, tpl, &form) | ctx.RenderWithErr(errStr, tpl, &form) | ||||
| return | return | ||||
| } | } | ||||
| @@ -362,7 +611,7 @@ func CloudBrainCreate(ctx *context.Context, form auth.CreateCloudBrainForm) { | |||||
| err = cloudbrain.GenerateTask(req) | err = cloudbrain.GenerateTask(req) | ||||
| if err != nil { | if err != nil { | ||||
| cloudBrainNewDataPrepare(ctx) | |||||
| cloudBrainTrainJobErrorPrepare(ctx, form) | |||||
| ctx.RenderWithErr(err.Error(), tpl, &form) | ctx.RenderWithErr(err.Error(), tpl, &form) | ||||
| return | return | ||||
| } | } | ||||
| @@ -402,20 +651,21 @@ func CloudBrainInferenceJobCreate(ctx *context.Context, form auth.CreateCloudBra | |||||
| if err == nil { | if err == nil { | ||||
| if len(tasks) != 0 { | if len(tasks) != 0 { | ||||
| log.Error("the job name did already exist", ctx.Data["MsgID"]) | log.Error("the job name did already exist", ctx.Data["MsgID"]) | ||||
| cloudBrainNewDataPrepare(ctx) | |||||
| cloudBrainInferenceJobErrorPrepare(ctx, form) | |||||
| ctx.RenderWithErr("the job name did already exist", tpl, &form) | ctx.RenderWithErr("the job name did already exist", tpl, &form) | ||||
| return | return | ||||
| } | } | ||||
| } else { | } else { | ||||
| if !models.IsErrJobNotExist(err) { | if !models.IsErrJobNotExist(err) { | ||||
| log.Error("system error, %v", err, ctx.Data["MsgID"]) | log.Error("system error, %v", err, ctx.Data["MsgID"]) | ||||
| cloudBrainNewDataPrepare(ctx) | |||||
| cloudBrainInferenceJobErrorPrepare(ctx, form) | |||||
| ctx.RenderWithErr("system error", tpl, &form) | ctx.RenderWithErr("system error", tpl, &form) | ||||
| return | return | ||||
| } | } | ||||
| } | } | ||||
| if !jobNamePattern.MatchString(displayJobName) { | if !jobNamePattern.MatchString(displayJobName) { | ||||
| cloudBrainInferenceJobErrorPrepare(ctx, form) | |||||
| ctx.RenderWithErr(ctx.Tr("repo.cloudbrain_jobname_err"), tpl, &form) | ctx.RenderWithErr(ctx.Tr("repo.cloudbrain_jobname_err"), tpl, &form) | ||||
| return | return | ||||
| } | } | ||||
| @@ -423,13 +673,13 @@ func CloudBrainInferenceJobCreate(ctx *context.Context, form auth.CreateCloudBra | |||||
| count, err := models.GetCloudbrainCountByUserID(ctx.User.ID, jobType) | count, err := models.GetCloudbrainCountByUserID(ctx.User.ID, jobType) | ||||
| if err != nil { | if err != nil { | ||||
| log.Error("GetCloudbrainCountByUserID failed:%v", err, ctx.Data["MsgID"]) | log.Error("GetCloudbrainCountByUserID failed:%v", err, ctx.Data["MsgID"]) | ||||
| cloudBrainNewDataPrepare(ctx) | |||||
| cloudBrainInferenceJobErrorPrepare(ctx, form) | |||||
| ctx.RenderWithErr("system error", tpl, &form) | ctx.RenderWithErr("system error", tpl, &form) | ||||
| return | return | ||||
| } else { | } else { | ||||
| if count >= 1 { | if count >= 1 { | ||||
| log.Error("the user already has running or waiting task", ctx.Data["MsgID"]) | log.Error("the user already has running or waiting task", ctx.Data["MsgID"]) | ||||
| cloudBrainNewDataPrepare(ctx) | |||||
| cloudBrainInferenceJobErrorPrepare(ctx, form) | |||||
| ctx.RenderWithErr(ctx.Tr("repo.cloudbrain.morethanonejob"), tpl, &form) | ctx.RenderWithErr(ctx.Tr("repo.cloudbrain.morethanonejob"), tpl, &form) | ||||
| return | return | ||||
| } | } | ||||
| @@ -449,7 +699,7 @@ func CloudBrainInferenceJobCreate(ctx *context.Context, form auth.CreateCloudBra | |||||
| datasetInfos, datasetNames, err := models.GetDatasetInfo(uuid) | datasetInfos, datasetNames, err := models.GetDatasetInfo(uuid) | ||||
| if err != nil { | if err != nil { | ||||
| log.Error("GetDatasetInfo failed: %v", err, ctx.Data["MsgID"]) | log.Error("GetDatasetInfo failed: %v", err, ctx.Data["MsgID"]) | ||||
| cloudBrainNewDataPrepare(ctx) | |||||
| cloudBrainInferenceJobErrorPrepare(ctx, form) | |||||
| ctx.RenderWithErr(ctx.Tr("cloudbrain.error.dataset_select"), tpl, &form) | ctx.RenderWithErr(ctx.Tr("cloudbrain.error.dataset_select"), tpl, &form) | ||||
| return | return | ||||
| } | } | ||||
| @@ -486,7 +736,7 @@ func CloudBrainInferenceJobCreate(ctx *context.Context, form auth.CreateCloudBra | |||||
| err = cloudbrain.GenerateTask(req) | err = cloudbrain.GenerateTask(req) | ||||
| if err != nil { | if err != nil { | ||||
| cloudBrainNewDataPrepare(ctx) | |||||
| cloudBrainInferenceJobErrorPrepare(ctx, form) | |||||
| ctx.RenderWithErr(err.Error(), tpl, &form) | ctx.RenderWithErr(err.Error(), tpl, &form) | ||||
| return | return | ||||
| } | } | ||||
| @@ -1,16 +1,8 @@ | |||||
| package repo | package repo | ||||
| import ( | import ( | ||||
| "code.gitea.io/gitea/modules/auth" | |||||
| "code.gitea.io/gitea/modules/git" | |||||
| "code.gitea.io/gitea/modules/grampus" | |||||
| "code.gitea.io/gitea/modules/modelarts" | |||||
| "code.gitea.io/gitea/modules/notification" | |||||
| "code.gitea.io/gitea/modules/timeutil" | |||||
| "code.gitea.io/gitea/modules/util" | |||||
| "encoding/json" | "encoding/json" | ||||
| "errors" | "errors" | ||||
| "github.com/unknwon/com" | |||||
| "io/ioutil" | "io/ioutil" | ||||
| "net/http" | "net/http" | ||||
| "os" | "os" | ||||
| @@ -19,6 +11,15 @@ import ( | |||||
| "strings" | "strings" | ||||
| "time" | "time" | ||||
| "code.gitea.io/gitea/modules/auth" | |||||
| "code.gitea.io/gitea/modules/git" | |||||
| "code.gitea.io/gitea/modules/grampus" | |||||
| "code.gitea.io/gitea/modules/modelarts" | |||||
| "code.gitea.io/gitea/modules/notification" | |||||
| "code.gitea.io/gitea/modules/timeutil" | |||||
| "code.gitea.io/gitea/modules/util" | |||||
| "github.com/unknwon/com" | |||||
| "code.gitea.io/gitea/models" | "code.gitea.io/gitea/models" | ||||
| "code.gitea.io/gitea/modules/base" | "code.gitea.io/gitea/modules/base" | ||||
| "code.gitea.io/gitea/modules/cloudbrain" | "code.gitea.io/gitea/modules/cloudbrain" | ||||
| @@ -137,6 +138,93 @@ func grampusTrainJobNewDataPrepare(ctx *context.Context, processType string) err | |||||
| return nil | return nil | ||||
| } | } | ||||
| func grampusTrainJobErrorPrepare(ctx *context.Context, processType string, form auth.CreateGrampusTrainJobForm) error { | |||||
| ctx.Data["PageIsCloudBrain"] = true | |||||
| //get valid images | |||||
| images, err := grampus.GetImages(processType) | |||||
| if err != nil { | |||||
| log.Error("GetImages failed:", err.Error()) | |||||
| } else { | |||||
| ctx.Data["images"] = images.Infos | |||||
| } | |||||
| grampus.InitSpecialPool() | |||||
| ctx.Data["GPUEnabled"] = true | |||||
| ctx.Data["NPUEnabled"] = true | |||||
| includeCenters := make(map[string]struct{}) | |||||
| excludeCenters := make(map[string]struct{}) | |||||
| if grampus.SpecialPools != nil { | |||||
| for _, pool := range grampus.SpecialPools.Pools { | |||||
| if pool.IsExclusive { | |||||
| if !IsUserInOrgPool(ctx.User.ID, pool) { | |||||
| ctx.Data[pool.Type+"Enabled"] = false | |||||
| } | |||||
| } else { | |||||
| if strings.Contains(strings.ToLower(processType), strings.ToLower(pool.Type)) { | |||||
| if IsUserInOrgPool(ctx.User.ID, pool) { | |||||
| for _, center := range pool.Pool { | |||||
| includeCenters[center.Queue] = struct{}{} | |||||
| } | |||||
| } else { | |||||
| for _, center := range pool.Pool { | |||||
| excludeCenters[center.Queue] = struct{}{} | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| //get valid resource specs | |||||
| specs, err := grampus.GetResourceSpecs(processType) | |||||
| grampusSpecs := getFilterSpecBySpecialPool(specs, includeCenters, excludeCenters) | |||||
| if err != nil { | |||||
| log.Error("GetResourceSpecs failed:", err.Error()) | |||||
| } else { | |||||
| ctx.Data["flavor_infos"] = grampusSpecs | |||||
| } | |||||
| if processType == grampus.ProcessorTypeGPU { | |||||
| ctx.Data["datasetType"] = models.TypeCloudBrainOne | |||||
| } else if processType == grampus.ProcessorTypeNPU { | |||||
| ctx.Data["datasetType"] = models.TypeCloudBrainTwo | |||||
| } | |||||
| var Parameters modelarts.Parameters | |||||
| if err := json.Unmarshal([]byte(form.Params), &Parameters); err != nil { | |||||
| ctx.ServerError("json.Unmarshal failed:", err) | |||||
| return err | |||||
| } | |||||
| ctx.Data["params"] = Parameters.Parameter | |||||
| ctx.Data["boot_file"] = form.BootFile | |||||
| ctx.Data["attachment"] = form.Attachment | |||||
| _, datasetNames, err := models.GetDatasetInfo(form.Attachment) | |||||
| if err != nil { | |||||
| log.Error("GetDatasetInfo failed: %v", err, ctx.Data["MsgID"]) | |||||
| return nil | |||||
| } | |||||
| ctx.Data["dataset_name"] = datasetNames | |||||
| ctx.Data["branch_name"] = form.BranchName | |||||
| ctx.Data["image_id"] = form.ImageID | |||||
| ctx.Data["display_job_name"] = form.DisplayJobName | |||||
| ctx.Data["image"] = form.Image | |||||
| ctx.Data["flavor"] = form.FlavorID | |||||
| ctx.Data["flavor_name"] = form.FlavorName | |||||
| ctx.Data["description"] = form.Description | |||||
| ctx.Data["engine_name"] = form.EngineName | |||||
| ctx.Data["work_server_number"] = form.WorkServerNumber | |||||
| return nil | |||||
| } | |||||
| func getFilterSpecBySpecialPool(specs *models.GetGrampusResourceSpecsResult, includeCenters map[string]struct{}, excludeCenters map[string]struct{}) []models.GrampusSpec { | func getFilterSpecBySpecialPool(specs *models.GetGrampusResourceSpecsResult, includeCenters map[string]struct{}, excludeCenters map[string]struct{}) []models.GrampusSpec { | ||||
| if len(includeCenters) == 0 && len(excludeCenters) == 0 { | if len(includeCenters) == 0 && len(excludeCenters) == 0 { | ||||
| return specs.Infos | return specs.Infos | ||||
| @@ -207,14 +295,14 @@ func GrampusTrainJobGpuCreate(ctx *context.Context, form auth.CreateGrampusTrain | |||||
| image := strings.TrimSpace(form.Image) | image := strings.TrimSpace(form.Image) | ||||
| if !jobNamePattern.MatchString(displayJobName) { | if !jobNamePattern.MatchString(displayJobName) { | ||||
| grampusTrainJobNewDataPrepare(ctx, grampus.ProcessorTypeGPU) | |||||
| grampusTrainJobErrorPrepare(ctx, grampus.ProcessorTypeGPU, form) | |||||
| ctx.RenderWithErr(ctx.Tr("repo.cloudbrain_jobname_err"), tplGrampusTrainJobGPUNew, &form) | ctx.RenderWithErr(ctx.Tr("repo.cloudbrain_jobname_err"), tplGrampusTrainJobGPUNew, &form) | ||||
| return | return | ||||
| } | } | ||||
| errStr := checkSpecialPool(ctx, "GPU") | errStr := checkSpecialPool(ctx, "GPU") | ||||
| if errStr != "" { | if errStr != "" { | ||||
| grampusTrainJobNewDataPrepare(ctx, grampus.ProcessorTypeGPU) | |||||
| grampusTrainJobErrorPrepare(ctx, grampus.ProcessorTypeGPU, form) | |||||
| ctx.RenderWithErr(errStr, tplGrampusTrainJobGPUNew, &form) | ctx.RenderWithErr(errStr, tplGrampusTrainJobGPUNew, &form) | ||||
| return | return | ||||
| } | } | ||||
| @@ -223,13 +311,13 @@ func GrampusTrainJobGpuCreate(ctx *context.Context, form auth.CreateGrampusTrain | |||||
| count, err := models.GetGrampusCountByUserID(ctx.User.ID, string(models.JobTypeTrain), models.GPUResource) | count, err := models.GetGrampusCountByUserID(ctx.User.ID, string(models.JobTypeTrain), models.GPUResource) | ||||
| if err != nil { | if err != nil { | ||||
| log.Error("GetGrampusCountByUserID failed:%v", err, ctx.Data["MsgID"]) | log.Error("GetGrampusCountByUserID failed:%v", err, ctx.Data["MsgID"]) | ||||
| grampusTrainJobNewDataPrepare(ctx, grampus.ProcessorTypeGPU) | |||||
| grampusTrainJobErrorPrepare(ctx, grampus.ProcessorTypeGPU, form) | |||||
| ctx.RenderWithErr("system error", tplGrampusTrainJobGPUNew, &form) | ctx.RenderWithErr("system error", tplGrampusTrainJobGPUNew, &form) | ||||
| return | return | ||||
| } else { | } else { | ||||
| if count >= 1 { | if count >= 1 { | ||||
| log.Error("the user already has running or waiting task", ctx.Data["MsgID"]) | log.Error("the user already has running or waiting task", ctx.Data["MsgID"]) | ||||
| grampusTrainJobNewDataPrepare(ctx, grampus.ProcessorTypeGPU) | |||||
| grampusTrainJobErrorPrepare(ctx, grampus.ProcessorTypeGPU, form) | |||||
| ctx.RenderWithErr("you have already a running or waiting task, can not create more", tplGrampusTrainJobGPUNew, &form) | ctx.RenderWithErr("you have already a running or waiting task, can not create more", tplGrampusTrainJobGPUNew, &form) | ||||
| return | return | ||||
| } | } | ||||
| @@ -238,7 +326,7 @@ func GrampusTrainJobGpuCreate(ctx *context.Context, form auth.CreateGrampusTrain | |||||
| //check param | //check param | ||||
| if err := grampusParamCheckCreateTrainJob(form); err != nil { | if err := grampusParamCheckCreateTrainJob(form); err != nil { | ||||
| log.Error("paramCheckCreateTrainJob failed:(%v)", err, ctx.Data["MsgID"]) | log.Error("paramCheckCreateTrainJob failed:(%v)", err, ctx.Data["MsgID"]) | ||||
| grampusTrainJobNewDataPrepare(ctx, grampus.ProcessorTypeGPU) | |||||
| grampusTrainJobErrorPrepare(ctx, grampus.ProcessorTypeGPU, form) | |||||
| ctx.RenderWithErr(err.Error(), tplGrampusTrainJobGPUNew, &form) | ctx.RenderWithErr(err.Error(), tplGrampusTrainJobGPUNew, &form) | ||||
| return | return | ||||
| } | } | ||||
| @@ -248,14 +336,14 @@ func GrampusTrainJobGpuCreate(ctx *context.Context, form auth.CreateGrampusTrain | |||||
| if err == nil { | if err == nil { | ||||
| if len(tasks) != 0 { | if len(tasks) != 0 { | ||||
| log.Error("the job name did already exist", ctx.Data["MsgID"]) | log.Error("the job name did already exist", ctx.Data["MsgID"]) | ||||
| grampusTrainJobNewDataPrepare(ctx, grampus.ProcessorTypeGPU) | |||||
| grampusTrainJobErrorPrepare(ctx, grampus.ProcessorTypeGPU, form) | |||||
| ctx.RenderWithErr("the job name did already exist", tplGrampusTrainJobGPUNew, &form) | ctx.RenderWithErr("the job name did already exist", tplGrampusTrainJobGPUNew, &form) | ||||
| return | return | ||||
| } | } | ||||
| } else { | } else { | ||||
| if !models.IsErrJobNotExist(err) { | if !models.IsErrJobNotExist(err) { | ||||
| log.Error("system error, %v", err, ctx.Data["MsgID"]) | log.Error("system error, %v", err, ctx.Data["MsgID"]) | ||||
| grampusTrainJobNewDataPrepare(ctx, grampus.ProcessorTypeGPU) | |||||
| grampusTrainJobErrorPrepare(ctx, grampus.ProcessorTypeGPU, form) | |||||
| ctx.RenderWithErr("system error", tplGrampusTrainJobGPUNew, &form) | ctx.RenderWithErr("system error", tplGrampusTrainJobGPUNew, &form) | ||||
| return | return | ||||
| } | } | ||||
| @@ -265,7 +353,7 @@ func GrampusTrainJobGpuCreate(ctx *context.Context, form auth.CreateGrampusTrain | |||||
| attachment, err := models.GetAttachmentByUUID(uuid) | attachment, err := models.GetAttachmentByUUID(uuid) | ||||
| if err != nil { | if err != nil { | ||||
| log.Error("GetAttachmentByUUID failed:", err.Error(), ctx.Data["MsgID"]) | log.Error("GetAttachmentByUUID failed:", err.Error(), ctx.Data["MsgID"]) | ||||
| grampusTrainJobNewDataPrepare(ctx, grampus.ProcessorTypeGPU) | |||||
| grampusTrainJobErrorPrepare(ctx, grampus.ProcessorTypeGPU, form) | |||||
| ctx.RenderWithErr("dataset is not exist", tplGrampusTrainJobGPUNew, &form) | ctx.RenderWithErr("dataset is not exist", tplGrampusTrainJobGPUNew, &form) | ||||
| return | return | ||||
| } | } | ||||
| @@ -278,7 +366,7 @@ func GrampusTrainJobGpuCreate(ctx *context.Context, form auth.CreateGrampusTrain | |||||
| if err := downloadZipCode(ctx, codeLocalPath, branchName); err != nil { | if err := downloadZipCode(ctx, codeLocalPath, branchName); err != nil { | ||||
| log.Error("downloadZipCode failed, server timed out: %s (%v)", repo.FullName(), err, ctx.Data["MsgID"]) | log.Error("downloadZipCode failed, server timed out: %s (%v)", repo.FullName(), err, ctx.Data["MsgID"]) | ||||
| grampusTrainJobNewDataPrepare(ctx, grampus.ProcessorTypeGPU) | |||||
| grampusTrainJobErrorPrepare(ctx, grampus.ProcessorTypeGPU, form) | |||||
| ctx.RenderWithErr("Create task failed, internal error", tplGrampusTrainJobGPUNew, &form) | ctx.RenderWithErr("Create task failed, internal error", tplGrampusTrainJobGPUNew, &form) | ||||
| return | return | ||||
| } | } | ||||
| @@ -287,7 +375,7 @@ func GrampusTrainJobGpuCreate(ctx *context.Context, form auth.CreateGrampusTrain | |||||
| //upload code | //upload code | ||||
| if err := uploadCodeToMinio(codeLocalPath+"/", jobName, cloudbrain.CodeMountPath+"/"); err != nil { | if err := uploadCodeToMinio(codeLocalPath+"/", jobName, cloudbrain.CodeMountPath+"/"); err != nil { | ||||
| log.Error("Failed to uploadCodeToMinio: %s (%v)", repo.FullName(), err, ctx.Data["MsgID"]) | log.Error("Failed to uploadCodeToMinio: %s (%v)", repo.FullName(), err, ctx.Data["MsgID"]) | ||||
| grampusTrainJobNewDataPrepare(ctx, grampus.ProcessorTypeGPU) | |||||
| grampusTrainJobErrorPrepare(ctx, grampus.ProcessorTypeGPU, form) | |||||
| ctx.RenderWithErr("Create task failed, internal error", tplGrampusTrainJobGPUNew, &form) | ctx.RenderWithErr("Create task failed, internal error", tplGrampusTrainJobGPUNew, &form) | ||||
| return | return | ||||
| } | } | ||||
| @@ -295,7 +383,7 @@ func GrampusTrainJobGpuCreate(ctx *context.Context, form auth.CreateGrampusTrain | |||||
| modelPath := setting.JobPath + jobName + cloudbrain.ModelMountPath + "/" | modelPath := setting.JobPath + jobName + cloudbrain.ModelMountPath + "/" | ||||
| if err := mkModelPath(modelPath); err != nil { | if err := mkModelPath(modelPath); err != nil { | ||||
| log.Error("Failed to mkModelPath: %s (%v)", repo.FullName(), err, ctx.Data["MsgID"]) | log.Error("Failed to mkModelPath: %s (%v)", repo.FullName(), err, ctx.Data["MsgID"]) | ||||
| grampusTrainJobNewDataPrepare(ctx, grampus.ProcessorTypeGPU) | |||||
| grampusTrainJobErrorPrepare(ctx, grampus.ProcessorTypeGPU, form) | |||||
| ctx.RenderWithErr("Create task failed, internal error", tplGrampusTrainJobGPUNew, &form) | ctx.RenderWithErr("Create task failed, internal error", tplGrampusTrainJobGPUNew, &form) | ||||
| return | return | ||||
| } | } | ||||
| @@ -303,7 +391,7 @@ func GrampusTrainJobGpuCreate(ctx *context.Context, form auth.CreateGrampusTrain | |||||
| //init model readme | //init model readme | ||||
| if err := uploadCodeToMinio(modelPath, jobName, cloudbrain.ModelMountPath+"/"); err != nil { | if err := uploadCodeToMinio(modelPath, jobName, cloudbrain.ModelMountPath+"/"); err != nil { | ||||
| log.Error("Failed to uploadCodeToMinio: %s (%v)", repo.FullName(), err, ctx.Data["MsgID"]) | log.Error("Failed to uploadCodeToMinio: %s (%v)", repo.FullName(), err, ctx.Data["MsgID"]) | ||||
| grampusTrainJobNewDataPrepare(ctx, grampus.ProcessorTypeGPU) | |||||
| grampusTrainJobErrorPrepare(ctx, grampus.ProcessorTypeGPU, form) | |||||
| ctx.RenderWithErr("Create task failed, internal error", tplGrampusTrainJobGPUNew, &form) | ctx.RenderWithErr("Create task failed, internal error", tplGrampusTrainJobGPUNew, &form) | ||||
| return | return | ||||
| } | } | ||||
| @@ -312,7 +400,7 @@ func GrampusTrainJobGpuCreate(ctx *context.Context, form auth.CreateGrampusTrain | |||||
| command, err := generateCommand(repo.Name, grampus.ProcessorTypeGPU, codeMinioPath+cloudbrain.DefaultBranchName+".zip", dataMinioPath, bootFile, params, setting.CBCodePathPrefix+jobName+cloudbrain.ModelMountPath+"/", attachment.Name) | command, err := generateCommand(repo.Name, grampus.ProcessorTypeGPU, codeMinioPath+cloudbrain.DefaultBranchName+".zip", dataMinioPath, bootFile, params, setting.CBCodePathPrefix+jobName+cloudbrain.ModelMountPath+"/", attachment.Name) | ||||
| if err != nil { | if err != nil { | ||||
| log.Error("Failed to generateCommand: %s (%v)", displayJobName, err, ctx.Data["MsgID"]) | log.Error("Failed to generateCommand: %s (%v)", displayJobName, err, ctx.Data["MsgID"]) | ||||
| grampusTrainJobNewDataPrepare(ctx, grampus.ProcessorTypeGPU) | |||||
| grampusTrainJobErrorPrepare(ctx, grampus.ProcessorTypeGPU, form) | |||||
| ctx.RenderWithErr("Create task failed, internal error", tplGrampusTrainJobGPUNew, &form) | ctx.RenderWithErr("Create task failed, internal error", tplGrampusTrainJobGPUNew, &form) | ||||
| return | return | ||||
| } | } | ||||
| @@ -344,7 +432,7 @@ func GrampusTrainJobGpuCreate(ctx *context.Context, form auth.CreateGrampusTrain | |||||
| err = grampus.GenerateTrainJob(ctx, req) | err = grampus.GenerateTrainJob(ctx, req) | ||||
| if err != nil { | if err != nil { | ||||
| log.Error("GenerateTrainJob failed:%v", err.Error(), ctx.Data["MsgID"]) | log.Error("GenerateTrainJob failed:%v", err.Error(), ctx.Data["MsgID"]) | ||||
| grampusTrainJobNewDataPrepare(ctx, grampus.ProcessorTypeGPU) | |||||
| grampusTrainJobErrorPrepare(ctx, grampus.ProcessorTypeGPU, form) | |||||
| ctx.RenderWithErr(err.Error(), tplGrampusTrainJobGPUNew, &form) | ctx.RenderWithErr(err.Error(), tplGrampusTrainJobGPUNew, &form) | ||||
| return | return | ||||
| } | } | ||||
| @@ -391,14 +479,14 @@ func GrampusTrainJobNpuCreate(ctx *context.Context, form auth.CreateGrampusTrain | |||||
| engineName := form.EngineName | engineName := form.EngineName | ||||
| if !jobNamePattern.MatchString(displayJobName) { | if !jobNamePattern.MatchString(displayJobName) { | ||||
| grampusTrainJobNewDataPrepare(ctx, grampus.ProcessorTypeNPU) | |||||
| grampusTrainJobErrorPrepare(ctx, grampus.ProcessorTypeNPU, form) | |||||
| ctx.RenderWithErr(ctx.Tr("repo.cloudbrain_jobname_err"), tplGrampusTrainJobNPUNew, &form) | ctx.RenderWithErr(ctx.Tr("repo.cloudbrain_jobname_err"), tplGrampusTrainJobNPUNew, &form) | ||||
| return | return | ||||
| } | } | ||||
| errStr := checkSpecialPool(ctx, "NPU") | errStr := checkSpecialPool(ctx, "NPU") | ||||
| if errStr != "" { | if errStr != "" { | ||||
| grampusTrainJobNewDataPrepare(ctx, grampus.ProcessorTypeNPU) | |||||
| grampusTrainJobErrorPrepare(ctx, grampus.ProcessorTypeNPU, form) | |||||
| ctx.RenderWithErr(errStr, tplGrampusTrainJobGPUNew, &form) | ctx.RenderWithErr(errStr, tplGrampusTrainJobGPUNew, &form) | ||||
| return | return | ||||
| } | } | ||||
| @@ -407,13 +495,13 @@ func GrampusTrainJobNpuCreate(ctx *context.Context, form auth.CreateGrampusTrain | |||||
| count, err := models.GetGrampusCountByUserID(ctx.User.ID, string(models.JobTypeTrain), models.NPUResource) | count, err := models.GetGrampusCountByUserID(ctx.User.ID, string(models.JobTypeTrain), models.NPUResource) | ||||
| if err != nil { | if err != nil { | ||||
| log.Error("GetGrampusCountByUserID failed:%v", err, ctx.Data["MsgID"]) | log.Error("GetGrampusCountByUserID failed:%v", err, ctx.Data["MsgID"]) | ||||
| grampusTrainJobNewDataPrepare(ctx, grampus.ProcessorTypeNPU) | |||||
| grampusTrainJobErrorPrepare(ctx, grampus.ProcessorTypeNPU, form) | |||||
| ctx.RenderWithErr("system error", tplGrampusTrainJobNPUNew, &form) | ctx.RenderWithErr("system error", tplGrampusTrainJobNPUNew, &form) | ||||
| return | return | ||||
| } else { | } else { | ||||
| if count >= 1 { | if count >= 1 { | ||||
| log.Error("the user already has running or waiting task", ctx.Data["MsgID"]) | log.Error("the user already has running or waiting task", ctx.Data["MsgID"]) | ||||
| grampusTrainJobNewDataPrepare(ctx, grampus.ProcessorTypeNPU) | |||||
| grampusTrainJobErrorPrepare(ctx, grampus.ProcessorTypeNPU, form) | |||||
| ctx.RenderWithErr("you have already a running or waiting task, can not create more", tplGrampusTrainJobNPUNew, &form) | ctx.RenderWithErr("you have already a running or waiting task, can not create more", tplGrampusTrainJobNPUNew, &form) | ||||
| return | return | ||||
| } | } | ||||
| @@ -422,7 +510,7 @@ func GrampusTrainJobNpuCreate(ctx *context.Context, form auth.CreateGrampusTrain | |||||
| //check param | //check param | ||||
| if err := grampusParamCheckCreateTrainJob(form); err != nil { | if err := grampusParamCheckCreateTrainJob(form); err != nil { | ||||
| log.Error("paramCheckCreateTrainJob failed:(%v)", err) | log.Error("paramCheckCreateTrainJob failed:(%v)", err) | ||||
| grampusTrainJobNewDataPrepare(ctx, grampus.ProcessorTypeNPU) | |||||
| grampusTrainJobErrorPrepare(ctx, grampus.ProcessorTypeNPU, form) | |||||
| ctx.RenderWithErr(err.Error(), tplGrampusTrainJobNPUNew, &form) | ctx.RenderWithErr(err.Error(), tplGrampusTrainJobNPUNew, &form) | ||||
| return | return | ||||
| } | } | ||||
| @@ -432,14 +520,14 @@ func GrampusTrainJobNpuCreate(ctx *context.Context, form auth.CreateGrampusTrain | |||||
| if err == nil { | if err == nil { | ||||
| if len(tasks) != 0 { | if len(tasks) != 0 { | ||||
| log.Error("the job name did already exist", ctx.Data["MsgID"]) | log.Error("the job name did already exist", ctx.Data["MsgID"]) | ||||
| grampusTrainJobNewDataPrepare(ctx, grampus.ProcessorTypeNPU) | |||||
| grampusTrainJobErrorPrepare(ctx, grampus.ProcessorTypeNPU, form) | |||||
| ctx.RenderWithErr("the job name did already exist", tplGrampusTrainJobNPUNew, &form) | ctx.RenderWithErr("the job name did already exist", tplGrampusTrainJobNPUNew, &form) | ||||
| return | return | ||||
| } | } | ||||
| } else { | } else { | ||||
| if !models.IsErrJobNotExist(err) { | if !models.IsErrJobNotExist(err) { | ||||
| log.Error("system error, %v", err, ctx.Data["MsgID"]) | log.Error("system error, %v", err, ctx.Data["MsgID"]) | ||||
| grampusTrainJobNewDataPrepare(ctx, grampus.ProcessorTypeNPU) | |||||
| grampusTrainJobErrorPrepare(ctx, grampus.ProcessorTypeNPU, form) | |||||
| ctx.RenderWithErr("system error", tplGrampusTrainJobNPUNew, &form) | ctx.RenderWithErr("system error", tplGrampusTrainJobNPUNew, &form) | ||||
| return | return | ||||
| } | } | ||||
| @@ -449,7 +537,7 @@ func GrampusTrainJobNpuCreate(ctx *context.Context, form auth.CreateGrampusTrain | |||||
| attachment, err := models.GetAttachmentByUUID(uuid) | attachment, err := models.GetAttachmentByUUID(uuid) | ||||
| if err != nil { | if err != nil { | ||||
| log.Error("GetAttachmentByUUID failed:", err.Error(), ctx.Data["MsgID"]) | log.Error("GetAttachmentByUUID failed:", err.Error(), ctx.Data["MsgID"]) | ||||
| grampusTrainJobNewDataPrepare(ctx, grampus.ProcessorTypeNPU) | |||||
| grampusTrainJobErrorPrepare(ctx, grampus.ProcessorTypeNPU, form) | |||||
| ctx.RenderWithErr("dataset is not exist", tplGrampusTrainJobNPUNew, &form) | ctx.RenderWithErr("dataset is not exist", tplGrampusTrainJobNPUNew, &form) | ||||
| return | return | ||||
| } | } | ||||
| @@ -462,7 +550,7 @@ func GrampusTrainJobNpuCreate(ctx *context.Context, form auth.CreateGrampusTrain | |||||
| if err := downloadZipCode(ctx, codeLocalPath, branchName); err != nil { | if err := downloadZipCode(ctx, codeLocalPath, branchName); err != nil { | ||||
| log.Error("downloadZipCode failed, server timed out: %s (%v)", repo.FullName(), err) | log.Error("downloadZipCode failed, server timed out: %s (%v)", repo.FullName(), err) | ||||
| grampusTrainJobNewDataPrepare(ctx, grampus.ProcessorTypeNPU) | |||||
| grampusTrainJobErrorPrepare(ctx, grampus.ProcessorTypeNPU, form) | |||||
| ctx.RenderWithErr("Create task failed, server timed out", tplGrampusTrainJobNPUNew, &form) | ctx.RenderWithErr("Create task failed, server timed out", tplGrampusTrainJobNPUNew, &form) | ||||
| return | return | ||||
| } | } | ||||
| @@ -470,14 +558,14 @@ func GrampusTrainJobNpuCreate(ctx *context.Context, form auth.CreateGrampusTrain | |||||
| //todo: upload code (send to file_server todo this work?) | //todo: upload code (send to file_server todo this work?) | ||||
| if err := obsMkdir(setting.CodePathPrefix + jobName + modelarts.OutputPath); err != nil { | if err := obsMkdir(setting.CodePathPrefix + jobName + modelarts.OutputPath); err != nil { | ||||
| log.Error("Failed to obsMkdir_output: %s (%v)", repo.FullName(), err) | log.Error("Failed to obsMkdir_output: %s (%v)", repo.FullName(), err) | ||||
| grampusTrainJobNewDataPrepare(ctx, grampus.ProcessorTypeNPU) | |||||
| grampusTrainJobErrorPrepare(ctx, grampus.ProcessorTypeNPU, form) | |||||
| ctx.RenderWithErr("Failed to obsMkdir_output", tplGrampusTrainJobNPUNew, &form) | ctx.RenderWithErr("Failed to obsMkdir_output", tplGrampusTrainJobNPUNew, &form) | ||||
| return | return | ||||
| } | } | ||||
| if err := uploadCodeToObs(codeLocalPath, jobName, ""); err != nil { | if err := uploadCodeToObs(codeLocalPath, jobName, ""); err != nil { | ||||
| log.Error("Failed to uploadCodeToObs: %s (%v)", repo.FullName(), err) | log.Error("Failed to uploadCodeToObs: %s (%v)", repo.FullName(), err) | ||||
| grampusTrainJobNewDataPrepare(ctx, grampus.ProcessorTypeNPU) | |||||
| grampusTrainJobErrorPrepare(ctx, grampus.ProcessorTypeNPU, form) | |||||
| ctx.RenderWithErr("Failed to uploadCodeToObs", tplGrampusTrainJobNPUNew, &form) | ctx.RenderWithErr("Failed to uploadCodeToObs", tplGrampusTrainJobNPUNew, &form) | ||||
| return | return | ||||
| } | } | ||||
| @@ -486,7 +574,7 @@ func GrampusTrainJobNpuCreate(ctx *context.Context, form auth.CreateGrampusTrain | |||||
| command, err := generateCommand(repo.Name, grampus.ProcessorTypeNPU, codeObsPath+cloudbrain.DefaultBranchName+".zip", dataObsPath+"'"+attachment.Name+"'", bootFile, params, setting.CodePathPrefix+jobName+modelarts.OutputPath, attachment.Name) | command, err := generateCommand(repo.Name, grampus.ProcessorTypeNPU, codeObsPath+cloudbrain.DefaultBranchName+".zip", dataObsPath+"'"+attachment.Name+"'", bootFile, params, setting.CodePathPrefix+jobName+modelarts.OutputPath, attachment.Name) | ||||
| if err != nil { | if err != nil { | ||||
| log.Error("Failed to generateCommand: %s (%v)", displayJobName, err, ctx.Data["MsgID"]) | log.Error("Failed to generateCommand: %s (%v)", displayJobName, err, ctx.Data["MsgID"]) | ||||
| grampusTrainJobNewDataPrepare(ctx, grampus.ProcessorTypeNPU) | |||||
| grampusTrainJobErrorPrepare(ctx, grampus.ProcessorTypeNPU, form) | |||||
| ctx.RenderWithErr("Create task failed, internal error", tplGrampusTrainJobNPUNew, &form) | ctx.RenderWithErr("Create task failed, internal error", tplGrampusTrainJobNPUNew, &form) | ||||
| return | return | ||||
| } | } | ||||
| @@ -522,7 +610,7 @@ func GrampusTrainJobNpuCreate(ctx *context.Context, form auth.CreateGrampusTrain | |||||
| err = grampus.GenerateTrainJob(ctx, req) | err = grampus.GenerateTrainJob(ctx, req) | ||||
| if err != nil { | if err != nil { | ||||
| log.Error("GenerateTrainJob failed:%v", err.Error()) | log.Error("GenerateTrainJob failed:%v", err.Error()) | ||||
| grampusTrainJobNewDataPrepare(ctx, grampus.ProcessorTypeNPU) | |||||
| grampusTrainJobErrorPrepare(ctx, grampus.ProcessorTypeNPU, form) | |||||
| ctx.RenderWithErr(err.Error(), tplGrampusTrainJobNPUNew, &form) | ctx.RenderWithErr(err.Error(), tplGrampusTrainJobNPUNew, &form) | ||||
| return | return | ||||
| } | } | ||||
| @@ -778,6 +778,12 @@ func trainJobErrorNewDataPrepare(ctx *context.Context, form auth.CreateModelArts | |||||
| ctx.Data["config_list"] = configList.ParaConfigs | ctx.Data["config_list"] = configList.ParaConfigs | ||||
| ctx.Data["bootFile"] = form.BootFile | ctx.Data["bootFile"] = form.BootFile | ||||
| ctx.Data["uuid"] = form.Attachment | ctx.Data["uuid"] = form.Attachment | ||||
| _, datasetNames, err := models.GetDatasetInfo(form.Attachment) | |||||
| if err != nil { | |||||
| log.Error("GetDatasetInfo failed: %v", err, ctx.Data["MsgID"]) | |||||
| return nil | |||||
| } | |||||
| ctx.Data["dataset_name"] = datasetNames | |||||
| ctx.Data["branch_name"] = form.BranchName | ctx.Data["branch_name"] = form.BranchName | ||||
| ctx.Data["datasetType"] = models.TypeCloudBrainTwo | ctx.Data["datasetType"] = models.TypeCloudBrainTwo | ||||
| @@ -2286,6 +2292,12 @@ func inferenceJobErrorNewDataPrepare(ctx *context.Context, form auth.CreateModel | |||||
| ctx.Data["config_list"] = configList.ParaConfigs | ctx.Data["config_list"] = configList.ParaConfigs | ||||
| ctx.Data["bootFile"] = form.BootFile | ctx.Data["bootFile"] = form.BootFile | ||||
| ctx.Data["uuid"] = form.Attachment | ctx.Data["uuid"] = form.Attachment | ||||
| _, datasetNames, err := models.GetDatasetInfo(form.Attachment) | |||||
| if err != nil { | |||||
| log.Error("GetDatasetInfo failed: %v", err, ctx.Data["MsgID"]) | |||||
| return nil | |||||
| } | |||||
| ctx.Data["dataset_name"] = datasetNames | |||||
| ctx.Data["branch_name"] = form.BranchName | ctx.Data["branch_name"] = form.BranchName | ||||
| ctx.Data["model_name"] = form.ModelName | ctx.Data["model_name"] = form.ModelName | ||||
| ctx.Data["model_version"] = form.ModelVersion | ctx.Data["model_version"] = form.ModelVersion | ||||
| @@ -58,18 +58,16 @@ | |||||
| <form class="ui form" action="{{.Link}}" method="post"> | <form class="ui form" action="{{.Link}}" method="post"> | ||||
| {{.CsrfTokenHtml}} | {{.CsrfTokenHtml}} | ||||
| <input type="hidden" name="action" value="update"> | <input type="hidden" name="action" value="update"> | ||||
| <input type="hidden" id="ai_engine_name" name="engine_names" value=""> | |||||
| <input type="hidden" id="ai_flaver_name" name="flaver_names" value=""> | |||||
| {{if $.model_version}} | |||||
| <input type="hidden" id="ai_model_version" name="model_version" value="{{$.model_version}}"> | |||||
| {{else}} | |||||
| <input type="hidden" id="ai_image_name" value="{{.image}}"> | |||||
| <input type="hidden" id="ai_model_version" name="model_version" value=""> | <input type="hidden" id="ai_model_version" name="model_version" value=""> | ||||
| {{end}} | |||||
| {{if $.label_names}} | |||||
| <input type="hidden" id="ai_model_label" name="label_names" value="{{$.label_names}}"> | |||||
| {{else}} | |||||
| <input type="hidden" id="ai_model_label" name="label_names" value=""> | |||||
| {{end}} | |||||
| <input type="hidden" id="failed_train_url" value="{{$.train_url}}"> | |||||
| <input type="hidden" id="failed_model_name" value="{{$.model_name}}"> | |||||
| <input type="hidden" id="failed_model_version" value="{{$.model_version}}"> | |||||
| <input type="hidden" id="failed_ckpt_name" value="{{$.ckpt_name}}"> | |||||
| <input type="hidden" id="failed_train_url" value="{{$.train_url}}"> | |||||
| <input type="hidden" id="fail_dataset_name" value="{{$.dataset_name}}"> | |||||
| <input type="hidden" id="fail_dataset_uuid" value="{{$.attachment}}"> | |||||
| <h4 class="unite title ui header ">{{.i18n.Tr "repo.modelarts.train_job.basic_info"}}:</h4> | <h4 class="unite title ui header ">{{.i18n.Tr "repo.modelarts.train_job.basic_info"}}:</h4> | ||||
| <div class="required min_title inline field"> | <div class="required min_title inline field"> | ||||
| <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "cloudbrain.compute_resource"}}</label> | <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "cloudbrain.compute_resource"}}</label> | ||||
| @@ -102,7 +100,11 @@ | |||||
| <div class="unite min_title inline field"> | <div class="unite min_title inline field"> | ||||
| <label class="label-fix-width" style="font-weight: normal;" for="description">{{.i18n.Tr "repo.modelarts.train_job.description"}}</label> | <label class="label-fix-width" style="font-weight: normal;" for="description">{{.i18n.Tr "repo.modelarts.train_job.description"}}</label> | ||||
| {{if .description}} | |||||
| <textarea style="width: 80%;" id="description" name="description" rows="3" maxlength="255" placeholder={{.i18n.Tr "repo.modelarts.train_job.new_place"}}>{{.description}}</textarea> | |||||
| {{else}} | |||||
| <textarea style="width: 80%;" id="description" name="description" rows="3" maxlength="255" placeholder={{.i18n.Tr "repo.modelarts.train_job.new_place"}} onchange="this.value=this.value.substring(0, 255)" onkeydown="this.value=this.value.substring(0, 255)" onkeyup="this.value=this.value.substring(0, 255)"></textarea> | <textarea style="width: 80%;" id="description" name="description" rows="3" maxlength="255" placeholder={{.i18n.Tr "repo.modelarts.train_job.new_place"}} onchange="this.value=this.value.substring(0, 255)" onkeydown="this.value=this.value.substring(0, 255)" onkeyup="this.value=this.value.substring(0, 255)"></textarea> | ||||
| {{end}} | |||||
| </div> | </div> | ||||
| <div class="ui divider"></div> | <div class="ui divider"></div> | ||||
| @@ -112,13 +114,8 @@ | |||||
| <div class="required eight wide field"> | <div class="required eight wide field"> | ||||
| <label style="font-weight: normal;white-space: nowrap;width: 210px;text-align: right;">{{.i18n.Tr "repo.modelarts.infer_job.select_model"}}</label> | <label style="font-weight: normal;white-space: nowrap;width: 210px;text-align: right;">{{.i18n.Tr "repo.modelarts.infer_job.select_model"}}</label> | ||||
| <div class="ui fluid search selection dropdown loading " id="select_model"> | <div class="ui fluid search selection dropdown loading " id="select_model"> | ||||
| {{if $.ckpt_name}} | |||||
| <input type="hidden" name="model_name" value="{{$.model_name}}" required> | |||||
| <div class="text">{{$.model_name}}</div> | |||||
| {{else}} | |||||
| <input type="hidden" name="model_name" required> | <input type="hidden" name="model_name" required> | ||||
| <div class="text"></div> | <div class="text"></div> | ||||
| {{end}} | |||||
| <i class="dropdown icon"></i> | <i class="dropdown icon"></i> | ||||
| <div class="menu" id="model_name"> | <div class="menu" id="model_name"> | ||||
| </div> | </div> | ||||
| @@ -126,13 +123,8 @@ | |||||
| </div> | </div> | ||||
| <div class="three wide field"> | <div class="three wide field"> | ||||
| <div class="ui fluid search selection dropdown" id="select_model_version"> | <div class="ui fluid search selection dropdown" id="select_model_version"> | ||||
| {{if $.ckpt_name}} | |||||
| <input type="hidden" name="train_url" value="{{$.train_url}}" required> | |||||
| <div class="text">{{$.model_version}}</div> | |||||
| {{else}} | |||||
| <input type="hidden" name="train_url" required> | <input type="hidden" name="train_url" required> | ||||
| <div class="text"></div> | <div class="text"></div> | ||||
| {{end}} | |||||
| <i class="dropdown icon"></i> | <i class="dropdown icon"></i> | ||||
| <div class="menu" id="model_name_version"> | <div class="menu" id="model_name_version"> | ||||
| </div> | </div> | ||||
| @@ -141,13 +133,8 @@ | |||||
| </div> | </div> | ||||
| <div class="five wide field"> | <div class="five wide field"> | ||||
| <div class="ui fluid search selection dropdown" id="select_model_checkpoint"> | <div class="ui fluid search selection dropdown" id="select_model_checkpoint"> | ||||
| {{if $.ckpt_name}} | |||||
| <input type="hidden" name="ckpt_name" value="{{$.ckpt_name}}" required> | |||||
| <div class="text">{{$.ckpt_name}}</div> | |||||
| {{else}} | |||||
| <input type="hidden" name="ckpt_name" required> | <input type="hidden" name="ckpt_name" required> | ||||
| <div class="text"></div> | <div class="text"></div> | ||||
| {{end}} | |||||
| <i class="dropdown icon"></i> | <i class="dropdown icon"></i> | ||||
| <div class="menu" id="model_checkpoint"> | <div class="menu" id="model_checkpoint"> | ||||
| </div> | </div> | ||||
| @@ -186,8 +173,21 @@ | |||||
| <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "cloudbrain.gpu_type"}}</label> | <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "cloudbrain.gpu_type"}}</label> | ||||
| <select id="cloudbrain_gpu_type" class="ui search width48 dropdown gpu-type" placeholder="选择GPU类型" | <select id="cloudbrain_gpu_type" class="ui search width48 dropdown gpu-type" placeholder="选择GPU类型" | ||||
| style='width:385px' name="gpu_type"> | style='width:385px' name="gpu_type"> | ||||
| {{range .inference_gpu_types}} | |||||
| <option value="{{.Queue}}">{{.Value}}</option> | |||||
| {{if .gpu_type}} | |||||
| {{range .inference_gpu_types}} | |||||
| {{if eq $.gpu_type .Queue}} | |||||
| <option value="{{.Queue}}">{{.Value}}</option> | |||||
| {{end}} | |||||
| {{end}} | |||||
| {{range .inference_gpu_types}} | |||||
| {{if ne $.gpu_type .Queue}} | |||||
| <option value="{{.Queue}}">{{.Value}}</option> | |||||
| {{end}} | |||||
| {{end}} | |||||
| {{else}} | |||||
| {{range .inference_gpu_types}} | |||||
| <option value="{{.Queue}}">{{.Value}}</option> | |||||
| {{end}} | |||||
| {{end}} | {{end}} | ||||
| </select> | </select> | ||||
| </div> | </div> | ||||
| @@ -196,8 +196,8 @@ | |||||
| <span class="tooltips" style="margin-left: 11.5rem;margin-bottom: 1rem;"></span> | <span class="tooltips" style="margin-left: 11.5rem;margin-bottom: 1rem;"></span> | ||||
| <div class="inline min_title field required"> | <div class="inline min_title field required"> | ||||
| <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.start_file"}}</label> | <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.start_file"}}</label> | ||||
| {{if .bootFile}} | |||||
| <input style="width: 48.5%;" name="boot_file" id="trainjob_boot_file" value="{{.bootFile}}" tabindex="3" autofocus required maxlength="255" > | |||||
| {{if .boot_file}} | |||||
| <input style="width: 48.5%;" name="boot_file" id="trainjob_boot_file" value="{{.boot_file}}" tabindex="3" autofocus required maxlength="255" > | |||||
| {{else}} | {{else}} | ||||
| <input style="width: 48.5%;" name="boot_file" id="trainjob_boot_file" value="" tabindex="3" autofocus required maxlength="255" > | <input style="width: 48.5%;" name="boot_file" id="trainjob_boot_file" value="" tabindex="3" autofocus required maxlength="255" > | ||||
| {{end}} | {{end}} | ||||
| @@ -213,22 +213,22 @@ | |||||
| <span id="add_run_para" style="cursor:pointer;color: rgba(3, 102, 214, 100);font-size: 14px;line-height: 26px;font-family: SourceHanSansSC-medium;"><i class="plus square outline icon"></i>{{.i18n.Tr "repo.modelarts.train_job.add_run_parameter"}}</span> | <span id="add_run_para" style="cursor:pointer;color: rgba(3, 102, 214, 100);font-size: 14px;line-height: 26px;font-family: SourceHanSansSC-medium;"><i class="plus square outline icon"></i>{{.i18n.Tr "repo.modelarts.train_job.add_run_parameter"}}</span> | ||||
| <input id="store_run_para" type="hidden" name="run_para_list"> | <input id="store_run_para" type="hidden" name="run_para_list"> | ||||
| <div class="dynamic field" style="margin-top: 1rem;"> | <div class="dynamic field" style="margin-top: 1rem;"> | ||||
| {{if ne 0 (len .params)}} | |||||
| {{range $k ,$v := .params}} | |||||
| <div class="two fields width85" id="para{{$k}}"> | |||||
| <div class="field"> | |||||
| <input type="text" name="shipping_first-name" value={{$v.Label}} required> | |||||
| </div> | |||||
| <div class="field"> | |||||
| <input type="text" name="shipping_last-name" value={{$v.Value}} required> | |||||
| </div> | |||||
| <span> | |||||
| <i class="trash icon"></i> | |||||
| </span> | |||||
| {{if ne 0 (len .params)}} | |||||
| {{range $k ,$v := .params}} | |||||
| <div class="two fields width85" id="para{{$k}}"> | |||||
| <div class="field"> | |||||
| <input type="text" name="shipping_first-name" value={{$v.Label}} required> | |||||
| </div> | |||||
| <div class="field"> | |||||
| <input type="text" name="shipping_last-name" value={{$v.Value}} required> | |||||
| </div> | |||||
| <span> | |||||
| <i class="trash icon"></i> | |||||
| </span> | |||||
| </div> | |||||
| </div> | |||||
| {{end}} | |||||
| {{end}} | {{end}} | ||||
| {{end}} | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| @@ -244,9 +244,22 @@ | |||||
| <div class="required min_title inline field"> | <div class="required min_title inline field"> | ||||
| <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "cloudbrain.resource_specification"}}</label> | <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "cloudbrain.resource_specification"}}</label> | ||||
| <select id="cloudbrain_resource_spec" class="ui search dropdown width80" placeholder="选择资源规格" name="resource_spec_id"> | <select id="cloudbrain_resource_spec" class="ui search dropdown width80" placeholder="选择资源规格" name="resource_spec_id"> | ||||
| {{range .inference_resource_specs}} | |||||
| <option name="resource_spec_id" value="{{.Id}}"> | |||||
| GPU数:{{.GpuNum}},CPU数:{{.CpuNum}},内存(MB):{{.MemMiB}},共享内存(MB):{{.ShareMemMiB}}</option> | |||||
| {{if .resource_spec_id}} | |||||
| {{range .inference_resource_specs}} | |||||
| {{if eq $.resource_spec_id .Id}} | |||||
| <option value="{{.Id}}">GPU数:{{.GpuNum}},CPU数:{{.CpuNum}},内存(MB):{{.MemMiB}},共享内存(MB):{{.ShareMemMiB}}</option> | |||||
| {{end}} | |||||
| {{end}} | |||||
| {{range .inference_resource_specs}} | |||||
| {{if ne $.resource_spec_id .Id}} | |||||
| <option value="{{.Id}}">GPU数:{{.GpuNum}},CPU数:{{.CpuNum}},内存(MB):{{.MemMiB}},共享内存(MB):{{.ShareMemMiB}}</option> | |||||
| {{end}} | |||||
| {{end}} | |||||
| {{else}} | |||||
| {{range .inference_resource_specs}} | |||||
| <option name="resource_spec_id" value="{{.Id}}"> | |||||
| GPU数:{{.GpuNum}},CPU数:{{.CpuNum}},内存(MB):{{.MemMiB}},共享内存(MB):{{.ShareMemMiB}}</option> | |||||
| {{end}} | |||||
| {{end}} | {{end}} | ||||
| </select> | </select> | ||||
| </div> | </div> | ||||
| @@ -270,27 +283,35 @@ | |||||
| const RepoLink = {{.RepoLink}} | const RepoLink = {{.RepoLink}} | ||||
| let nameMap,nameList | let nameMap,nameList | ||||
| // 获取模型列表和模型名称对应的模型版本 | // 获取模型列表和模型名称对应的模型版本 | ||||
| $.get(`${RepoLink}/modelmanage/query_model_for_predict?type=0`, (data) => { | |||||
| $(document).ready(function(){ | |||||
| modelVersion() | modelVersion() | ||||
| modelCkpt() | modelCkpt() | ||||
| nameMap = data.nameMap | |||||
| nameList = data.nameList | |||||
| let html = '' | |||||
| nameList.forEach(element => { | |||||
| html += `<div class="item" data-value=${element}>${element}</div>` | |||||
| }); | |||||
| if(nameList.length!==0){ | |||||
| const initModelVersion = nameMap[nameList[0]][0] | |||||
| const initTrainTaskInfo = JSON.parse(initModelVersion.TrainTaskInfo) | |||||
| $('#model_name').append(html) | |||||
| $("#select_model").dropdown('set text',nameList[0]) | |||||
| $("#select_model").dropdown('set value',nameList[0],nameList[0]) | |||||
| } | |||||
| $('#select_model').removeClass("loading") | |||||
| $.get(`${RepoLink}/modelmanage/query_model_for_predict?type=0`, (data) => { | |||||
| nameMap = data.nameMap | |||||
| nameList = data.nameList | |||||
| let faildModelName = document.getElementById('failed_model_name').value | |||||
| let html = '' | |||||
| nameList.forEach(element => { | |||||
| html += `<div class="item" data-value=${element}>${element}</div>` | |||||
| }); | |||||
| if(nameList.length!==0){ | |||||
| $('#model_name').append(html) | |||||
| if(faildModelName){ | |||||
| $("#select_model").dropdown('set text',faildModelName) | |||||
| $("#select_model").dropdown('set value',faildModelName) | |||||
| }else{ | |||||
| $("#select_model").dropdown('set text',nameList[0]) | |||||
| $("#select_model").dropdown('set value',nameList[0],nameList[0]) | |||||
| } | |||||
| } | |||||
| $('#select_model').removeClass("loading") | |||||
| }) | |||||
| }) | }) | ||||
| // 根据选中的模型名称获取相应的模型版本 | // 根据选中的模型名称获取相应的模型版本 | ||||
| function modelVersion(){ | function modelVersion(){ | ||||
| let faildModelVersion = $('#failed_model_version').val() | |||||
| let faildTrainUrl = $('#failed_train_url').val() | |||||
| $('#select_model').dropdown({ | $('#select_model').dropdown({ | ||||
| onChange: function(value, text, $selectedItem) { | onChange: function(value, text, $selectedItem) { | ||||
| $("#select_model_version").addClass("loading") | $("#select_model_version").addClass("loading") | ||||
| @@ -305,13 +326,20 @@ | |||||
| $("#select_model_version").removeClass("loading") | $("#select_model_version").removeClass("loading") | ||||
| const initVersionText = $('#model_name_version div.item:first-child').text() | const initVersionText = $('#model_name_version div.item:first-child').text() | ||||
| const initVersionValue = $('#model_name_version div.item:first-child').data('value') | const initVersionValue = $('#model_name_version div.item:first-child').data('value') | ||||
| $("#select_model_version").dropdown('set text',initVersionText) | |||||
| $("#select_model_version").dropdown('set value',initVersionValue,initVersionText,$('#model_name_version div.item:first-child')) | |||||
| if(faildModelVersion&&faildTrainUrl){ | |||||
| $("#select_model_version").dropdown('set text',faildModelVersion) | |||||
| $("#select_model_version").dropdown('set value',faildTrainUrl,faildModelVersion,$('#model_name_version div.item:first-child')) | |||||
| }else{ | |||||
| $("#select_model_version").dropdown('set text',initVersionText) | |||||
| $("#select_model_version").dropdown('set value',initVersionValue,initVersionText,$('#model_name_version div.item:first-child')) | |||||
| } | |||||
| } | } | ||||
| }) | }) | ||||
| } | } | ||||
| // 根据选中的模型版本获取相应的模型权重文件 | // 根据选中的模型版本获取相应的模型权重文件 | ||||
| function modelCkpt(){ | function modelCkpt(){ | ||||
| let faildCkptName = $('#failed_ckpt_name').val() | |||||
| $('#select_model_version').dropdown({ | $('#select_model_version').dropdown({ | ||||
| onChange: function(value, text, $selectedItem) { | onChange: function(value, text, $selectedItem) { | ||||
| const dataID = $selectedItem[0].getAttribute("data-id") | const dataID = $selectedItem[0].getAttribute("data-id") | ||||
| @@ -326,17 +354,19 @@ | |||||
| if(!element.IsDir && loadCheckpointFile.includes(ckptSuffix[ckptSuffix.length-1])){ | if(!element.IsDir && loadCheckpointFile.includes(ckptSuffix[ckptSuffix.length-1])){ | ||||
| html += `<div class="item" data-value=${element.FileName}>${element.FileName}</div>` | html += `<div class="item" data-value=${element.FileName}>${element.FileName}</div>` | ||||
| } | } | ||||
| }) | }) | ||||
| $('#model_checkpoint').append(html) | $('#model_checkpoint').append(html) | ||||
| $("#select_model_checkpoint").removeClass("loading") | $("#select_model_checkpoint").removeClass("loading") | ||||
| const initVersionText = $('#model_checkpoint div.item:first-child').text() | const initVersionText = $('#model_checkpoint div.item:first-child').text() | ||||
| const initVersionValue = $('#model_checkpoint div.item:first-child').data('value') | const initVersionValue = $('#model_checkpoint div.item:first-child').data('value') | ||||
| $("#select_model_checkpoint").dropdown('set text',initVersionText) | |||||
| $("#select_model_checkpoint").dropdown('set value',initVersionValue,initVersionText,$('#model_name_version div.item:first-child')) | |||||
| if(faildCkptName){ | |||||
| $("#select_model_checkpoint").dropdown('set text',faildCkptName) | |||||
| $("#select_model_checkpoint").dropdown('set value',faildCkptName,faildCkptName,$('#model_name_version div.item:first-child')) | |||||
| }else{ | |||||
| $("#select_model_checkpoint").dropdown('set text',initVersionText) | |||||
| $("#select_model_checkpoint").dropdown('set value',initVersionValue,initVersionText,$('#model_name_version div.item:first-child')) | |||||
| } | |||||
| }) | }) | ||||
| $("input#ai_model_version").val(text) | $("input#ai_model_version").val(text) | ||||
| $("input#ai_model_label").val(label) | $("input#ai_model_label").val(label) | ||||
| } | } | ||||
| @@ -397,13 +427,6 @@ | |||||
| msg = JSON.stringify(msg) | msg = JSON.stringify(msg) | ||||
| $('#store_run_para').val(msg) | $('#store_run_para').val(msg) | ||||
| } | } | ||||
| function get_name(){ | |||||
| let name1=$("#engine_name .text").text() | |||||
| let name2=$("#flaver_name .text").text() | |||||
| $("input#ai_engine_name").val(name1) | |||||
| $("input#ai_flaver_name").val(name2) | |||||
| } | |||||
| function validate(){ | function validate(){ | ||||
| $('.ui.form') | $('.ui.form') | ||||
| .form({ | .form({ | ||||
| @@ -475,6 +498,5 @@ | |||||
| validate(); | validate(); | ||||
| $('.ui.create_train_job.green.button').click(function(e) { | $('.ui.create_train_job.green.button').click(function(e) { | ||||
| send_run_para() | send_run_para() | ||||
| get_name() | |||||
| }) | }) | ||||
| </script> | </script> | ||||
| @@ -252,7 +252,9 @@ | |||||
| </span> | </span> | ||||
| <span class="cti-mgRight-sm uc-accordionTitle-black" | <span class="cti-mgRight-sm uc-accordionTitle-black" | ||||
| id="{{.VersionName}}-duration-span">{{$.duration}}</span> | id="{{.VersionName}}-duration-span">{{$.duration}}</span> | ||||
| <span id="refresh-status" data-tooltip="刷新" style="cursor: pointer;" data-inverted="" data-version="{{.VersionName}}"> | |||||
| <i class="redo icon redo-color"></i> | |||||
| </span> | |||||
| </div> | </div> | ||||
| </span> | </span> | ||||
| </span> | </span> | ||||
| @@ -89,8 +89,7 @@ | |||||
| <form class="ui form" action="{{.Link}}" method="post"> | <form class="ui form" action="{{.Link}}" method="post"> | ||||
| {{.CsrfTokenHtml}} | {{.CsrfTokenHtml}} | ||||
| <input type="hidden" name="action" value="update"> | <input type="hidden" name="action" value="update"> | ||||
| <input type="hidden" id="ai_engine_name" name="engine_names" value=""> | |||||
| <input type="hidden" id="ai_flaver_name" name="flaver_names" value=""> | |||||
| <input type="hidden" id="ai_image_name" value="{{.image}}"> | |||||
| <h4 class="train-job-title ui header ">{{.i18n.Tr "repo.modelarts.train_job.basic_info"}}:</h4> | <h4 class="train-job-title ui header ">{{.i18n.Tr "repo.modelarts.train_job.basic_info"}}:</h4> | ||||
| <div class="required unite min_title inline field"> | <div class="required unite min_title inline field"> | ||||
| <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "cloudbrain.resource_cluster"}}</label> | <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "cloudbrain.resource_cluster"}}</label> | ||||
| @@ -140,11 +139,11 @@ | |||||
| <div class="inline min_title field"> | <div class="inline min_title field"> | ||||
| <label class="label-fix-width" style="font-weight: normal;" | <label class="label-fix-width" style="font-weight: normal;" | ||||
| for="description">{{.i18n.Tr "repo.modelarts.train_job.description"}}</label> | for="description">{{.i18n.Tr "repo.modelarts.train_job.description"}}</label> | ||||
| <textarea style="width: 80%;" id="description" name="description" rows="3" maxlength="255" | |||||
| placeholder={{.i18n.Tr "repo.modelarts.train_job.new_place"}} | |||||
| onchange="this.value=this.value.substring(0, 255)" | |||||
| onkeydown="this.value=this.value.substring(0, 255)" | |||||
| onkeyup="this.value=this.value.substring(0, 255)"></textarea> | |||||
| {{if .description}} | |||||
| <textarea style="width: 80%;" id="description" name="description" rows="3" maxlength="255" placeholder={{.i18n.Tr "repo.modelarts.train_job.new_place"}}>{{.description}}</textarea> | |||||
| {{else}} | |||||
| <textarea style="width: 80%;" id="description" name="description" rows="3" maxlength="255" placeholder={{.i18n.Tr "repo.modelarts.train_job.new_place"}} onchange="this.value=this.value.substring(0, 255)" onkeydown="this.value=this.value.substring(0, 255)" onkeyup="this.value=this.value.substring(0, 255)"></textarea> | |||||
| {{end}} | |||||
| </div> | </div> | ||||
| <div class="ui divider"></div> | <div class="ui divider"></div> | ||||
| @@ -179,13 +178,25 @@ | |||||
| <option name="job_type" value="TRAIN">TRAIN</option> | <option name="job_type" value="TRAIN">TRAIN</option> | ||||
| </select> | </select> | ||||
| </div> | </div> | ||||
| <div class="required min_title inline field"> | <div class="required min_title inline field"> | ||||
| <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "cloudbrain.gpu_type"}}</label> | <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "cloudbrain.gpu_type"}}</label> | ||||
| <select id="cloudbrain_gpu_type" class="ui search width806 dropdown gpu-type" placeholder="选择GPU类型" | <select id="cloudbrain_gpu_type" class="ui search width806 dropdown gpu-type" placeholder="选择GPU类型" | ||||
| style='width:385px' name="gpu_type"> | style='width:385px' name="gpu_type"> | ||||
| {{range .train_gpu_types}} | |||||
| <option value="{{.Queue}}">{{.Value}}</option> | |||||
| {{if .gpu_type}} | |||||
| {{range .train_gpu_types}} | |||||
| {{if eq $.gpu_type .Queue}} | |||||
| <option value="{{.Queue}}">{{.Value}}</option> | |||||
| {{end}} | |||||
| {{end}} | |||||
| {{range .train_gpu_types}} | |||||
| {{if ne $.gpu_type .Queue}} | |||||
| <option value="{{.Queue}}">{{.Value}}</option> | |||||
| {{end}} | |||||
| {{end}} | |||||
| {{else}} | |||||
| {{range .train_gpu_types}} | |||||
| <option value="{{.Queue}}">{{.Value}}</option> | |||||
| {{end}} | |||||
| {{end}} | {{end}} | ||||
| </select> | </select> | ||||
| </div> | </div> | ||||
| @@ -195,8 +206,8 @@ | |||||
| <div class="inline field min_title required"> | <div class="inline field min_title required"> | ||||
| <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.start_file"}}</label> | <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.start_file"}}</label> | ||||
| {{if .bootFile}} | |||||
| <input style="width: 48.5%;" name="boot_file" id="trainjob_boot_file" value="{{.bootFile}}" | |||||
| {{if .boot_file}} | |||||
| <input style="width: 48.5%;" name="boot_file" id="trainjob_boot_file" value="{{.boot_file}}" | |||||
| tabindex="3" autofocus required maxlength="255"> | tabindex="3" autofocus required maxlength="255"> | ||||
| {{else}} | {{else}} | ||||
| <input style="width: 48.5%;" name="boot_file" id="trainjob_boot_file" value="" tabindex="3" | <input style="width: 48.5%;" name="boot_file" id="trainjob_boot_file" value="" tabindex="3" | ||||
| @@ -221,7 +232,6 @@ | |||||
| class="plus square outline icon"></i>{{.i18n.Tr "repo.modelarts.train_job.add_run_parameter"}}</span> | class="plus square outline icon"></i>{{.i18n.Tr "repo.modelarts.train_job.add_run_parameter"}}</span> | ||||
| <input id="store_run_para" type="hidden" name="run_para_list"> | <input id="store_run_para" type="hidden" name="run_para_list"> | ||||
| <div class="dynamic field" style="margin-top: 1rem;"> | <div class="dynamic field" style="margin-top: 1rem;"> | ||||
| {{if .params}} | |||||
| {{if ne 0 (len .params)}} | {{if ne 0 (len .params)}} | ||||
| {{range $k ,$v := .params}} | {{range $k ,$v := .params}} | ||||
| <div class="two fields width85" id="para{{$k}}"> | <div class="two fields width85" id="para{{$k}}"> | ||||
| @@ -238,17 +248,28 @@ | |||||
| </div> | </div> | ||||
| {{end}} | {{end}} | ||||
| {{end}} | {{end}} | ||||
| {{end}} | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| <div class="required min_title inline field"> | <div class="required min_title inline field"> | ||||
| <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "cloudbrain.resource_specification"}}</label> | <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "cloudbrain.resource_specification"}}</label> | ||||
| <select id="cloudbrain_resource_spec" class="ui search dropdown" placeholder="选择资源规格" | <select id="cloudbrain_resource_spec" class="ui search dropdown" placeholder="选择资源规格" | ||||
| style='width:385px' name="resource_spec_id"> | style='width:385px' name="resource_spec_id"> | ||||
| {{range .train_resource_specs}} | |||||
| <option name="resource_spec_id" value="{{.Id}}"> | |||||
| GPU数:{{.GpuNum}},CPU数:{{.CpuNum}},内存(MB):{{.MemMiB}},共享内存(MB):{{.ShareMemMiB}}</option> | |||||
| {{if .resource_spec_id}} | |||||
| {{range .train_resource_specs}} | |||||
| {{if eq $.resource_spec_id .Id}} | |||||
| <option value="{{.Id}}">GPU数:{{.GpuNum}},CPU数:{{.CpuNum}},内存(MB):{{.MemMiB}},共享内存(MB):{{.ShareMemMiB}}</option> | |||||
| {{end}} | |||||
| {{end}} | |||||
| {{range .train_resource_specs}} | |||||
| {{if ne $.resource_spec_id .Id}} | |||||
| <option value="{{.Id}}">GPU数:{{.GpuNum}},CPU数:{{.CpuNum}},内存(MB):{{.MemMiB}},共享内存(MB):{{.ShareMemMiB}}</option> | |||||
| {{end}} | |||||
| {{end}} | |||||
| {{else}} | |||||
| {{range .train_resource_specs}} | |||||
| <option name="resource_spec_id" value="{{.Id}}"> | |||||
| GPU数:{{.GpuNum}},CPU数:{{.CpuNum}},内存(MB):{{.MemMiB}},共享内存(MB):{{.ShareMemMiB}}</option> | |||||
| {{end}} | |||||
| {{end}} | {{end}} | ||||
| </select> | </select> | ||||
| </div> | </div> | ||||
| @@ -476,16 +497,8 @@ | |||||
| msg = JSON.stringify(msg) | msg = JSON.stringify(msg) | ||||
| $('#store_run_para').val(msg) | $('#store_run_para').val(msg) | ||||
| } | } | ||||
| function get_name() { | |||||
| let name1 = $("#engine_name .text").text() | |||||
| let name2 = $("#flaver_name .text").text() | |||||
| $("input#ai_engine_name").val(name1) | |||||
| $("input#ai_flaver_name").val(name2) | |||||
| } | |||||
| validate(); | validate(); | ||||
| $('.ui.create_train_job.green.button').click(function (e) { | $('.ui.create_train_job.green.button').click(function (e) { | ||||
| get_name() | |||||
| send_run_para() | send_run_para() | ||||
| }) | }) | ||||
| </script> | </script> | ||||
| @@ -80,8 +80,9 @@ | |||||
| <form class="ui form" action="{{.Link}}" method="post"> | <form class="ui form" action="{{.Link}}" method="post"> | ||||
| {{.CsrfTokenHtml}} | {{.CsrfTokenHtml}} | ||||
| <input type="hidden" name="action" value="update"> | <input type="hidden" name="action" value="update"> | ||||
| <input type="hidden" id="ai_engine_name" name="engine_names" value=""> | |||||
| <input type="hidden" id="ai_flavor_name" name="flavor_name" value=""> | |||||
| <input type="hidden" id="ai_image_name" value="{{.image}}"> | |||||
| <input type="hidden" id="fail_dataset_name" value="{{$.dataset_name}}"> | |||||
| <input type="hidden" id="fail_dataset_uuid" value="{{$.attachment}}"> | |||||
| <h4 class="train-job-title ui header ">{{.i18n.Tr "repo.modelarts.train_job.basic_info"}}:</h4> | <h4 class="train-job-title ui header ">{{.i18n.Tr "repo.modelarts.train_job.basic_info"}}:</h4> | ||||
| <div class="required min_title inline field"> | <div class="required min_title inline field"> | ||||
| <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "cloudbrain.resource_cluster"}}</label> | <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "cloudbrain.resource_cluster"}}</label> | ||||
| @@ -123,7 +124,11 @@ | |||||
| <div class="min_title inline field"> | <div class="min_title inline field"> | ||||
| <label class="label-fix-width" style="font-weight: normal;" for="description">{{.i18n.Tr "repo.modelarts.train_job.description"}}</label> | <label class="label-fix-width" style="font-weight: normal;" for="description">{{.i18n.Tr "repo.modelarts.train_job.description"}}</label> | ||||
| {{if .description}} | |||||
| <textarea style="width: 80%;" id="description" name="description" rows="3" maxlength="255" placeholder={{.i18n.Tr "repo.modelarts.train_job.new_place"}}>{{.description}}</textarea> | |||||
| {{else}} | |||||
| <textarea style="width: 80%;" id="description" name="description" rows="3" maxlength="255" placeholder={{.i18n.Tr "repo.modelarts.train_job.new_place"}} onchange="this.value=this.value.substring(0, 255)" onkeydown="this.value=this.value.substring(0, 255)" onkeyup="this.value=this.value.substring(0, 255)"></textarea> | <textarea style="width: 80%;" id="description" name="description" rows="3" maxlength="255" placeholder={{.i18n.Tr "repo.modelarts.train_job.new_place"}} onchange="this.value=this.value.substring(0, 255)" onkeydown="this.value=this.value.substring(0, 255)" onkeyup="this.value=this.value.substring(0, 255)"></textarea> | ||||
| {{end}} | |||||
| </div> | </div> | ||||
| <div class="ui divider"></div> | <div class="ui divider"></div> | ||||
| @@ -156,8 +161,8 @@ | |||||
| <div class="inline min_title field required"> | <div class="inline min_title field required"> | ||||
| <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.start_file"}}</label> | <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.start_file"}}</label> | ||||
| {{if .bootFile}} | |||||
| <input style="width: 48.5%;" name="boot_file" id="trainjob_boot_file" value="{{.bootFile}}" tabindex="3" autofocus required maxlength="255" > | |||||
| {{if .boot_file}} | |||||
| <input style="width: 48.5%;" name="boot_file" id="trainjob_boot_file" value="{{.boot_file}}" tabindex="3" autofocus required maxlength="255" > | |||||
| {{else}} | {{else}} | ||||
| <input style="width: 48.5%;" name="boot_file" id="trainjob_boot_file" value="" tabindex="3" autofocus required maxlength="255" > | <input style="width: 48.5%;" name="boot_file" id="trainjob_boot_file" value="" tabindex="3" autofocus required maxlength="255" > | ||||
| {{end}} | {{end}} | ||||
| @@ -199,8 +204,21 @@ | |||||
| <div class="required min_title inline field" id="flavor_name"> | <div class="required min_title inline field" id="flavor_name"> | ||||
| <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.standard"}}</label> | <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.standard"}}</label> | ||||
| <select class="ui dropdown width81" id="trainjob-flavor" style='width:385px' name="flavor"> | <select class="ui dropdown width81" id="trainjob-flavor" style='width:385px' name="flavor"> | ||||
| {{range .flavor_infos}} | |||||
| {{if .flavor}} | |||||
| {{range .flavor_infos}} | |||||
| {{if eq $.flavor .ID}} | |||||
| <option value="{{.ID}}">{{.Name}}</option> | |||||
| {{end}} | |||||
| {{end}} | |||||
| {{range .flavor_infos}} | |||||
| {{if ne $.flavor .ID}} | |||||
| <option value="{{.ID}}">{{.Name}}</option> | |||||
| {{end}} | |||||
| {{end}} | |||||
| {{else}} | |||||
| {{range .flavor_infos}} | |||||
| <option name="flavor" value="{{.ID}}">{{.Name}}</option> | <option name="flavor" value="{{.ID}}">{{.Name}}</option> | ||||
| {{end}} | |||||
| {{end}} | {{end}} | ||||
| </select> | </select> | ||||
| </div> | </div> | ||||
| @@ -426,16 +444,8 @@ | |||||
| msg = JSON.stringify(msg) | msg = JSON.stringify(msg) | ||||
| $('#store_run_para').val(msg) | $('#store_run_para').val(msg) | ||||
| } | } | ||||
| function get_name(){ | |||||
| let name1=$("#engine_name .text").text() | |||||
| let name2=$("#flavor_name .text").text() | |||||
| $("input#ai_engine_name").val(name1) | |||||
| $("input#ai_flavor_name").val(name2) | |||||
| } | |||||
| validate(); | validate(); | ||||
| $('.ui.create_train_job.green.button').click(function(e) { | $('.ui.create_train_job.green.button').click(function(e) { | ||||
| get_name() | |||||
| send_run_para() | send_run_para() | ||||
| }) | }) | ||||
| </script> | </script> | ||||
| @@ -77,6 +77,8 @@ | |||||
| <input type="hidden" name="action" value="update"> | <input type="hidden" name="action" value="update"> | ||||
| <input type="hidden" id="ai_engine_name" name="engine_name" value=""> | <input type="hidden" id="ai_engine_name" name="engine_name" value=""> | ||||
| <input type="hidden" id="ai_flavor_name" name="flavor_name" value=""> | <input type="hidden" id="ai_flavor_name" name="flavor_name" value=""> | ||||
| <input type="hidden" id="fail_dataset_name" value="{{$.dataset_name}}"> | |||||
| <input type="hidden" id="fail_dataset_uuid" value="{{$.attachment}}"> | |||||
| <h4 class="train-job-title ui header ">{{.i18n.Tr "repo.modelarts.train_job.basic_info"}}:</h4> | <h4 class="train-job-title ui header ">{{.i18n.Tr "repo.modelarts.train_job.basic_info"}}:</h4> | ||||
| <div class="required min_title inline field"> | <div class="required min_title inline field"> | ||||
| <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "cloudbrain.resource_cluster"}}</label> | <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "cloudbrain.resource_cluster"}}</label> | ||||
| @@ -119,7 +121,11 @@ | |||||
| <div class="min_title inline field"> | <div class="min_title inline field"> | ||||
| <label class="label-fix-width" style="font-weight: normal;" for="description">{{.i18n.Tr "repo.modelarts.train_job.description"}}</label> | <label class="label-fix-width" style="font-weight: normal;" for="description">{{.i18n.Tr "repo.modelarts.train_job.description"}}</label> | ||||
| {{if .description}} | |||||
| <textarea style="width: 80%;" id="description" name="description" rows="3" maxlength="255" placeholder={{.i18n.Tr "repo.modelarts.train_job.new_place"}}>{{.description}}</textarea> | |||||
| {{else}} | |||||
| <textarea style="width: 80%;" id="description" name="description" rows="3" maxlength="255" placeholder={{.i18n.Tr "repo.modelarts.train_job.new_place"}} onchange="this.value=this.value.substring(0, 255)" onkeydown="this.value=this.value.substring(0, 255)" onkeyup="this.value=this.value.substring(0, 255)"></textarea> | <textarea style="width: 80%;" id="description" name="description" rows="3" maxlength="255" placeholder={{.i18n.Tr "repo.modelarts.train_job.new_place"}} onchange="this.value=this.value.substring(0, 255)" onkeydown="this.value=this.value.substring(0, 255)" onkeyup="this.value=this.value.substring(0, 255)"></textarea> | ||||
| {{end}} | |||||
| </div> | </div> | ||||
| <div class="ui divider"></div> | <div class="ui divider"></div> | ||||
| @@ -150,16 +156,29 @@ | |||||
| <div class="required min_title inline field" id="engine_name"> | <div class="required min_title inline field" id="engine_name"> | ||||
| <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "cloudbrain.mirror"}}</label> | <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "cloudbrain.mirror"}}</label> | ||||
| <select class="ui dropdown width81" id="trainjob_images" name="image_id"> | <select class="ui dropdown width81" id="trainjob_images" name="image_id"> | ||||
| {{range .images}} | |||||
| <option name="image_id" value="{{.ID}}">{{.Name}}</option> | |||||
| {{if .image_id}} | |||||
| {{range .images}} | |||||
| {{if eq $.image_id .ID}} | |||||
| <option value="{{.ID}}">{{.Name}}</option> | |||||
| {{end}} | |||||
| {{end}} | |||||
| {{range .images}} | |||||
| {{if ne $.image_id .ID}} | |||||
| <option value="{{.ID}}">{{.Name}}</option> | |||||
| {{end}} | |||||
| {{end}} | |||||
| {{else}} | |||||
| {{range .images}} | |||||
| <option name="image_id" value="{{.ID}}">{{.Name}}</option> | |||||
| {{end}} | |||||
| {{end}} | {{end}} | ||||
| </select> | </select> | ||||
| </div> | </div> | ||||
| <div class="inline min_title field required"> | <div class="inline min_title field required"> | ||||
| <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.start_file"}}</label> | <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.start_file"}}</label> | ||||
| {{if .bootFile}} | |||||
| <input style="width: 48.5%;" name="boot_file" id="trainjob_boot_file" value="{{.bootFile}}" tabindex="3" autofocus required maxlength="255" > | |||||
| {{if .boot_file}} | |||||
| <input style="width: 48.5%;" name="boot_file" id="trainjob_boot_file" value="{{.boot_file}}" tabindex="3" autofocus required maxlength="255" > | |||||
| {{else}} | {{else}} | ||||
| <input style="width: 48.5%;" name="boot_file" id="trainjob_boot_file" value="" tabindex="3" autofocus required maxlength="255" > | <input style="width: 48.5%;" name="boot_file" id="trainjob_boot_file" value="" tabindex="3" autofocus required maxlength="255" > | ||||
| {{end}} | {{end}} | ||||
| @@ -176,14 +195,45 @@ | |||||
| <span id="add_run_para" style="margin-left: 0.5rem;cursor:pointer;color: rgba(3, 102, 214, 100);font-size: 14px;line-height: 26px;font-family: SourceHanSansSC-medium;"><i class="plus square outline icon"></i>{{.i18n.Tr "repo.modelarts.train_job.add_run_parameter"}}</span> | <span id="add_run_para" style="margin-left: 0.5rem;cursor:pointer;color: rgba(3, 102, 214, 100);font-size: 14px;line-height: 26px;font-family: SourceHanSansSC-medium;"><i class="plus square outline icon"></i>{{.i18n.Tr "repo.modelarts.train_job.add_run_parameter"}}</span> | ||||
| <input id="store_run_para" type="hidden" name="run_para_list"> | <input id="store_run_para" type="hidden" name="run_para_list"> | ||||
| <div class="dynamic field" style="margin-top: 1rem;"> | <div class="dynamic field" style="margin-top: 1rem;"> | ||||
| {{if .params}} | |||||
| {{if ne 0 (len .params)}} | |||||
| {{range $k ,$v := .params}} | |||||
| <div class="two fields width85" id="para{{$k}}"> | |||||
| <div class="field"> | |||||
| <input type="text" name="shipping_first-name" value={{$v.Label}} required> | |||||
| </div> | |||||
| <div class="field"> | |||||
| <input type="text" name="shipping_last-name" value={{$v.Value}} required> | |||||
| </div> | |||||
| <span> | |||||
| <i class="trash icon"></i> | |||||
| </span> | |||||
| </div> | |||||
| {{end}} | |||||
| {{end}} | |||||
| {{end}} | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| <div class="required min_title inline field" id="flavor_name"> | <div class="required min_title inline field" id="flavor_name"> | ||||
| <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.standard"}}</label> | <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.standard"}}</label> | ||||
| <select class="ui dropdown width81" id="trainjob-flavor" style='width:385px' name="flavor"> | <select class="ui dropdown width81" id="trainjob-flavor" style='width:385px' name="flavor"> | ||||
| {{range .flavor_infos}} | |||||
| {{if .flavor}} | |||||
| {{range .flavor_infos}} | |||||
| {{if eq $.flavor .ID}} | |||||
| <option value="{{.ID}}">{{.Name}}</option> | |||||
| {{end}} | |||||
| {{end}} | |||||
| {{range .flavor_infos}} | |||||
| {{if ne $.flavor .ID}} | |||||
| <option value="{{.ID}}">{{.Name}}</option> | |||||
| {{end}} | |||||
| {{end}} | |||||
| {{else}} | |||||
| {{range .flavor_infos}} | |||||
| <option name="flavor" value="{{.ID}}">{{.Name}}</option> | <option name="flavor" value="{{.ID}}">{{.Name}}</option> | ||||
| {{end}} | |||||
| {{end}} | {{end}} | ||||
| </select> | </select> | ||||
| </div> | </div> | ||||
| @@ -58,16 +58,16 @@ | |||||
| <input type="hidden" name="action" value="update"> | <input type="hidden" name="action" value="update"> | ||||
| <input type="hidden" id="ai_engine_name" name="engine_names" value=""> | <input type="hidden" id="ai_engine_name" name="engine_names" value=""> | ||||
| <input type="hidden" id="ai_flaver_name" name="flaver_names" value=""> | <input type="hidden" id="ai_flaver_name" name="flaver_names" value=""> | ||||
| {{if $.model_version}} | |||||
| <input type="hidden" id="ai_model_version" name="model_version" value="{{$.model_version}}"> | |||||
| {{else}} | |||||
| <input type="hidden" id="ai_model_version" name="model_version" value=""> | <input type="hidden" id="ai_model_version" name="model_version" value=""> | ||||
| {{end}} | |||||
| {{if $.label_names}} | |||||
| <input type="hidden" id="ai_model_label" name="label_names" value="{{$.label_names}}"> | |||||
| {{else}} | |||||
| <input type="hidden" id="ai_model_label" name="label_names" value=""> | |||||
| {{end}} | |||||
| <input type="hidden" id="failed_train_url" value="{{$.train_url}}"> | |||||
| <input type="hidden" id="failed_model_name" value="{{$.model_name}}"> | |||||
| <input type="hidden" id="failed_model_version" value="{{$.model_version}}"> | |||||
| <input type="hidden" id="failed_ckpt_name" value="{{$.ckpt_name}}"> | |||||
| <input type="hidden" id="failed_train_url" value="{{$.train_url}}"> | |||||
| <input type="hidden" id="fail_dataset_name" value="{{$.dataset_name}}"> | |||||
| <input type="hidden" id="fail_dataset_uuid" value="{{$.attachment}}"> | |||||
| <h4 class="unite title ui header ">{{.i18n.Tr "repo.modelarts.train_job.basic_info"}}:</h4> | <h4 class="unite title ui header ">{{.i18n.Tr "repo.modelarts.train_job.basic_info"}}:</h4> | ||||
| <div class="required min_title inline field"> | <div class="required min_title inline field"> | ||||
| <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "cloudbrain.compute_resource"}}</label> | <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "cloudbrain.compute_resource"}}</label> | ||||
| @@ -99,24 +99,22 @@ | |||||
| </div> | </div> | ||||
| <div class="min_title inline field"> | <div class="min_title inline field"> | ||||
| <label class="label-fix-width" style="font-weight: normal;" for="description">{{.i18n.Tr "repo.modelarts.train_job.description"}}</label> | |||||
| <label class="label-fix-width" style="font-weight: normal;" for="description">{{.i18n.Tr "repo.modelarts.train_job.description"}}</label> | |||||
| {{if .description}} | |||||
| <textarea style="width: 80%;" id="description" name="description" rows="3" maxlength="255" placeholder={{.i18n.Tr "repo.modelarts.train_job.new_place"}}>{{.description}}</textarea> | |||||
| {{else}} | |||||
| <textarea style="width: 80%;" id="description" name="description" rows="3" maxlength="255" placeholder={{.i18n.Tr "repo.modelarts.train_job.new_place"}} onchange="this.value=this.value.substring(0, 255)" onkeydown="this.value=this.value.substring(0, 255)" onkeyup="this.value=this.value.substring(0, 255)"></textarea> | <textarea style="width: 80%;" id="description" name="description" rows="3" maxlength="255" placeholder={{.i18n.Tr "repo.modelarts.train_job.new_place"}} onchange="this.value=this.value.substring(0, 255)" onkeydown="this.value=this.value.substring(0, 255)" onkeyup="this.value=this.value.substring(0, 255)"></textarea> | ||||
| {{end}} | |||||
| </div> | </div> | ||||
| <div class="ui divider"></div> | <div class="ui divider"></div> | ||||
| <!-- 模型相关配置 --> | <!-- 模型相关配置 --> | ||||
| <h4 class="unite title ui header ">{{.i18n.Tr "repo.modelarts.train_job.parameter_setting"}}:</h4> | <h4 class="unite title ui header ">{{.i18n.Tr "repo.modelarts.train_job.parameter_setting"}}:</h4> | ||||
| <div class="required unite inline min_title fields" style="width: 96.8%;"> | <div class="required unite inline min_title fields" style="width: 96.8%;"> | ||||
| <div class="required eight wide field"> | <div class="required eight wide field"> | ||||
| <label style="font-weight: normal;white-space: nowrap;width: 210px;text-align: right;">{{.i18n.Tr "repo.modelarts.infer_job.select_model"}}</label> | <label style="font-weight: normal;white-space: nowrap;width: 210px;text-align: right;">{{.i18n.Tr "repo.modelarts.infer_job.select_model"}}</label> | ||||
| <div class="ui fluid search selection dropdown loading " id="select_model"> | <div class="ui fluid search selection dropdown loading " id="select_model"> | ||||
| {{if $.ckpt_name}} | |||||
| <input type="hidden" name="model_name" value="{{$.model_name}}" required> | |||||
| <div class="text">{{$.model_name}}</div> | |||||
| {{else}} | |||||
| <input type="hidden" name="model_name" required> | <input type="hidden" name="model_name" required> | ||||
| <div class="text"></div> | <div class="text"></div> | ||||
| {{end}} | |||||
| <i class="dropdown icon"></i> | <i class="dropdown icon"></i> | ||||
| <div class="menu" id="model_name"> | <div class="menu" id="model_name"> | ||||
| </div> | </div> | ||||
| @@ -124,13 +122,8 @@ | |||||
| </div> | </div> | ||||
| <div class="three wide field"> | <div class="three wide field"> | ||||
| <div class="ui fluid search selection dropdown" id="select_model_version"> | <div class="ui fluid search selection dropdown" id="select_model_version"> | ||||
| {{if $.ckpt_name}} | |||||
| <input type="hidden" name="train_url" value="{{$.train_url}}" required> | |||||
| <div class="text">{{$.model_version}}</div> | |||||
| {{else}} | |||||
| <input type="hidden" name="train_url" required> | <input type="hidden" name="train_url" required> | ||||
| <div class="text"></div> | <div class="text"></div> | ||||
| {{end}} | |||||
| <i class="dropdown icon"></i> | <i class="dropdown icon"></i> | ||||
| <div class="menu" id="model_name_version"> | <div class="menu" id="model_name_version"> | ||||
| </div> | </div> | ||||
| @@ -139,13 +132,8 @@ | |||||
| </div> | </div> | ||||
| <div class="five wide field"> | <div class="five wide field"> | ||||
| <div class="ui fluid search selection dropdown" id="select_model_checkpoint"> | <div class="ui fluid search selection dropdown" id="select_model_checkpoint"> | ||||
| {{if $.ckpt_name}} | |||||
| <input type="hidden" name="ckpt_name" value="{{$.ckpt_name}}" required> | |||||
| <div class="text">{{$.ckpt_name}}</div> | |||||
| {{else}} | |||||
| <input type="hidden" name="ckpt_name" required> | <input type="hidden" name="ckpt_name" required> | ||||
| <div class="text"></div> | <div class="text"></div> | ||||
| {{end}} | |||||
| <i class="dropdown icon"></i> | <i class="dropdown icon"></i> | ||||
| <div class="menu" id="model_checkpoint"> | <div class="menu" id="model_checkpoint"> | ||||
| </div> | </div> | ||||
| @@ -169,9 +157,22 @@ | |||||
| <div class="field" style="flex: 2;" id="engine_name"> | <div class="field" style="flex: 2;" id="engine_name"> | ||||
| <select class="ui dropdown width" id="trainjob_engine_versions" name="engine_id"> | <select class="ui dropdown width" id="trainjob_engine_versions" name="engine_id"> | ||||
| {{if .engine_id}} | |||||
| {{range .engine_versions}} | {{range .engine_versions}} | ||||
| <option name="engine_id" value="{{.ID}}">{{.Value}}</option> | |||||
| {{if eq $.engine_id .ID}} | |||||
| <option value="{{.ID}}">{{.Value}}</option> | |||||
| {{end}} | |||||
| {{end}} | |||||
| {{range .engine_versions}} | |||||
| {{if ne $.engine_id .ID}} | |||||
| <option value="{{.ID}}">{{.Value}}</option> | |||||
| {{end}} | |||||
| {{end}} | {{end}} | ||||
| {{else}} | |||||
| {{range .engine_versions}} | |||||
| <option value="{{.ID}}">{{.Value}}</option> | |||||
| {{end}} | |||||
| {{end}} | |||||
| </select> | </select> | ||||
| </div> | </div> | ||||
| @@ -251,8 +252,21 @@ | |||||
| <div class="required min_title inline field" id="flaver_name"> | <div class="required min_title inline field" id="flaver_name"> | ||||
| <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.standard"}}</label> | <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.standard"}}</label> | ||||
| <select class="ui dropdown width80" id="trainjob-flavor" name="flavor"> | <select class="ui dropdown width80" id="trainjob-flavor" name="flavor"> | ||||
| {{range .flavor_infos}} | |||||
| {{if .flavor}} | |||||
| {{range .flavor_infos}} | |||||
| {{if eq $.flavor .Code}} | |||||
| <option value="{{.Code}}">{{.Value}}</option> | |||||
| {{end}} | |||||
| {{end}} | |||||
| {{range .flavor_infos}} | |||||
| {{if ne $.flavor .Code}} | |||||
| <option value="{{.Code}}">{{.Value}}</option> | |||||
| {{end}} | |||||
| {{end}} | |||||
| {{else}} | |||||
| {{range .flavor_infos}} | |||||
| <option name="flavor" value="{{.Code}}">{{.Value}}</option> | <option name="flavor" value="{{.Code}}">{{.Value}}</option> | ||||
| {{end}} | |||||
| {{end}} | {{end}} | ||||
| </select> | </select> | ||||
| </div> | </div> | ||||
| @@ -286,30 +300,38 @@ | |||||
| let nameMap,nameList | let nameMap,nameList | ||||
| $(".ui.button").attr('href',url_href) | $(".ui.button").attr('href',url_href) | ||||
| // 获取模型列表和模型名称对应的模型版本 | // 获取模型列表和模型名称对应的模型版本 | ||||
| $.get(`${RepoLink}/modelmanage/query_model_for_predict?type=1`, (data) => { | |||||
| $(document).ready(function(){ | |||||
| modelVersion() | modelVersion() | ||||
| modelCkpt() | modelCkpt() | ||||
| nameMap = data.nameMap | |||||
| nameList = data.nameList | |||||
| let html = '' | |||||
| nameList.forEach(element => { | |||||
| html += `<div class="item" data-value=${element}>${element}</div>` | |||||
| }); | |||||
| if(nameList.length!==0){ | |||||
| const initModelVersion = nameMap[nameList[0]][0] | |||||
| const initTrainTaskInfo = JSON.parse(initModelVersion.TrainTaskInfo) | |||||
| $('#model_name').append(html) | |||||
| $("#select_model").dropdown('set text',nameList[0]) | |||||
| $("#select_model").dropdown('set value',nameList[0],nameList[0]) | |||||
| } | |||||
| $('#select_model').removeClass("loading") | |||||
| $.get(`${RepoLink}/modelmanage/query_model_for_predict?type=1`, (data) => { | |||||
| nameMap = data.nameMap | |||||
| nameList = data.nameList | |||||
| let faildModelName = document.getElementById('failed_model_name').value | |||||
| let html = '' | |||||
| nameList.forEach(element => { | |||||
| html += `<div class="item" data-value=${element}>${element}</div>` | |||||
| }); | |||||
| if(nameList.length!==0){ | |||||
| $('#model_name').append(html) | |||||
| if(faildModelName){ | |||||
| $("#select_model").dropdown('set text',faildModelName) | |||||
| $("#select_model").dropdown('set value',faildModelName) | |||||
| }else{ | |||||
| $("#select_model").dropdown('set text',nameList[0]) | |||||
| $("#select_model").dropdown('set value',nameList[0],nameList[0]) | |||||
| } | |||||
| } | |||||
| $('#select_model').removeClass("loading") | |||||
| }) | |||||
| }) | }) | ||||
| // 根据选中的模型名称获取相应的模型版本 | // 根据选中的模型名称获取相应的模型版本 | ||||
| function modelVersion(){ | function modelVersion(){ | ||||
| let faildModelVersion = $('#failed_model_version').val() | |||||
| let faildTrainUrl = $('#failed_train_url').val() | |||||
| $('#select_model').dropdown({ | $('#select_model').dropdown({ | ||||
| onChange: function(value, text, $selectedItem) { | onChange: function(value, text, $selectedItem) { | ||||
| console.log("-----------------") | |||||
| $("#select_model_version").addClass("loading") | $("#select_model_version").addClass("loading") | ||||
| $('#model_name_version').empty() | $('#model_name_version').empty() | ||||
| let html = '' | let html = '' | ||||
| @@ -322,13 +344,20 @@ | |||||
| $("#select_model_version").removeClass("loading") | $("#select_model_version").removeClass("loading") | ||||
| const initVersionText = $('#model_name_version div.item:first-child').text() | const initVersionText = $('#model_name_version div.item:first-child').text() | ||||
| const initVersionValue = $('#model_name_version div.item:first-child').data('value') | const initVersionValue = $('#model_name_version div.item:first-child').data('value') | ||||
| $("#select_model_version").dropdown('set text',initVersionText) | |||||
| $("#select_model_version").dropdown('set value',initVersionValue,initVersionText,$('#model_name_version div.item:first-child')) | |||||
| if(faildModelVersion&&faildTrainUrl){ | |||||
| $("#select_model_version").dropdown('set text',faildModelVersion) | |||||
| $("#select_model_version").dropdown('set value',faildTrainUrl,faildModelVersion,$('#model_name_version div.item:first-child')) | |||||
| }else{ | |||||
| $("#select_model_version").dropdown('set text',initVersionText) | |||||
| $("#select_model_version").dropdown('set value',initVersionValue,initVersionText,$('#model_name_version div.item:first-child')) | |||||
| } | |||||
| } | } | ||||
| }) | }) | ||||
| } | } | ||||
| // 根据选中的模型版本获取相应的模型权重文件 | // 根据选中的模型版本获取相应的模型权重文件 | ||||
| function modelCkpt(){ | function modelCkpt(){ | ||||
| let faildCkptName = $('#failed_ckpt_name').val() | |||||
| $('#select_model_version').dropdown({ | $('#select_model_version').dropdown({ | ||||
| onChange: function(value, text, $selectedItem) { | onChange: function(value, text, $selectedItem) { | ||||
| const dataID = $selectedItem[0].getAttribute("data-id") | const dataID = $selectedItem[0].getAttribute("data-id") | ||||
| @@ -343,17 +372,19 @@ | |||||
| if(!element.IsDir && loadCheckpointFile.includes(ckptSuffix[ckptSuffix.length-1])){ | if(!element.IsDir && loadCheckpointFile.includes(ckptSuffix[ckptSuffix.length-1])){ | ||||
| html += `<div class="item" data-value=${element.FileName}>${element.FileName}</div>` | html += `<div class="item" data-value=${element.FileName}>${element.FileName}</div>` | ||||
| } | } | ||||
| }) | }) | ||||
| $('#model_checkpoint').append(html) | $('#model_checkpoint').append(html) | ||||
| $("#select_model_checkpoint").removeClass("loading") | $("#select_model_checkpoint").removeClass("loading") | ||||
| const initVersionText = $('#model_checkpoint div.item:first-child').text() | const initVersionText = $('#model_checkpoint div.item:first-child').text() | ||||
| const initVersionValue = $('#model_checkpoint div.item:first-child').data('value') | const initVersionValue = $('#model_checkpoint div.item:first-child').data('value') | ||||
| $("#select_model_checkpoint").dropdown('set text',initVersionText) | |||||
| $("#select_model_checkpoint").dropdown('set value',initVersionValue,initVersionText,$('#model_name_version div.item:first-child')) | |||||
| if(faildCkptName){ | |||||
| $("#select_model_checkpoint").dropdown('set text',faildCkptName) | |||||
| $("#select_model_checkpoint").dropdown('set value',faildCkptName,faildCkptName,$('#model_name_version div.item:first-child')) | |||||
| }else{ | |||||
| $("#select_model_checkpoint").dropdown('set text',initVersionText) | |||||
| $("#select_model_checkpoint").dropdown('set value',initVersionValue,initVersionText,$('#model_name_version div.item:first-child')) | |||||
| } | |||||
| }) | }) | ||||
| $("input#ai_model_version").val(text) | $("input#ai_model_version").val(text) | ||||
| $("input#ai_model_label").val(label) | $("input#ai_model_label").val(label) | ||||
| } | } | ||||
| @@ -419,7 +450,6 @@ | |||||
| let name2=$("#flaver_name .text").text() | let name2=$("#flaver_name .text").text() | ||||
| $("input#ai_engine_name").val(name1) | $("input#ai_engine_name").val(name1) | ||||
| $("input#ai_flaver_name").val(name2) | $("input#ai_flaver_name").val(name2) | ||||
| } | } | ||||
| function validate(){ | function validate(){ | ||||
| $('.ui.form') | $('.ui.form') | ||||
| @@ -257,7 +257,9 @@ | |||||
| class="cti-mgRight-sm">{{$.i18n.Tr "repo.modelarts.train_job.dura_time"}}:</span> | class="cti-mgRight-sm">{{$.i18n.Tr "repo.modelarts.train_job.dura_time"}}:</span> | ||||
| <span class="cti-mgRight-sm uc-accordionTitle-black" | <span class="cti-mgRight-sm uc-accordionTitle-black" | ||||
| id="{{.VersionName}}-duration-span">{{$.duration}}</span> | id="{{.VersionName}}-duration-span">{{$.duration}}</span> | ||||
| <span id="refresh-status" data-tooltip="刷新" style="cursor: pointer;" data-inverted="" data-version="{{.VersionName}}"> | |||||
| <i class="redo icon redo-color"></i> | |||||
| </span> | |||||
| </div> | </div> | ||||
| </span> | </span> | ||||
| </span> | </span> | ||||
| @@ -128,7 +128,11 @@ | |||||
| <div class="inline min_title field"> | <div class="inline min_title field"> | ||||
| <label class="label-fix-width" style="font-weight: normal;" for="description">{{.i18n.Tr "repo.modelarts.train_job.description"}}</label> | <label class="label-fix-width" style="font-weight: normal;" for="description">{{.i18n.Tr "repo.modelarts.train_job.description"}}</label> | ||||
| {{if .description}} | |||||
| <textarea style="width: 80%;" id="description" name="description" rows="3" maxlength="255" placeholder={{.i18n.Tr "repo.modelarts.train_job.new_place"}}>{{.description}}</textarea> | |||||
| {{else}} | |||||
| <textarea style="width: 80%;" id="description" name="description" rows="3" maxlength="255" placeholder={{.i18n.Tr "repo.modelarts.train_job.new_place"}} onchange="this.value=this.value.substring(0, 255)" onkeydown="this.value=this.value.substring(0, 255)" onkeyup="this.value=this.value.substring(0, 255)"></textarea> | <textarea style="width: 80%;" id="description" name="description" rows="3" maxlength="255" placeholder={{.i18n.Tr "repo.modelarts.train_job.new_place"}} onchange="this.value=this.value.substring(0, 255)" onkeydown="this.value=this.value.substring(0, 255)" onkeyup="this.value=this.value.substring(0, 255)"></textarea> | ||||
| {{end}} | |||||
| </div> | </div> | ||||
| <div class="ui divider"></div> | <div class="ui divider"></div> | ||||
| @@ -170,9 +174,22 @@ | |||||
| <div class="field" style="flex: 2;" id="engine_name"> | <div class="field" style="flex: 2;" id="engine_name"> | ||||
| <select class="ui dropdown width" id="trainjob_engine_versions" name="engine_id"> | <select class="ui dropdown width" id="trainjob_engine_versions" name="engine_id"> | ||||
| {{if .engine_id}} | |||||
| {{range .engine_versions}} | {{range .engine_versions}} | ||||
| <option name="engine_id" value="{{.ID}}">{{.Value}}</option> | |||||
| {{if eq $.engine_id .ID}} | |||||
| <option value="{{.ID}}">{{.Value}}</option> | |||||
| {{end}} | |||||
| {{end}} | |||||
| {{range .engine_versions}} | |||||
| {{if ne $.engine_id .ID}} | |||||
| <option value="{{.ID}}">{{.Value}}</option> | |||||
| {{end}} | |||||
| {{end}} | {{end}} | ||||
| {{else}} | |||||
| {{range .engine_versions}} | |||||
| <option value="{{.ID}}">{{.Value}}</option> | |||||
| {{end}} | |||||
| {{end}} | |||||
| </select> | </select> | ||||
| </div> | </div> | ||||
| @@ -220,7 +237,6 @@ | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| <div class="required min_title field " style="display: none;"> | <div class="required min_title field " style="display: none;"> | ||||
| <label style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.resource_pool"}}</label> | <label style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.resource_pool"}}</label> | ||||
| <select class="ui dropdown" id="trainjob_resource_pool" style='width:385px' name="pool_id"> | <select class="ui dropdown" id="trainjob_resource_pool" style='width:385px' name="pool_id"> | ||||
| @@ -246,12 +262,24 @@ | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| <div class="required inline min_title field" id="flaver_name"> | <div class="required inline min_title field" id="flaver_name"> | ||||
| <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.standard"}}</label> | <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.standard"}}</label> | ||||
| <select class="ui dropdown width48" id="trainjob-flavor" name="flavor"> | <select class="ui dropdown width48" id="trainjob-flavor" name="flavor"> | ||||
| {{range .flavor_infos}} | |||||
| <option name="flavor" value="{{.Code}}">{{.Value}}</option> | |||||
| {{if .flavor}} | |||||
| {{range .flavor_infos}} | |||||
| {{if eq $.flavor .Code}} | |||||
| <option value="{{.Code}}">{{.Value}}</option> | |||||
| {{end}} | |||||
| {{end}} | |||||
| {{range .flavor_infos}} | |||||
| {{if ne $.flavor .Code}} | |||||
| <option value="{{.Code}}">{{.Value}}</option> | |||||
| {{end}} | |||||
| {{end}} | |||||
| {{else}} | |||||
| {{range .flavor_infos}} | |||||
| <option name="flavor" value="{{.Code}}">{{.Value}}</option> | |||||
| {{end}} | |||||
| {{end}} | {{end}} | ||||
| </select> | </select> | ||||
| </div> | </div> | ||||
| @@ -225,6 +225,9 @@ export default { | |||||
| }, | }, | ||||
| }, | }, | ||||
| mounted() { | mounted() { | ||||
| if (document.getElementById("ai_image_name")) { | |||||
| this.imageAddress = document.getElementById("ai_image_name").value; | |||||
| } | |||||
| this.getImageListPublic(); | this.getImageListPublic(); | ||||
| if ( | if ( | ||||
| location.href.indexOf("benchmark") !== -1 || | location.href.indexOf("benchmark") !== -1 || | ||||
| @@ -498,6 +498,9 @@ export default { | |||||
| }, | }, | ||||
| }, | }, | ||||
| mounted() { | mounted() { | ||||
| if (document.getElementById("ai_image_name")) { | |||||
| this.imageAddress = document.getElementById("ai_image_name").value; | |||||
| } | |||||
| this.getImageListPublic(); | this.getImageListPublic(); | ||||
| if ( | if ( | ||||
| location.href.indexOf("train-job") !== -1 || | location.href.indexOf("train-job") !== -1 || | ||||
| @@ -3873,6 +3873,10 @@ function initVueDataset() { | |||||
| MinioUploader, | MinioUploader, | ||||
| }, | }, | ||||
| mounted() { | mounted() { | ||||
| if (document.getElementById("fail_dataset_name")) { | |||||
| this.dataset_name = document.getElementById("fail_dataset_name").value; | |||||
| this.dataset_uuid = document.getElementById("fail_dataset_uuid").value; | |||||
| } | |||||
| this.getTypeList(); | this.getTypeList(); | ||||
| if (!!document.getElementById("dataset-repolink-init")) { | if (!!document.getElementById("dataset-repolink-init")) { | ||||