| @@ -91,6 +91,7 @@ type Cloudbrain struct { | |||
| Description string | |||
| WorkServerNumber int | |||
| FlavorName string | |||
| EngineName string | |||
| User *User `xorm:"-"` | |||
| Repo *Repository `xorm:"-"` | |||
| @@ -19,7 +19,7 @@ type CreateModelArtsNotebookForm struct { | |||
| JobName string `form:"job_name" binding:"Required"` | |||
| Attachment string `form:"attachment"` | |||
| Description string `form:"description"` | |||
| Flavor string `form:"flavor"` | |||
| Flavor string `form:"flavor"` | |||
| } | |||
| func (f *CreateModelArtsNotebookForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { | |||
| @@ -41,7 +41,8 @@ type CreateModelArtsTrainJobForm struct { | |||
| PrameterDescription string `form:"parameter_description"` | |||
| BranchName string `form:"branch_name" binding:"Required"` | |||
| VersionName string `form:"version_name" binding:"Required"` | |||
| FlavorName string `form:"flavor_name" binding:"Required"` | |||
| FlavorName string `form:"flaver_names" binding:"Required"` | |||
| EngineName string `form:"engine_names" binding:"Required"` | |||
| } | |||
| func (f *CreateModelArtsTrainJobForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { | |||
| @@ -82,6 +82,7 @@ type GenerateTrainJobReq struct { | |||
| FatherVersionName string | |||
| FlavorName string | |||
| VersionCount int | |||
| EngineName string | |||
| } | |||
| type GenerateTrainJobVersionReq struct { | |||
| @@ -104,6 +105,7 @@ type GenerateTrainJobVersionReq struct { | |||
| CommitID string | |||
| BranchName string | |||
| FlavorName string | |||
| EngineName string | |||
| } | |||
| type VersionInfo struct { | |||
| @@ -134,6 +136,22 @@ type ResourcePool struct { | |||
| } `json:"resource_pool"` | |||
| } | |||
| // type Parameter struct { | |||
| // Label string `json:"label"` | |||
| // Value string `json:"value"` | |||
| // } | |||
| // type Parameters struct { | |||
| // Parameter []Parameter `json:"parameter"` | |||
| // } | |||
| type Parameters struct { | |||
| Parameter []struct { | |||
| Label string `json:"label"` | |||
| Value string `json:"value"` | |||
| } `json:"parameter"` | |||
| } | |||
| func GenerateTask(ctx *context.Context, jobName, uuid, description, flavor string) error { | |||
| var dataActualPath string | |||
| if uuid != "" { | |||
| @@ -263,6 +281,7 @@ func GenerateTrainJob(ctx *context.Context, req *GenerateTrainJobReq) (err error | |||
| Description: req.Description, | |||
| WorkServerNumber: req.WorkServerNumber, | |||
| FlavorName: req.FlavorName, | |||
| EngineName: req.EngineName, | |||
| VersionCount: req.VersionCount, | |||
| }) | |||
| @@ -331,6 +350,7 @@ func GenerateTrainJobVersion(ctx *context.Context, req *GenerateTrainJobVersionR | |||
| Description: req.Description, | |||
| WorkServerNumber: req.WorkServerNumber, | |||
| FlavorName: req.FlavorName, | |||
| EngineName: req.EngineName, | |||
| }) | |||
| if err != nil { | |||
| log.Error("CreateCloudbrain(%s) failed:%v", req.JobName, err.Error()) | |||
| @@ -302,7 +302,7 @@ func GetOneLevelAllObjectUnderDir(bucket string, prefixRootPath string, relative | |||
| fileName = val.Key[prefixLen:] | |||
| } | |||
| fileInfo := FileInfo{ | |||
| ModTime: val.LastModified.Format("2006-01-02 15:04:05"), | |||
| ModTime: val.LastModified.Local().Format("2006-01-02 15:04:05"), | |||
| FileName: fileName, | |||
| Size: val.Size, | |||
| IsDir: isDir, | |||
| @@ -874,11 +874,13 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
| }) | |||
| m.Group("/train-job", func() { | |||
| m.Group("/:jobid", func() { | |||
| m.Get("", repo.GetModelArtsTrainJob) | |||
| // m.Get("", repo.GetModelArtsTrainJob) | |||
| m.Get("", repo.GetModelArtsTrainJobVersion) | |||
| // m.Get("/log", repo.TrainJobGetLog) | |||
| m.Get("/log", repo.TrainJobGetLog) | |||
| m.Group("/:version-name", func() { | |||
| m.Get("", repo.GetModelArtsTrainJobVersion) | |||
| }) | |||
| // m.Group("/:version-name", func() { | |||
| // m.Get("", repo.GetModelArtsTrainJobVersion) | |||
| // }) | |||
| }) | |||
| }) | |||
| }, reqRepoReader(models.UnitTypeCloudBrain)) | |||
| @@ -86,7 +86,7 @@ func GetModelArtsTrainJobVersion(ctx *context.APIContext) { | |||
| ) | |||
| jobID := ctx.Params(":jobid") | |||
| versionName := ctx.Params(":version-name") | |||
| versionName := ctx.Query("version_name") | |||
| repoID := ctx.Repo.Repository.ID | |||
| job, err := models.GetRepoCloudBrainByJobIDAndVersionName(repoID, jobID, versionName) | |||
| if err != nil { | |||
| @@ -123,6 +123,7 @@ func TrainJobGetLog(ctx *context.APIContext) { | |||
| log.Info("test") | |||
| var jobID = ctx.Params(":jobid") | |||
| var versionName = ctx.Query("version_name") | |||
| var logFileName = ctx.Query("file_name") | |||
| var baseLine = ctx.Query("base_line") | |||
| var order = ctx.Query("order") | |||
| @@ -135,11 +136,11 @@ func TrainJobGetLog(ctx *context.APIContext) { | |||
| return | |||
| } | |||
| task, err := models.GetCloudbrainByJobID(jobID) | |||
| task, err := models.GetCloudbrainByJobIDAndVersionName(jobID, versionName) | |||
| if err != nil { | |||
| log.Error("GetCloudbrainByJobID(%s) failed:%v", jobID, err.Error()) | |||
| log.Error("GetCloudbrainByJobIDAndVersionName(%s) failed:%v", jobID, err.Error()) | |||
| ctx.JSON(http.StatusInternalServerError, map[string]interface{}{ | |||
| "err_msg": "GetCloudbrainByJobID failed", | |||
| "err_msg": "GetCloudbrainByJobIDAndVersionName failed", | |||
| }) | |||
| return | |||
| } | |||
| @@ -441,6 +441,13 @@ func trainJobNewVersionDataPrepare(ctx *context.Context) error { | |||
| } | |||
| ctx.Data["flavor_infos"] = flavorInfos.Info | |||
| var Parameters modelarts.Parameters | |||
| if err = json.Unmarshal([]byte(task.Parameters), &Parameters); err != nil { | |||
| ctx.ServerError("json.Unmarshal failed:", err) | |||
| return err | |||
| } | |||
| ctx.Data["params"] = Parameters.Parameter | |||
| outputObsPath := "/" + setting.Bucket + modelarts.JobPath + jobName + modelarts.OutputPath | |||
| ctx.Data["train_url"] = outputObsPath | |||
| @@ -454,9 +461,9 @@ func trainJobNewVersionDataPrepare(ctx *context.Context) error { | |||
| ctx.Data["description"] = task.Description | |||
| ctx.Data["boot_file"] = task.BootFile | |||
| ctx.Data["dataset_name"] = task.DatasetName | |||
| ctx.Data["params"] = task.Parameters | |||
| ctx.Data["work_server_number"] = task.WorkServerNumber | |||
| ctx.Data["flavor_name"] = task.FlavorName | |||
| ctx.Data["engine_name"] = task.FlavorName | |||
| ctx.Data["uuid"] = task.Uuid | |||
| ctx.Data["flavor_code"] = task.FlavorCode | |||
| ctx.Data["engine_id"] = task.EngineID | |||
| @@ -493,6 +500,7 @@ func TrainJobCreate(ctx *context.Context, form auth.CreateModelArtsTrainJobForm) | |||
| isLatestVersion := modelarts.IsLatestVersion | |||
| FlavorName := form.FlavorName | |||
| VersionCount := modelarts.VersionCount | |||
| EngineName := form.EngineName | |||
| if err := paramCheckCreateTrainJob(form); err != nil { | |||
| log.Error("paramCheckCreateTrainJob failed:(%v)", err) | |||
| @@ -619,13 +627,6 @@ func TrainJobCreate(ctx *context.Context, form auth.CreateModelArtsTrainJobForm) | |||
| return | |||
| } | |||
| } | |||
| //将引擎id转化为引擎名称 | |||
| FlavorName, err = getFlavorNameByEngineID(engineID) | |||
| if err != nil { | |||
| log.Error("getFlavorNameByEngineID(%s) failed:%v", engineID, err.Error()) | |||
| ctx.RenderWithErr(err.Error(), tplModelArtsTrainJobNew, &form) | |||
| return | |||
| } | |||
| req := &modelarts.GenerateTrainJobReq{ | |||
| JobName: jobName, | |||
| @@ -648,6 +649,7 @@ func TrainJobCreate(ctx *context.Context, form auth.CreateModelArtsTrainJobForm) | |||
| Params: form.Params, | |||
| FatherVersionName: modelarts.InitFatherVersionName, | |||
| FlavorName: FlavorName, | |||
| EngineName: EngineName, | |||
| VersionCount: VersionCount, | |||
| } | |||
| @@ -719,6 +721,7 @@ func TrainJobCreateVersion(ctx *context.Context, form auth.CreateModelArtsTrainJ | |||
| branch_name := form.BranchName | |||
| fatherVersionName := versionName | |||
| FlavorName := form.FlavorName | |||
| EngineName := form.EngineName | |||
| if err := paramCheckCreateTrainJob(form); err != nil { | |||
| log.Error("paramCheckCreateTrainJob failed:(%v)", err) | |||
| @@ -843,8 +846,7 @@ func TrainJobCreateVersion(ctx *context.Context, form auth.CreateModelArtsTrainJ | |||
| return | |||
| } | |||
| } | |||
| //将引擎id转化为引擎名称 | |||
| FlavorName, err = getFlavorNameByEngineID(engineID) | |||
| if err != nil { | |||
| log.Error("getFlavorNameByEngineID(%s) failed:%v", engineID, err.Error()) | |||
| ctx.RenderWithErr(err.Error(), tplModelArtsTrainJobVersionNew, &form) | |||
| @@ -876,6 +878,7 @@ func TrainJobCreateVersion(ctx *context.Context, form auth.CreateModelArtsTrainJ | |||
| CommitID: commitID, | |||
| BranchName: branch_name, | |||
| FlavorName: FlavorName, | |||
| EngineName: EngineName, | |||
| } | |||
| err = modelarts.GenerateTrainJobVersion(ctx, req, jobID, fatherVersionName) | |||
| if err != nil { | |||
| @@ -920,19 +923,6 @@ func TrainJobCreateVersion(ctx *context.Context, form auth.CreateModelArtsTrainJ | |||
| ctx.HTML(http.StatusOK, tplModelArtsTrainJobShow) | |||
| } | |||
| func getFlavorNameByEngineID(engineID int) (FlavorName string, err error) { | |||
| if engineID == 121 { | |||
| FlavorName = "TensorFlow-1.15" | |||
| return FlavorName, nil | |||
| } else if engineID == 122 { | |||
| FlavorName = "Mindspore-1.3" | |||
| return FlavorName, nil | |||
| } else { | |||
| log.Error("getFlavorName failed:%v", errors.New("getFlavorName failed")) | |||
| return "getFlavorName failed:", errors.New("getFlavorName failed") | |||
| } | |||
| } | |||
| // readDir reads the directory named by dirname and returns | |||
| // a list of directory entries sorted by filename. | |||
| func readDir(dirname string) ([]os.FileInfo, error) { | |||
| @@ -332,7 +332,7 @@ | |||
| <span>{{.VersionCount}} </span> | |||
| </div> | |||
| <!-- 任务状态 --> | |||
| <div class="two wide column text center padding0"> | |||
| <div class="two wide column padding0" style="padding-left: 2.2rem !important;"> | |||
| <span class="job-status" id="{{.JobID}}" data-repopath="{{$.RepoRelPath}}" data-jobid="{{.JobID}}"> | |||
| <span><i id="{{.JobID}}-icon" style="vertical-align: middle;" class="{{.Status}}"></i><span id="{{.JobID}}-text" style="margin-left: 0.4em;font-size: 12px;">{{.Status}}</span></span> | |||
| </span> | |||
| @@ -153,6 +153,8 @@ | |||
| <form class="ui form" action="{{.Link}}" method="post"> | |||
| {{.CsrfTokenHtml}} | |||
| <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=""> | |||
| <h4 class="unite title ui header ">{{.i18n.Tr "repo.modelarts.train_job.basic_info"}}:</h4> | |||
| <div class="required unite min_title inline field"> | |||
| <label>{{.i18n.Tr "repo.modelarts.train_job.job_name"}}</label> | |||
| @@ -189,7 +191,7 @@ | |||
| </select> | |||
| </div> | |||
| <div class="field" style="flex: 2;"> | |||
| <div class="field" style="flex: 2;" id="engine_name"> | |||
| <select class="ui dropdown width" id="trainjob_engine_versions" style='width: 100%;' name="engine_id"> | |||
| {{range .engine_versions}} | |||
| <option name="engine_id" value="{{.ID}}">{{.Value}}</option> | |||
| @@ -257,7 +259,7 @@ | |||
| </div> | |||
| </div> | |||
| <div class="required unite min_title inline field"> | |||
| <div class="required unite min_title inline field" id="flaver_name"> | |||
| <label>{{.i18n.Tr "repo.modelarts.train_job.standard"}}</label> | |||
| <select class="ui dropdown width81" id="trainjob-flavor" style='width:385px' name="flavor"> | |||
| {{range .flavor_infos}} | |||
| @@ -541,8 +543,15 @@ | |||
| msg = JSON.stringify(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) | |||
| } | |||
| $('.ui.create_train_job.green.button').click(function(e) { | |||
| get_name() | |||
| send_run_para() | |||
| validate() | |||
| }) | |||
| @@ -162,7 +162,6 @@ | |||
| <input type="hidden" style="width: 60%;" name="job_name" id="trainjob_job_name" value="{{.job_name}}"> | |||
| <input style="width: 60%;" value="{{.job_name}}" tabindex="3" disabled > | |||
| </div> | |||
| <input type="hidden" name="version_name" value="{{.version_name}}"> | |||
| <div class="unite min_title inline field"> | |||
| <label for="description">{{.i18n.Tr "repo.modelarts.train_job.description"}} </label> | |||
| <textarea style="width: 80%;" id="description" value="{{.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, 256)"></textarea> | |||
| @@ -202,7 +201,7 @@ | |||
| <div class="field" style="flex: 2;"> | |||
| <select class="ui dropdown width" id="trainjob_engine_versions" style='width: 100%;' name="engine_id"> | |||
| {{if .engine_id}} | |||
| <option name="engine_id" value="{{.engine_id}}">{{.engine_id}}</option> | |||
| <option name="engine_id" value="{{.engine_id}}">{{.engine_name}}</option> | |||
| {{end}} | |||
| {{range .engine_versions}} | |||
| {{if ne $.engine_id .ID}} | |||
| @@ -245,7 +244,24 @@ | |||
| <label>{{.i18n.Tr "repo.modelarts.train_job.run_parameter"}}</label> | |||
| <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"> | |||
| <div class="dynamic field" style="margin-top: 1rem;"></div> | |||
| <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> | |||
| </div> | |||
| {{end}} | |||
| {{end}} | |||
| </div> | |||
| </div> | |||
| @@ -314,11 +330,7 @@ | |||
| {{template "base/footer" .}} | |||
| <script> | |||
| console.log({{.dataset_name}}) | |||
| console.log({{.params}}) | |||
| console.log({{.flavor_name}}) | |||
| console.log({{.flavor_code}}) | |||
| let url_href = window.location.pathname.split('create')[0] | |||
| let url_href = {{.RepoLink}}+'/modelarts/train-job' | |||
| let url_post = window.location.pathname.split('?version_name=V0001')[0] | |||
| $(".ui.button").attr('href',url_href) | |||
| $(".ui.form").attr('action',url_post) | |||
| @@ -554,6 +566,7 @@ | |||
| } | |||
| document.onreadystatechange = function() { | |||
| if (document.readyState === "complete") { | |||
| document.getElementById("mask").style.display = "none" | |||
| } | |||
| } | |||