| @@ -883,7 +883,19 @@ modelarts.train_job_para_admin=train_job_para_admin | |||||
| modelarts.train_job_para.edit=train_job_para.edit | modelarts.train_job_para.edit=train_job_para.edit | ||||
| modelarts.train_job_para.connfirm=train_job_para.connfirm | modelarts.train_job_para.connfirm=train_job_para.connfirm | ||||
| model.manage.import_new_model=Import New Model | |||||
| model.manage.create_error=Equal Name and Version has existed. | model.manage.create_error=Equal Name and Version has existed. | ||||
| model.manage.model_name = Model Name | |||||
| model.manage.version = Version | |||||
| model.manage.label = Label | |||||
| model.manage.size = Size | |||||
| model.manage.create_time = Create Time | |||||
| model.manage.Description = Description | |||||
| model.manage.Accuracy = Accuracy | |||||
| model.manage.F1 = F1 | |||||
| model.manage.Precision = Precision | |||||
| model.manage.Recall = Recall | |||||
| template.items = Template Items | template.items = Template Items | ||||
| template.git_content = Git Content (Default Branch) | template.git_content = Git Content (Default Branch) | ||||
| @@ -895,7 +895,18 @@ modelarts.train_job_para_admin=任务参数管理 | |||||
| modelarts.train_job_para.edit=编辑 | modelarts.train_job_para.edit=编辑 | ||||
| modelarts.train_job_para.connfirm=确定 | modelarts.train_job_para.connfirm=确定 | ||||
| model.manage.import_new_model=导入新模型 | |||||
| model.manage.create_error=相同的名称和版本的模型已经存在。 | model.manage.create_error=相同的名称和版本的模型已经存在。 | ||||
| model.manage.model_name = 模型名称 | |||||
| model.manage.version = 版本 | |||||
| model.manage.label = 标签 | |||||
| model.manage.size = 大小 | |||||
| model.manage.create_time = 创建时间 | |||||
| model.manage.description = 描述 | |||||
| model.manage.Accuracy = 准确率 | |||||
| model.manage.F1 = F1值 | |||||
| model.manage.Precision = 精确率 | |||||
| model.manage.Recall = 召回率 | |||||
| template.items=模板选项 | template.items=模板选项 | ||||
| template.git_content=Git数据(默认分支) | template.git_content=Git数据(默认分支) | ||||
| @@ -28,112 +28,24 @@ | |||||
| <div class="repository release dataset-list view"> | <div class="repository release dataset-list view"> | ||||
| {{template "repo/header" .}} | {{template "repo/header" .}} | ||||
| <!-- 列表容器 --> | <!-- 列表容器 --> | ||||
| <div class="ui container loading"> | |||||
| <div class="ui container"> | |||||
| {{template "base/alert" .}} | {{template "base/alert" .}} | ||||
| <div class="ui two column stackable grid "> | <div class="ui two column stackable grid "> | ||||
| <div class="column"></div> | <div class="column"></div> | ||||
| <div class="column right aligned"> | <div class="column right aligned"> | ||||
| {{if .Permission.CanWrite $.UnitTypeCloudBrain}} | |||||
| <a class="ui green button" onclick="showcreate(this)">{{$.i18n.Tr "repo.modelarts.train_job.new_train"}}</a>{{end}} | |||||
| <!-- --> | |||||
| <a class="ui button {{if .Permission.CanWrite $.UnitTypeCloudBrain}} green {{else}} disabled {{end}}" onclick="showcreate(this)">{{$.i18n.Tr "repo.model.manage.import_new_model"}}</a> | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| <!-- 中下列表展示区 --> | <!-- 中下列表展示区 --> | ||||
| <div class="ui grid"> | <div class="ui grid"> | ||||
| <div class="row"> | |||||
| <div class="row" style="padding-top: 0;"> | |||||
| <div class="ui sixteen wide column"> | <div class="ui sixteen wide column"> | ||||
| <!-- 任务展示 --> | <!-- 任务展示 --> | ||||
| <div class="dataset list" id="model_list"> | <div class="dataset list" id="model_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.modelarts.model_name"}}</span> | |||||
| </div> | |||||
| <div class="one wide column text center padding0"> | |||||
| <span style="margin:0 6px">{{$.i18n.Tr "repo.modelarts.version"}}</span> | |||||
| </div> | |||||
| <div class="one wide column text center padding0" style="width: 7.25%!important;"> | |||||
| <span style="margin:0 6px">{{$.i18n.Tr "repo.modelarts.version_nums"}}</span> | |||||
| </div> | |||||
| <div class="two wide column text center padding0" style="width: 11.5%!important;"> | |||||
| <span>{{$.i18n.Tr "repo.modelarts.model_size"}}</span> | |||||
| </div> | |||||
| <div class="two wide column text center padding0" style="width: 8.5%!important;"> | |||||
| <span>{{$.i18n.Tr "repo.modelarts.train_job.AI_driver"}}</span> | |||||
| </div> | |||||
| <div class="two wide column text center padding0" style="width: 11.5%!important;"> | |||||
| <span>{{$.i18n.Tr "repo.modelarts.computing_resources"}}</span> | |||||
| </div> | |||||
| <div class="two wide column text center padding0"> | |||||
| <span>{{$.i18n.Tr "repo.modelarts.createtime"}}</span> | |||||
| </div> | |||||
| <div class="one wide column text center padding0"> | |||||
| <span>{{$.i18n.Tr "repo.cloudbrain_creator"}}</span> | |||||
| </div> | |||||
| <div class="two wide column text center padding0" style="width: 17.5%!important;"> | |||||
| <span>{{$.i18n.Tr "repo.cloudbrain_operate"}}</span> | |||||
| </div> | |||||
| </div> | |||||
| </div> --> | |||||
| <!-- <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: 12px;"> | |||||
| <span class="fitted" style="vertical-align: middle;">{{svg "octicon-tasklist" 16}}</span> | |||||
| <span class="fitted" style="width: 90%;vertical-align: middle;margin-left: 0.4rem;">Model-abcd</span> | |||||
| </a> | |||||
| </div> | |||||
| <div class="one wide column text center padding0"> | |||||
| <span>0.0.3</span> | |||||
| </div> | |||||
| <div class="one wide column text center padding0" style="width: 7.25%!important;"> | |||||
| <span>20</span> | |||||
| </div> | |||||
| <div class="two wide column padding0 text center" style="width: 11.5%!important;"> | |||||
| <span>20.28MB</span> | |||||
| </div> | |||||
| <div class="two wide column padding0 text center" style="width: 8.5%!important;"> | |||||
| <span>Mindspore</span> | |||||
| </div> | |||||
| <div class="two wide column text center padding0" style="width: 11.5%!important;"> | |||||
| <span style="font-size: 12px;">CPU</span> | |||||
| </div> | |||||
| <div class="two wide column text center padding0"> | |||||
| <span style="font-size: 12px;">2021/09/20 12:06:13</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="two wide column text center padding0" style="width: 17.5%!important;"> | |||||
| <div style="display: flex;justify-content: space-between;"> | |||||
| <a>创建新版本</a> | |||||
| <a>下载</a> | |||||
| <a onclick="assertDelete(this)">删除</a> | |||||
| </div> | |||||
| </div> | |||||
| </div> | |||||
| </div> --> | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| @@ -227,7 +139,7 @@ | |||||
| </div> | </div> | ||||
| <div class="inline field"> | <div class="inline field"> | ||||
| <label for="description">模型描述</label> | <label for="description">模型描述</label> | ||||
| <textarea style="width: 83%;margin-left: 7px;" id="Description" name="description" rows="3" maxlength="255" placeholder={{.i18n.Tr "repo.modelarts.train_job.new_place"}} onchange="this.value=this.value.substring(0, 255)" onkeydown="this.value=this.value.substring(0, 255)" onkeyup="this.value=this.value.substring(0, 256)"></textarea> | |||||
| <textarea style="width: 83%;margin-left: 7px;" id="Description" name="Description" rows="3" maxlength="255" placeholder={{.i18n.Tr "repo.modelarts.train_job.new_place"}} onchange="this.value=this.value.substring(0, 255)" onkeydown="this.value=this.value.substring(0, 255)" onkeyup="this.value=this.value.substring(0, 256)"></textarea> | |||||
| </div> | </div> | ||||
| <div class="inline field" style="margin-left: 75px;"> | <div class="inline field" style="margin-left: 75px;"> | ||||
| @@ -16,7 +16,7 @@ | |||||
| padding-bottom: 20px; | padding-bottom: 20px; | ||||
| padding-right: 20px; | padding-right: 20px; | ||||
| color: #8a8e99; | color: #8a8e99; | ||||
| font-size: 12px; | |||||
| font-size: 14px; | |||||
| white-space: nowrap !important; | white-space: nowrap !important; | ||||
| width: 80px; | width: 80px; | ||||
| line-height: 30px; | line-height: 30px; | ||||
| @@ -25,54 +25,154 @@ | |||||
| line-height: 30px; | line-height: 30px; | ||||
| padding-bottom: 20px; | padding-bottom: 20px; | ||||
| } | } | ||||
| .change-version{ | |||||
| min-width: auto !important; | |||||
| border: 1px solid rgba(187, 187, 187, 100) !important; | |||||
| border-radius: .38571429rem !important; | |||||
| margin-left: 1.5em; | |||||
| } | |||||
| .word-elipsis{ | |||||
| overflow: hidden; | |||||
| text-overflow: ellipsis; | |||||
| white-space: nowrap; | |||||
| } | |||||
| .half-table{ | |||||
| width: 50%; | |||||
| float: left; | |||||
| } | |||||
| .text-width80 { | |||||
| width: 100px; | |||||
| line-height: 30px; | |||||
| } | |||||
| .tableStyle{ | |||||
| width:100%; | |||||
| table-layout: fixed; | |||||
| } | |||||
| </style> | </style> | ||||
| <div class="ui container"> | <div class="ui container"> | ||||
| <h4 class="ui header" id="vertical-segment"> | <h4 class="ui header" id="vertical-segment"> | ||||
| <!-- <a href="javascript:window.history.back();"><i class="arrow left icon"></i>返回</a> --> | <!-- <a href="javascript:window.history.back();"><i class="arrow left icon"></i>返回</a> --> | ||||
| <div class="ui breadcrumb"> | <div class="ui breadcrumb"> | ||||
| <a class="section" href="{{$.RepoLink}}/modelmanage/show_model"> | <a class="section" href="{{$.RepoLink}}/modelmanage/show_model"> | ||||
| 模型管理 | |||||
| 模型管理 | |||||
| </a> | </a> | ||||
| <div class="divider"> / </div> | <div class="divider"> / </div> | ||||
| <div class="active section">{{.name}}</div> | <div class="active section">{{.name}}</div> | ||||
| </div> | </div> | ||||
| <select class="ui dropdown tiny change-version" id="dropdown" onchange="changeInfo(this.value)"> | |||||
| </select> | |||||
| </h4> | </h4> | ||||
| <div style="border:1px solid #e2e2e2;padding: 20px 60px;margin-top:24px"> | |||||
| <div style="width: 50%;float: left;"> | |||||
| <span class="model_header_text">基本信息</span> | |||||
| <table style="margin-top:20px;"> | |||||
| <tbody> | |||||
| <tr style="font-size: 12px;"> | |||||
| <td class="ti-text-form-label"> | |||||
| 模型名称: | |||||
| </td> | |||||
| <td class="ti-text-form-content"> | |||||
| Model_asasdas | |||||
| </td> | |||||
| </tr> | |||||
| </tbody> | |||||
| </table> | |||||
| </div> | |||||
| <div style="width: 50%;float: left;"> | |||||
| <span class="model_header_text">模型精度</span> | |||||
| </div> | |||||
| <div style="clear: both;"></div> | |||||
| <div id="showInfo" style="border:1px solid #e2e2e2;padding: 20px 60px;margin-top:24px"> | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| {{template "base/footer" .}} | |||||
| <script> | <script> | ||||
| let url = location.href.split('show_model')[0] | let url = location.href.split('show_model')[0] | ||||
| let ID = location.search.slice(6,8) | |||||
| let ID = location.search.split('?name=').pop() | |||||
| console.log("-----------",ID) | console.log("-----------",ID) | ||||
| $(document).ready(loadInfo); | $(document).ready(loadInfo); | ||||
| function loadInfo(version){ | |||||
| $.get(`${url}show_model_info_api?ID=${ID}`,(data)=>{ | |||||
| console.log("data",data) | |||||
| function changeInfo(version){ | |||||
| $.get(`${url}show_model_info_api?name=${ID}`,(data)=>{ | |||||
| let versionData = data.filter((item)=>{ | |||||
| return item.Version === version | |||||
| }) | |||||
| let initObj = transObj(versionData)[0] | |||||
| let initModelAcc = transObj(versionData)[1] | |||||
| console.log("=======",initObj,initModelAcc) | |||||
| $('#showInfo').empty() | |||||
| renderInfo(initObj,initModelAcc) | |||||
| }) | |||||
| } | |||||
| function loadInfo(){ | |||||
| $.get(`${url}show_model_info_api?name=${ID}`,(data)=>{ | |||||
| let html = '' | |||||
| for (let i=0;i<data.length;i++){ | |||||
| html += `<option value="${data[i].Version}">${data[i].Version}</option>` | |||||
| } | |||||
| $('#dropdown').append(html) | |||||
| let initObj = transObj(data)[0] | |||||
| let initModelAcc = transObj(data)[1] | |||||
| renderInfo(initObj,initModelAcc) | |||||
| }) | }) | ||||
| } | } | ||||
| function transObj(data){ | |||||
| let {Name,Version,Label,Size,Description,CreatedUnix,Accuracy} = data[0] | |||||
| let modelAcc = JSON.parse(Accuracy) | |||||
| let size = tranSize(Size) | |||||
| let time = transTime(CreatedUnix) | |||||
| let initObj = { | |||||
| ModelName:Name || '--', | |||||
| Version:Version, | |||||
| Label:Label || '--', | |||||
| Size:size, | |||||
| CreateTime:time, | |||||
| Description:Description || '--', | |||||
| } | |||||
| let initModelAcc = { | |||||
| Accuracy: modelAcc.Accuracy || '--', | |||||
| F1: modelAcc.F1 || '--', | |||||
| Precision:modelAcc.Precision || '--', | |||||
| Recall: modelAcc.Recall || '--' | |||||
| } | |||||
| return [initObj,initModelAcc] | |||||
| } | |||||
| function transTime(time){ | |||||
| let date = new Date(time * 1000);//时间戳为10位需*1000,时间戳为13位的话不需乘1000 | |||||
| let Y = date.getFullYear() + '-'; | |||||
| let M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1):date.getMonth()+1) + '-'; | |||||
| let D = (date.getDate()< 10 ? '0'+date.getDate():date.getDate())+ ' '; | |||||
| let h = (date.getHours() < 10 ? '0'+date.getHours():date.getHours())+ ':'; | |||||
| let m = (date.getMinutes() < 10 ? '0'+date.getMinutes():date.getMinutes()) + ':'; | |||||
| let s = date.getSeconds() < 10 ? '0'+date.getSeconds():date.getSeconds(); | |||||
| return Y+M+D+h+m+s; | |||||
| } | |||||
| function tranSize(value){ | |||||
| if(null==value||value==''){ | |||||
| return "0 Bytes"; | |||||
| } | |||||
| var unitArr = new Array("Bytes","KB","MB","GB","TB","PB","EB","ZB","YB"); | |||||
| var index=0; | |||||
| var srcsize = parseFloat(value); | |||||
| index=Math.floor(Math.log(srcsize)/Math.log(1024)); | |||||
| var size =srcsize/Math.pow(1024,index); | |||||
| size=size.toFixed(2);//保留的小数位数 | |||||
| return size+unitArr[index]; | |||||
| } | |||||
| function renderInfo(obj,accObj){ | |||||
| let html = '' | |||||
| html += '<div class="half-table">' | |||||
| html += '<span class="model_header_text">基本信息</span>' | |||||
| html += '<table class="tableStyle" style="margin-top:20px;">' | |||||
| html += '<tbody>' | |||||
| for(let key in obj){ | |||||
| html += '<tr style="font-size: 12px;">' | |||||
| html += `<td class="ti-text-form-label text-width80">${key}</td>` | |||||
| html += `<td class="ti-text-form-content word-elipsis">${obj[key]}</td>` | |||||
| html += '</tr>' | |||||
| } | |||||
| html += '</tbody>' | |||||
| html += '</table>' | |||||
| html += '</div>' | |||||
| html += '<div class="half-table">' | |||||
| html += '<span class="model_header_text">模型精度</span>' | |||||
| html += '<table class="tableStyle" style="margin-top:20px;">' | |||||
| html += '<tbody>' | |||||
| for(let key in accObj){ | |||||
| html += '<tr style="font-size: 12px;">' | |||||
| html += `<td class="ti-text-form-label text-width80">${key}</td>` | |||||
| html += `<td class="ti-text-form-content">${accObj[key]}</td>` | |||||
| html += '</tr>' | |||||
| } | |||||
| html += '</tbody>' | |||||
| html += '</table>' | |||||
| html += '</div>' | |||||
| html += '<div style="clear: both;"></div>' | |||||
| $('#showInfo').append(html) | |||||
| } | |||||
| </script> | </script> | ||||
| @@ -118,6 +118,7 @@ | |||||
| @size-change="handleSizeChange" | @size-change="handleSizeChange" | ||||
| @current-change="handleCurrentChange" | @current-change="handleCurrentChange" | ||||
| :current-page="currentPage" | :current-page="currentPage" | ||||
| :page-sizes="[10]" | |||||
| :page-size="pageSize" | :page-size="pageSize" | ||||
| layout="total, sizes, prev, pager, next, jumper" | layout="total, sizes, prev, pager, next, jumper" | ||||
| :total="totalNum"> | :total="totalNum"> | ||||
| @@ -164,7 +165,7 @@ export default { | |||||
| tableData= res.data | tableData= res.data | ||||
| console.log("-----tableData---",tableData) | console.log("-----tableData---",tableData) | ||||
| for(let i=0;i<tableData.length;i++){ | for(let i=0;i<tableData.length;i++){ | ||||
| TrainTaskInfo = JSON.parse(res.data[i].TrainTaskInfo) | |||||
| TrainTaskInfo = JSON.parse(tableData[i].TrainTaskInfo) | |||||
| tableData[i].EngineName = TrainTaskInfo.EngineName.split('-')[0] | tableData[i].EngineName = TrainTaskInfo.EngineName.split('-')[0] | ||||
| tableData[i].ComputeResource = TrainTaskInfo.ComputeResource | tableData[i].ComputeResource = TrainTaskInfo.ComputeResource | ||||
| tableData[i].Name='' | tableData[i].Name='' | ||||
| @@ -184,11 +185,11 @@ export default { | |||||
| }, | }, | ||||
| handleSizeChange(val){ | handleSizeChange(val){ | ||||
| this.params.size = val | this.params.size = val | ||||
| this.getImageList() | |||||
| this.getModelList() | |||||
| }, | }, | ||||
| handleCurrentChange(val){ | handleCurrentChange(val){ | ||||
| this.params.page = val | this.params.page = val | ||||
| this.getImageList() | |||||
| this.getModelList() | |||||
| }, | }, | ||||
| showcreateVue(name,version){ | showcreateVue(name,version){ | ||||
| $('.ui.modal.second') | $('.ui.modal.second') | ||||
| @@ -222,20 +223,22 @@ export default { | |||||
| }) | }) | ||||
| }, | }, | ||||
| getModelList(){ | getModelList(){ | ||||
| this.fullscreenLoading = true | |||||
| this.fullscreenLoading = false | |||||
| this.$axios.get(location.href+'_api',{ | this.$axios.get(location.href+'_api',{ | ||||
| params:this.params | params:this.params | ||||
| }).then((res)=>{ | }).then((res)=>{ | ||||
| console.log("res",res) | |||||
| let TrainTaskInfo | let TrainTaskInfo | ||||
| this.tableData = res.data.data | this.tableData = res.data.data | ||||
| for(let i=0;i<res.data.count;i++){ | |||||
| TrainTaskInfo = JSON.parse(res.data.data[i].TrainTaskInfo) | |||||
| console.log("this.tableData",this.tableData) | |||||
| for(let i=0;i<this.tableData.length;i++){ | |||||
| TrainTaskInfo = JSON.parse(this.tableData[i].TrainTaskInfo) | |||||
| this.tableData[i].EngineName = TrainTaskInfo.EngineName.split('-')[0] | this.tableData[i].EngineName = TrainTaskInfo.EngineName.split('-')[0] | ||||
| this.tableData[i].ComputeResource = TrainTaskInfo.ComputeResource | this.tableData[i].ComputeResource = TrainTaskInfo.ComputeResource | ||||
| this.tableData[i].hasChildren = res.data.data[i].VersionCount===1 ? false : true | this.tableData[i].hasChildren = res.data.data[i].VersionCount===1 ? false : true | ||||
| } | } | ||||
| this.totalNum = this.tableData.length | |||||
| this.totalNum = res.data.count | |||||
| console.log("this.tableData.",this.tableData) | console.log("this.tableData.",this.tableData) | ||||
| this.fullscreenLoading = false | this.fullscreenLoading = false | ||||
| }) | }) | ||||
| @@ -359,6 +362,7 @@ export default { | |||||
| margin-right: 3px; | margin-right: 3px; | ||||
| font-size: 12px; | font-size: 12px; | ||||
| } | } | ||||
| /deep/ .el-table_1_column_1.is-left .cell {padding-right: 0px !important;} | |||||
| /deep/ .el-table__expand-icon .el-icon-arrow-right{ | /deep/ .el-table__expand-icon .el-icon-arrow-right{ | ||||
| font-family: element-icons!important; | font-family: element-icons!important; | ||||
| speak: none; | speak: none; | ||||