Browse Source

model manage

tags/v1.22.11.2^2
chenshihai 3 years ago
parent
commit
15f4e72680
3 changed files with 699 additions and 22 deletions
  1. +577
    -5
      templates/repo/modelmanage/create_online.tmpl
  2. +1
    -1
      templates/repo/modelmanage/index.tmpl
  3. +121
    -16
      web_src/vuepages/pages/modelmanage/common/modelmanage-common-detail.vue

+ 577
- 5
templates/repo/modelmanage/create_online.tmpl View File

@@ -1,12 +1,584 @@
{{template "base/head" .}}
<link rel="stylesheet" href="{{StaticUrlPrefix}}/css/vp-modelmanage-local-create-1.css?v={{MD5 AppVer}}" />
<style></style>
<link rel="stylesheet" href="/self/ztree/css/zTreeStyle/zTreeStyle.css" type="text/css">
<style>
#newmodel .header {
height: 45px;
border: 1px solid #d4d4d5;
border-radius: 5px 5px 0 0;
font-size: 14px;
background: #f0f0f0;
display: flex;
align-items: center;
}
#newmodel .content {
margin-top: -1px;
border: 1px solid #d4d4d5;
border-top: none;
}
.inline.fields .right.aligned label{
width: 100% !important;
text-align: right;
}
.inline .ui.dropdown .text {
color: rgba(0, 0, 0, .87) !important;
max-width: 360px;
}
.newtext{
margin-left: 12px !important
}
.menuContent{
position: absolute;
background: #ffffff;
left: 0;
right: 26px;
top: 36px;
z-index:999;
border: 1px solid #96c8da;
border-top: 0;
border-bottom-right-radius: 4px;
border-bottom-left-radius: 4px;
box-shadow: 0 2px 3px 0 rgb(34 36 38 / 15%);
}
</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>
{{$repository := .Repository.ID}}
<div class="repository release dataset-list view">
{{template "repo/header" .}}
<div class="ui container">
<div id="__vue-root"></div>
</div>
<div id="newmodel">
<div class="ui second">
<div class="header" style="padding: 1rem;background-color: rgba(240, 240, 240, 100);">
<h4 id="model_header"></h4>
</div>
<div class="content content-padding">
<form id="formId" class="ui form dirty">
<input class="ays-ignore" type="hidden" name="initModel" value="{{$.MODEL_COUNT}}">
<div class="ui error message"></div>
<input class="ays-ignore" type="hidden" name="_csrf" value="">
<div class="inline fields">
<div class="required two wide field right aligned">
<label for="jobId">{{.i18n.Tr "repo.model.manage.select.trainjob"}}</label>
</div>
<div class="required thirteen wide inline field">
<div class="ui dropdown selection search loading" id="choice_model">
<input class="ays-ignore" type="hidden" id="jobId" name="jobId" required>
<div class="default text">{{.i18n.Tr "repo.model.manage.select.trainjob"}}</div>
<i class="dropdown icon"></i>
<div class="menu" id="job-name">
</div>
</div>
<label for="versionName">{{.i18n.Tr "repo.model.manage.version"}}</label>
<span>&nbsp;</span>
<div class="ui dropdown selection search" id="choice_version">
<input class="ays-ignore" type="hidden" id="versionName" name="versionName" required>
<div class="default text">{{.i18n.Tr "repo.model.manage.select.version"}}</div>
<i class="dropdown icon"></i>
<div class="menu" id="job-version">

</div>
</div>
</div>
</div>
<div class="required inline fields" id="modelname">
<div class="two wide field right aligned">
<label for="name">{{.i18n.Tr "repo.model.manage.model_name"}}</label>
</div>
<div class="eight wide field">
<input class="ays-ignore" id="name" name="name" required maxlength="25" onkeyup="this.value=this.value.replace(/[, ]/g,'')">
</div>
</div>
<div class="required inline fields" id="verionName">
<div class="two wide field right aligned">
<label for="version">{{.i18n.Tr "repo.model.manage.version"}}</label>
</div>
<div class="eight wide field">
<input class="ays-ignore" id="version" name="version" value="" readonly required maxlength="255">
</div>
</div>
<div class="unite min_title inline fields required">
<div class="two wide field right aligned">
<label for="Engine">{{.i18n.Tr "repo.model.manage.engine"}}</label>
</div>
<div class="ui ten wide field dropdown selection" id="choice_Engine">
<input class="ays-ignore" type="hidden" id="engine" name="engine" required>
<div class="default text newtext">{{.i18n.Tr "repo.model.manage.select.engine"}}</div>
<i class="dropdown icon"></i>
<div class="menu" id="job-Engine">

</div>
</div>
</div>
<div class="unite min_title inline fields required">
<div class="two wide field right aligned">
<label for="modelSelectedFile">{{.i18n.Tr "repo.model.manage.modelfile"}}</label>
</div>
<div class="thirteen wide field" style="position:relative">
<input class="ays-ignore" id="modelSelectedFile" type="text" readonly required onclick="showMenu();" name="modelSelectedFile" >
<div id="menuContent" class="menuContent" style="display:none;">
<ul id="treeDemo" class="ztree"></ul>
</div>
</div>
</div>
<div class="inline fields">
<div class="two wide field right aligned">
<label for="Label">{{.i18n.Tr "repo.model.manage.modellabel"}} &nbsp</label>
</div>
<div class="thirteen wide field">
<input class="ays-ignore" id="label" name="label" maxlength="255" placeholder='{{.i18n.Tr "repo.modelarts.train_job.label_place"}}'>
</div>
</div>
<div class="inline fields">
<div class="two wide field right aligned">
<label for="description">{{.i18n.Tr "repo.model.manage.modeldesc"}} &nbsp</label>
</div>
<div class="thirteen wide field">
<textarea id="description" class="ays-ignore" name="description" rows="3"
maxlength="255" placeholder='{{.i18n.Tr "repo.modelarts.train_job.new_place"}}'
onchange="this.value=this.value.substring(0, 255)"
onkeydown="this.value=this.value.substring(0, 255)"
onkeyup="this.value=this.value.substring(0, 256)"></textarea>
</div>
</div>
<div class="inline field" style="margin-left:140px;">
<button id="submitId" type="button" class="ui create_train_job green button" onclick="submitSaveModel()"
style="position: absolute;margin-top:16px;">
{{.i18n.Tr "repo.model.manage.sava_model"}}
</button>
</div>
</form>
<div class="actions" style="display: inline-block;margin-left:252px;margin-top:16px;">
<button class="ui button cancel" onclick="backToModelListPage()">{{.i18n.Tr "repo.cloudbrain.cancel"}}</button>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="{{StaticUrlPrefix}}/js/vp-modelmanage-local-create-1.js?v={{MD5 AppVer}}"></script>
{{template "base/footer" .}}
<script type="text/javascript" src="/self/ztree/js/jquery.ztree.core.js"></script>
<script type="text/javascript" src="/self/ztree/js/jquery.ztree.excheck.js"></script>
<script>
;(function() {
var setting = {
check: {
enable: true,
chkboxType: {"Y":"ps", "N":"ps"}
},
view: {
dblClickExpand: false
},
callback: {
beforeClick: beforeClick,
onCheck: onCheck
}
};

function beforeClick(treeId, treeNode) {
var zTree = $.fn.zTree.getZTreeObj("treeDemo");
zTree.checkNode(treeNode, !treeNode.checked, null, true);
return false;
}
function onCheck(e, treeId, treeNode) {
var zTree = $.fn.zTree.getZTreeObj("treeDemo"),
nodes = zTree.getCheckedNodes(true),
v = "";
for (var i=0, l=nodes.length; i<l; i++) {
if(nodes[i].isParent){
continue;
}
var pathNodes = nodes[i].getPath();
var path ="";
for(var j=0;j<pathNodes.length;j++){
if(j ==0){
path += pathNodes[j].name;
}else{
path += "/" + pathNodes[j].name;
}
}
v += path + ";";
}
if (v.length > 0 ) v = v.substring(0, v.length-1);
var cityObj = $("#modelSelectedFile");
cityObj.attr("value", v);
}
function showMenu() {
var cityObj = $("#modelSelectedFile");
var cityOffset = $("#modelSelectedFile").offset();
// $("#menuContent").css({left:cityOffset.left + "px", top:cityOffset.top + cityObj.outerHeight() + "px"}).slideDown("fast");
$("#menuContent").slideDown("fast");

$("body").bind("mousedown", onBodyDown);
}
window.showMenu = showMenu;

function hideMenu() {
$("#menuContent").fadeOut("fast");
$("body").unbind("mousedown", onBodyDown);
}
function onBodyDown(event) {
if (!(event.target.id == "menuBtn" || event.target.id == "modelSelectedFile" || event.target.id == "menuContent" || $(event.target).parents("#menuContent").length>0)) {
hideMenu();
}
}

$(document).ready(function(){
//$.fn.zTree.init($("#treeDemo"), setting, zNodes);
});
let repolink = {{.RepoLink }}
let repoId = {{ $repository }}
const { _AppSubUrl, _StaticUrlPrefix, csrf } = window.config;
$('input[name="_csrf"]').val(csrf)
let modelData;
function createModelName() {
let repoName = location.pathname.split('/')[2]
let modelName = repoName + '_model_' + Math.random().toString(36).substr(2, 4)
$('#name').val(modelName)
$('#version').val("0.0.1")
}
let dirKey="isOnlyDir--:&";
/*
function showcreate(obj) {
$('.ui.modal.second')
.modal({
centered: false,
onShow: function () {
$('#model_header').text({{.i18n.Tr "repo.model.manage.import_new_model"}})
$('input[name="version"]').addClass('model_disabled')
$('.ui.dimmer').css({ "background-color": "rgb(136, 136, 136,0.7)" })
$("#job-name").empty()
createModelName()
loadTrainList()
},
onHide: function () {
var cityObj = $("#modelSelectedFile");
cityObj.attr("value", "");
document.getElementById("formId").reset();
$('#choice_model').dropdown('clear')
$('#choice_version').dropdown('clear')
$('#choice_Engine').dropdown('clear')
$('.ui.dimmer').css({ "background-color": "" })
$('.ui.error.message').text()
$('.ui.error.message').css('display', 'none')

}
})
.modal('show')
}
*/
$('#model_header').text({{.i18n.Tr "repo.model.manage.import_new_model"}})
$('input[name="version"]').addClass('model_disabled')
$('.ui.dimmer').css({ "background-color": "rgb(136, 136, 136,0.7)" })
$("#job-name").empty()
createModelName()
loadTrainList()

$(function () {
$('#choice_model').dropdown({
onChange: function (value) {
$("#choice_version").addClass("loading")
$('#choice_version').dropdown('clear')
$("#job-version").empty()
loadTrainVersion(value)
}
})

$('#choice_version').dropdown({
onChange: function (value) {
console.log("model version:" + value);
if (modelData != null) {
for (var i = 0; i < modelData.length; i++) {
if (modelData[i].VersionName == value) {
setEngine(modelData[i]);
loadModelFile(modelData[i]);
break;
}
}
}
}
})
});

function versionAdd(version) {
let versionArray = version.split('.')
if (versionArray[2] == '9') {
if (versionArray[1] == '9') {
versionArray[0] = String(Number(versionArray[1]) + 1)
versionArray[1] = '0'
} else {
versionArray[1] = String(Number(versionArray[1]) + 1)
}
versionArray[2] = '0'
} else {
versionArray[2] = String(Number(versionArray[2]) + 1)
}
return versionArray.join('.')
}

function loadTrainList() {
$.get(`${repolink}/modelmanage/query_train_job?repoId=${repoId}`, (data) => {

const n_length = data.length
if(n_length > 0){
let train_html = ''
for (let i = 0; i < n_length; i++) {
train_html += `<div class="item" data-value="${data[i].JobID}">${data[i].DisplayJobName}</div>`
train_html += '</div>'
}
$("#job-name").append(train_html)
$("#choice_model").removeClass("loading")
$('#choice_model .default.text').text(data[0].DisplayJobName)
$('#choice_model input[name="jobId"]').val(data[0].JobID)
loadTrainVersion()
}else{
$("#choice_model").removeClass("loading")
}
})
}

function loadTrainVersion(value) {
let tmp = $('#choice_model input[name="jobId"]').val();
let jobId = !value ? $('#choice_model input[name="jobId"]').val() : value
$.get(`${repolink}/modelmanage/query_train_job_version?jobId=${jobId}`, (data) => {
const n_length = data.length
let train_html = '';
modelData = data;
for (let i = 0; i < n_length; i++) {
train_html += `<div class="item" data-value="${data[i].VersionName}">${data[i].VersionName}</div>`
train_html += '</div>'
}
if (data.length) {
$("#job-version").append(train_html)
$("#choice_version").removeClass("loading")
var versionName = data[0].VersionName;
if (versionName == null || versionName == "") {
versionName = "V0001";
}
$('#choice_version .default.text').text(versionName)
$('#choice_version input[name="versionName"]').val(versionName)
setEngine(data[0])
loadModelFile(data[0])
}

})
}

function loadModelFile(trainJob){
console.log("trainJob=", trainJob);
$('#choice_file').dropdown('clear')
$("#model-file").empty()
if(trainJob ==null || trainJob ==""){
console.log("trainJob is null");
}else{
let type = trainJob.Type;
if(type == 2){
if(trainJob.ComputeResource=="NPU"){
type=1;
}else{
type=0;
}
}
$.get(`${repolink}/modelmanage/query_train_model?jobName=${trainJob.JobName}&type=${type}&versionName=${trainJob.VersionName}`, (data) => {
var cityObj = $("#modelSelectedFile");
cityObj.attr("value", "");
const n_length = data.length
let file_html=''
let firstFileName =''
var zNodes=[];
var nodesMap={};
for (let i=0;i<n_length;i++){
var parentNodeMap = nodesMap;
var fileSplits = data[i].FileName.split("/");
for(let j=0;j < fileSplits.length;j++){
if(fileSplits[j] == ""){
break;
}
if(parentNodeMap[fileSplits[j]] == null){
parentNodeMap[fileSplits[j]] = {};
}
parentNodeMap = parentNodeMap[fileSplits[j]];
}
}
for (let i=0;i<n_length;i++){
var parentNodeMap = nodesMap;
var fileSplits = data[i].FileName.split("/");
for(let j=0;j < fileSplits.length;j++){
if(fileSplits[j] == ""){
if(data[i].FileName[data[i].FileName.length -1] =="/"){
if(Object.keys(parentNodeMap).length ==0){
parentNodeMap[dirKey]="true";
}
}
break;
}
parentNodeMap = parentNodeMap[fileSplits[j]];
}
}
convertToNode(zNodes,nodesMap);
$.fn.zTree.init($("#treeDemo"), setting, zNodes);
})
}
}

function convertToNode(nodeList,nodesMap){
var keyList = Object.keys(nodesMap);
keyList.sort(function(a,b){
return a-b;
});
var isFirst = true;
for(var i=0; i<keyList.length;i++){
var node = {};
node["name"] = keyList[i];
nodeList.push(node);
if(nodesMap[keyList[i]] != null && Object.keys(nodesMap[keyList[i]]).length >0){
if(nodesMap[keyList[i]][dirKey] != null){
node["open"] = false;
node["isParent"] = true;
}else{
node["children"]=[];
if(isFirst){
node["open"] = true;
isFirst= false;
}
convertToNode(node["children"],nodesMap[keyList[i]]);
}
}
}
}

function setEngine(trainJob) {
console.log("trainJob=", trainJob);
$('#choice_Engine').dropdown('clear')
$("#job-Engine").empty()
if (trainJob.EngineName != null && trainJob.EngineName != "") {
srcEngine = trainJob.EngineName.split('-')[0]
srcEngine = srcEngine.trim().toLowerCase();
let selectedText = "PyTorch";
let selectedValue = 0;
let itemHtml = "<option class=\"item\" data-value=\"0\">PyTorch</option>";
if (srcEngine == 'tensorflow') {
selectedText = "TensorFlow";
selectedValue = 1;
itemHtml += "<option class=\"active item\" data-value=\"1\">TensorFlow</option>";
} else {
itemHtml += "<option class=\"item\" data-value=\"1\">TensorFlow</option>";
}
if (srcEngine == 'mindspore') {
selectedText = "MindSpore";
selectedValue = 2;
itemHtml += "<option class=\"active item\" data-value=\"2\">MindSpore</option>";
} else {
itemHtml += "<option class=\"item\" data-value=\"2\">MindSpore</option>";
}
itemHtml += "<option class=\"item\" data-value=\"4\">PaddlePaddle</option>"
itemHtml += "<option class=\"item\" data-value=\"5\">OneFlow</option>"
itemHtml += "<option class=\"item\" data-value=\"6\">MXNet</option>"
itemHtml += "<option class=\"item\" data-value=\"3\">Other</option>"

$('#choice_Engine .default.text').text(selectedText)
$('#choice_Engine input[name="engine"]').val(selectedValue)
$("#job-Engine").append(itemHtml);
$("#choice_Engine").removeClass('disabled');
} else {
let itemHtml = "<option class=\"active item\" data-value=\"0\">PyTorch</option>";
itemHtml += "<option class=\"item\" data-value=\"1\">TensorFlow</option>"
itemHtml += "<option class=\"item\" data-value=\"2\">MindSpore</option>"
itemHtml += "<option class=\"item\" data-value=\"4\">PaddlePaddle</option>"
itemHtml += "<option class=\"item\" data-value=\"5\">OneFlow</option>"
itemHtml += "<option class=\"item\" data-value=\"6\">MXNet</option>"
itemHtml += "<option class=\"item\" data-value=\"3\">Other</option>"
$('#choice_Engine .default.text').text("PyTorch");
$('#choice_Engine input[name="engine"]').val(0)
$("#job-Engine").append(itemHtml);
$("#choice_Engine").removeClass('disabled');
}
}

function check() {
let jobid = document.getElementById("jobId").value;
let versionname = document.getElementById("versionName").value;
let name = document.getElementById("name").value;
let version = document.getElementById("version").value;
let modelSelectedFile = document.getElementById("modelSelectedFile").value;
if (name == "") {
$("#modelname").closest('.required').addClass("error");
return false;
} else {
$("#modelname").closest('.required').removeClass("error");
}
if (versionname == "") {
$("#verionname").closest('.required').addClass("error");
return false;
} else {
$("#verionname").closest('.required').removeClass("error");
}
if (jobid == "") {
$("#jobId").closest('.required').addClass("error");
return false;
} else {
$("#jobId").closest('.required').removeClass("error");
}
if (modelSelectedFile == "") {
$("#modelSelectedFile").closest('.required').addClass("error");
return false;
} else {
$("#modelSelectedFile").closest('.required').removeClass("error");
}
if (versionname == "") {
$("#versionName").closest('.required').addClass("error");
return false;
} else {
$("#versionName").closest('.required').removeClass("error");
}
return true;
}

function submitSaveModel() {
let flag = check();
if (!flag) return false;
$(".ui.error.message").hide();
let cName = $("input[name='name']").val();
let version = $("input[name='version']").val();
let data = $("#formId").serialize();
const initModel = $("input[name='initModel']").val();
let url_href = location.href.split("create_online_model_tmpl")[0] + 'create_new_model';
$("#mask").css({ display: "block", "z-index": "9999" });
$.ajax({
url: url_href,
type: "POST",
data: data,
success: function (res) {
backToModelListPage();
},
error: function (xhr) {
// 隐藏 loading
// 只有请求不正常(状态码不为200)才会执行
$(".ui.error.message").text(xhr.responseText);
$(".ui.error.message").show();
},
complete: function (xhr) {
$("#mask").css({ display: "none", "z-index": "1" });
},
});
}

function backToModelListPage() {
let url_href = location.href.split("create_online_model_tmpl")[0] + 'show_model';
window.location.href = url_href;
}
window.submitSaveModel = submitSaveModel;
window.backToModelListPage = backToModelListPage;
})();
</script>

+ 1
- 1
templates/repo/modelmanage/index.tmpl View File

@@ -77,7 +77,7 @@
<a class="ui button {{if .Permission.CanWrite $.UnitTypeModelManage}} blue m-blue-btn {{else}} disabled {{end}}"
href="{{.RepoLink}}/modelmanage/create_local_model_tmpl1">导入本地模型</a>
<a class="ui button {{if .Permission.CanWrite $.UnitTypeModelManage}} green {{else}} disabled {{end}}"
onclick="showcreate(this)">导入线上模型</a>
href="{{.RepoLink}}/modelmanage/create_online_model_tmpl">导入线上模型</a>
</div>
</div>
{{if eq $.MODEL_COUNT 0}}


+ 121
- 16
web_src/vuepages/pages/modelmanage/common/modelmanage-common-detail.vue View File

@@ -21,8 +21,8 @@
<div class="row">
<div class="tit">可用集群:</div>
<div class="val">
<div class="txt-wrap" :title="state.type == 0 ? 'CPU/GPU' : 'NPU'">
{{ state.type == 0 ? 'CPU/GPU' : 'NPU' }}
<div class="txt-wrap" :title="state.typeStr">
{{ state.typeStr }}
</div>
</div>
</div>
@@ -32,10 +32,22 @@
<div class="txt-wrap" :title="state.modelSize">{{ state.modelSize }}</div>
</div>
</div>
<div v-show="isExpanded" class="row">
<div v-show="isExpanded" class="row" :class="isEidtDescr ? 'edit-row' : ''">
<div class="tit">描述:</div>
<div class="val">
<div class="txt-wrap" :title="state.description">{{ state.description }}</div>
<div class="val" :class="isEidtDescr ? 'edit-val' : ''">
<div v-if="!isEidtDescr" class="txt-wrap" :title="state.description"
style="max-width:100%;width:unset;padding-right:20px;">
<span>{{ state.description }}</span>
<i v-if="canOperate" style="position:absolute;right:0;top:3px;color:rgb(22, 132, 252);cursor:pointer;"
class="el-icon-edit" @click="editDescr = state._description; isEidtDescr = true;"></i>
</div>
<div class="txt-edit" v-if="isEidtDescr">
<el-input type="textarea" v-model="editDescr" :maxLength="255" placeholder="描述字数不超过255个字符"></el-input>
<i style="position:absolute;right:-4px;bottom:20px;color:rgb(255, 37, 37);cursor:pointer;"
class="icon times" @click="isEidtDescr = false;"></i>
<i style="position:absolute;right:-5px;bottom:2px;color:rgb(39, 177, 72);cursor:pointer;"
@click="submitEidt('descr')" class="icon check"></i>
</div>
</div>
</div>
</div>
@@ -52,10 +64,22 @@
<div class="txt-wrap" :title="state.createTime">{{ state.createTime }}</div>
</div>
</div>
<div v-show="isExpanded" class="row">
<div v-show="isExpanded" class="row" :class="isEidtLabel ? 'edit-row' : ''">
<div class="tit">标签:</div>
<div class="val">
<div class="txt-wrap" :title="state.label">{{ state.label }}</div>
<div class="val" :class="isEidtLabel ? 'edit-val' : ''">
<div v-if="!isEidtLabel" class="txt-wrap" :title="state.label"
style="max-width:100%;width:unset;padding-right:20px;">
<span>{{ state.label }}</span>
<i v-if="canOperate" style="position:absolute;right:0;top:3px;color:rgb(22, 132, 252);cursor:pointer;"
class="el-icon-edit" @click="editLabel = state._label; isEidtLabel = true;"></i>
</div>
<div class="txt-edit" v-if="isEidtLabel">
<el-input v-model="editLabel" :maxLength="255" placeholder="输入标签,多个标签用空格区分"></el-input>
<i style="position:absolute;right:-5px;bottom:20px;color:rgb(255, 37, 37);cursor:pointer;"
class="icon times" @click="isEidtLabel = false;"></i>
<i style="position:absolute;right:-5px;bottom:2px;color:rgb(39, 177, 72);cursor:pointer;"
@click="submitEidt('label')" class="icon check"></i>
</div>
</div>
</div>
</div>
@@ -66,13 +90,13 @@
<div class="row">
<div class="tit">训练任务:</div>
<div class="val">
<div class="txt-wrap" :title="state.displayJobName">{{ state.displayJobName }}</div>
<div class="txt-wrap" v-html="state.displayJobName"></div>
</div>
</div>
<div class="row">
<div class="tit">代码分支:</div>
<div class="val">
<div class="txt-wrap" :title="state.branchName">{{ state.branchName }}</div>
<div class="txt-wrap" v-html="state.branchName"></div>
</div>
</div>
<div class="row">
@@ -192,6 +216,10 @@ export default {
label: '',
description: '',
},
editDescr: '',
isEidtDescr: false,
editLabel: '',
isEidtLabel: false,
engineList: MODEL_ENGINES,
curVersion: '',
modelList: [],
@@ -205,6 +233,7 @@ export default {
this.modelType = data.modelType;
this.canOperate = data.isCanOper;
this.state.type = data.type;
this.state.typeStr = data.type == 0 ? 'CPU/GPU' : data.type == 1 ? 'NPU' : '';
this.state.id = data.id;
this.state.name = data.name;
this.state.version = data.version;
@@ -212,7 +241,9 @@ export default {
this.state.engineName = getListValueWithKey(MODEL_ENGINES, data.engine.toString());
this.state.modelSize = transFileSize(data.size);
this.state.label = data.label || '--';
this.state._label = data.label;
this.state.description = data.description || '--';
this.state._description = data.description;
this.state.createTime = formatDate(new Date(data.createdUnix * 1000), 'yyyy-MM-dd HH:mm:ss');

const trainTaskInfo = data.trainTaskInfo ? JSON.parse(data.trainTaskInfo) : '';
@@ -228,14 +259,27 @@ export default {
if (trainTaskInfo) {
const parameters = trainTaskInfo.Parameters ? JSON.parse(trainTaskInfo.Parameters).parameter : [];
const parametersStr = parameters.map((item) => { return item.label + '=' + item.value }).join('; ');
const taskType = trainTaskInfo.Type;
let taskUrl = location.href.split('modelmanage')[0];
if (taskType == 0) {
taskUrl = taskUrl + 'cloudbrain/train-job/' + trainTaskInfo.JobID;
} else if (taskType == 1) {
taskUrl = taskUrl + 'modelarts/train-job/' + trainTaskInfo.JobID;
} else if (taskType == 2) {
taskUrl = taskUrl + 'grampus/train-job/' + trainTaskInfo.JobID;
}
const versionName = trainTaskInfo.VersionName;
const versionHtml = versionName ? `<span class="append-txt" title="${versionName}">${versionName}</span>` : '';
const codeCommitID = data.codeCommitID;
const codeCommitIDHtml = codeCommitID ? `<span class="append-txt" title="${codeCommitID}">${codeCommitID}</span>` : '';
Object.assign(this.state, {
displayJobName: trainTaskInfo.DisplayJobName,
branchName: trainTaskInfo.BranchName,
displayJobName: `<a href="${taskUrl}" title="${trainTaskInfo.DisplayJobName}">${trainTaskInfo.DisplayJobName}</a>${versionHtml}`,
branchName: `${trainTaskInfo.BranchName}${codeCommitIDHtml}`,
bootFile: trainTaskInfo.BootFile,
datasetName: trainTaskInfo.DatasetName,
parameters: parametersStr || '--',
workServerNumber: trainTaskInfo.WorkServerNumber || '--',
specStr: trainTaskInfo.Spec ? trainTaskInfo.Spec.toString() : '--'
specStr: trainTaskInfo.FlavorName || '--',
});
}
this.curVersion = version;
@@ -256,6 +300,43 @@ export default {
goUploadPage() {
window.location.href = `${this.repo}/modelmanage/create_local_model_tmpl2?type=0&name=${this.state.name}&id=${this.state.id}`;
},
submitEidt(type) {
const obj = {
repo: this.repo,
type: this.state.type,
id: this.state.id,
name: this.state.name,
version: this.state.version,
engine: this.state.engine,
label: type == 'label' ? this.editLabel : this.state.label,
description: type == 'descr' ? this.editDescr : this.state.description,
};
modifyModel(obj).then(res => {
res = res.data;
if (res && res.code == '0') {
if (type == 'label') {
this.state.label = this.editLabel;
this.state._label = this.editLabel;
this.isEidtLabel = false;
} else if (type == 'descr') {
this.state.description = this.editDescr;
this.state._description = this.editDescr;
this.isEidtDescr = false;
}
} else {
this.$message({
type: 'error',
message: '信息修改失败',
});
}
}).catch(err => {
console.log(err);
this.$message({
type: 'error',
message: '信息修改失败',
});
});
},
deleteFile(file) {
this.$confirm('请确认是否删除当前模型文件?', this.$t('tips'), {
confirmButtonText: this.$t('confirm1'),
@@ -350,8 +431,12 @@ export default {
.row {
display: flex;
height: 32px;
align-items: center;
margin-bottom: 4px;
align-items: center;

&.edit-row {
height: unset;
}

.tit {
width: 160px;
@@ -365,14 +450,30 @@ export default {
position: relative;
height: 20px;

&.edit-val {
height: unset;
}

.txt-wrap {
position: absolute;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 100%;

/deep/.append-txt {
margin-left: 6px;
background-color: gainsboro;
padding: 2px;
border-radius: 2px;
font-size: 12px;
}
}
}

.txt-edit {
padding-right: 20px;
}
}
}
}
@@ -466,9 +567,13 @@ export default {
}
}

/deep/ .el-input__inner {
font-weight: 600;
.el-select {
/deep/ .el-input__inner {
font-weight: 600;
}
}

/deep/ .el-input__inner {
&:focus {
border-color: #85b7d9;
}


Loading…
Cancel
Save