|
|
@@ -0,0 +1,361 @@ |
|
|
|
<!-- 头部导航栏 --> |
|
|
|
{{template "base/head" .}} |
|
|
|
|
|
|
|
<style> |
|
|
|
.fontsize14{ |
|
|
|
font-size: 14px; |
|
|
|
} |
|
|
|
.padding0{ |
|
|
|
padding: 0 !important; |
|
|
|
} |
|
|
|
</style> |
|
|
|
|
|
|
|
<!-- 弹窗 --> |
|
|
|
<div id="mask"> |
|
|
|
<div id="loadingPage"> |
|
|
|
<div class="rect1"></div> |
|
|
|
<div class="rect2"></div> |
|
|
|
<div class="rect3"></div> |
|
|
|
<div class="rect4"></div> |
|
|
|
<div class="rect5"></div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 提示框 --> |
|
|
|
<div class="alert"></div> |
|
|
|
|
|
|
|
<div class="repository release dataset-list view"> |
|
|
|
{{template "repo/header" .}} |
|
|
|
<!-- 列表容器 --> |
|
|
|
<div class="ui container"> |
|
|
|
{{template "base/alert" .}} |
|
|
|
<div class="ui two column stackable grid "> |
|
|
|
<div class="column"> |
|
|
|
<div class="ui blue small menu compact selectcloudbrain"> |
|
|
|
<a class="item" href="{{.RepoLink}}/debugjob?debugListType=all">{{$.i18n.Tr "repo.modelarts.notebook"}}</a> |
|
|
|
<a class="item" href="{{.RepoLink}}/modelarts/train-job">{{$.i18n.Tr "repo.modelarts.train_job"}}</a> |
|
|
|
<a class="active item" href="{{.RepoLink}}/modelarts/evaluate-job">{{$.i18n.Tr "repo.modelarts.evaluate_job"}}</a> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<div class="column right aligned"> |
|
|
|
{{if .Permission.CanWrite $.UnitTypeCloudBrain}} |
|
|
|
<a class="ui green button" href="{{.RepoLink}}/modelarts/evaluate-job/create">{{$.i18n.Tr "repo.modelarts.evaluate_job.new_job"}}</a> |
|
|
|
{{else}} |
|
|
|
<a class="ui disabled button" >{{$.i18n.Tr "repo.modelarts.evaluate_job.new_job"}}</a> |
|
|
|
{{end}} |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
{{if eq 0 (len .Tasks)}} |
|
|
|
<div class="ui placeholder segment bgtask-none"> |
|
|
|
<div class="ui icon header bgtask-header-pic"></div> |
|
|
|
<div class="bgtask-content-header">未创建过评测任务</div> |
|
|
|
<div class="bgtask-content"> |
|
|
|
{{if $.RepoIsEmpty}} |
|
|
|
<div class="bgtask-content-txt">代码版本:您还没有初始化代码仓库,请先<a href="{{.RepoLink}}">创建代码版本;</a></div> |
|
|
|
{{end}} |
|
|
|
<div class="bgtask-content-txt">使用说明:可以参考启智AI协作平台<a href="https://git.openi.org.cn/zeizei/OpenI_Learning">小白训练营课程。</a></div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
{{else}} |
|
|
|
<!-- 中下列表展示区 --> |
|
|
|
<div class="ui grid"> |
|
|
|
<div class="row"> |
|
|
|
<div class="ui sixteen wide column"> |
|
|
|
<!-- 任务展示 --> |
|
|
|
<div class="dataset list"> |
|
|
|
|
|
|
|
<!-- 表头 --> |
|
|
|
<div class="ui grid stackable" style="background: #f0f0f0;;"> |
|
|
|
<div class="row"> |
|
|
|
<div class="three wide column padding0"> |
|
|
|
<span style="margin:0 6px">{{$.i18n.Tr "repo.cloudbrain_task"}}</span> |
|
|
|
</div> |
|
|
|
<div class="one wide column text center padding0"> |
|
|
|
<span style="margin:0 6px">{{$.i18n.Tr "repo.modelarts.version_nums"}}</span> |
|
|
|
</div> |
|
|
|
<div class="two wide column text center padding0"> |
|
|
|
<span>{{$.i18n.Tr "repo.modelarts.status"}}</span> |
|
|
|
</div> |
|
|
|
<div class="two wide column text center padding0"> |
|
|
|
<span>{{$.i18n.Tr "repo.modelarts.createtime"}}</span> |
|
|
|
</div> |
|
|
|
<div class="two wide column text center padding0"> |
|
|
|
<span>{{$.i18n.Tr "repo.cloudbrain_status_runtime"}}</span> |
|
|
|
</div> |
|
|
|
<div class="two wide column text center padding0"> |
|
|
|
<span>{{$.i18n.Tr "repo.modelarts.computing_resources"}}</span> |
|
|
|
</div> |
|
|
|
<div class="one wide column text center padding0"> |
|
|
|
<span>{{$.i18n.Tr "repo.cloudbrain_creator"}}</span> |
|
|
|
</div> |
|
|
|
<div class="three wide column text center padding0"> |
|
|
|
<span>{{$.i18n.Tr "repo.cloudbrain_operate"}}</span> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
{{range .Tasks}} |
|
|
|
<div class="ui grid stackable item"> |
|
|
|
<div class="row"> |
|
|
|
|
|
|
|
<!-- 任务名 --> |
|
|
|
<div class="three wide column padding0"> |
|
|
|
<a class="title" href="{{$.Link}}/{{.JobID}}" title="{{.JobName}}" style="font-size: 14px;"> |
|
|
|
|
|
|
|
<span class="fitted" style="width: 90%;vertical-align: middle;">{{.JobName}}</span> |
|
|
|
</a> |
|
|
|
</div> |
|
|
|
<!-- 版本数量 --> |
|
|
|
<div class="one wide column text center padding0"> |
|
|
|
<span style="font-size: 12px;">{{.VersionCount}} </span> |
|
|
|
</div> |
|
|
|
<!-- 任务状态 --> |
|
|
|
<div class="two wide column padding0" style="padding-left: 2.2rem !important;"> |
|
|
|
<span class="job-status" id="{{.JobID}}" data-repopath="{{$.RepoRelPath}}" data-jobid="{{.JobID}}" data-version="{{.VersionName}}"> |
|
|
|
<span><i id="{{.JobID}}-icon" style="vertical-align: middle;" class="{{.Status}}"></i><span id="{{.JobID}}-text" style="margin-left: 0.4em;font-size: 12px;">{{.Status}}</span></span> |
|
|
|
</span> |
|
|
|
</div> |
|
|
|
<!-- 任务创建时间 --> |
|
|
|
<div class="two wide column text center padding0"> |
|
|
|
<span style="font-size: 12px;" class="">{{TimeSinceUnix .Cloudbrain.CreatedUnix $.Lang}}</span> |
|
|
|
</div> |
|
|
|
<!-- 任务运行时间 --> |
|
|
|
<div class="two wide column text center padding0"> |
|
|
|
<span style="font-size: 12px;" id="duration-{{.JobID}}">{{.TrainJobDuration}}</span> |
|
|
|
</div> |
|
|
|
<!-- 计算资源 --> |
|
|
|
<div class="two wide column text center padding0"> |
|
|
|
<span style="font-size: 12px;">{{.ComputeResource}}</span> |
|
|
|
</div> |
|
|
|
<!-- 创建者 --> |
|
|
|
<div class="one wide column text center padding0"> |
|
|
|
{{if .User.Name}} |
|
|
|
<a href="{{AppSubUrl}}/{{.User.Name}}" title="{{.User.Name}}"><img class="ui avatar image" src="{{.User.RelAvatarLink}}"></a> |
|
|
|
{{else}} |
|
|
|
<a title="Ghost"><img class="ui avatar image" src="{{AppSubUrl}}/user/avatar/Ghost/-1"></a> |
|
|
|
{{end}} |
|
|
|
</div> |
|
|
|
|
|
|
|
<div class="three wide column text center padding0"> |
|
|
|
<!-- 停止任务 --> |
|
|
|
<div class="ui compact buttons"> |
|
|
|
{{$.CsrfTokenHtml}} |
|
|
|
{{if .CanDel}} |
|
|
|
<a style="padding: 0.5rem 1rem;" id="{{.VersionName}}-stop" class="ui basic {{if eq .Status "KILLED" "FAILED" "START_FAILED" "KILLING" "COMPLETED"}}disabled {{else}} blue {{end}}button" onclick="stopVersion({{.VersionName}},{{.JobID}})"> |
|
|
|
{{$.i18n.Tr "repo.stop"}} |
|
|
|
</a> |
|
|
|
{{else}} |
|
|
|
<a style="padding: 0.5rem 1rem;" id="{{.VersionName}}-stop" class="ui basic disabled button"> |
|
|
|
{{$.i18n.Tr "repo.stop"}} |
|
|
|
</a> |
|
|
|
{{end}} |
|
|
|
|
|
|
|
</div> |
|
|
|
<!-- 删除任务 --> |
|
|
|
<form class="ui compact buttons" id="delForm-{{.JobID}}" action="{{$.Link}}/{{.JobID}}/del" method="post"> |
|
|
|
{{$.CsrfTokenHtml}} |
|
|
|
{{if .CanDel}} |
|
|
|
<a style="padding: 0.5rem 1rem;margin-left:0.2rem" id="model-delete-{{.JobID}}" class="ui basic blue button" onclick="assertDelete(this)" style="border-radius: .28571429rem;"> |
|
|
|
{{$.i18n.Tr "repo.delete"}} |
|
|
|
</a> |
|
|
|
{{else}} |
|
|
|
<a style="padding: 0.5rem 1rem;margin-left:0.2rem" class="ui basic button disabled" style="border-radius: .28571429rem;"> |
|
|
|
{{$.i18n.Tr "repo.delete"}} |
|
|
|
</a> |
|
|
|
{{end}} |
|
|
|
</form> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
{{end}} {{template "base/paginate" .}} |
|
|
|
</div> |
|
|
|
|
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
{{end}} |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 确认模态框 --> |
|
|
|
<div id="deletemodel"> |
|
|
|
<div class="ui basic modal"> |
|
|
|
<div class="ui icon header"> |
|
|
|
<i class="trash icon"></i> 删除任务 |
|
|
|
</div> |
|
|
|
|
|
|
|
<div class="content"> |
|
|
|
<p>你确认删除该任务么?此任务一旦删除不可恢复。</p> |
|
|
|
</div> |
|
|
|
<div class="actions"> |
|
|
|
<div class="ui red basic inverted cancel button"> |
|
|
|
<i class="remove icon"></i> 取消操作 |
|
|
|
</div> |
|
|
|
<div class="ui green basic inverted ok button"> |
|
|
|
<i class="checkmark icon"></i> 确定操作 |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
</div> |
|
|
|
{{template "base/footer" .}} |
|
|
|
|
|
|
|
<script> |
|
|
|
console.log({{.Tasks}}) |
|
|
|
// 调试和评分新开窗口 |
|
|
|
function stop(obj) { |
|
|
|
if (obj.style.color != "rgb(204, 204, 204)") { |
|
|
|
obj.target = '_blank' |
|
|
|
} else { |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 删除时用户确认 |
|
|
|
function assertDelete(obj) { |
|
|
|
if (obj.style.color == "rgb(204, 204, 204)") { |
|
|
|
return |
|
|
|
} else { |
|
|
|
var delId = obj.parentNode.id |
|
|
|
flag = 1; |
|
|
|
$('.ui.basic.modal') |
|
|
|
.modal({ |
|
|
|
onDeny: function() { |
|
|
|
flag = false |
|
|
|
}, |
|
|
|
onApprove: function() { |
|
|
|
document.getElementById(delId).submit() |
|
|
|
flag = true |
|
|
|
}, |
|
|
|
onHidden: function() { |
|
|
|
if (flag == false) { |
|
|
|
$('.alert').html('您已取消操作').removeClass('alert-success').addClass('alert-danger').show().delay(1500).fadeOut(); |
|
|
|
} |
|
|
|
} |
|
|
|
}) |
|
|
|
.modal('show') |
|
|
|
} |
|
|
|
} |
|
|
|
function runtime(time){ |
|
|
|
if(time){ |
|
|
|
let hours = time/3600000<10 ? "0"+parseInt(time/3600000):parseInt(time/3600000) |
|
|
|
let miuns = time%3600000/60000<10 ? "0"+parseInt(time%3600000/60000):parseInt(time%3600000/60000) |
|
|
|
let seconds = time%60000/1000<10 ? "0"+parseInt(time%60000/1000):parseInt(time%60000/1000) |
|
|
|
return hours + ":" + miuns + ":" + seconds |
|
|
|
}else{ |
|
|
|
return "00:00:00" |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 加载任务状态 |
|
|
|
var timeid = window.setInterval(loadJobStatus, 15000); |
|
|
|
$(document).ready(loadJobStatus); |
|
|
|
function loadJobStatus() { |
|
|
|
$(".job-status").each((index, job) => { |
|
|
|
const jobID = job.dataset.jobid |
|
|
|
const repoPath = job.dataset.repopath |
|
|
|
const versionname = job.dataset.version |
|
|
|
const status_text = $(`#${jobID}-text`).text() |
|
|
|
if(['IMAGE_FAILED','SUBMIT_FAILED','DELETE_FAILED','KILLED','COMPLETED','FAILED','CANCELED','LOST','START_FAILED'].includes(status_text)){ |
|
|
|
return |
|
|
|
} |
|
|
|
$.get(`/api/v1/repos/${repoPath}/modelarts/train-job/${jobID}?version_name=${versionname}`, (data) => { |
|
|
|
const jobID = data.JobID |
|
|
|
const status = data.JobStatus |
|
|
|
const duration = data.JobDuration |
|
|
|
$('#duration-'+jobID).text(duration) |
|
|
|
if (status != job.textContent.trim()) { |
|
|
|
$('#' + jobID+'-icon').removeClass().addClass(status) |
|
|
|
$('#' + jobID+ '-text').text(status) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}).fail(function(err) { |
|
|
|
console.log(err); |
|
|
|
}); |
|
|
|
}); |
|
|
|
}; |
|
|
|
|
|
|
|
// 获取弹窗 |
|
|
|
var modal = document.getElementById('imageModal'); |
|
|
|
|
|
|
|
// 打开弹窗的按钮对象 |
|
|
|
var btns = document.getElementsByClassName("imageBtn"); |
|
|
|
|
|
|
|
// 获取 <span> 元素,用于关闭弹窗 |
|
|
|
var spans = document.getElementsByClassName('close'); |
|
|
|
|
|
|
|
// 点击按钮打开弹窗 |
|
|
|
for (i = 0; i < btns.length; i++) { |
|
|
|
btns[i].onclick = function() { |
|
|
|
modal.style.display = "block"; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 点击 <span> (x), 关闭弹窗 |
|
|
|
for (i = 0; i < spans.length; i++) { |
|
|
|
spans[i].onclick = function() { |
|
|
|
modal.style.display = "none"; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 在用户点击其他地方时,关闭弹窗 |
|
|
|
window.onclick = function(event) { |
|
|
|
if (event.target == modal) { |
|
|
|
modal.style.display = "none"; |
|
|
|
} |
|
|
|
} |
|
|
|
function stopVersion(version_name,jobID){ |
|
|
|
const url = '/api/v1/repos/{{$.RepoRelPath}}/modelarts/train-job/'+jobID+'/stop_version' |
|
|
|
$.post(url,{version_name:version_name},(data)=>{ |
|
|
|
if(data.StatusOK===0){ |
|
|
|
$('#'+version_name+'-stop').removeClass('blue') |
|
|
|
$('#'+version_name+'-stop').addClass('disabled') |
|
|
|
refreshStatus(version_name,jobID) |
|
|
|
} |
|
|
|
}).fail(function(err) { |
|
|
|
console.log(err); |
|
|
|
}); |
|
|
|
} |
|
|
|
function refreshStatus(version_name,jobID){ |
|
|
|
|
|
|
|
const url = '/api/v1/repos/{{$.RepoRelPath}}/modelarts/train-job/'+jobID+'?version_name='+version_name |
|
|
|
$.get(url,(data)=>{ |
|
|
|
|
|
|
|
|
|
|
|
$(`#${jobID}-icon`).attr("class",data.JobStatus) |
|
|
|
// detail status and duration |
|
|
|
|
|
|
|
$(`#${jobID}-text`).text(data.JobStatus) |
|
|
|
|
|
|
|
|
|
|
|
}).fail(function(err) { |
|
|
|
console.log(err); |
|
|
|
}); |
|
|
|
|
|
|
|
} |
|
|
|
// 显示弹窗,弹出相应的信息 |
|
|
|
function showmask() { |
|
|
|
$('#imageModal').css('display', 'none') |
|
|
|
$('#mask').css('display', 'block') |
|
|
|
|
|
|
|
$("iframe[name=iframeContent]").on("load", function() { |
|
|
|
var responseText = $("iframe")[0].contentDocument.body.getElementsByTagName("pre")[0].innerHTML; |
|
|
|
var json1 = JSON.parse(responseText) |
|
|
|
$('#mask').css('display', 'none') |
|
|
|
parent.location.href |
|
|
|
|
|
|
|
if (json1.result_code === "0") { |
|
|
|
$('.alert').html('操作成功!').removeClass('alert-danger').addClass('alert-success').show().delay(1500).fadeOut(); |
|
|
|
} else { |
|
|
|
$('.alert').html(json1.error_msg).removeClass('alert-success').addClass('alert-danger').show().delay(5000).fadeOut(); |
|
|
|
} |
|
|
|
}) |
|
|
|
} |
|
|
|
</script> |