Browse Source

Merge branch 'V20220718' into zouap_static

tags/v1.22.7.2^2^2
zouap 3 years ago
parent
commit
66bade8fb8
27 changed files with 182 additions and 227 deletions
  1. +1
    -1
      models/cloudbrain.go
  2. +1
    -0
      modules/auth/cloudbrain.go
  3. +2
    -0
      modules/cloudbrain/cloudbrain.go
  4. +1
    -1
      routers/api/v1/api.go
  5. +4
    -4
      routers/api/v1/repo/cloudbrain.go
  6. +43
    -4
      routers/repo/cloudbrain.go
  7. +7
    -1
      routers/repo/modelarts.go
  8. +2
    -3
      templates/custom/wait_count.tmpl
  9. +9
    -9
      templates/custom/wait_count_train.tmpl
  10. +2
    -2
      templates/repo/cloudbrain/benchmark/new.tmpl
  11. +1
    -6
      templates/repo/cloudbrain/benchmark/show.tmpl
  12. +1
    -1
      templates/repo/cloudbrain/inference/new.tmpl
  13. +5
    -6
      templates/repo/cloudbrain/inference/show.tmpl
  14. +2
    -38
      templates/repo/cloudbrain/show.tmpl
  15. +1
    -1
      templates/repo/cloudbrain/trainjob/new.tmpl
  16. +8
    -3
      templates/repo/cloudbrain/trainjob/show.tmpl
  17. +2
    -2
      templates/repo/debugjob/index.tmpl
  18. +1
    -1
      templates/repo/grampus/trainjob/gpu/new.tmpl
  19. +1
    -1
      templates/repo/grampus/trainjob/npu/new.tmpl
  20. +7
    -69
      templates/repo/grampus/trainjob/show.tmpl
  21. +1
    -1
      templates/repo/modelarts/inferencejob/new.tmpl
  22. +7
    -7
      templates/repo/modelarts/inferencejob/show.tmpl
  23. +2
    -8
      templates/repo/modelarts/notebook/show.tmpl
  24. +1
    -1
      templates/repo/modelarts/trainjob/new.tmpl
  25. +13
    -47
      templates/repo/modelarts/trainjob/show.tmpl
  26. +23
    -7
      web_src/js/features/cloudbrainShow.js
  27. +34
    -3
      web_src/js/features/cloudrbanin.js

+ 1
- 1
models/cloudbrain.go View File

@@ -1803,7 +1803,7 @@ func GetBenchmarkCountByUserID(userID int64) (int, error) {
func GetWaitingCloudbrainCount(cloudbrainType int, computeResource string, jobTypes ...JobType) (int64, error) {
sess := x.Where("status=? and type=?", JobWaiting, cloudbrainType)
if len(jobTypes) > 0 {
sess.In("JobType", jobTypes)
sess.In("job_type", jobTypes)
}
if computeResource != "" {
sess.And("compute_resource=?", computeResource)


+ 1
- 0
modules/auth/cloudbrain.go View File

@@ -69,6 +69,7 @@ type CreateCloudBrainInferencForm struct {
ModelName string `form:"model_name" binding:"Required"`
ModelVersion string `form:"model_version" binding:"Required"`
CkptName string `form:"ckpt_name" binding:"Required"`
LabelName string `form:"label_names" binding:"Required"`
}

func (f *CreateCloudBrainForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {


+ 2
- 0
modules/cloudbrain/cloudbrain.go View File

@@ -78,6 +78,7 @@ type GenerateCloudBrainTaskReq struct {
ModelName string
ModelVersion string
CkptName string
LabelName string
}

func GetCloudbrainDebugCommand() string {
@@ -400,6 +401,7 @@ func GenerateTask(req GenerateCloudBrainTaskReq) error {
ModelVersion: req.ModelVersion,
CkptName: req.CkptName,
ResultUrl: req.ResultPath,
LabelName: req.LabelName,
CreatedUnix: createTime,
UpdatedUnix: createTime,
CommitID: req.CommitID,


+ 1
- 1
routers/api/v1/api.go View File

@@ -925,7 +925,7 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Group("/inference-job", func() {
m.Group("/:jobid", func() {
m.Get("", repo.GetCloudBrainInferenceJob)
m.Post("/del", cloudbrain.AdminOrOwnerOrJobCreaterRight, repo.DelCloudBrainJob)
m.Post("/del", cloudbrain.AdminOrOwnerOrJobCreaterRightForTrain, repo.DelCloudBrainJob)
m.Get("/result_list", repo.InferencJobResultList)
})
})


+ 4
- 4
routers/api/v1/repo/cloudbrain.go View File

@@ -157,15 +157,15 @@ func DelCloudBrainJob(ctx *context.APIContext) {

if errStr != "" {
ctx.JSON(http.StatusOK, map[string]interface{}{
"message": ctx.Tr(errStr),
"Message": ctx.Tr(errStr),
"VersionName": "1",
"code": 1,
"Code": 1,
})
} else {
ctx.JSON(http.StatusOK, map[string]interface{}{
"message": "",
"Message": "",
"VersionName": "1",
"code": 0,
"Code": 0,
})
}



+ 43
- 4
routers/repo/cloudbrain.go View File

@@ -131,10 +131,12 @@ func cloudBrainNewDataPrepare(ctx *context.Context) error {
}
ctx.Data["train_gpu_types"] = trainGpuInfos.GpuInfo

if inferenceGpuInfos == nil {
if inferenceGpuInfos == nil && setting.InferenceGpuTypes != "" {
json.Unmarshal([]byte(setting.InferenceGpuTypes), &inferenceGpuInfos)
}
ctx.Data["inference_gpu_types"] = inferenceGpuInfos.GpuInfo
if inferenceGpuInfos != nil {
ctx.Data["inference_gpu_types"] = inferenceGpuInfos.GpuInfo
}

if benchmarkGpuInfos == nil {
json.Unmarshal([]byte(setting.BenchmarkGpuTypes), &benchmarkGpuInfos)
@@ -156,10 +158,12 @@ func cloudBrainNewDataPrepare(ctx *context.Context) error {
}
ctx.Data["train_resource_specs"] = cloudbrain.TrainResourceSpecs.ResourceSpec

if cloudbrain.InferenceResourceSpecs == nil {
if cloudbrain.InferenceResourceSpecs == nil && setting.InferenceResourceSpecs != "" {
json.Unmarshal([]byte(setting.InferenceResourceSpecs), &cloudbrain.InferenceResourceSpecs)
}
ctx.Data["inference_resource_specs"] = cloudbrain.InferenceResourceSpecs.ResourceSpec
if cloudbrain.InferenceResourceSpecs != nil {
ctx.Data["inference_resource_specs"] = cloudbrain.InferenceResourceSpecs.ResourceSpec
}

if cloudbrain.SpecialPools != nil {
var debugGpuTypes []*models.GpuInfo
@@ -261,6 +265,7 @@ func CloudBrainCreate(ctx *context.Context, form auth.CreateCloudBrainForm) {
}

if !jobNamePattern.MatchString(displayJobName) {
cloudBrainNewDataPrepare(ctx)
ctx.RenderWithErr(ctx.Tr("repo.cloudbrain_jobname_err"), tpl, &form)
return
}
@@ -384,6 +389,7 @@ func CloudBrainInferenceJobCreate(ctx *context.Context, form auth.CreateCloudBra
codePath := setting.JobPath + jobName + cloudbrain.CodeMountPath
resourceSpecId := form.ResourceSpecId
branchName := form.BranchName
labelName := form.LabelName
repo := ctx.Repo.Repository

ckptUrl := setting.Attachment.Minio.RealPath + form.TrainUrl + form.CkptName
@@ -479,6 +485,7 @@ func CloudBrainInferenceJobCreate(ctx *context.Context, form auth.CreateCloudBra
ModelVersion: form.ModelVersion,
CkptName: form.CkptName,
TrainUrl: form.TrainUrl,
LabelName: labelName,
}

err = cloudbrain.GenerateTask(req)
@@ -660,14 +667,35 @@ func cloudBrainShow(ctx *context.Context, tpName base.TplName, jobType models.Jo
if cloudbrain.TrainResourceSpecs == nil {
json.Unmarshal([]byte(setting.TrainResourceSpecs), &cloudbrain.TrainResourceSpecs)
}
hasSpec := false
for _, tmp := range cloudbrain.TrainResourceSpecs.ResourceSpec {
if tmp.Id == task.ResourceSpecId {
hasSpec = true
ctx.Data["GpuNum"] = tmp.GpuNum
ctx.Data["CpuNum"] = tmp.CpuNum
ctx.Data["MemMiB"] = tmp.MemMiB
ctx.Data["ShareMemMiB"] = tmp.ShareMemMiB
}
}

if !hasSpec && cloudbrain.SpecialPools != nil {
for _, specialPool := range cloudbrain.SpecialPools.Pools {

if specialPool.ResourceSpec != nil {

for _, spec := range specialPool.ResourceSpec {
if task.ResourceSpecId == spec.Id {
ctx.Data["GpuNum"] = spec.GpuNum
ctx.Data["CpuNum"] = spec.CpuNum
ctx.Data["MemMiB"] = spec.MemMiB
ctx.Data["ShareMemMiB"] = spec.ShareMemMiB
break
}
}
}
}
}

} else if task.JobType == string(models.JobTypeInference) {
if cloudbrain.InferenceResourceSpecs == nil {
json.Unmarshal([]byte(setting.InferenceResourceSpecs), &cloudbrain.InferenceResourceSpecs)
@@ -708,6 +736,15 @@ func cloudBrainShow(ctx *context.Context, tpName base.TplName, jobType models.Jo
ctx.Data["resource_type"] = resourceType.Value
}
}
for _, specialPool := range cloudbrain.SpecialPools.Pools {

for _, resourceType := range specialPool.Pool {
if resourceType.Queue == jobRes.Config.GpuType {
ctx.Data["resource_type"] = resourceType.Value
}
}
}

} else if task.JobType == string(models.JobTypeInference) {
if inferenceGpuInfos == nil {
json.Unmarshal([]byte(setting.InferenceGpuTypes), &inferenceGpuInfos)
@@ -835,6 +872,8 @@ func cloudBrainShow(ctx *context.Context, tpName base.TplName, jobType models.Jo
}

ctx.Data["task"] = task
labelName := strings.Fields(task.LabelName)
ctx.Data["LabelName"] = labelName
ctx.Data["jobName"] = task.JobName
ctx.Data["displayJobName"] = task.DisplayJobName
version_list_task := make([]*models.Cloudbrain, 0)


+ 7
- 1
routers/repo/modelarts.go View File

@@ -1220,7 +1220,13 @@ func getUserCommand(engineId int, req *modelarts.GenerateTrainJobReq) (string, s
userImageUrl := ""
userCommand := ""
if engineId < 0 {
userCommand = "/bin/bash /home/work/run_train.sh 's3://" + req.CodeObsPath + "' 'code/" + req.BootFile + "' '/tmp/log/train.log' --'data_url'='s3://" + req.DataUrl + "' --'train_url'='s3://" + req.TrainUrl + "'"
tmpCodeObsPath := strings.Trim(req.CodeObsPath, "/")
tmpCodeObsPaths := strings.Split(tmpCodeObsPath, "/")
lastCodeDir := "code"
if len(tmpCodeObsPaths) > 0 {
lastCodeDir = tmpCodeObsPaths[len(tmpCodeObsPaths)-1]
}
userCommand = "/bin/bash /home/work/run_train.sh 's3://" + req.CodeObsPath + "' '" + lastCodeDir + "/" + req.BootFile + "' '/tmp/log/train.log' --'data_url'='s3://" + req.DataUrl + "' --'train_url'='s3://" + req.TrainUrl + "'"
var versionInfos modelarts.VersionInfo
if err := json.Unmarshal([]byte(setting.EngineVersions), &versionInfos); err != nil {
log.Info("json parse err." + err.Error())


+ 2
- 3
templates/custom/wait_count.tmpl View File

@@ -3,13 +3,12 @@
{{$gpuQueue := 0}}
{{range $k,$v :=.gpu_types}}
{{if eq $k 0}}
{{ $queue := $v.Queue }}
{{ $queue = $v.Queue }}
{{ end }}
{{ end }}

{{ range $k,$v :=.QueuesDetail }}
{{if eq $k $queue}}
{{$gpuQueue :=$v}}
{{$gpuQueue =$v}}
{{ end }}
{{ end }}
<i


+ 9
- 9
templates/custom/wait_count_train.tmpl View File

@@ -1,28 +1,28 @@
<div class="tooltip-wati-count" style="margin-left: 155px">
{{$queue := ""}}
{{$gpuQueue := 0}}
{{range $k,$v :=.gpu_types}}
{{range $k,$v :=.type}}
{{if eq $k 0}}
{{ $queue := $v.Queue }}
{{ $queue = $v.Queue }}
{{ end }}
{{ end }}

{{ range $k,$v :=.QueuesDetail }}
{{ range $k,$v :=.ctx.QueuesDetail }}
{{if eq $k $queue}}
{{$gpuQueue :=$v}}
{{$gpuQueue =$v}}
{{ end }}
{{ end }}
<i
class="ri-error-warning-line"
style="margin-right: 0.5rem; font-size: 16px"
></i>
<span
>{{.i18n.Tr "repo.wait_count_start"}}
{{if .QueuesDetail}}
<span id="gpu-nums"
>{{.ctx.i18n.Tr "repo.wait_count_start"}}
{{if .type}}
{{ $gpuQueue }}
{{else}}
{{.WaitCount}}
{{.ctx.WaitCount}}
{{ end }}
{{.i18n.Tr "repo.wait_count_end"}}</span
{{.ctx.i18n.Tr "repo.wait_count_end"}}</span
>
</div>

+ 2
- 2
templates/repo/cloudbrain/benchmark/new.tmpl View File

@@ -62,7 +62,7 @@
<a class="active item model_benchmark"
href="{{.Link}}?benchmarkMode=model">{{.i18n.Tr "repo.cloudbrain.benchmark.model"}}</a>
</div>
{{template "custom/wait_count_train" .}}
{{template "custom/wait_count_train" Dict "ctx" $ "type" .benchmark_gpu_types}}
</div>
<div>
<div class="required min_title inline field">
@@ -157,7 +157,7 @@
<a class="item model_benchmark"
href="{{.Link}}?benchmarkMode=model">{{.i18n.Tr "repo.cloudbrain.benchmark.model"}}</a>
</div>
{{template "custom/wait_count_train" .}}
{{template "custom/wait_count_train" Dict "ctx" $ "type" .benchmark_gpu_types}}
</div>

<div>


+ 1
- 6
templates/repo/cloudbrain/benchmark/show.tmpl View File

@@ -232,12 +232,7 @@
<span>
<div class="ac-display-inblock title_text acc-margin-bottom">
<span class="cti-mgRight-sm">
{{if not (eq .StartTime 0)}}
<td>{{TimeSinceUnix1 .StartTime}}</td>
{{else}}
<td>{{TimeSinceUnix1 .CreatedUnix}}
<td>
{{end}}
<td>{{TimeSinceUnix1 .CreatedUnix}}</td>
</span>

<span class="cti-mgRight-sm">{{$.i18n.Tr "repo.modelarts.status"}}:


+ 1
- 1
templates/repo/cloudbrain/inference/new.tmpl View File

@@ -92,7 +92,7 @@
</svg>
Ascend NPU</a>
</div>
{{template "custom/wait_count_train" .}}
{{template "custom/wait_count_train" Dict "ctx" $ "type" .inference_gpu_types}}
</div>
<div class="required min_title inline field">
<label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.job_name"}}</label>


+ 5
- 6
templates/repo/cloudbrain/inference/show.tmpl View File

@@ -266,7 +266,7 @@
onclick="javascript:parseInfo()">{{$.i18n.Tr "repo.cloudbrain.runinfo"}}</a>
<a class="item load-model-file" data-tab="four"
data-path="{{$.RepoLink}}/cloudbrain/inference-job/{{.JobID}}/result_list" data-version="{{.VersionName}}" data-parents="" data-filename="" data-init="init" >{{$.i18n.Tr "repo.model_download"}}</a>
data-gpu-flag="true" data-download-flag="{{$.canDownload}}" data-path="{{$.RepoLink}}/cloudbrain/inference-job/{{.JobID}}/result_list" data-version="{{.VersionName}}" data-parents="" data-filename="" data-init="init" >{{$.i18n.Tr "repo.model_download"}}</a>
</div>
<div class="ui tab active" data-tab="first" style="height:400px">
<div style="padding-top: 10px;">
@@ -317,9 +317,9 @@
<span style="font-size: 12px;" class="">
{{if not (eq .StartTime 0)}}
{{TimeSinceUnix1 .StartTime}}
{{else}}
{{TimeSinceUnix1 .CreatedUnix}}
{{end}}
{{else}}
--
{{end}}
</span>
</div>
</td>
@@ -420,9 +420,8 @@

<td class="ti-text-form-content">
<div class="text-span text-span-w" id="{{.VersionName}}-labels">

{{if .LabelName}}
{{range $.labelName}}
{{range $.LabelName}}
<a class="ui label" title="{{.}}">{{.}}</a>
{{end}}
{{else}}


+ 2
- 38
templates/repo/cloudbrain/show.tmpl View File

@@ -240,12 +240,7 @@
<span>
<div class="ac-display-inblock title_text acc-margin-bottom">
<span class="cti-mgRight-sm">
{{if not (eq .StartTime 0)}}
<td>{{TimeSinceUnix1 .StartTime}}</td>
{{else}}
<td>{{TimeSinceUnix1 .CreatedUnix}}
<td>
{{end}}
<td>{{TimeSinceUnix1 .CreatedUnix}}</td>
</span>

<span class="cti-mgRight-sm">{{$.i18n.Tr "repo.modelarts.status"}}:
@@ -257,9 +252,7 @@
</span>
<span class="cti-mgRight-sm uc-accordionTitle-black"
id="{{.VersionName}}-duration-span">{{$.duration}}</span>
<span data-tooltip="刷新" style="cursor: pointer;" data-inverted=""
onclick="refreshStatus({{.VersionName}})"><i
class="redo icon redo-color"></i></span>
</div>
</span>
</span>
@@ -588,33 +581,4 @@
}
document.getElementById("info_display").innerHTML = html;
}
function stopBubbling(e) {
e = window.event || e;
if (e.stopPropagation) {
e.stopPropagation(); //阻止事件 冒泡传播
} else {
e.cancelBubble = true; //ie兼容
}
}

function refreshStatus(version_name) {
$(".ui.accordion.border-according").each((index, job) => {
const jobID = job.dataset.jobid;
const repoPath = job.dataset.repopath;
const versionname = job.dataset.version
$.get(`/api/v1/repos/${repoPath}/cloudbrain/${jobID}?version_name=${versionname}`, (data) => {
// header status and duration
//$(`#${version_name}-duration-span`).text(data.JobDuration)
$(`#${version_name}-status-span span`).text(data.JobStatus)
$(`#${version_name}-status-span i`).attr("class", data.JobStatus)
// detail status and duration
//$('#'+version_name+'-duration').text(data.JobDuration)
$('#' + version_name + '-status').text(data.JobStatus)
parseLog()
}).fail(function (err) {
console.log(err);
});
stopBubbling(arguments.callee.caller.arguments[0])
})
}
</script>

+ 1
- 1
templates/repo/cloudbrain/trainjob/new.tmpl View File

@@ -126,7 +126,7 @@
</svg>
Ascend NPU</a>
</div>
{{template "custom/wait_count_train" .}}
{{template "custom/wait_count_train" Dict "ctx" $ "type" .train_gpu_types}}
</div>
<div class="required min_title inline field">
<label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.job_name"}}</label>


+ 8
- 3
templates/repo/cloudbrain/trainjob/show.tmpl View File

@@ -288,7 +288,7 @@
onclick="javascript:parseInfo()">{{$.i18n.Tr "repo.cloudbrain.runinfo"}}</a>
<a class="item" data-tab="third{{$k}}"
onclick="loadLog({{.VersionName}})">{{$.i18n.Tr "repo.modelarts.log"}}</a>
<a class="item load-model-file" data-tab="four{{$k}}" data-path="{{$.RepoLink}}/cloudbrain/train-job/{{.JobID}}/model_list" data-version="{{.VersionName}}" data-parents="" data-filename="" data-init="init" >{{$.i18n.Tr "repo.model_download"}}</a>
<a class="item load-model-file" data-tab="four{{$k}}" data-gpu-flag="true" data-download-flag="{{$.canDownload}}" data-path="{{$.RepoLink}}/cloudbrain/train-job/{{.JobID}}/model_list" data-version="{{.VersionName}}" data-parents="" data-filename="" data-init="init" >{{$.i18n.Tr "repo.model_download"}}</a>
</div>
<div class="ui tab active" data-tab="first{{$k}}">
<div style="padding-top: 10px;">
@@ -326,8 +326,13 @@

<td class="ti-text-form-content">
<div class="text-span text-span-w">
<span style="font-size: 12px;"
class="">{{TimeSinceUnix1 .CreatedUnix}}</span>
<span style="font-size: 12px;">
{{if not (eq .StartTime 0)}}
{{TimeSinceUnix1 .StartTime}}
{{else}}
--
{{end}}
</span>
</div>
</td>
</tr>


+ 2
- 2
templates/repo/debugjob/index.tmpl View File

@@ -386,7 +386,7 @@
{{$.CsrfTokenHtml}}
{{if .CanDel}}
<a id="ai-stop-{{.Cloudbrain.ID}}"
class='ui basic ai_stop {{if eq .Status "STOPPED" "FAILED" "START_FAILED" "STOPPING" "CREATING" "STARTING" "SUCCEEDED"}}disabled {{else}}blue {{end}}button'
class='ui basic ai_stop {{if eq .Status "STOPPED" "FAILED" "START_FAILED" "STOPPING" "CREATING" "STARTING" "SUCCEEDED" "CREATE_FAILED"}}disabled {{else}}blue {{end}}button'
data-repopath="{{$.RepoLink}}{{if eq .ComputeResource "CPU/GPU"}}/cloudbrain{{else}}/modelarts/notebook{{end}}/{{.Cloudbrain.ID}}/stop"
data-jobid="{{.Cloudbrain.ID}}">
{{$.i18n.Tr "repo.stop"}}
@@ -405,7 +405,7 @@
{{$.CsrfTokenHtml}}
{{if .CanDel}}
<a id="ai-delete-{{.Cloudbrain.ID}}"
class='ui basic ai_delete {{if eq .Status "STOPPED" "FAILED" "START_FAILED" "SUCCEEDED"}}blue {{else}}disabled {{end}}button'
class='ui basic ai_delete {{if eq .Status "STOPPED" "FAILED" "START_FAILED" "SUCCEEDED" "CREATE_FAILED"}}blue {{else}}disabled {{end}}button'
style="border-radius: .28571429rem;">
{{$.i18n.Tr "repo.delete"}}
</a>


+ 1
- 1
templates/repo/grampus/trainjob/gpu/new.tmpl View File

@@ -113,7 +113,7 @@
</svg>
Ascend NPU</a>
</div>
{{template "custom/wait_count_train" .}}
{{template "custom/wait_count_train" Dict "ctx" $}}
</div>
<div class="required min_title inline field">
<label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.job_name"}}</label>


+ 1
- 1
templates/repo/grampus/trainjob/npu/new.tmpl View File

@@ -108,7 +108,7 @@
</svg>
Ascend NPU</a>
</div>
{{template "custom/wait_count_train" .}}
{{template "custom/wait_count_train" Dict "ctx" $}}
</div>
<div class="required min_title inline field">


+ 7
- 69
templates/repo/grampus/trainjob/show.tmpl View File

@@ -236,7 +236,7 @@
</h4>
{{range $k ,$v := .version_list_task}}
<div class="ui accordion border-according" id="accordion{{.VersionName}}"
data-repopath="{{$.RepoRelPath}}/modelarts/train-job" data-jobid="{{.JobID}}"
data-repopath="{{$.RepoRelPath}}/grampus/train-job" data-jobid="{{.JobID}}"
data-version="{{.VersionName}}">
<div class="{{if eq $k 0}}active{{end}} title padding0">
<div class="according-panel-heading">
@@ -251,12 +251,7 @@
<div class="ac-display-inblock title_text acc-margin-bottom">

<span class="cti-mgRight-sm">
{{if not (eq .StartTime 0)}}
{{TimeSinceUnix1 .StartTime}}
{{else}}
{{TimeSinceUnix1 .CreatedUnix}}
{{end}}</span>
<span class="cti-mgRight-sm">{{TimeSinceUnix1 .CreatedUnix}}</span>
<span class="cti-mgRight-sm">
{{$.i18n.Tr "repo.modelarts.current_version"}}:{{.VersionName}}</span>
<span class="cti-mgRight-sm">
@@ -270,9 +265,9 @@
class="cti-mgRight-sm">{{$.i18n.Tr "repo.modelarts.train_job.dura_time"}}:</span>
<span class="cti-mgRight-sm uc-accordionTitle-black"
id="{{.VersionName}}-duration-span">{{.TrainJobDuration}}</span>
<span data-tooltip="刷新" style="cursor: pointer;" data-inverted=""
onclick="refreshStatus({{.VersionName}})"><i
class="redo icon redo-color"></i></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 style="float: right;">
@@ -298,7 +293,7 @@
data-tab="first{{$k}}">{{$.i18n.Tr "repo.modelarts.train_job.config"}}</a>
<a class="item" data-tab="second{{$k}}"
onclick="loadLog({{.VersionName}})">{{$.i18n.Tr "repo.modelarts.log"}}</a>
<a class="item load-model-file" data-tab="third{{$k}}" data-path="{{$.RepoLink}}/modelarts/train-job/{{.JobID}}/model_list" data-version="{{.VersionName}}" data-parents="" data-filename="" data-init="init" >{{$.i18n.Tr "repo.model_download"}}</a>
<a class="item load-model-file" data-tab="third{{$k}}" data-download-flag="{{$.canDownload}}" data-path="{{$.RepoLink}}/modelarts/train-job/{{.JobID}}/model_list" data-version="{{.VersionName}}" data-parents="" data-filename="" data-init="init" >{{$.i18n.Tr "repo.model_download"}}</a>
</div>
<div class="ui tab active" data-tab="first{{$k}}">
<div style="padding-top: 10px;">
@@ -350,7 +345,7 @@
{{if not (eq .StartTime 0)}}
{{TimeSinceUnix1 .StartTime}}
{{else}}
{{TimeSinceUnix1 .CreatedUnix}}
--
{{end}}</span>
</div>
</td>
@@ -871,64 +866,7 @@
size = size.toFixed(0);//保留的小数位数
return size + unitArr[index];
}
function refreshStatus(version_name) {
$.get(`/api/v1/repos/${userName}/${repoPath}/grampus/train-job/${jobID}?version_name=${version_name}`, (data) => {
// header status and duration
$(`#${version_name}-duration-span`).text(data.JobDuration)
$(`#${version_name}-status-span span`).text(data.JobStatus)
$(`#${version_name}-status-span i`).attr("class", data.JobStatus)
// detail status and duration
$('#' + version_name + '-duration').text(data.JobDuration)
$('#' + version_name + '-status').text(data.JobStatus)
$('#' + version_name + '-ai_center').text(data.AiCenter)
loadLog(version_name)


}).fail(function (err) {
console.log(err);
});
stopBubbling(arguments.callee.caller.arguments[0])
}
function deleteVersion(version_name) {
stopBubbling(arguments.callee.caller.arguments[0])
let flag = 1;
$('.ui.basic.modal').modal({
onDeny: function () {
flag = false
},
onApprove: function () {
$.post(`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/del_version`, { version_name: version_name }, (data) => {
if (data.VersionListCount === 0) {
location.href = `/${userName}/${repoPath}/modelarts/train-job`
} else {
$('#accordion' + version_name).remove()
}

}).fail(function (err) {
console.log(err);
});
flag = true
},
onHidden: function () {
if (flag == false) {
$('.alert').html('您已取消操作').removeClass('alert-success').addClass('alert-danger').show().delay(1500).fadeOut();
}
}
})
.modal('show')

}
function stopVersion(version_name) {
stopBubbling(arguments.callee.caller.arguments[0])
$.post(`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/stop_version`, { version_name: version_name }, (data) => {
if (data.StatusOK === 0) {
$('#' + version_name + '-stop').addClass('disabled')
refreshStatus(version_name)
}
}).fail(function (err) {
console.log(err);
});
}
function loadLog(version_name) {
document.getElementById("mask").style.display = "block"
$.get(`/api/v1/repos/${userName}/${repoPath}/grampus/train-job/${jobID}/log?version_name=${version_name}&lines=50&order=asc`, (data) => {


+ 1
- 1
templates/repo/modelarts/inferencejob/new.tmpl View File

@@ -90,7 +90,7 @@
</svg>
Ascend NPU</a>
</div>
{{template "custom/wait_count_train" .}}
{{template "custom/wait_count_train" Dict "ctx" $}}
</div>
<div class="required min_title inline field">
<label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.job_name"}}</label>


+ 7
- 7
templates/repo/modelarts/inferencejob/show.tmpl View File

@@ -214,7 +214,7 @@ td, th {

<a class="active item" data-tab="first">{{$.i18n.Tr "repo.modelarts.train_job.config"}}</a>
<a class="item log_bottom" data-tab="second" data-version="{{.VersionName}}">{{$.i18n.Tr "repo.modelarts.log"}}</a>
<a class="item load-model-file" data-tab="third" data-path="{{$.RepoLink}}/modelarts/inference-job/{{.JobID}}/result_list" data-version="{{.VersionName}}" data-parents="" data-filename="" data-init="init" >{{$.i18n.Tr "repo.model_download"}}</a>
<a class="item load-model-file" data-tab="third" data-download-flag="{{$.canDownload}}" data-path="{{$.RepoLink}}/modelarts/inference-job/{{.JobID}}/result_list" data-version="{{.VersionName}}" data-parents="" data-filename="" data-init="init" >{{$.i18n.Tr "repo.model_download"}}</a>
</div>

<div class="ui tab active" data-tab="first" style="height:400px">
@@ -266,9 +266,9 @@ td, th {
<span style="font-size: 12px;" class="">
{{if not (eq .StartTime 0)}}
{{TimeSinceUnix1 .StartTime}}
{{else}}
{{TimeSinceUnix1 .CreatedUnix}}
{{end}}
{{else}}
--
{{end}}
</span>
</div>
</td>
@@ -451,10 +451,10 @@ td, th {
<div class="ui tab" data-tab="second">
<div>
<a id="{{.VersionName}}-log-down"
class='{{if and (.CanModify) (eq .Status "KILLED" "FAILED" "START_FAILED" "STOPPED" "COMPLETED") }}ti-download-file{{else}}disabled{{end}}'
class='{{if and ($.canDownload) (eq .Status "KILLED" "FAILED" "START_FAILED" "STOPPED" "COMPLETED") }}ti-download-file{{else}}disabled{{end}}'
href="{{$.RepoLink}}/modelarts/train-job/{{.JobID}}/download_log_file?version_name={{.VersionName}}">
<i class="ri-download-cloud-2-line"></i>
<span style="margin-left: 0.3rem;">{{$.i18n.Tr "repo.modelarts.download_log"}}</span>{{.CanModify}}
<span style="margin-left: 0.3rem;">{{$.i18n.Tr "repo.modelarts.download_log"}}</span>
</a>

</div>
@@ -507,7 +507,7 @@ td, th {
</div>
{{template "base/footer" .}}
<script>
console.log('{{.CanModify}}')
console.log('{{$.canDownload}}')
$(document).ready(function(){
$('.secondary.menu .item').tab();
});


+ 2
- 8
templates/repo/modelarts/notebook/show.tmpl View File

@@ -246,14 +246,8 @@
<span>
<div class="ac-display-inblock title_text acc-margin-bottom">
<span class="cti-mgRight-sm">
{{if not (eq .StartTime 0)}}
<td>{{TimeSinceUnix1 .StartTime}}</td>
{{else}}
<td>{{TimeSinceUnix1 .CreatedUnix}}
<td>
{{end}}
{{TimeSinceUnix1 .CreatedUnix}}
</span>

<span class="cti-mgRight-sm">{{$.i18n.Tr "repo.modelarts.status"}}:
<span id="{{.VersionName}}-status-span"><i id="icon"
style="vertical-align: middle;" class="{{.Status}}"></i><span id="text"
@@ -413,7 +407,7 @@
</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">
{{$.i18n.Tr "repo.modelarts.train_job.dura_time"}}
</td>


+ 1
- 1
templates/repo/modelarts/trainjob/new.tmpl View File

@@ -118,7 +118,7 @@
</svg>
Ascend NPU</a>
</div>
{{template "custom/wait_count_train" .}}
{{template "custom/wait_count_train" Dict "ctx" $}}
</div>
<div class="required inline min_title field">
<label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.job_name"}}</label>


+ 13
- 47
templates/repo/modelarts/trainjob/show.tmpl View File

@@ -270,12 +270,14 @@
{{end}}

{{if .CanDel}}
<a class="ti-action-menu-item {{if eq .Status "KILLED" "FAILED" "START_FAILED" "KILLING" "COMPLETED"}}disabled {{end}}"
<a class="ti-action-menu-item stop-show-version {{if eq .Status "KILLED" "FAILED" "START_FAILED" "KILLING" "COMPLETED"}}disabled {{end}}"
id="{{.VersionName}}-stop"
onclick="stopVersion({{.VersionName}})">{{$.i18n.Tr "repo.stop"}}</a>
data-jobid="{{.JobID}}"
data-repopath="{{$.RepoRelPath}}/modelarts/train-job"
data-version = "{{.VersionName}}"
>{{$.i18n.Tr "repo.stop"}}</a>
{{else}}
<a class="ti-action-menu-item disabled" id="{{.VersionName}}-stop"
onclick="stopVersion({{.VersionName}})">{{$.i18n.Tr "repo.stop"}}</a>
<a class="ti-action-menu-item disabled" id="{{.VersionName}}-stop">{{$.i18n.Tr "repo.stop"}}</a>
{{end}}


@@ -290,11 +292,8 @@
<div class="ac-display-inblock title_text acc-margin-bottom">

<span class="cti-mgRight-sm">
{{if not (eq .Cloudbrain.StartTime 0)}}
{{TimeSinceUnix1 .Cloudbrain.StartTime}}
{{else}}
{{TimeSinceUnix1 .Cloudbrain.CreatedUnix}}
{{end}}</span>
</span>
<span class="cti-mgRight-sm">
{{$.i18n.Tr "repo.modelarts.current_version"}}:{{.VersionName}}</span>
<span class="cti-mgRight-sm">
@@ -308,10 +307,9 @@
class="cti-mgRight-sm">{{$.i18n.Tr "repo.modelarts.train_job.dura_time"}}:</span>
<span class="cti-mgRight-sm uc-accordionTitle-black"
id="{{.VersionName}}-duration-span">{{.TrainJobDuration}}</span>
<span data-tooltip="刷新" style="cursor: pointer;" data-inverted=""
onclick="refreshStatus({{.VersionName}})"><i
class="redo icon redo-color"></i></span>

<span id="refresh-status" data-tooltip="刷新" style="cursor: pointer;" data-inverted="" data-version="{{.VersionName}}">
<i class="redo icon redo-color"></i>
</span>
</div>
</span>
</span>
@@ -327,7 +325,7 @@
<a class="item log_bottom" data-tab="second{{$k}}"
data-version="{{.VersionName}}">{{$.i18n.Tr "repo.modelarts.log"}}</a>
<a class="item metric_chart" data-tab="four{{$k}}" data-version="{{.VersionName}}">资源占用情况</a>
<a class="item load-model-file" data-tab="third{{$k}}" data-path="{{$.RepoLink}}/modelarts/train-job/{{.JobID}}/model_list" data-version="{{.VersionName}}" data-parents="" data-filename="" data-init="init" >{{$.i18n.Tr "repo.model_download"}}</a>
<a class="item load-model-file" data-tab="third{{$k}}" data-download-flag="{{$.canDownload}}" data-path="{{$.RepoLink}}/modelarts/train-job/{{.JobID}}/model_list" data-version="{{.VersionName}}" data-parents="" data-filename="" data-init="init" >{{$.i18n.Tr "repo.model_download"}}</a>
</div>
<div class="ui tab active" data-tab="first{{$k}}">
<div style="padding-top: 10px;">
@@ -379,7 +377,7 @@
{{if not (eq .Cloudbrain.StartTime 0)}}
{{TimeSinceUnix1 .Cloudbrain.StartTime}}
{{else}}
{{TimeSinceUnix1 .Cloudbrain.CreatedUnix}}
--
{{end}}</span>
</div>
</td>
@@ -877,28 +875,6 @@
$('#name').val(modelName)
$('#version').val("0.0.1")
}
function refreshStatus(version_name) {
$.get(`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}?version_name=${version_name}`, (data) => {
// header status and duration
$(`#${version_name}-duration-span`).text(data.JobDuration)
$(`#${version_name}-status-span span`).text(data.JobStatus)
$(`#${version_name}-status-span i`).attr("class", data.JobStatus)
// detail status and duration
$('#' + version_name + '-duration').text(data.JobDuration)
$('#' + version_name + '-status').text(data.JobStatus)
console.log(data)
if (["KILLED", "FAILED", "START_FAILED", "STOPPED", "COMPLETED"].includes(data.JobStatus)) {
$('#' + version_name + '-stop').addClass('disabled')
}

loadLog(version_name)


}).fail(function (err) {
console.log(err);
});
stopBubbling(arguments.callee.caller.arguments[0])
}
function deleteVersion(version_name) {
stopBubbling(arguments.callee.caller.arguments[0])
let flag = 1;
@@ -928,17 +904,7 @@
.modal('show')

}
function stopVersion(version_name) {
stopBubbling(arguments.callee.caller.arguments[0])
$.post(`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/stop_version`, { version_name: version_name }, (data) => {
if (data.StatusOK === 0) {
$('#' + version_name + '-stop').addClass('disabled')
refreshStatus(version_name)
}
}).fail(function (err) {
console.log(err);
});
}

function loadLog(version_name) {
$.get(`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/log?version_name=${version_name}&lines=50&order=asc`, (data) => {
$('input[name=end_line]').val(data.EndLine)


+ 23
- 7
web_src/js/features/cloudbrainShow.js View File

@@ -16,7 +16,6 @@ export default async function initCloudrainSow() {

function logScroll(version_name) {
let container = document.querySelector(`#log${version_name}`);
console.log(container);
let scrollTop = container.scrollTop;
let scrollHeight = container.scrollHeight;
let clientHeight = container.clientHeight;
@@ -126,6 +125,11 @@ export default async function initCloudrainSow() {
$.get(
`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/log?version_name=${version_name}&base_line=&lines=50&order=desc`,
(data) => {
if (!data.CanLogDownload) {
$(`#${version_name}-log-down`)
.removeClass("ti-download-file")
.addClass("disabled");
}
$(`#log${version_name} input[name=end_line]`).val(data.EndLine); //如果变动就改变所对应的值
$(`#log${version_name} input[name=start_line]`).val(data.StartLine);
$(`#log${version_name}`).append("<pre>" + data.Content);
@@ -161,17 +165,17 @@ export default async function initCloudrainSow() {

//
$(".content-pad").on("click", ".load-model-file", function () {
console.log("11111111111");
let downloadFlag = $(this).data("download-flag") || "";
let gpuFlag = $(this).data("gpu-flag") || "";
let version_name = $(this).data("version");
let parents = $(this).data("parents") || "";
let filename = $(this).data("filename") || "";
let init = $(this).data("init") || "";
let path = $(this).data("path");
let url = `/api/v1/repos${path}?version_name=${version_name}&parentDir=${parents}`;
console.log(url);
$.get(url, (data) => {
$(`#dir_list${version_name}`).empty();
renderDir(path, data, version_name);
renderDir(path, data, version_name, downloadFlag, gpuFlag);
if (init === "init") {
$(`input[name=model${version_name}]`).val("");
$(`input[name=modelback${version_name}]`).val(version_name);
@@ -251,7 +255,7 @@ export default async function initCloudrainSow() {
}
}

function renderDir(path, data, version_name) {
function renderDir(path, data, version_name, downloadFlag, gpuFlag) {
let html = "";
html += "<div class='ui grid' style='margin:0;'>";
html += "<div class='row' style='padding: 0;'>";
@@ -274,8 +278,20 @@ export default async function initCloudrainSow() {
data.Dirs[i].FileName +
"</span>";
} else {
if (downlaodFlag) {
html += `<a href="${location.href}/result_download?version_name=${version_name}&file_name=${data.Dirs[i].FileName}&parent_dir=${data.Dirs[i].ParenDir}">`;
if (downloadFlag) {
if (gpuFlag) {
if (path.includes("model_list")) {
html += `<a href="${location.href}/download_model?version_name=${version_name}&fileName=${data.Dirs[i].FileName}&parentDir=${data.Dirs[i].ParenDir}&jobName=${data.task.JobName}">`;
} else {
html += `<a href="${location.href}/result_download?version_name=${version_name}&fileName=${data.Dirs[i].FileName}&parentDir=${data.Dirs[i].ParenDir}&jobName=${data.task.JobName}">`;
}
} else {
if (path.includes("model_list")) {
html += `<a href="${location.href}/model_download?version_name=${version_name}&file_name=${data.Dirs[i].FileName}&parent_dir=${data.Dirs[i].ParenDir}">`;
} else {
html += `<a href="${location.href}/result_download?version_name=${version_name}&file_name=${data.Dirs[i].FileName}&parent_dir=${data.Dirs[i].ParenDir}">`;
}
}
} else {
html += `<a class="disabled">`;
}


+ 34
- 3
web_src/js/features/cloudrbanin.js View File

@@ -123,6 +123,7 @@ export default async function initCloudrain() {
"KILLED",
"COMPLETED",
"SUCCEEDED",
"CREATE_FAILED",
].includes(status)
) {
$("#ai-delete-" + ID)
@@ -166,6 +167,7 @@ export default async function initCloudrain() {
"START_FAILED",
"SUCCEEDED",
"STOPPED",
"CREATE_FAILED",
].includes(status)
) {
return;
@@ -177,6 +179,7 @@ export default async function initCloudrain() {
"KILLING",
"COMPLETED",
"SUCCEEDED",
"CREATE_FAILED",
"STOPPED",
];
$.get(
@@ -327,6 +330,23 @@ export default async function initCloudrain() {
});
}

$(".stop-show-version").click(function (e) {
const ID = this.dataset.jobid;
const repoPath = this.dataset.repopath;
const version_name = this.dataset.version;
const url = `/api/v1/repos/${repoPath}/${ID}/stop_version`;
$.post(url, { version_name: version_name }, (data) => {
if (data.StatusOK === 0) {
$(`#${version_name}-stop`).removeClass("blue");
$(`#${version_name}-stop`).addClass("disabled");
refreshStatusShow(version_name, ID, repoPath);
}
}).fail(function (err) {
console.log(err);
});
e.stopPropagation();
});

$("#refresh-status").click(function (e) {
let version_name = $(this).data("version");
let ID = $(`#accordion${version_name}`).data("jobid");
@@ -339,11 +359,16 @@ export default async function initCloudrain() {
$.get(
`/api/v1/repos/${repoPath}/${ID}?version_name=${version_name}`,
(data) => {
//accroding下的状态
$(`#${version_name}-status-span span`).text(data.JobStatus);
//accroding下的状态图标
$(`#${version_name}-status-span i`).attr("class", data.JobStatus);
//accroding下的运行时长
$(`#${version_name}-duration-span`).text(data.JobDuration);
$("#" + versionname + "-duration").text(data.JobDuration);
$("#" + versionname + "-status").text(data.JobStatus);
//配置信息详情页的状态
$(`#${version_name}-status`).text(data.JobStatus);
//配置信息详情页的状态
$(`#${version_name}-duration`).text(data.JobDuration);
}
).fail(function (err) {
console.log(err);
@@ -363,6 +388,7 @@ export default async function initCloudrain() {
"KILLED",
"COMPLETED",
"SUCCEEDED",
"CREATE_FAILED",
].includes(data.JobStatus)
) {
$("#ai-delete-" + ID)
@@ -458,10 +484,15 @@ export default async function initCloudrain() {
});

function setWaitNums() {
console.log($(".cloudbrain-type"));
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(" ");


Loading…
Cancel
Save