@@ -28,6 +28,7 @@ type CreateModelArtsNotebookForm struct { | |||||
LabelName string `form:"label_names"` | LabelName string `form:"label_names"` | ||||
PreTrainModelUrl string `form:"pre_train_model_url"` | PreTrainModelUrl string `form:"pre_train_model_url"` | ||||
SpecId int64 `form:"spec_id" binding:"Required"` | SpecId int64 `form:"spec_id" binding:"Required"` | ||||
DatasetName string `form:"dataset_name"` | |||||
} | } | ||||
func (f *CreateModelArtsNotebookForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { | func (f *CreateModelArtsNotebookForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { | ||||
@@ -696,7 +696,7 @@ type GenerateModelArtsNotebookReq struct { | |||||
ImageId string | ImageId string | ||||
AutoStopDurationMs int64 | AutoStopDurationMs int64 | ||||
BranchName string | |||||
BranchName string | |||||
Spec *models.Specification | Spec *models.Specification | ||||
ModelName string | ModelName string | ||||
@@ -106,6 +106,7 @@ func NewFuncMap() []template.FuncMap { | |||||
"SafeJS": SafeJS, | "SafeJS": SafeJS, | ||||
"Str2html": Str2html, | "Str2html": Str2html, | ||||
"subOne": subOne, | "subOne": subOne, | ||||
"addOne": addOne, | |||||
"TimeSince": timeutil.TimeSince, | "TimeSince": timeutil.TimeSince, | ||||
"TimeSinceUnix": timeutil.TimeSinceUnix, | "TimeSinceUnix": timeutil.TimeSinceUnix, | ||||
"TimeSinceUnix1": timeutil.TimeSinceUnix1, | "TimeSinceUnix1": timeutil.TimeSinceUnix1, | ||||
@@ -473,7 +474,9 @@ func Str2html(raw string) template.HTML { | |||||
func subOne(length int) int { | func subOne(length int) int { | ||||
return length - 1 | return length - 1 | ||||
} | } | ||||
func addOne(length int64) int64 { | |||||
return length + 1 | |||||
} | |||||
// Escape escapes a HTML string | // Escape escapes a HTML string | ||||
func Escape(raw string) string { | func Escape(raw string) string { | ||||
return html.EscapeString(raw) | return html.EscapeString(raw) | ||||
@@ -1082,6 +1082,7 @@ delete=Delete | |||||
more=More | more=More | ||||
gpu_type_all=All | gpu_type_all=All | ||||
model_download=Model Download | model_download=Model Download | ||||
all_result_download=All result download | |||||
submit_image=Submit Image | submit_image=Submit Image | ||||
modify_image=Modify Image | modify_image=Modify Image | ||||
image_exist=Image name has been used, please use a new one. | image_exist=Image name has been used, please use a new one. | ||||
@@ -1094,8 +1095,8 @@ image_delete_fail=Failed to delete image, please try again later. | |||||
image_overwrite=You had submitted the same name image before, are you sure to overwrite the original image? | image_overwrite=You had submitted the same name image before, are you sure to overwrite the original image? | ||||
download=Download | download=Download | ||||
score=Score | score=Score | ||||
wait_count_start = There are currently | |||||
wait_count_end = tasks queued | |||||
wait_count_start = Your current queue position is | |||||
wait_count_end = | |||||
file_limit_100 = Display up to 100 files or folders in a single directory | file_limit_100 = Display up to 100 files or folders in a single directory | ||||
images.name = Image Tag | images.name = Image Tag | ||||
images.name_placerholder = Please enter the image name | images.name_placerholder = Please enter the image name | ||||
@@ -1081,6 +1081,7 @@ delete=删除 | |||||
more=更多 | more=更多 | ||||
gpu_type_all=全部 | gpu_type_all=全部 | ||||
model_download=结果下载 | model_download=结果下载 | ||||
all_result_download=全部结果下载 | |||||
submit_image=提交镜像 | submit_image=提交镜像 | ||||
modify_image=修改镜像 | modify_image=修改镜像 | ||||
image_exist=镜像Tag已被使用,请修改镜像Tag。 | image_exist=镜像Tag已被使用,请修改镜像Tag。 | ||||
@@ -1093,8 +1094,8 @@ image_delete_fail=删除镜像失败,请稍后再试。 | |||||
image_overwrite=您已经提交过相同名称的镜像,您确定要覆盖原来提交的镜像吗? | image_overwrite=您已经提交过相同名称的镜像,您确定要覆盖原来提交的镜像吗? | ||||
download=模型下载 | download=模型下载 | ||||
score=评分 | score=评分 | ||||
wait_count_start = 当前有 | |||||
wait_count_end = 个任务正在排队 | |||||
wait_count_start = 您当前排队位置是第 | |||||
wait_count_end = 位 | |||||
file_limit_100 = 单目录下最多显示100个文件或文件夹 | file_limit_100 = 单目录下最多显示100个文件或文件夹 | ||||
images.name = 镜像Tag | images.name = 镜像Tag | ||||
images.name_placerholder = 请输入镜像Tag | images.name_placerholder = 请输入镜像Tag | ||||
@@ -2811,18 +2811,24 @@ func InferenceCloudBrainJobShow(ctx *context.Context) { | |||||
cloudBrainShow(ctx, tplCloudBrainInferenceJobShow, models.JobTypeInference) | cloudBrainShow(ctx, tplCloudBrainInferenceJobShow, models.JobTypeInference) | ||||
} | } | ||||
func DownloadInferenceResultFile(ctx *context.Context) { | |||||
func DownloadGPUInferenceResultFile(ctx *context.Context) { | |||||
var jobID = ctx.Params(":jobid") | var jobID = ctx.Params(":jobid") | ||||
var versionName = ctx.Query("version_name") | |||||
task, err := models.GetCloudbrainByJobIDAndVersionName(jobID, versionName) | |||||
task, err := models.GetCloudbrainByJobID(jobID) | |||||
if err != nil { | if err != nil { | ||||
log.Error("GetCloudbrainByJobID(%s) failed:%v", task.JobName, err.Error()) | log.Error("GetCloudbrainByJobID(%s) failed:%v", task.JobName, err.Error()) | ||||
return | return | ||||
} | } | ||||
allFile, err := storage.GetAllObjectByBucketAndPrefixMinio(setting.Attachment.Minio.Bucket, task.ResultUrl) | |||||
returnFileName := task.DisplayJobName + ".zip" | |||||
MinioDownloadManyFile(task.ResultUrl, ctx, returnFileName, allFile) | |||||
parentDir := ctx.Query("parentDir") | |||||
filePath := "jobs/" + task.JobName + "/result/" + parentDir | |||||
log.Info("prefix=" + filePath) | |||||
allFile, err := storage.GetAllObjectByBucketAndPrefixMinio(setting.Attachment.Minio.Bucket, filePath) | |||||
if err == nil { | |||||
returnFileName := task.DisplayJobName + ".zip" | |||||
MinioDownloadManyFile(filePath, ctx, returnFileName, allFile) | |||||
} else { | |||||
log.Info("error,msg=" + err.Error()) | |||||
ctx.ServerError("no file to download.", err) | |||||
} | |||||
} | } | ||||
func getInferenceJobCommand(form auth.CreateCloudBrainInferencForm) (string, error) { | func getInferenceJobCommand(form auth.CreateCloudBrainInferencForm) (string, error) { | ||||
@@ -1308,6 +1308,7 @@ func GrampusTrainJobShow(ctx *context.Context) { | |||||
taskList := make([]*models.Cloudbrain, 0) | taskList := make([]*models.Cloudbrain, 0) | ||||
taskList = append(taskList, task) | taskList = append(taskList, task) | ||||
prepareSpec4Show(ctx, task) | prepareSpec4Show(ctx, task) | ||||
ctx.Data["version_list_task"] = taskList | ctx.Data["version_list_task"] = taskList | ||||
ctx.Data["datasetDownload"] = GetCloudBrainDataSetInfo(task.Uuid, task.DatasetName, false) | ctx.Data["datasetDownload"] = GetCloudBrainDataSetInfo(task.Uuid, task.DatasetName, false) | ||||
ctx.Data["canDownload"] = cloudbrain.CanModifyJob(ctx, task) | ctx.Data["canDownload"] = cloudbrain.CanModifyJob(ctx, task) | ||||
@@ -2609,7 +2609,8 @@ func inferenceJobErrorNewDataPrepare(ctx *context.Context, form auth.CreateModel | |||||
ctx.Data["datasetType"] = models.TypeCloudBrainTwo | ctx.Data["datasetType"] = models.TypeCloudBrainTwo | ||||
waitCount := cloudbrain.GetWaitingCloudbrainCount(models.TypeCloudBrainTwo, "") | waitCount := cloudbrain.GetWaitingCloudbrainCount(models.TypeCloudBrainTwo, "") | ||||
ctx.Data["WaitCount"] = waitCount | ctx.Data["WaitCount"] = waitCount | ||||
NotStopTaskCount, _ := cloudbrainTask.GetNotFinalStatusTaskCount(ctx.User.ID, models.TypeCloudBrainTwo, string(models.JobTypeInference)) | |||||
ctx.Data["NotStopTaskCount"] = NotStopTaskCount | |||||
return nil | return nil | ||||
} | } | ||||
func InferenceJobShow(ctx *context.Context) { | func InferenceJobShow(ctx *context.Context) { | ||||
@@ -2689,6 +2690,8 @@ func MultiModelDownload(ctx *context.Context) { | |||||
if task.ComputeResource == models.NPUResource { | if task.ComputeResource == models.NPUResource { | ||||
path := strings.TrimPrefix(path.Join(setting.TrainJobModelPath, task.JobName, setting.OutPutPath, versionName, parentDir), "/") | path := strings.TrimPrefix(path.Join(setting.TrainJobModelPath, task.JobName, setting.OutPutPath, versionName, parentDir), "/") | ||||
path = strings.TrimSuffix(path, "/") | |||||
path += "/" | |||||
allFile, err := storage.GetAllObjectByBucketAndPrefix(setting.Bucket, path) | allFile, err := storage.GetAllObjectByBucketAndPrefix(setting.Bucket, path) | ||||
if err == nil { | if err == nil { | ||||
returnFileName := task.DisplayJobName + ".zip" | returnFileName := task.DisplayJobName + ".zip" | ||||
@@ -1210,7 +1210,7 @@ func RegisterRoutes(m *macaron.Macaron) { | |||||
m.Post("/del", cloudbrain.AdminOrOwnerOrJobCreaterRightForTrain, repo.CloudBrainTrainJobDel) | m.Post("/del", cloudbrain.AdminOrOwnerOrJobCreaterRightForTrain, repo.CloudBrainTrainJobDel) | ||||
//m.Get("/models", reqRepoCloudBrainReader, repo.CloudBrainShowModels) | //m.Get("/models", reqRepoCloudBrainReader, repo.CloudBrainShowModels) | ||||
m.Get("/download_model", cloudbrain.AdminOrOwnerOrJobCreaterRightForTrain, repo.CloudBrainDownloadModel) | m.Get("/download_model", cloudbrain.AdminOrOwnerOrJobCreaterRightForTrain, repo.CloudBrainDownloadModel) | ||||
m.Get("/download_multi_model", cloudbrain.AdminOrJobCreaterRight, repo.CloudBrainDownloadMultiModel) | |||||
m.Get("/download_multi_model", cloudbrain.AdminOrOwnerOrJobCreaterRightForTrain, repo.CloudBrainDownloadMultiModel) | |||||
//m.Get("/get_log", cloudbrain.AdminOrJobCreaterRightForTrain, repo.GetLogFromModelDir) | //m.Get("/get_log", cloudbrain.AdminOrJobCreaterRightForTrain, repo.GetLogFromModelDir) | ||||
//m.Post("/create_version", reqWechatBind, cloudbrain.AdminOrJobCreaterRightForTrain, bindIgnErr(auth.CreateModelArtsTrainJobForm{}), repo.TrainJobCreateVersion) | //m.Post("/create_version", reqWechatBind, cloudbrain.AdminOrJobCreaterRightForTrain, bindIgnErr(auth.CreateModelArtsTrainJobForm{}), repo.TrainJobCreateVersion) | ||||
m.Get("/create_version", reqWechatBind, cloudbrain.AdminOrJobCreaterRightForTrain, repo.CloudBrainTrainJobVersionNew) | m.Get("/create_version", reqWechatBind, cloudbrain.AdminOrJobCreaterRightForTrain, repo.CloudBrainTrainJobVersionNew) | ||||
@@ -1223,8 +1223,8 @@ func RegisterRoutes(m *macaron.Macaron) { | |||||
m.Group("/:jobid", func() { | m.Group("/:jobid", func() { | ||||
m.Get("", reqRepoCloudBrainReader, repo.InferenceCloudBrainJobShow) | m.Get("", reqRepoCloudBrainReader, repo.InferenceCloudBrainJobShow) | ||||
m.Get("/result_download", cloudbrain.AdminOrJobCreaterRightForTrain, repo.CloudBrainDownloadInferenceResult) | m.Get("/result_download", cloudbrain.AdminOrJobCreaterRightForTrain, repo.CloudBrainDownloadInferenceResult) | ||||
m.Get("/download_multi_model", cloudbrain.AdminOrJobCreaterRight, repo.CloudBrainDownloadMultiModel) | |||||
m.Get("/downloadall", repo.DownloadInferenceResultFile) | |||||
m.Get("/download_multi_model", cloudbrain.AdminOrJobCreaterRightForTrain, repo.CloudBrainDownloadMultiModel) | |||||
m.Get("/downloadall", cloudbrain.AdminOrJobCreaterRightForTrain, repo.DownloadGPUInferenceResultFile) | |||||
}) | }) | ||||
m.Get("/create", reqWechatBind, reqRepoCloudBrainWriter, context.PointAccount(), repo.InferenceCloudBrainJobNew) | m.Get("/create", reqWechatBind, reqRepoCloudBrainWriter, context.PointAccount(), repo.InferenceCloudBrainJobNew) | ||||
m.Post("/create", reqWechatBind, reqRepoCloudBrainWriter, bindIgnErr(auth.CreateCloudBrainInferencForm{}), repo.CloudBrainInferenceJobCreate) | m.Post("/create", reqWechatBind, reqRepoCloudBrainWriter, bindIgnErr(auth.CreateCloudBrainInferencForm{}), repo.CloudBrainInferenceJobCreate) | ||||
@@ -1352,7 +1352,7 @@ func RegisterRoutes(m *macaron.Macaron) { | |||||
m.Group("/:jobid", func() { | m.Group("/:jobid", func() { | ||||
m.Get("", reqRepoCloudBrainReader, repo.InferenceJobShow) | m.Get("", reqRepoCloudBrainReader, repo.InferenceJobShow) | ||||
m.Get("/result_download", cloudbrain.AdminOrJobCreaterRightForTrain, repo.ResultDownload) | m.Get("/result_download", cloudbrain.AdminOrJobCreaterRightForTrain, repo.ResultDownload) | ||||
m.Get("/downloadall", repo.DownloadMultiResultFile) | |||||
m.Get("/downloadall", cloudbrain.AdminOrJobCreaterRightForTrain, repo.DownloadMultiResultFile) | |||||
}) | }) | ||||
m.Get("/create", reqWechatBind, reqRepoCloudBrainWriter, context.PointAccount(), repo.InferenceJobNew) | m.Get("/create", reqWechatBind, reqRepoCloudBrainWriter, context.PointAccount(), repo.InferenceJobNew) | ||||
m.Post("/create", reqWechatBind, reqRepoCloudBrainWriter, bindIgnErr(auth.CreateModelArtsInferenceJobForm{}), repo.InferenceJobCreate) | m.Post("/create", reqWechatBind, reqRepoCloudBrainWriter, bindIgnErr(auth.CreateModelArtsInferenceJobForm{}), repo.InferenceJobCreate) | ||||
@@ -1,7 +1,7 @@ | |||||
<div style="display:inline-block;"> | <div style="display:inline-block;"> | ||||
<div style="display:flex;align-items:center;color:#f2711c;"> | <div style="display:flex;align-items:center;color:#f2711c;"> | ||||
<i class="ri-error-warning-line" style="margin-right: 0.5rem; font-size: 14px"></i> | <i class="ri-error-warning-line" style="margin-right: 0.5rem; font-size: 14px"></i> | ||||
<span style="font-size: 12px">{{.i18n.Tr "repo.wait_count_start"}} <span class="__task_wait_count__">{{.WaitCount}}</span> {{.i18n.Tr "repo.wait_count_end"}}</span> | |||||
<span style="font-size: 12px">{{.i18n.Tr "repo.wait_count_start"}} <span class="__task_wait_count__">{{if not .WaitCount}}1{{else}}{{addOne .WaitCount}}{{end}}</span> {{.i18n.Tr "repo.wait_count_end"}}</span> | |||||
</div> | </div> | ||||
</div> | </div> | ||||
<script> | <script> | ||||
@@ -12,7 +12,7 @@ | |||||
var specsSelEl = $('select#__specs__'); | var specsSelEl = $('select#__specs__'); | ||||
var seldOption = specsSelEl.find('option:selected'); | var seldOption = specsSelEl.find('option:selected'); | ||||
var queueCode = seldOption.attr('queueCode'); | var queueCode = seldOption.attr('queueCode'); | ||||
$('span.__task_wait_count__').text(queuesDetail[queueCode] || 0); | |||||
$('span.__task_wait_count__').text((queuesDetail[queueCode] || 0) +1); | |||||
}; | }; | ||||
$('body').on('change', 'select#__specs__', function(e) { | $('body').on('change', 'select#__specs__', function(e) { | ||||
changeSpecs(); | changeSpecs(); | ||||
@@ -40,7 +40,7 @@ | |||||
{{template "base/alert" .}} | {{template "base/alert" .}} | ||||
{{end}} | {{end}} | ||||
{{template "custom/alert_cb" .}} | {{template "custom/alert_cb" .}} | ||||
<div class="cloudbrain-type" style="display: none;" data-cloudbrain-type="{{.datasetType}}" data-repo-link="{{.RepoLink}}" data-queue="{{.QueuesDetail}}" data-queue-start="{{.i18n.Tr "repo.wait_count_start"}}" data-queue-end="{{.i18n.Tr "repo.wait_count_end"}}"></div> | |||||
<div class="cloudbrain-type" style="display: none;" data-cloudbrain-type="{{.datasetType}}" data-repo-link="{{.RepoLink}}"></div> | |||||
<h4 class="ui top attached header"> | <h4 class="ui top attached header"> | ||||
{{.i18n.Tr "repo.modelarts.train_job.new_infer"}} | {{.i18n.Tr "repo.modelarts.train_job.new_infer"}} | ||||
</h4> | </h4> | ||||
@@ -371,10 +371,18 @@ | |||||
<div class="ui tab" data-tab="four"> | <div class="ui tab" data-tab="four"> | ||||
<input type="hidden" name="model{{.VersionName}}" value="-1"> | <input type="hidden" name="model{{.VersionName}}" value="-1"> | ||||
<input type="hidden" name="modelback{{.VersionName}}" value="-1"> | <input type="hidden" name="modelback{{.VersionName}}" value="-1"> | ||||
<div class='ui breadcrumb model_file_bread' id='file_breadcrumb{{.VersionName}}'> | |||||
<div class="active section">{{.VersionName}}</div> | |||||
<div class="divider"> / </div> | |||||
<div style="display: flex;justify-content: space-between;"> | |||||
<div class='ui breadcrumb model_file_bread' id='file_breadcrumb{{.VersionName}}'> | |||||
<div class="active section">{{.VersionName}}</div> | |||||
<div class="divider"> / </div> | |||||
</div> | |||||
<a id="{{.VersionName}}-result-down" style="padding-right: 1%;display: none;" | |||||
class='{{if $.canDownload}}ti-download-file{{else}}disabled{{end}} file-info' | |||||
href="{{$.RepoLink}}/cloudbrain/inference-job/{{.JobID}}/downloadall?version_name={{.VersionName}}"> | |||||
<i class="ri-download-cloud-2-line"></i> | |||||
<span style="margin-left: 0.3rem;">{{$.i18n.Tr "repo.all_result_download"}}</span> | |||||
</a> | |||||
</div> | </div> | ||||
<div id="dir_list{{.VersionName}}"> | <div id="dir_list{{.VersionName}}"> | ||||
@@ -23,7 +23,7 @@ | |||||
<div class="repository"> | <div class="repository"> | ||||
{{template "repo/header" .}} | {{template "repo/header" .}} | ||||
<div class="ui container"> | <div class="ui container"> | ||||
<div class="cloudbrain-type" style="display: none;" data-cloudbrain-type="{{.datasetType}}" data-repo-link="{{.RepoLink}}" data-queue="{{.QueuesDetail}}" data-queue-start="{{.i18n.Tr "repo.wait_count_start"}}" data-queue-end="{{.i18n.Tr "repo.wait_count_end"}}" data-flag-model="true" data-exceed-size="{{DebugAttachSize}}"></div> | |||||
<div class="cloudbrain-type" style="display: none;" data-cloudbrain-type="{{.datasetType}}" data-repo-link="{{.RepoLink}}" data-flag-model="true" data-dataset-uuid="{{.attachment}}" data-dataset-name="{{.dataset_name}}" data-exceed-size="{{DebugAttachSize}}"></div> | |||||
{{if eq .NotStopTaskCount 0}} | {{if eq .NotStopTaskCount 0}} | ||||
{{template "base/alert" .}} | {{template "base/alert" .}} | ||||
{{end}} | {{end}} | ||||
@@ -38,6 +38,7 @@ | |||||
<form id="form_id" class="ui form" action="{{.Link}}" method="post"> | <form id="form_id" class="ui form" action="{{.Link}}" method="post"> | ||||
{{.CsrfTokenHtml}} | {{.CsrfTokenHtml}} | ||||
<input type="hidden" name='isBranches' value="{{.Branches}}"> | <input type="hidden" name='isBranches' value="{{.Branches}}"> | ||||
<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 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> | ||||
@@ -56,7 +56,7 @@ | |||||
<div class="repository"> | <div class="repository"> | ||||
{{template "repo/header" .}} | {{template "repo/header" .}} | ||||
<div class="ui container"> | <div class="ui container"> | ||||
<div class="cloudbrain-type" style="display: none;" data-cloudbrain-type="{{.datasetType}}" data-repo-link="{{.RepoLink}}" data-flag-model="true" data-dataset-uuid="{{.attachment}}" data-dataset-name="{{.dataset_name}}" data-queue="{{.QueuesDetail}}" data-queue-start="{{.i18n.Tr "repo.wait_count_start"}}" data-queue-end="{{.i18n.Tr "repo.wait_count_end"}}"></div> | |||||
<div class="cloudbrain-type" style="display: none;" data-cloudbrain-type="{{.datasetType}}" data-repo-link="{{.RepoLink}}" data-flag-model="true" data-dataset-uuid="{{.attachment}}" data-dataset-name="{{.dataset_name}}"></div> | |||||
{{if eq .NotStopTaskCount 0}} | {{if eq .NotStopTaskCount 0}} | ||||
{{template "base/alert" .}} | {{template "base/alert" .}} | ||||
{{end}} | {{end}} | ||||
@@ -123,7 +123,17 @@ | |||||
</div> | </div> | ||||
</td> | </td> | ||||
</tr> | </tr> | ||||
<tr class="ti-no-ng-animate"> | |||||
<td class="ti-no-ng-animate ti-text-form-label text-width80"> | |||||
{{$.i18n.Tr "repo.cloudbrain_creator"}} | |||||
</td> | |||||
<td class="ti-text-form-content"> | |||||
<div class="text-span text-span-w" id="{{.VersionName}}-mirror"> | |||||
{{.User.Name}} | |||||
</div> | |||||
</td> | |||||
</tr> | |||||
<tr class="ti-no-ng-animate"> | <tr class="ti-no-ng-animate"> | ||||
<td class="ti-no-ng-animate ti-text-form-label text-width80"> | <td class="ti-no-ng-animate ti-text-form-label text-width80"> | ||||
{{$.i18n.Tr "repo.modelarts.train_job.start_time"}} | {{$.i18n.Tr "repo.modelarts.train_job.start_time"}} | ||||
@@ -351,9 +361,18 @@ | |||||
<div class="ui tab" data-tab="four{{$k}}"> | <div class="ui tab" data-tab="four{{$k}}"> | ||||
<input type="hidden" name="model{{.VersionName}}" value="-1"> | <input type="hidden" name="model{{.VersionName}}" value="-1"> | ||||
<input type="hidden" name="modelback{{.VersionName}}" value="-1"> | <input type="hidden" name="modelback{{.VersionName}}" value="-1"> | ||||
<div class='ui breadcrumb model_file_bread' id='file_breadcrumb{{.VersionName}}'> | |||||
<div class="active section">result</div> | |||||
<div class="divider"> / </div> | |||||
<div style="display: flex;justify-content: space-between;"> | |||||
<div class='ui breadcrumb model_file_bread' id='file_breadcrumb{{.VersionName}}'> | |||||
<div class="active section">result</div> | |||||
<div class="divider"> / </div> | |||||
</div> | |||||
<a id="{{.VersionName}}-result-down" style="padding-right: 1%;display: none;" | |||||
class='{{if $.canDownload}}ti-download-file{{else}}disabled{{end}} file-info' | |||||
href="{{$.RepoLink}}/cloudbrain/train-job/{{.JobID}}/download_multi_model?version_name={{.VersionName}}&jobName={{.JobName}}"> | |||||
<i class="ri-download-cloud-2-line"></i> | |||||
<span style="margin-left: 0.3rem;">{{$.i18n.Tr "repo.all_result_download"}}</span> | |||||
</a> | |||||
</div> | </div> | ||||
<div id="dir_list{{.VersionName}}"> | <div id="dir_list{{.VersionName}}"> | ||||
</div> | </div> | ||||
@@ -4,8 +4,7 @@ | |||||
<div class="repository"> | <div class="repository"> | ||||
{{template "repo/header" .}} | {{template "repo/header" .}} | ||||
<div class="ui container"> | <div class="ui container"> | ||||
<div class="cloudbrain-type" style="display: none;" data-cloudbrain-type="{{.datasetType}}" data-repo-link="{{.RepoLink}}" data-queue="{{.QueuesDetail}}" data-queue-start="{{.i18n.Tr "repo.wait_count_start"}}" data-queue-end="{{.i18n.Tr "repo.wait_count_end"}}" data-flag-model="true" data-exceed-size="{{DebugAttachSize}}"></div> | |||||
<div class="cloudbrain-type" style="display: none;" data-cloudbrain-type="{{.datasetType}}" data-repo-link="{{.RepoLink}}" data-flag-model="true" data-dataset-uuid="{{.attachment}}" data-dataset-name="{{.dataset_name}}" data-exceed-size="{{DebugAttachSize}}"></div> | |||||
{{if eq .NotStopTaskCount 0}} | {{if eq .NotStopTaskCount 0}} | ||||
{{template "base/alert" .}} | {{template "base/alert" .}} | ||||
{{end}} | {{end}} | ||||
@@ -20,8 +19,8 @@ | |||||
<form id="form_id" class="ui form" action="{{.Link}}" method="post"> | <form id="form_id" class="ui form" action="{{.Link}}" method="post"> | ||||
{{.CsrfTokenHtml}} | {{.CsrfTokenHtml}} | ||||
<input type="hidden" name="type" value="0"> | <input type="hidden" name="type" value="0"> | ||||
<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 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> | ||||
<div class="ui blue mini menu compact selectcloudbrain"> | <div class="ui blue mini menu compact selectcloudbrain"> | ||||
@@ -3,7 +3,7 @@ | |||||
<div class="repository"> | <div class="repository"> | ||||
{{template "repo/header" .}} | {{template "repo/header" .}} | ||||
<div class="ui container"> | <div class="ui container"> | ||||
<div class="cloudbrain-type" style="display: none;" data-cloudbrain-type="{{.datasetType}}" data-repo-link="{{.RepoLink}}" data-flag-model="true" data-exceed-size="{{DebugAttachSize}}"></div> | |||||
<div class="cloudbrain-type" style="display: none;" data-cloudbrain-type="{{.datasetType}}" data-repo-link="{{.RepoLink}}" data-flag-model="true" data-dataset-uuid="{{.attachment}}" data-dataset-name="{{.dataset_name}}" data-exceed-size="{{DebugAttachSize}}"></div> | |||||
{{if eq .NotStopTaskCount 0}} | {{if eq .NotStopTaskCount 0}} | ||||
{{template "base/alert" .}} | {{template "base/alert" .}} | ||||
{{end}} | {{end}} | ||||
@@ -93,8 +93,21 @@ | |||||
<div class="inline min_title required field"> | <div class="inline min_title required field"> | ||||
<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 search dropdown cloudbrain_image width48" placeholder="{{.i18n.Tr "cloudbrain.choose_mirror"}}" style='width:385px' name="image_id"> | <select class="ui search dropdown cloudbrain_image width48" placeholder="{{.i18n.Tr "cloudbrain.choose_mirror"}}" style='width:385px' 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> | ||||
@@ -123,6 +123,17 @@ | |||||
</tr> | </tr> | ||||
<tr class="ti-no-ng-animate"> | <tr class="ti-no-ng-animate"> | ||||
<td class="ti-no-ng-animate ti-text-form-label text-width80"> | <td class="ti-no-ng-animate ti-text-form-label text-width80"> | ||||
{{$.i18n.Tr "repo.cloudbrain_creator"}} | |||||
</td> | |||||
<td class="ti-text-form-content"> | |||||
<div class="text-span text-span-w" id="{{.VersionName}}-mirror"> | |||||
{{.User.Name}} | |||||
</div> | |||||
</td> | |||||
</tr> | |||||
<tr class="ti-no-ng-animate"> | |||||
<td class="ti-no-ng-animate ti-text-form-label text-width80"> | |||||
{{$.i18n.Tr "repo.modelarts.run_version"}} | {{$.i18n.Tr "repo.modelarts.run_version"}} | ||||
</td> | </td> | ||||
@@ -386,10 +397,18 @@ | |||||
<div class="ui tab" data-tab="third{{$k}}"> | <div class="ui tab" data-tab="third{{$k}}"> | ||||
<input type="hidden" name="model{{.VersionName}}" value="-1"> | <input type="hidden" name="model{{.VersionName}}" value="-1"> | ||||
<input type="hidden" name="modelback{{.VersionName}}" value="-1"> | <input type="hidden" name="modelback{{.VersionName}}" value="-1"> | ||||
<div class='ui breadcrumb model_file_bread' id='file_breadcrumb{{.VersionName}}'> | |||||
<div class="active section">{{.VersionName}}</div> | |||||
<div class="divider"> / </div> | |||||
<div style="display: flex;justify-content: space-between;"> | |||||
<div class='ui breadcrumb model_file_bread' id='file_breadcrumb{{.VersionName}}'> | |||||
<div class="active section">{{.VersionName}}</div> | |||||
<div class="divider"> / </div> | |||||
</div> | |||||
<a id="{{.VersionName}}-result-down" style="padding-right: 1%;display: none;" | |||||
class='{{if $.canDownload}}ti-download-file{{else}}disabled{{end}} file-info' | |||||
href="{{$.RepoLink}}/grampus/train-job/{{.JobID}}/download_multi_model?version_name={{.VersionName}}"> | |||||
<i class="ri-download-cloud-2-line"></i> | |||||
<span style="margin-left: 0.3rem;">{{$.i18n.Tr "repo.all_result_download"}}</span> | |||||
</a> | |||||
</div> | </div> | ||||
<div id="dir_list{{.VersionName}}"> | <div id="dir_list{{.VersionName}}"> | ||||
</div> | </div> | ||||
@@ -353,10 +353,18 @@ | |||||
<div class="ui tab" data-tab="third"> | <div class="ui tab" data-tab="third"> | ||||
<input type="hidden" name="model{{.VersionName}}" value="-1"> | <input type="hidden" name="model{{.VersionName}}" value="-1"> | ||||
<input type="hidden" name="modelback{{.VersionName}}" value="-1"> | <input type="hidden" name="modelback{{.VersionName}}" value="-1"> | ||||
<div class='ui breadcrumb model_file_bread' id='file_breadcrumb{{.VersionName}}'> | |||||
<div class="active section">result</div> | |||||
<div class="divider"> / </div> | |||||
<div style="display: flex;justify-content: space-between;"> | |||||
<div class='ui breadcrumb model_file_bread' id='file_breadcrumb{{.VersionName}}'> | |||||
<div class="active section">result</div> | |||||
<div class="divider"> / </div> | |||||
</div> | |||||
<a id="{{.VersionName}}-result-down" style="padding-right: 1%;display: none;" | |||||
class='{{if $.canDownload}}ti-download-file{{else}}disabled{{end}} file-info' | |||||
href="{{$.RepoLink}}/modelarts/inference-job/{{.JobID}}/downloadall?version_name={{.VersionName}}"> | |||||
<i class="ri-download-cloud-2-line"></i> | |||||
<span style="margin-left: 0.3rem;">{{$.i18n.Tr "repo.all_result_download"}}</span> | |||||
</a> | |||||
</div> | </div> | ||||
<div id="dir_list{{.VersionName}}"> | <div id="dir_list{{.VersionName}}"> | ||||
@@ -4,7 +4,7 @@ | |||||
{{template "repo/header" .}} | {{template "repo/header" .}} | ||||
<div class="ui container"> | <div class="ui container"> | ||||
<div class="cloudbrain-type" style="display: none;" data-cloudbrain-type="{{.datasetType}}" data-repo-link="{{.RepoLink}}" data-flag-model="true" data-exceed-size="{{DebugAttachSize}}"></div> | |||||
<div class="cloudbrain-type" style="display: none;" data-cloudbrain-type="{{.datasetType}}" data-repo-link="{{.RepoLink}}" data-flag-model="true" data-dataset-uuid="{{.attachment}}" data-dataset-name="{{.dataset_name}}" data-exceed-size="{{DebugAttachSize}}"></div> | |||||
{{if eq .NotStopTaskCount 0}} | {{if eq .NotStopTaskCount 0}} | ||||
{{template "base/alert" .}} | {{template "base/alert" .}} | ||||
{{end}} | {{end}} | ||||
@@ -77,8 +77,21 @@ | |||||
<div class="inline min_title required field"> | <div class="inline min_title required field"> | ||||
<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 id="cloudbrain_image" class="ui search dropdown width48" placeholder="{{.i18n.Tr "cloudbrain.choose_mirror"}}" name="image_id"> | <select id="cloudbrain_image" class="ui search dropdown width48" placeholder="{{.i18n.Tr "cloudbrain.choose_mirror"}}" name="image_id"> | ||||
{{range .images}} | |||||
<option name="image_id" value="{{.Id}}">{{.Value}}</option> | |||||
{{if .image_id}} | |||||
{{range .images}} | |||||
{{if eq $.image_id .Id}} | |||||
<option value="{{.Id}}">{{.Value}}</option> | |||||
{{end}} | |||||
{{end}} | |||||
{{range .images}} | |||||
{{if ne $.image_id .Id}} | |||||
<option value="{{.Id}}">{{.Value}}</option> | |||||
{{end}} | |||||
{{end}} | |||||
{{else}} | |||||
{{range .images}} | |||||
<option name="image_id" value="{{.Id}}">{{.Value}}</option> | |||||
{{end}} | |||||
{{end}} | {{end}} | ||||
</select> | </select> | ||||
</div> | </div> | ||||
@@ -159,6 +159,17 @@ | |||||
</tr> | </tr> | ||||
<tr class="ti-no-ng-animate"> | <tr class="ti-no-ng-animate"> | ||||
<td class="ti-no-ng-animate ti-text-form-label text-width80"> | <td class="ti-no-ng-animate ti-text-form-label text-width80"> | ||||
{{$.i18n.Tr "repo.cloudbrain_creator"}} | |||||
</td> | |||||
<td class="ti-text-form-content"> | |||||
<div class="text-span text-span-w" id="{{.VersionName}}-mirror"> | |||||
{{.User.Name}} | |||||
</div> | |||||
</td> | |||||
</tr> | |||||
<tr class="ti-no-ng-animate"> | |||||
<td class="ti-no-ng-animate ti-text-form-label text-width80"> | |||||
{{$.i18n.Tr "repo.modelarts.run_version"}} | {{$.i18n.Tr "repo.modelarts.run_version"}} | ||||
</td> | </td> | ||||
@@ -411,10 +422,19 @@ | |||||
<div class="ui tab" data-tab="third{{$k}}"> | <div class="ui tab" data-tab="third{{$k}}"> | ||||
<input type="hidden" name="model{{.VersionName}}" value="-1"> | <input type="hidden" name="model{{.VersionName}}" value="-1"> | ||||
<input type="hidden" name="modelback{{.VersionName}}" value="-1"> | <input type="hidden" name="modelback{{.VersionName}}" value="-1"> | ||||
<div class='ui breadcrumb model_file_bread' id='file_breadcrumb{{.VersionName}}'> | |||||
<div style="display: flex;justify-content: space-between;"> | |||||
<div class='ui breadcrumb model_file_bread' id='file_breadcrumb{{.VersionName}}'> | |||||
<div class="active section">{{.VersionName}}</div> | <div class="active section">{{.VersionName}}</div> | ||||
<div class="divider"> / </div> | |||||
<div class="divider"> / </div> | |||||
</div> | |||||
<a id="{{.VersionName}}-result-down" style="padding-right: 1%;display: none;" | |||||
class='{{if $.canDownload}}ti-download-file{{else}}disabled{{end}} file-info' | |||||
href="{{$.RepoLink}}/modelarts/train-job/{{.JobID}}/download_multi_model?version_name={{.VersionName}}"> | |||||
<i class="ri-download-cloud-2-line"></i> | |||||
<span style="margin-left: 0.3rem;">{{$.i18n.Tr "repo.all_result_download"}}</span> | |||||
</a> | |||||
</div> | </div> | ||||
<div id="dir_list{{.VersionName}}" style="max-height: 500px;overflow:auto;"> | <div id="dir_list{{.VersionName}}" style="max-height: 500px;overflow:auto;"> | ||||
@@ -49,7 +49,7 @@ | |||||
{{template "repo/header" .}} | {{template "repo/header" .}} | ||||
<div class="ui container"> | <div class="ui container"> | ||||
{{$Grampus := (or (eq (index (SubJumpablePath .Link) 1) "create_grampus_gpu") (eq (index (SubJumpablePath .Link) 1) "create_grampus_npu"))}} | {{$Grampus := (or (eq (index (SubJumpablePath .Link) 1) "create_grampus_gpu") (eq (index (SubJumpablePath .Link) 1) "create_grampus_npu"))}} | ||||
<div class="cloudbrain-type" style="display: none;" data-grampus="{{$Grampus}}" data-cloudbrain-type="{{.datasetType}}" data-repo-link="{{.RepoLink}}" data-flag-model="true" data-dataset-uuid="{{.attachment}}" data-dataset-name="{{.dataset_name}}" data-queue="{{.QueuesDetail}}" data-queue-start="{{.i18n.Tr "repo.wait_count_start"}}" data-queue-end="{{.i18n.Tr "repo.wait_count_end"}}"></div> | |||||
<div class="cloudbrain-type" style="display: none;" data-grampus="{{$Grampus}}" data-cloudbrain-type="{{.datasetType}}" data-repo-link="{{.RepoLink}}" data-flag-model="true" data-dataset-uuid="{{.attachment}}" data-dataset-name="{{.dataset_name}}"></div> | |||||
{{if eq .NotStopTaskCount 0}} | {{if eq .NotStopTaskCount 0}} | ||||
{{template "base/alert" .}} | {{template "base/alert" .}} | ||||
{{end}} | {{end}} | ||||
@@ -141,40 +141,7 @@ | |||||
onkeydown="this.value=this.value.substring(0, 255)" | onkeydown="this.value=this.value.substring(0, 255)" | ||||
onkeyup="this.value=this.value.substring(0, 255)">{{.description}}</textarea> | onkeyup="this.value=this.value.substring(0, 255)">{{.description}}</textarea> | ||||
</div> | </div> | ||||
<input type="hidden" id="ai_model_version" name="model_version" value="{{$.model_version}}"> | |||||
<div class="required inline min_title fields" style="width: 93.5%;"> | |||||
<label class="label-fix-width label-required" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.infer_job.select_model"}}</label> | |||||
<div class="six wide field"> | |||||
<div class="ui fluid selection dropdown" id="select_model"> | |||||
<input type="hidden" name="model_name" required value="{{.model_name}}"> | |||||
<div class="text"></div> | |||||
<i class="dropdown icon"></i> | |||||
<div class="menu" id="model_name"> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<input type="hidden" name="pre_train_model_url" value="{{.train_url}}"> | |||||
<div class="three wide field"> | |||||
<div class="ui fluid selection dropdown" id="select_model_version"> | |||||
<input type="hidden" name="train_url" required value="{{.train_url}}"> | |||||
<div class="text"></div> | |||||
<i class="dropdown icon"></i> | |||||
<div class="menu" id="model_name_version"></div> | |||||
</div> | |||||
</div> | |||||
<div class="five wide field"> | |||||
<div class="ui fluid selection dropdown" id="select_model_checkpoint"> | |||||
<input type="hidden" name="ckpt_name" required value="{{.ckpt_name}}"> | |||||
<div class="text"></div> | |||||
<i class="dropdown icon"></i> | |||||
<div class="menu" id="model_checkpoint"> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<span > | |||||
<i class="question circle icon" data-content="{{.i18n.Tr "cloudbrain.model_file_postfix_rule"}}" data-position="top center" data-variation="inverted mini"></i> | |||||
</span> | |||||
</div> | |||||
{{template "custom/select_model" .}} | |||||
<div class="required inline min_title field " style="display: none;"> | <div class="required inline min_title field " style="display: none;"> | ||||
<label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.resource_pool"}}</label> | <label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.resource_pool"}}</label> | ||||
<select class="ui dropdown width48" id="trainjob_resource_pool" name="pool_id"> | <select class="ui dropdown width48" id="trainjob_resource_pool" name="pool_id"> | ||||
@@ -544,6 +544,7 @@ export default async function initCloudrainSow() { | |||||
$.get(url, (data) => { | $.get(url, (data) => { | ||||
if (data.StatusOK == 0) { // 成功 0 | if (data.StatusOK == 0) { // 成功 0 | ||||
if (data.Dirs) { | if (data.Dirs) { | ||||
data.Dirs.length !==0 && $(`#${version_name}-result-down`).show() | |||||
renderDir(path, data, version_name, downloadFlag, gpuFlag); | renderDir(path, data, version_name, downloadFlag, gpuFlag); | ||||
} | } | ||||
if (init === "init") { | if (init === "init") { | ||||
@@ -752,200 +753,4 @@ export default async function initCloudrainSow() { | |||||
html += "</div>"; | html += "</div>"; | ||||
$(`#dir_list${version_name}`).append(html); | $(`#dir_list${version_name}`).append(html); | ||||
} | } | ||||
let nameMap, nameList; | |||||
let RepoLink = $(".cloudbrain-type").data("repo-link"); | |||||
let type = $(".cloudbrain-type").data("cloudbrain-type"); | |||||
let flagModel = $(".cloudbrain-type").data("flag-model"); | |||||
// 获取模型列表和模型名称对应的模型版本 | |||||
$(document).ready(function () { | |||||
if (!flagModel) return; | |||||
else { | |||||
$.get( | |||||
`${RepoLink}/modelmanage/query_model_for_predict?type=${type}`, | |||||
(data) => { | |||||
nameMap = data.nameMap; | |||||
nameList = data.nameList; | |||||
let html = `<div class="item"></div>`; | |||||
nameList.forEach((element) => { | |||||
html += `<div class="item" data-value=${element}>${element}</div>`; | |||||
}); | |||||
if (nameList.length !== 0) { | |||||
$("#model_name").append(html); | |||||
} | |||||
let faildModelName = $('input[name="model_name"]').val(); | |||||
let faildModelVersion = $('input[name="model_version"]').val(); | |||||
let dataID; | |||||
// 新建错误的表单返回初始化 | |||||
if (faildModelName && nameList.includes(faildModelName)) { | |||||
$("#select_model").dropdown("set text", faildModelName); | |||||
$("#select_model").dropdown("set value", faildModelName); | |||||
nameMap[faildModelName].forEach((element) => { | |||||
if (element.Version === faildModelVersion) { | |||||
dataID = element.ID; | |||||
} | |||||
}); | |||||
initModelVerison(faildModelName, nameMap, faildModelVersion); | |||||
initModelckpt(dataID); | |||||
} | |||||
} | |||||
); | |||||
} | |||||
$("#select_model").dropdown({ | |||||
onChange: function (value, text, $selectedItem) { | |||||
$("#model_name_version").empty(); | |||||
if (value) { | |||||
let html = ""; | |||||
nameMap[value].forEach((element) => { | |||||
//let { trainTaskInfo } = element; | |||||
//trainTaskInfo = JSON.parse(trainTaskInfo); | |||||
html += `<div class="item" data-label="${element.label}" data-id="${element.id}" data-value="${element.path}">${element.version}</div>`; | |||||
}); | |||||
$("#model_name_version").append(html); | |||||
const initVersionText = $( | |||||
"#model_name_version div.item:first-child" | |||||
).text(); | |||||
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") | |||||
); | |||||
} else { | |||||
$("#select_model_version").dropdown("set text", ""); | |||||
$("#select_model_version").dropdown("set value", ""); | |||||
$("#select_model_checkpoint").dropdown("set text", ""); | |||||
$("#select_model_checkpoint").dropdown("set value", ""); | |||||
$("#model_checkpoint").empty(); | |||||
} | |||||
}, | |||||
}); | |||||
$("#select_model_version").dropdown({ | |||||
onChange: function (value, text, $selectedItem) { | |||||
if (!value) return; | |||||
const dataID = | |||||
$selectedItem && $selectedItem[0].getAttribute("data-id"); | |||||
$("input#ai_model_version").val(text); | |||||
$("#select_model_checkpoint").dropdown("set text", ""); | |||||
$("#select_model_checkpoint").addClass("loading"); | |||||
$("#model_checkpoint").empty(); | |||||
let html = ""; | |||||
loadCheckpointList(dataID).then((res) => { | |||||
res.forEach((element) => { | |||||
const ckptSuffix = element.FileName.split("."); | |||||
const loadCheckpointFile = [ | |||||
"ckpt", | |||||
"pb", | |||||
"h5", | |||||
"json", | |||||
"pkl", | |||||
"pth", | |||||
"t7", | |||||
"pdparams", | |||||
"onnx", | |||||
"pbtxt", | |||||
"keras", | |||||
"mlmodel", | |||||
"cfg", | |||||
"pt", | |||||
]; | |||||
if ( | |||||
!element.IsDir && | |||||
loadCheckpointFile.includes(ckptSuffix[ckptSuffix.length - 1]) | |||||
) { | |||||
html += `<div class="item" data-value="${element.FileName}">${element.FileName}</div>`; | |||||
} | |||||
}); | |||||
$("#model_checkpoint").append(html); | |||||
$("#select_model_checkpoint").removeClass("loading"); | |||||
if (html) { | |||||
$("#select_model_checkpoint").removeClass("error"); | |||||
} | |||||
const initVersionText = $( | |||||
"#model_checkpoint div.item:first-child" | |||||
).text(); | |||||
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") | |||||
); | |||||
}); | |||||
}, | |||||
}); | |||||
}); | |||||
function initModelVerison(value, nameMap, faildModelVersion) { | |||||
let faildTrainUrl = $('input[name="pre_train_model_url"]').val(); | |||||
let html = ""; | |||||
nameMap[value].forEach((element) => { | |||||
let { TrainTaskInfo } = element; | |||||
TrainTaskInfo = JSON.parse(TrainTaskInfo); | |||||
html += `<div class="item" data-label="${element.Label}" data-id="${element.ID}" data-value="${element.Path}">${element.Version}</div>`; | |||||
}); | |||||
$("#model_name_version").append(html); | |||||
$("#select_model_version").dropdown("set text", faildModelVersion); | |||||
$("#select_model_version").dropdown("set value", faildTrainUrl); | |||||
} | |||||
function initModelckpt(dataID) { | |||||
let faildCkptName = $('input[name="ckpt_name"]').val(); | |||||
$("#select_model_checkpoint").addClass("loading"); | |||||
$("#model_checkpoint").empty(); | |||||
let html = ""; | |||||
loadCheckpointList(dataID).then((res) => { | |||||
res.forEach((element) => { | |||||
const ckptSuffix = element.FileName.split("."); | |||||
const loadCheckpointFile = [ | |||||
"ckpt", | |||||
"pb", | |||||
"h5", | |||||
"json", | |||||
"pkl", | |||||
"pth", | |||||
"t7", | |||||
"pdparams", | |||||
"onnx", | |||||
"pbtxt", | |||||
"keras", | |||||
"mlmodel", | |||||
"cfg", | |||||
"pt", | |||||
]; | |||||
if ( | |||||
!element.IsDir && | |||||
loadCheckpointFile.includes(ckptSuffix[ckptSuffix.length - 1]) | |||||
) { | |||||
html += `<div class="item" data-value=${element.FileName}>${element.FileName}</div>`; | |||||
} | |||||
}); | |||||
$("#model_checkpoint").append(html); | |||||
$("#select_model_checkpoint").removeClass("loading"); | |||||
$("#select_model_checkpoint").dropdown("set text", faildCkptName); | |||||
$("#select_model_checkpoint").dropdown("set value", faildCkptName); | |||||
}); | |||||
} | |||||
function loadCheckpointList(value) { | |||||
return new Promise((resolve, reject) => { | |||||
$.get( | |||||
`${RepoLink}/modelmanage/query_modelfile_for_predict`, | |||||
{ id: value }, | |||||
(data) => { | |||||
resolve(data); | |||||
} | |||||
); | |||||
}); | |||||
} | |||||
} | } |
@@ -58,8 +58,8 @@ export default async function initCloudrain() { | |||||
const duration = data.JobDuration; | const duration = data.JobDuration; | ||||
const aiCenter = data.AiCenter || '--' | const aiCenter = data.AiCenter || '--' | ||||
$("#duration-" + ID).text(duration); | $("#duration-" + ID).text(duration); | ||||
$("#cluster-" + ID).text(aiCenter); | |||||
$("#" + versionname + "-ai_center").text(data.AiCenter); | |||||
data.AiCenter != undefined && $("#cluster-" + ID).text(aiCenter); | |||||
data.AiCenter != undefined && $("#" + versionname + "-ai_center").text(data.AiCenter); | |||||
if (status != status_text) { | if (status != status_text) { | ||||
$("#" + ID + "-icon") | $("#" + ID + "-icon") | ||||
.removeClass() | .removeClass() | ||||
@@ -224,7 +224,7 @@ export default async function initCloudrain() { | |||||
data.StartTime !== undefined && data.StartTime > 0 && $("#" + versionname + "-startTime").text(timeFormat(new Date(data.StartTime * 1000))); | data.StartTime !== undefined && data.StartTime > 0 && $("#" + versionname + "-startTime").text(timeFormat(new Date(data.StartTime * 1000))); | ||||
$("#" + versionname + "-duration").text(data.JobDuration); | $("#" + versionname + "-duration").text(data.JobDuration); | ||||
$("#" + versionname + "-status").text(data.JobStatus); | $("#" + versionname + "-status").text(data.JobStatus); | ||||
$("#" + versionname + "-ai_center").text(data.AiCenter); | |||||
data.AiCenter != undefined && $("#" + versionname + "-ai_center").text(data.AiCenter); | |||||
if (stopArray.includes(data.JobStatus)) { | if (stopArray.includes(data.JobStatus)) { | ||||
$("#" + versionname + "-stop").addClass("disabled"); | $("#" + versionname + "-stop").addClass("disabled"); | ||||
@@ -483,43 +483,6 @@ export default async function initCloudrain() { | |||||
const redirect_to = this.dataset.linkpath; | const redirect_to = this.dataset.linkpath; | ||||
debugAgain(ID, repoPath, redirect_to); | debugAgain(ID, repoPath, redirect_to); | ||||
}); | }); | ||||
function setWaitNums() { | |||||
if ($(".cloudbrain-type").length === 0 && $(".gpu-type").length === 0) { | |||||
return; | |||||
} | |||||
if ( | |||||
$(".cloudbrain-type").length !== 0 && | |||||
!$(".cloudbrain-type").data("queue") | |||||
) { | |||||
return; | |||||
} | |||||
let waitNums = $(".cloudbrain-type").data("queue").split("map")[1]; | |||||
let test = new Map(); | |||||
let waitNumsArray = waitNums.split(" "); | |||||
waitNumsArray.forEach((element, index) => { | |||||
if (index === 0) { | |||||
test.set(element.slice(1, -2), parseInt(element.slice(-1))); | |||||
} else if (index === waitNumsArray.length - 1) { | |||||
test.set(element.slice(0, -3), parseInt(element.slice(-2, -1))); | |||||
} else { | |||||
test.set(element.slice(0, -2), parseInt(element.slice(-1))); | |||||
} | |||||
}); | |||||
$(".ui.search.dropdown.gpu-type").dropdown({ | |||||
onChange: function (value, text, $selectedItem) { | |||||
let gpuTypeNums = test.get(value); | |||||
let gpuTypeNumString = | |||||
$(".cloudbrain-type").data("queue-start") + | |||||
" " + | |||||
gpuTypeNums + | |||||
" " + | |||||
$(".cloudbrain-type").data("queue-end"); | |||||
$("#gpu-nums").text(gpuTypeNumString); | |||||
}, | |||||
}); | |||||
} | |||||
setWaitNums(); | |||||
} | } | ||||
function userSearchControll() { | function userSearchControll() { | ||||
@@ -183,6 +183,200 @@ | |||||
validate(); | validate(); | ||||
}); | }); | ||||
//管理镜像相关的东西 | |||||
let nameMap, nameList; | |||||
let RepoLink = $(".cloudbrain-type").data("repo-link"); | |||||
let type = $(".cloudbrain-type").data("cloudbrain-type"); | |||||
let flagModel = $(".cloudbrain-type").data("flag-model"); | |||||
// 获取模型列表和模型名称对应的模型版本 | |||||
$(document).ready(function () { | |||||
if (!flagModel) return; | |||||
else { | |||||
$.get( | |||||
`${RepoLink}/modelmanage/query_model_for_predict?type=${type}`, | |||||
(data) => { | |||||
nameMap = data.nameMap; | |||||
nameList = data.nameList; | |||||
let html = `<div class="item"></div>`; | |||||
nameList.forEach((element) => { | |||||
html += `<div class="item" data-value=${element}>${element}</div>`; | |||||
}); | |||||
if (nameList.length !== 0) { | |||||
$("#model_name").append(html); | |||||
} | |||||
let faildModelName = $('input[name="model_name"]').val(); | |||||
let faildModelVersion = $('input[name="model_version"]').val(); | |||||
let dataID; | |||||
// 新建错误的表单返回初始化 | |||||
if (faildModelName && nameList.includes(faildModelName)) { | |||||
$("#select_model").dropdown("set text", faildModelName); | |||||
$("#select_model").dropdown("set value", faildModelName); | |||||
nameMap[faildModelName].forEach((element) => { | |||||
if (element.version === faildModelVersion) { | |||||
dataID = element.id; | |||||
} | |||||
}); | |||||
initModelVerison(faildModelName, nameMap, faildModelVersion); | |||||
initModelckpt(dataID); | |||||
} | |||||
} | |||||
); | |||||
} | |||||
$("#select_model").dropdown({ | |||||
onChange: function (value, text, $selectedItem) { | |||||
$("#model_name_version").empty(); | |||||
if (value) { | |||||
let html = ""; | |||||
nameMap[value].forEach((element) => { | |||||
//let { trainTaskInfo } = element; | |||||
//trainTaskInfo = JSON.parse(trainTaskInfo); | |||||
html += `<div class="item" data-label="${element.label}" data-id="${element.id}" data-value="${element.path}">${element.version}</div>`; | |||||
}); | |||||
$("#model_name_version").append(html); | |||||
const initVersionText = $( | |||||
"#model_name_version div.item:first-child" | |||||
).text(); | |||||
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") | |||||
); | |||||
} else { | |||||
$("#select_model_version").dropdown("set text", ""); | |||||
$("#select_model_version").dropdown("set value", ""); | |||||
$("#select_model_checkpoint").dropdown("set text", ""); | |||||
$("#select_model_checkpoint").dropdown("set value", ""); | |||||
$("#model_checkpoint").empty(); | |||||
} | |||||
}, | |||||
}); | |||||
$("#select_model_version").dropdown({ | |||||
onChange: function (value, text, $selectedItem) { | |||||
if (!value) return; | |||||
const dataID = | |||||
$selectedItem && $selectedItem[0].getAttribute("data-id"); | |||||
$("input#ai_model_version").val(text); | |||||
$("#select_model_checkpoint").dropdown("set text", ""); | |||||
$("#select_model_checkpoint").addClass("loading"); | |||||
$("#model_checkpoint").empty(); | |||||
let html = ""; | |||||
loadCheckpointList(dataID).then((res) => { | |||||
res.forEach((element) => { | |||||
const ckptSuffix = element.FileName.split("."); | |||||
const loadCheckpointFile = [ | |||||
"ckpt", | |||||
"pb", | |||||
"h5", | |||||
"json", | |||||
"pkl", | |||||
"pth", | |||||
"t7", | |||||
"pdparams", | |||||
"onnx", | |||||
"pbtxt", | |||||
"keras", | |||||
"mlmodel", | |||||
"cfg", | |||||
"pt", | |||||
]; | |||||
if ( | |||||
!element.IsDir && | |||||
loadCheckpointFile.includes(ckptSuffix[ckptSuffix.length - 1]) | |||||
) { | |||||
html += `<div class="item" data-value="${element.FileName}">${element.FileName}</div>`; | |||||
} | |||||
}); | |||||
$("#model_checkpoint").append(html); | |||||
$("#select_model_checkpoint").removeClass("loading"); | |||||
if (html) { | |||||
$("#select_model_checkpoint").removeClass("error"); | |||||
} | |||||
const initVersionText = $( | |||||
"#model_checkpoint div.item:first-child" | |||||
).text(); | |||||
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") | |||||
); | |||||
}); | |||||
}, | |||||
}); | |||||
}); | |||||
function initModelVerison(value, nameMap, faildModelVersion) { | |||||
let faildTrainUrl = $('input[name="pre_train_model_url"]').val(); | |||||
let html = ""; | |||||
nameMap[value].forEach((element) => { | |||||
html += `<div class="item" data-label="${element.label}" data-id="${element.id}" data-value="${element.path}">${element.version}</div>`; | |||||
}); | |||||
$("#model_name_version").append(html); | |||||
$("#select_model_version").dropdown("set text", faildModelVersion); | |||||
$("#select_model_version").dropdown("set value", faildTrainUrl); | |||||
} | |||||
function initModelckpt(dataID) { | |||||
let faildCkptName = $('input[name="ckpt_name"]').val(); | |||||
$("#select_model_checkpoint").addClass("loading"); | |||||
$("#model_checkpoint").empty(); | |||||
let html = ""; | |||||
loadCheckpointList(dataID).then((res) => { | |||||
res.forEach((element) => { | |||||
const ckptSuffix = element.FileName.split("."); | |||||
const loadCheckpointFile = [ | |||||
"ckpt", | |||||
"pb", | |||||
"h5", | |||||
"json", | |||||
"pkl", | |||||
"pth", | |||||
"t7", | |||||
"pdparams", | |||||
"onnx", | |||||
"pbtxt", | |||||
"keras", | |||||
"mlmodel", | |||||
"cfg", | |||||
"pt", | |||||
]; | |||||
if ( | |||||
!element.IsDir && | |||||
loadCheckpointFile.includes(ckptSuffix[ckptSuffix.length - 1]) | |||||
) { | |||||
html += `<div class="item" data-value=${element.FileName}>${element.FileName}</div>`; | |||||
} | |||||
}); | |||||
$("#model_checkpoint").append(html); | |||||
$("#select_model_checkpoint").removeClass("loading"); | |||||
$("#select_model_checkpoint").dropdown("set text", faildCkptName); | |||||
$("#select_model_checkpoint").dropdown("set value", faildCkptName); | |||||
}); | |||||
} | |||||
function loadCheckpointList(value) { | |||||
return new Promise((resolve, reject) => { | |||||
$.get( | |||||
`${RepoLink}/modelmanage/query_modelfile_for_predict`, | |||||
{ id: value }, | |||||
(data) => { | |||||
resolve(data); | |||||
} | |||||
); | |||||
}); | |||||
} | |||||
// 评测任务相关创建func | // 评测任务相关创建func | ||||
let repoLink = $(".cloudbrain-type").data("repo-link"); | let repoLink = $(".cloudbrain-type").data("repo-link"); | ||||
function setChildType(type_id=1) { | function setChildType(type_id=1) { | ||||
@@ -752,6 +752,8 @@ i.SUCCEEDED { | |||||
.disabled { | .disabled { | ||||
cursor: pointer; | cursor: pointer; | ||||
pointer-events: none; | pointer-events: none; | ||||
opacity: .45!important; | |||||
color: rgba(0,0,0,.6); | |||||
} | } | ||||
.left2 { | .left2 { | ||||
margin-left: -2px !important; | margin-left: -2px !important; | ||||