|
- {{template "base/head" .}}
- <style>
- .unite{
- font-family: SourceHanSansSC-medium !important;
- color: rgba(16, 16, 16, 100) !important;
- }
-
- .title{
- font-size: 16px !important;
- padding-left: 3rem !important;
- }
- .min_title{
- font-size: 14px !important;
- padding-left: 6rem !important;
- margin-bottom: 2rem !important;
-
- }
- .width80{
- width: 80.7% !important;
- }
- .width84{
- width: 84% !important;
- margin-left: 5.1rem !important;
- }
- .width35{
- width: 35.5% !important;
- }
-
-
- .nowrap {
- white-space: nowrap !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="repository">
- {{template "repo/header" .}}
- <div class="ui container">
- {{template "base/alert" .}}
- <h4 class="ui top attached header">
- {{.i18n.Tr "repo.modelarts.train_job.new"}}
- </h4>
- <div class="ui attached segment">
- <!-- equal width -->
- <form class="ui form" action="{{.Link}}" method="post">
- {{.CsrfTokenHtml}}
- <input type="hidden" name="action" value="update">
- <input type="hidden" id="ai_engine_name" name="engine_names" value="">
- <input type="hidden" id="ai_flaver_name" name="flaver_names" value="">
- <input type="hidden" id="ai_model_version" name="model_version" value="">
- <input type="hidden" id="ai_model_label" name="label_names" value="">
- <h4 class="unite title ui header ">{{.i18n.Tr "repo.modelarts.train_job.basic_info"}}:</h4>
- <div class="required unite min_title inline field">
- <label style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.job_name"}}</label>
- <input style="width: 60%;" name="job_name" id="trainjob_job_name" placeholder={{.i18n.Tr "repo.modelarts.train_job.job_name"}} value="{{.job_name}}" tabindex="3" autofocus required maxlength="36">
- <span class="tooltips" style="display: block;">请输入只包含大小写字母、数字、_和-,最长36个字符。</span>
- </div>
-
- <div class="unite min_title inline field">
- <label style="font-weight: normal;" for="description">{{.i18n.Tr "repo.modelarts.train_job.description"}}</label>
- <textarea style="width: 80%;" id="description" name="description" rows="3" maxlength="254" 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, 255)"></textarea>
- </div>
- <div class="ui divider"></div>
-
- <!-- 模型相关配置 -->
- <h4 class="unite title ui header ">{{.i18n.Tr "repo.modelarts.train_job.parameter_setting"}}:</h4>
- <div class="required unite inline min_title fields" style="width: 91.8%;">
- <div class="required eight wide field">
- <label style="font-weight: normal;white-space: nowrap;">{{.i18n.Tr "repo.modelarts.infer_job.select_model"}}</label>
- <div class="ui fluid search selection dropdown loading" id="select_model">
- {{if $.ckpt_name}}
- <input type="hidden" name="model_name" value="{{$.model_name}}" required>
- <div class="text">{{$.model_name}}</div>
- {{else}}
- <input type="hidden" name="model_name" required>
- <div class="text"></div>
- {{end}}
- <i class="dropdown icon"></i>
- <div class="menu" id="model_name">
- </div>
- </div>
- </div>
- <div class="three wide field">
- <div class="ui fluid search selection dropdown" id="select_model_version">
- {{if $.ckpt_name}}
- <input type="hidden" name="train_url" value="{{$.model_version}}" required>
- <div class="text">{{$.model_version}}</div>
- {{else}}
- <input type="hidden" name="train_url" required>
- <div class="text"></div>
- {{end}}
- <i class="dropdown icon"></i>
- <div class="menu" id="model_name_version">
- </div>
-
- </div>
- </div>
- <div class="five wide field">
- <div class="ui fluid search selection dropdown" id="select_model_checkpoint">
- {{if $.ckpt_name}}
- <input type="hidden" name="ckpt_name" value="{{$.ckpt_name}}" required>
- <div class="text">{{$.ckpt_name}}</div>
- {{else}}
- <input type="hidden" name="ckpt_name" required>
- <div class="text"></div>
- {{end}}
- <i class="dropdown icon"></i>
- <div class="menu" id="model_checkpoint">
- </div>
- </div>
-
- </div>
- <span >
- <i class="question circle icon" data-content="模型文件位置存储在环境变量ckpt_path中。" data-position="top center" data-variation="inverted mini"></i>
- </span>
- </div>
- <!-- AI引擎 -->
- <div class="required unite inline min_title fields" style="width: 90%;">
- <div class="required eight wide field">
- <label style="font-weight: normal;white-space: nowrap;">{{.i18n.Tr "repo.modelarts.train_job.AI_driver"}}</label>
- <select class="ui fluid selection search dropdown" id="trainjob_engines">
- {{range .engines}}
- <option value="{{.Value}}">{{.Value}}</option>
- {{end}}
- </select>
- </div>
- <div class="eight wide field" id="engine_name">
- <select class="ui fluid selection dropdown nowrap" id="trainjob_engine_versions" name="engine_id" style="white-space: nowrap;">
- {{range .engine_versions}}
- <option name="engine_id" value="{{.ID}}">{{.Value}}</option>
- {{end}}
- </select>
- </div>
- </div>
- <!-- 代码分支 -->
- <div class="required unite min_title inline field">
- <label style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.code_version"}}</label>
- <select class="ui dropdown width35" id="code_version" name="branch_name">
- {{if .branch_name}}
- <option name="branch_name" value="{{.branch_name}}">{{.branch_name}}</option>
- {{range $k, $v :=.Branches}}
- {{ if ne $v $.branch_name }}
- <option name="branch_name" value="{{$v}}">{{$v}}</option>
- {{end}}
- {{end}}
- {{else}}
- <option name="branch_name" value="{{.branchName}}">{{.branchName}}</option>
- {{range $k, $v :=.Branches}}
- {{ if ne $v $.branchName }}
- <option name="branch_name" value="{{$v}}">{{$v}}</option>
- {{end}}
- {{end}}
- {{end}}
- </select>
- </div>
- <!-- 数据集 -->
- <div class="required unite min_title inline field">
- <label style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.dataset"}}</label>
- <select class="ui dropdown width35" id="trainjob_datasets" name="attachment" placeholder="选择数据集" required>
- {{if $.uuid}}
- <option name="attachment" value="{{$.uuid}}">{{$.datasetName}}</option>
- {{end}}
- {{range .attachments}}
- <option value="">选择数据集</option>
- <option name="attachment" value="{{.UUID}}">{{.Attachment.Name}}</option>
- {{end}}
- </select>
- <span>
- <i class="question circle icon" data-content="数据集位置存储在环境变量data_url中。" data-position="top center" data-variation="inverted mini"></i>
- </span>
- <span class="tooltips" style="display: block;">数据集位置存储在环境变量data_url中,推理输出路径存储在环境变量result_url中。</span>
- </div>
- <!-- 启动文件 -->
- <div class="inline unite min_title field required">
- <label style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.start_file"}}</label>
- {{if .bootFile}}
- <input style="width: 35.5%;" name="boot_file" id="trainjob_boot_file" value="{{.bootFile}}" tabindex="3" autofocus required maxlength="254" >
- {{else}}
- <input style="width: 35.5%;" name="boot_file" id="trainjob_boot_file" value="" tabindex="3" autofocus required maxlength="254" >
- {{end}}
- <span >
- <i class="question circle icon" data-content={{.i18n.Tr "repo.modelarts.train_job.boot_file_helper"}} data-position="top center" data-variation="inverted mini"></i>
- </span>
- <a href="https://git.openi.org.cn/OpenIOSSG/MINIST_Example" target="_blank">查看样例</a>
- </div>
-
- <!-- 运行参数 -->
- <div class="inline unite min_title field">
- <label style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.run_parameter"}}</label>
- <span id="add_run_para" style="margin-left: 0.5rem;cursor:pointer;color: rgba(3, 102, 214, 100);font-size: 14px;line-height: 26px;font-family: SourceHanSansSC-medium;"><i class="plus square outline icon"></i>{{.i18n.Tr "repo.modelarts.train_job.add_run_parameter"}}</span>
- <input id="store_run_para" type="hidden" name="run_para_list">
- <div class="dynamic field" style="margin-top: 1rem;">
- {{if ne 0 (len .params)}}
- {{range $k ,$v := .params}}
- <div class="two fields width84" id="para{{$k}}">
- <div class="field">
- <input type="text" name="shipping_first-name" value={{$v.Label}} required>
- </div>
- <div class="field">
- <input type="text" name="shipping_last-name" value={{$v.Value}} required>
- </div>
- <span>
- <i class="trash icon"></i>
- </span>
-
- </div>
- {{end}}
- {{end}}
- </div>
- </div>
-
- <div class="required field " style="display: none;">
- <label style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.resource_pool"}}</label>
- <select class="ui dropdown" id="trainjob_resource_pool" style='width:385px' name="pool_id">
- {{range .resource_pools}}
- <option value="{{.ID}}">{{.Value}}</option>
- {{end}}
- </select>
- </div>
- <!-- 规格 -->
- <div class="required unite min_title inline field" id="flaver_name">
- <label style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.standard"}}</label>
- <select class="ui dropdown width80" id="trainjob-flavor" name="flavor">
- {{range .flavor_infos}}
- <option name="flavor" value="{{.Code}}">{{.Value}}</option>
- {{end}}
- </select>
- </div>
- <!-- 计算节点 -->
- <div class="inline required unite min_title field">
- <label style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.amount_of_compute_node"}}</label>
-
- <div class="ui labeled input" style="width: 5%;">
- <input style="border-radius: 0;text-align: center;" name="work_server_number" id="trainjob_work_server_num" tabindex="3" autofocus required maxlength="254" value="1" readonly>
- </div>
- </div>
- <!-- 表单操作 -->
- <div class="inline unite min_title field">
- <button class="ui create_train_job green button">
- {{.i18n.Tr "repo.cloudbrain.new"}}
- </button>
- <a class="ui button" href="/">{{.i18n.Tr "repo.cloudbrain.cancel"}}</a>
- </div>
- <!-- 模态框 -->
- </form>
- </div>
- </div>
- </div>
- {{template "base/footer" .}}
-
- <script>
- const RepoLink = {{.RepoLink}}
- const url_href = window.location.pathname.split('create')[0]
- let nameMap,nameList
- $(".ui.button").attr('href',url_href)
- // 获取模型列表和模型名称对应的模型版本
- $.get(`${RepoLink}/modelmanage/query_model_for_predict`, (data) => {
- nameMap = data.nameMap
- nameList = data.nameList
- let html = ''
- nameList.forEach(element => {
- html += `<div class="item" data-value=${element}>${element}</div>`
- });
- const initModelVersion = nameMap[nameList[0]][0]
- const initTrainTaskInfo = JSON.parse(initModelVersion.TrainTaskInfo)
- $('#model_name').append(html)
- $('#select_model').removeClass("loading")
- $("#select_model").dropdown('set text',nameList[0])
- $("#select_model").dropdown('set value',nameList[0],nameList[0])
- })
- // 根据选中的模型名称获取相应的模型版本
- $(function(){
- $('#select_model').dropdown({
- onChange: function(value, text, $selectedItem) {
- $("#select_model_version").addClass("loading")
- $('#model_name_version').empty()
- let html = ''
- nameMap[value].forEach(element => {
- let {TrainTaskInfo} = element
- TrainTaskInfo = JSON.parse(TrainTaskInfo)
- html += `<div class="item" data-label="${element.Label}" data-id="${element.ID}" data-value="${TrainTaskInfo.TrainUrl}">${element.Version}</div>`
- });
- $('#model_name_version').append(html)
- $("#select_model_version").removeClass("loading")
- const initVersionText = $('#model_name_version div.item:first-child').text()
- const initVersionValue = $('#model_name_version div.item:first-child').data('value')
- $("#select_model_version").dropdown('set text',initVersionText)
- $("#select_model_version").dropdown('set value',initVersionValue,initVersionText,$('#model_name_version div.item:first-child'))
- }
- })
- })
- // 根据选中的模型版本获取相应的模型权重文件
- $(function(){
- $('#select_model_version').dropdown({
- onChange: function(value, text, $selectedItem) {
- const dataID = $selectedItem[0].getAttribute("data-id")
- const label = $selectedItem[0].getAttribute("data-label")
- $("#select_model_checkpoint").addClass("loading")
- $("#model_checkpoint").empty()
- let html = ''
- loadCheckpointList(dataID).then((res)=>{
- res.forEach(element => {
- const ckptSuffix = element.FileName.split(".")
- if(!element.IsDir && ckptSuffix[ckptSuffix.length-1]==='ckpt'){
- html += `<div class="item" data-value=${element.FileName}>${element.FileName}</div>`
- }
-
- })
- $('#model_checkpoint').append(html)
- $("#select_model_checkpoint").removeClass("loading")
- const initVersionText = $('#model_checkpoint div.item:last-child').text()
- const initVersionValue = $('#model_checkpoint div.item:last-child').data('value')
- $("#select_model_checkpoint").dropdown('set text',initVersionText)
- $("#select_model_checkpoint").dropdown('set value',initVersionValue,initVersionText,$('#model_name_version div.item:first-child'))
- })
-
-
- $("input#ai_model_version").val(text)
- $("input#ai_model_label").val(label)
- }
- })
- })
- function loadCheckpointList(value){
- return new Promise((resolve,reject)=>{
- $.get(`${RepoLink}/modelmanage/query_modelfile_for_predict`,{ID:value}, (data) => {
- resolve(data)
- })
- })
- }
-
- $('.question.circle.icon').hover(function(){
- $(this).popup('show')
- });
-
- // 参数增加、删除、修改、保存
- function Add_parameter(i){
- value = '<div class="two fields width84" id= "para'+ i +'">' +
- '<div class="field">' +
- '<input type="text" name="shipping_first-name" required placeholder={{.i18n.Tr "repo.modelarts.train_job.parameter_name"}}> ' +
- '</div> ' +
- '<div class="field"> ' +
- '<input type="text" name="shipping_last-name" required placeholder={{.i18n.Tr "repo.modelarts.train_job.parameter_value"}}>' +
- '</div>'+
- '<span>' +
- '<i class="trash icon">' +
- '</i>' +
- '</span>' +
- '</div>'
- $(".dynamic.field").append(value)
- }
-
- $('#add_run_para').click(function(){
- var len = $(".dynamic.field .two.fields").length
- Add_parameter(len)
- });
-
- $(".dynamic.field").on("click",".trash.icon", function() {
- var index = $(this).parent().parent().index()
- $(this).parent().parent().remove()
- var len = $(".dynamic.field .two.fields").length
- $(".dynamic.field .two.fields").each(function(){
- var cur_index = $(this).index()
- $(this).attr('id', 'para' + cur_index)
- })
- });
- function send_run_para(){
- var run_parameters = []
- var msg = {}
- $(".dynamic.field .two.fields").each(function(){
- var para_name = $(this).find('input[name=shipping_first-name]').val()
- var para_value = $(this).find('input[name=shipping_last-name]').val()
- run_parameters.push({"label": para_name, "value": para_value})
- })
- msg["parameter"] = run_parameters
- msg = JSON.stringify(msg)
- $('#store_run_para').val(msg)
- }
- function get_name(){
- let name1=$("#engine_name .text").text()
- let name2=$("#flaver_name .text").text()
- $("input#ai_engine_name").val(name1)
- $("input#ai_flaver_name").val(name2)
-
- }
- function validate(){
- $('.ui.form')
- .form({
- on: 'blur',
- fields: {
- boot_file: {
- identifier : 'boot_file',
- rules: [
- {
- type: 'regExp[/.+\.py$/g]',
- }
- ]
- },
- job_name:{
- identifier : 'job_name',
- rules: [
- {
- type: 'regExp[/^[a-zA-Z0-9-_]{1,36}$/]',
- }
- ]
- },
- attachment:{
- identifier : 'attachment',
- rules: [
- {
- type: 'empty',
- }
- ]
-
- },
- model_name:{
- identifier : 'model_name',
- rules: [
- {
- type: 'empty',
- }
- ]
- },
- train_url:{
- identifier : 'train_url',
- rules: [
- {
- type: 'empty',
- }
- ]
- },
- ckpt_name:{
- identifier : 'ckpt_name',
- rules: [
- {
- type: 'empty',
- }
- ]
- }
- },
- onSuccess: function(){
- document.getElementById("mask").style.display = "block"
- },
- onFailure: function(e){
- return false;
- }
- })
- }
- document.onreadystatechange = function() {
- if (document.readyState === "complete") {
- document.getElementById("mask").style.display = "none"
- }
- }
- $('.ui.create_train_job.green.button').click(function(e) {
- send_run_para()
- get_name()
- validate()
- })
- </script>
|