You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

show.tmpl 51 kB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
4 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
3 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093
  1. {{template "base/head" .}}
  2. <link rel="stylesheet" href="/self/ztree/css/zTreeStyle/zTreeStyle.css" type="text/css">
  3. <style>
  4. .according-panel-heading {
  5. box-sizing: border-box;
  6. padding: 8px 16px;
  7. color: #252b3a;
  8. background-color: #f2f5fc;
  9. line-height: 1.5;
  10. cursor: pointer;
  11. -moz-user-select: none;
  12. -webkit-user-select: none;
  13. -ms-user-select: none;
  14. -khtml-user-select: none;
  15. user-select: none;
  16. }
  17. .accordion-panel-title {
  18. margin-top: 0;
  19. margin-bottom: 0;
  20. color: #252b3a;
  21. }
  22. .accordion-panel-title-content {
  23. vertical-align: middle;
  24. display: inline-block;
  25. width: calc(100% - 32px);
  26. cursor: default;
  27. }
  28. .acc-margin-bottom {
  29. margin-bottom: 5px;
  30. }
  31. .title_text {
  32. font-size: 12px;
  33. }
  34. .ac-display-inblock {
  35. display: inline-block;
  36. }
  37. .cti-mgRight-sm {
  38. margin-right: 8px;
  39. }
  40. .ac-text-normal {
  41. font-size: 14px;
  42. color: #575d6c;
  43. }
  44. .uc-accordionTitle-black {
  45. color: #333;
  46. }
  47. .accordion-border {
  48. border: 1px solid #cce2ff;
  49. }
  50. .padding0 {
  51. padding: 0 !important;
  52. }
  53. .content-pad {
  54. padding: 15px 35px;
  55. }
  56. .content-margin {
  57. margin: 10px 5px;
  58. }
  59. .tab_2_content {
  60. min-height: 360px;
  61. margin-left: 10px;
  62. }
  63. .ac-grid {
  64. display: block;
  65. *zoom: 1;
  66. }
  67. .ac-grid-col {
  68. float: left;
  69. width: 100%;
  70. }
  71. .ac-grid-col2 .ac-grid-col {
  72. width: 50%;
  73. }
  74. .ti-form {
  75. text-align: left;
  76. max-width: 100%;
  77. vertical-align: middle;
  78. }
  79. .ti-form>tbody {
  80. font-size: 12px;
  81. }
  82. .ti-form>tbody,
  83. .ti-form>tbody>tr {
  84. vertical-align: inherit;
  85. }
  86. .ti-text-form-label {
  87. padding-bottom: 20px;
  88. padding-right: 20px;
  89. color: #8a8e99;
  90. font-size: 12px;
  91. white-space: nowrap !important;
  92. width: 80px;
  93. line-height: 30px;
  94. }
  95. .ti-text-form-content {
  96. line-height: 30px;
  97. padding-bottom: 20px;
  98. }
  99. .ti-form>tbody>tr>td {
  100. vertical-align: top;
  101. white-space: normal;
  102. }
  103. td,
  104. th {
  105. padding: 0;
  106. }
  107. .ac-grid-col .text-span {
  108. width: 450px;
  109. overflow: hidden;
  110. text-overflow: ellipsis;
  111. white-space: nowrap;
  112. }
  113. .redo-color {
  114. color: #3291F8;
  115. }
  116. .ti-action-menu-item:not(:last-child) {
  117. margin-right: 10px;
  118. padding-right: 11px;
  119. text-decoration: none !important;
  120. color: #526ecc;
  121. cursor: pointer;
  122. display: inline-block;
  123. -moz-user-select: none;
  124. -webkit-user-select: none;
  125. -ms-user-select: none;
  126. -khtml-user-select: none;
  127. user-select: none;
  128. position: relative;
  129. }
  130. .ti-action-menu-item:not(:last-child):after {
  131. content: "";
  132. display: inline-block;
  133. position: absolute;
  134. height: 12px;
  135. right: 0;
  136. top: 50%;
  137. -webkit-transform: translateY(-6px);
  138. -ms-transform: translateY(-6px);
  139. -o-transform: translateY(-6px);
  140. transform: translateY(-6px);
  141. border-right: 1px solid #dfe1e6;
  142. }
  143. .text-width80 {
  144. width: 100px;
  145. line-height: 30px;
  146. }
  147. .border-according {
  148. border: 1px solid #dfe1e6;
  149. }
  150. .ti-download-file {
  151. display: flex;
  152. align-items: center;
  153. margin: 0.5rem 0;
  154. }
  155. .disabled {
  156. cursor: default;
  157. pointer-events: none;
  158. color: rgba(0, 0, 0, .6) !important;
  159. opacity: .45 !important;
  160. }
  161. .pad20 {
  162. border: 0px !important;
  163. }
  164. .model_file_bread {
  165. margin-bottom: -0.5rem !important;
  166. padding-left: 1rem;
  167. padding-top: 0.5rem;
  168. }
  169. .menuContent{
  170. position: absolute;
  171. background: #ffffff;
  172. left: 0;
  173. right: 26px;
  174. top: 36px;
  175. z-index:999;
  176. border: 1px solid #96c8da;
  177. border-top: 0;
  178. border-bottom-right-radius: 4px;
  179. border-bottom-left-radius: 4px;
  180. box-shadow: 0 2px 3px 0 rgb(34 36 38 / 15%);
  181. }
  182. </style>
  183. <div id="mask">
  184. <div id="loadingPage">
  185. <div class="rect1"></div>
  186. <div class="rect2"></div>
  187. <div class="rect3"></div>
  188. <div class="rect4"></div>
  189. <div class="rect5"></div>
  190. </div>
  191. </div>
  192. <div class="repository">
  193. {{template "repo/header" .}}
  194. <div class="ui container">
  195. <h4 class="ui header" id="vertical-segment">
  196. <div class="ui breadcrumb">
  197. <a class="section" href="{{.RepoLink}}/debugjob?debugListType=all">
  198. {{.i18n.Tr "repo.cloudbrain"}}
  199. </a>
  200. <div class="divider"> / </div>
  201. <a class="section" href="{{$.RepoLink}}/modelarts/train-job">
  202. {{$.i18n.Tr "repo.modelarts.train_job"}}
  203. </a>
  204. <div class="divider"> / </div>
  205. <div class="active section">{{.displayJobName}}</div>
  206. </div>
  207. </h4>
  208. {{range $k ,$v := .version_list_task}}
  209. <div class="ui accordion border-according" id="accordion{{.VersionName}}"
  210. data-repopath="{{$.RepoRelPath}}/modelarts/train-job" data-jobid="{{.JobID}}"
  211. data-version="{{.VersionName}}">
  212. <div class="{{if eq $k 0}}active{{end}} title padding0">
  213. <div class="according-panel-heading">
  214. <div class="accordion-panel-title">
  215. <i class="dropdown icon"></i>
  216. <span class="accordion-panel-title-content">
  217. <span>
  218. <div style="float: right;">
  219. {{$.CsrfTokenHtml}}
  220. {{if and (.CanModify) (eq .Status "COMPLETED") ($.Permission.CanWrite $.UnitTypeModelManage) }}
  221. <a class="ti-action-menu-item" id="{{.VersionName}}-create-model"
  222. onclick="showcreate({{.}})">{{$.i18n.Tr "repo.modelarts.create_model"}}</a>
  223. {{else}}
  224. <a class="ti-action-menu-item disabled" id="{{.VersionName}}-create-model"
  225. onclick="showcreate({{.}})">{{$.i18n.Tr "repo.modelarts.create_model"}}</a>
  226. {{end}}
  227. {{if .CanModify}}
  228. <a class="ti-action-menu-item"
  229. href="{{$.RepoLink}}/modelarts/train-job/{{.JobID}}/create_version?version_name={{.VersionName}}">{{$.i18n.Tr "repo.modelarts.modify"}}</a>
  230. {{else}}
  231. <a class="ti-action-menu-item disabled"
  232. href="{{$.RepoLink}}/modelarts/train-job/{{.JobID}}/create_version?version_name={{.VersionName}}">{{$.i18n.Tr "repo.modelarts.modify"}}</a>
  233. {{end}}
  234. {{if .CanDel}}
  235. <a class="ti-action-menu-item {{if eq .Status "KILLED" "FAILED" "START_FAILED" "KILLING" "COMPLETED"}}disabled {{end}}"
  236. id="{{.VersionName}}-stop"
  237. onclick="stopVersion({{.VersionName}})">{{$.i18n.Tr "repo.stop"}}</a>
  238. {{else}}
  239. <a class="ti-action-menu-item disabled" id="{{.VersionName}}-stop"
  240. onclick="stopVersion({{.VersionName}})">{{$.i18n.Tr "repo.stop"}}</a>
  241. {{end}}
  242. {{if .CanDel}}
  243. <a class="ti-action-menu-item" onclick="deleteVersion({{.VersionName}})"
  244. style="color: #FF4D4F;">{{$.i18n.Tr "repo.delete"}}</a>
  245. {{else}}
  246. <a class="ti-action-menu-item disabled" onclick="deleteVersion({{.VersionName}})"
  247. style="color: #FF4D4F;">{{$.i18n.Tr "repo.delete"}}</a>
  248. {{end}}
  249. </div>
  250. <div class="ac-display-inblock title_text acc-margin-bottom">
  251. <span class="cti-mgRight-sm">
  252. {{if not (eq .Cloudbrain.StartTime 0)}}
  253. {{TimeSinceUnix1 .Cloudbrain.StartTime}}
  254. {{else}}
  255. {{TimeSinceUnix1 .Cloudbrain.CreatedUnix}}
  256. {{end}}</span>
  257. <span class="cti-mgRight-sm">
  258. {{$.i18n.Tr "repo.modelarts.current_version"}}:{{.VersionName}}</span>
  259. <span class="cti-mgRight-sm">
  260. {{$.i18n.Tr "repo.modelarts.parent_version"}}:{{.PreVersionName}}</span>
  261. <span class="cti-mgRight-sm">{{$.i18n.Tr "repo.modelarts.status"}}:
  262. <span id="{{.VersionName}}-status-span"><i id="icon"
  263. style="vertical-align: middle;" class="{{.Status}}"></i><span id="text"
  264. style="margin-left: 0.4em;font-size: 12px;">{{.Status}}</span></span>
  265. </span>
  266. <span
  267. class="cti-mgRight-sm">{{$.i18n.Tr "repo.modelarts.train_job.dura_time"}}:</span>
  268. <span class="cti-mgRight-sm uc-accordionTitle-black"
  269. id="{{.VersionName}}-duration-span">{{.TrainJobDuration}}</span>
  270. <span data-tooltip="刷新" style="cursor: pointer;" data-inverted=""
  271. onclick="refreshStatus({{.VersionName}})"><i
  272. class="redo icon redo-color"></i></span>
  273. </div>
  274. </span>
  275. </span>
  276. </div>
  277. </div>
  278. </div>
  279. <div class="{{if eq $k 0}}active{{end}} content">
  280. <div class="content-pad">
  281. <div class="ui pointing secondary menu" style="border-bottom: 1px solid rgba(34,36,38,.15);">
  282. <a class="active item"
  283. data-tab="first{{$k}}">{{$.i18n.Tr "repo.modelarts.train_job.config"}}</a>
  284. <a class="item log_bottom" data-tab="second{{$k}}"
  285. data-version="{{.VersionName}}">{{$.i18n.Tr "repo.modelarts.log"}}</a>
  286. <a class="item metric_chart" data-tab="four{{$k}}" data-version="{{.VersionName}}">资源占用情况</a>
  287. <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>
  288. </div>
  289. <div class="ui tab active" data-tab="first{{$k}}">
  290. <div style="padding-top: 10px;">
  291. <div class="tab_2_content">
  292. <div class="ac-grid ac-grid-col2">
  293. <div class="ac-grid-col">
  294. <table class="ti-form">
  295. <tbody class="ti-text-form">
  296. <tr class="ti-no-ng-animate">
  297. <td class="ti-no-ng-animate ti-text-form-label text-width80">
  298. {{$.i18n.Tr "repo.cloudbrain_task"}}
  299. </td>
  300. <td class="ti-text-form-content">
  301. <div class="text-span text-span-w">
  302. {{.DisplayJobName}}
  303. </div>
  304. </td>
  305. </tr>
  306. <tr class="ti-no-ng-animate">
  307. <td class="ti-no-ng-animate ti-text-form-label text-width80">
  308. {{$.i18n.Tr "repo.modelarts.status"}}
  309. </td>
  310. <td class="ti-text-form-content">
  311. <div class="text-span text-span-w" id="{{.VersionName}}-status">
  312. {{.Status}}
  313. </div>
  314. </td>
  315. </tr>
  316. <tr class="ti-no-ng-animate">
  317. <td class="ti-no-ng-animate ti-text-form-label text-width80">
  318. {{$.i18n.Tr "repo.modelarts.run_version"}}
  319. </td>
  320. <td class="ti-text-form-content">
  321. <div class="text-span text-span-w">
  322. {{.VersionName}}
  323. </div>
  324. </td>
  325. </tr>
  326. <tr class="ti-no-ng-animate">
  327. <td class="ti-no-ng-animate ti-text-form-label text-width80">
  328. {{$.i18n.Tr "repo.modelarts.train_job.start_time"}}
  329. </td>
  330. <td class="ti-text-form-content">
  331. <div class="text-span text-span-w">
  332. <span style="font-size: 12px;" class="">
  333. {{if not (eq .Cloudbrain.StartTime 0)}}
  334. {{TimeSinceUnix1 .Cloudbrain.StartTime}}
  335. {{else}}
  336. {{TimeSinceUnix1 .Cloudbrain.CreatedUnix}}
  337. {{end}}</span>
  338. </div>
  339. </td>
  340. </tr>
  341. <tr class="ti-no-ng-animate">
  342. <td class="ti-no-ng-animate ti-text-form-label text-width80">
  343. {{$.i18n.Tr "repo.modelarts.train_job.dura_time"}}
  344. </td>
  345. <td class="ti-text-form-content">
  346. <div class="text-span text-span-w"
  347. id="{{.VersionName}}-duration">
  348. {{.TrainJobDuration}}
  349. </div>
  350. </td>
  351. </tr>
  352. <tr class="ti-no-ng-animate">
  353. <td class="ti-no-ng-animate ti-text-form-label text-width80">
  354. {{$.i18n.Tr "repo.modelarts.train_job.standard"}}
  355. </td>
  356. <td class="ti-text-form-content">
  357. <div class="text-span text-span-w">
  358. {{.FlavorName}}
  359. </div>
  360. </td>
  361. </tr>
  362. <tr class="ti-no-ng-animate">
  363. <td class="ti-no-ng-animate ti-text-form-label text-width80">
  364. {{$.i18n.Tr "repo.modelarts.train_job.compute_node"}}
  365. </td>
  366. <td class="ti-text-form-content">
  367. <div class="text-span text-span-w">
  368. {{.WorkServerNumber}}
  369. </div>
  370. </td>
  371. </tr>
  372. </tbody>
  373. </table>
  374. </div>
  375. <div class="ac-grid-col">
  376. <table class="ti-form">
  377. <tbody class="ti-text-form">
  378. <tr class="ti-no-ng-animate">
  379. <td class="ti-no-ng-animate ti-text-form-label text-width80">
  380. {{$.i18n.Tr "repo.modelarts.train_job.AI_driver"}}
  381. </td>
  382. <td class="ti-text-form-content">
  383. <div class="text-span text-span-w">
  384. {{.EngineName}}
  385. </div>
  386. </td>
  387. </tr>
  388. <tr class="ti-no-ng-animate">
  389. <td class="ti-no-ng-animate ti-text-form-label text-width80">
  390. {{$.i18n.Tr "repo.modelarts.code_version"}}
  391. </td>
  392. <td class="ti-text-form-content">
  393. <div class="text-span text-span-w">
  394. {{.BranchName}}
  395. </div>
  396. </td>
  397. </tr>
  398. <tr class="ti-no-ng-animate">
  399. <td class="ti-no-ng-animate ti-text-form-label text-width80">
  400. {{$.i18n.Tr "repo.modelarts.train_job.start_file"}}
  401. </td>
  402. <td class="ti-text-form-content">
  403. <div class="text-span text-span-w">
  404. {{.BootFile}}
  405. </div>
  406. </td>
  407. </tr>
  408. <tr class="ti-no-ng-animate">
  409. <td class="ti-no-ng-animate ti-text-form-label text-width80">
  410. {{$.i18n.Tr "repo.modelarts.train_job.train_dataset"}}
  411. </td>
  412. <td class="ti-text-form-content">
  413. <div class="text-span text-span-w">
  414. {{.DatasetName}}
  415. </div>
  416. </td>
  417. </tr>
  418. <tr class="ti-no-ng-animate">
  419. <td class="ti-no-ng-animate ti-text-form-label text-width80">
  420. {{$.i18n.Tr "repo.modelarts.train_job.run_parameter"}}
  421. </td>
  422. <td class="ti-text-form-content">
  423. <div class="text-span text-span-w" title="{{.Parameters}}">
  424. {{.Parameters}}
  425. </div>
  426. </td>
  427. </tr>
  428. </tr>
  429. <tr class="ti-no-ng-animate">
  430. <td class="ti-no-ng-animate ti-text-form-label text-width80">
  431. {{$.i18n.Tr "repo.modelarts.train_job.description"}}
  432. </td>
  433. <td class="ti-text-form-content">
  434. <div class="text-span text-span-w"
  435. title="{{.Cloudbrain.Description}}">
  436. {{.Cloudbrain.Description}}
  437. </div>
  438. </td>
  439. </tr>
  440. </tbody>
  441. </table>
  442. </div>
  443. </div>
  444. </div>
  445. </div>
  446. </div>
  447. <div class="ui tab" data-tab="second{{$k}}">
  448. <div>
  449. <a id="{{.VersionName}}-log-down"
  450. class='{{if and (.CanModify) (eq .Status "KILLED" "FAILED" "START_FAILED" "STOPPED" "COMPLETED") }}ti-download-file{{else}}disabled{{end}}'
  451. href="{{$.RepoLink}}/modelarts/train-job/{{.JobID}}/download_log_file?version_name={{.VersionName}}">
  452. <i class="ri-download-cloud-2-line"></i>
  453. <span style="margin-left: 0.3rem;">{{$.i18n.Tr "repo.modelarts.download_log"}}</span>
  454. </a>
  455. </div>
  456. <div
  457. style="position: relative;border: 1px solid rgba(0,0,0,.2);padding: 0 10px;margin-top: 10px;">
  458. <span>
  459. <a title="滚动到顶部" style="position: absolute; right: -32px;cursor: pointer;"
  460. class="log_top" data-version="{{.VersionName}}"><i class="icon-to-top"></i></a>
  461. </span>
  462. <span>
  463. <a title="滚动到底部" style="position: absolute; bottom: 10px;right: -32px;cursor: pointer;"
  464. class="log_bottom" data-version="{{.VersionName}}"><i
  465. class="icon-to-bottom"></i></a>
  466. </span>
  467. <div class="ui message message{{.VersionName}}" style="display: none;">
  468. <div id="header"></div>
  469. </div>
  470. <div class="ui attached log log-scroll" id="log{{.VersionName}}" data-version="{{.VersionName}}"
  471. style="height: 300px !important; overflow: auto;">
  472. <input type="hidden" name="end_line" value>
  473. <input type="hidden" name="start_line" value>
  474. <pre id="log_file{{.VersionName}}"></pre>
  475. </div>
  476. </div>
  477. </div>
  478. <div class="ui tab" data-tab="four{{$k}}" style="position: relative;">
  479. <i class="ri-refresh-line metric_chart"
  480. style="position: absolute;right: 25%;color:#3291f8;z-index:99;cursor: pointer;"
  481. data-version="{{.VersionName}}"></i>
  482. <div id="metric-{{.VersionName}}" style="height: 260px;width: 870px;">
  483. </div>
  484. </div>
  485. <div class="ui tab" data-tab="third{{$k}}">
  486. <input type="hidden" name="model{{.VersionName}}" value="-1">
  487. <input type="hidden" name="modelback{{.VersionName}}" value="-1">
  488. <div class='ui breadcrumb model_file_bread' id='file_breadcrumb{{.VersionName}}'>
  489. <div class="active section">{{.VersionName}}</div>
  490. <div class="divider"> / </div>
  491. </div>
  492. <div id="dir_list{{.VersionName}}" style="max-height: 500px;overflow:auto;">
  493. </div>
  494. </div>
  495. </div>
  496. </div>
  497. </div>
  498. {{end}} {{template "base/paginate" .}}
  499. </div>
  500. <!-- 确认模态框 -->
  501. <div id="deletemodel">
  502. <div class="ui basic modal">
  503. <div class="ui icon header">
  504. <i class="trash icon"></i> {{.i18n.Tr "cloudbrain.delete_task"}}
  505. </div>
  506. <div class="content">
  507. <p>{{.i18n.Tr "cloudbrain.task_delete_confirm"}}</p>
  508. </div>
  509. <div class="actions">
  510. <div class="ui red basic inverted cancel button">
  511. <i class="remove icon"></i> {{.i18n.Tr "cloudbrain.operate_cancel"}}
  512. </div>
  513. <div class="ui green basic inverted ok button">
  514. <i class="checkmark icon"></i> {{.i18n.Tr "cloudbrain.operate_confirm"}}
  515. </div>
  516. </div>
  517. </div>
  518. </div>
  519. <!--
  520. <div id="menuContent" class="menuContent" style="display:none; position: absolute;z-index:9999">
  521. <ul id="treeDemo" class="ztree" style="margin-top:0; width: 83%; height: 100%;"></ul>
  522. </div> -->
  523. <!-- 创建模型 -->
  524. <div id="newmodel">
  525. <div class="ui modal second">
  526. <div class="header" style="padding: 1rem;background-color: rgba(240, 240, 240, 100);">
  527. <h4 id="model_header">导入新模型</h4>
  528. </div>
  529. <div class="content content-padding">
  530. <form id="formId" method="POST" class="ui form">
  531. <div class="ui error message">
  532. </div>
  533. {{$.CsrfTokenHtml}}
  534. <input type="hidden" name="trainTaskCreate" value="true">
  535. <div class="two inline fields ">
  536. <div class="required ten wide field">
  537. <label style="margin-left: -23px;">选择训练任务</label>
  538. <input type="hidden" class="width83" id="JobId" name="JobId" readonly required>
  539. <input class="width83" id="JobName" readonly required>
  540. </div>
  541. <div class="required six widde field">
  542. <label>版本</label>
  543. <input class="width70" id="VersionName" name="VersionName" readonly required>
  544. </div>
  545. </div>
  546. <div class="required inline field" id="modelname">
  547. <label>模型名称</label>
  548. <input style="width: 45%;" id="name" name="Name" required maxlength="25"
  549. onkeyup="this.value=this.value.replace(/[, ]/g,'')">
  550. </div>
  551. <div class="required inline field" id="verionname">
  552. <label>模型版本</label>
  553. <input style="width: 45%;" id="version" name="Version" value="" readonly required maxlength="255">
  554. </div>
  555. <div class="unite min_title inline field required">
  556. <label>模型框架</label>
  557. <input type="hidden" id="Engine" name="Engine" required>
  558. <input style="width: 45%;" id="Engine_name" name="Engine_name" readonly required maxlength="255">
  559. </div>
  560. <div class="unite min_title inline fields required">
  561. <div class="field required">
  562. <label for="modelSelectedFile">模型文件</label>
  563. </div>
  564. <div class="thirteen wide field" style="position:relative">
  565. <input id="modelSelectedFile" type="text" readonly required onclick="showMenu();" name="modelSelectedFile" >
  566. <div id="menuContent" class="menuContent" style="display:none;">
  567. <ul id="treeDemo" class="ztree"></ul>
  568. </div>
  569. </div>
  570. </div>
  571. <div class="inline field">
  572. <label>模型标签</label>
  573. <input style="width: 83%;margin-left: 7px;" id="label" name="Label" maxlength="255"
  574. placeholder='{{.i18n.Tr "repo.modelarts.train_job.label_place"}}'>
  575. </div>
  576. <div class="inline field">
  577. <label for="description">模型描述</label>
  578. <textarea style="width: 83%;margin-left: 7px;" id="Description" name="Description" rows="3"
  579. maxlength="255" placeholder='{{.i18n.Tr "repo.modelarts.train_job.new_place"}}'
  580. onchange="this.value=this.value.substring(0, 255)"
  581. onkeydown="this.value=this.value.substring(0, 255)"
  582. onkeyup="this.value=this.value.substring(0, 256)"></textarea>
  583. </div>
  584. <div class="inline field" style="margin-left: 75px;">
  585. <button onclick="createModel()" type="button" class="ui create_train_job green button"
  586. style="position: absolute;">
  587. {{.i18n.Tr "repo.model.manage.sava_model"}}
  588. </button>
  589. </div>
  590. </form>
  591. <div class="actions" style="display: inline-block;margin-left: 180px;">
  592. <button class="ui button cancel">{{.i18n.Tr "repo.cloudbrain.cancel"}}</button>
  593. </div>
  594. </div>
  595. </div>
  596. </div>
  597. </div>
  598. {{template "base/footer" .}}
  599. <script type="text/javascript" src="/self/ztree/js/jquery.ztree.core.js"></script>
  600. <script type="text/javascript" src="/self/ztree/js/jquery.ztree.excheck.js"></script>
  601. <script>
  602. var setting = {
  603. check: {
  604. enable: true,
  605. chkboxType: {"Y":"ps", "N":"ps"}
  606. },
  607. view: {
  608. dblClickExpand: false
  609. },
  610. callback: {
  611. beforeClick: beforeClick,
  612. onCheck: onCheck
  613. }
  614. };
  615. function beforeClick(treeId, treeNode) {
  616. var zTree = $.fn.zTree.getZTreeObj("treeDemo");
  617. zTree.checkNode(treeNode, !treeNode.checked, null, true);
  618. return false;
  619. }
  620. function onCheck(e, treeId, treeNode) {
  621. var zTree = $.fn.zTree.getZTreeObj("treeDemo"),
  622. nodes = zTree.getCheckedNodes(true),
  623. v = "";
  624. for (var i=0, l=nodes.length; i<l; i++) {
  625. if(nodes[i].isParent){
  626. continue;
  627. }
  628. var pathNodes = nodes[i].getPath();
  629. var path ="";
  630. for(var j=0;j<pathNodes.length;j++){
  631. if(j ==0){
  632. path += pathNodes[j].name;
  633. }else{
  634. path += "/" + pathNodes[j].name;
  635. }
  636. }
  637. v += path + ";";
  638. }
  639. if (v.length > 0 ) v = v.substring(0, v.length-1);
  640. var cityObj = $("#modelSelectedFile");
  641. cityObj.attr("value", v);
  642. }
  643. function showMenu() {
  644. var cityObj = $("#modelSelectedFile");
  645. var cityOffset = $("#modelSelectedFile").offset();
  646. //$("#menuContent").css({left:cityOffset.left + "px", top:cityOffset.top + cityObj.outerHeight() + "px"}).slideDown("fast");
  647. $("#menuContent").slideDown("fast");
  648. $("body").bind("mousedown", onBodyDown);
  649. }
  650. function hideMenu() {
  651. $("#menuContent").fadeOut("fast");
  652. $("body").unbind("mousedown", onBodyDown);
  653. }
  654. function onBodyDown(event) {
  655. if (!(event.target.id == "menuBtn" || event.target.id == "modelSelectedFile" || event.target.id == "menuContent" || $(event.target).parents("#menuContent").length>0)) {
  656. hideMenu();
  657. }
  658. }
  659. function loadSelectedModelFile(trainJob){
  660. console.log("trainJob=" + trainJob);
  661. $('#choice_file').dropdown('clear')
  662. $("#model-file").empty()
  663. if(trainJob ==null || trainJob ==""){
  664. console.log("trainJob is null");
  665. }else{
  666. $.get(`/${userName}/${repoPath}/modelmanage/query_train_model?jobName=${trainJob.JobName}&type=1&VersionName=${trainJob.VersionName}`, (data) => {
  667. const n_length = data.length
  668. let file_html=''
  669. let firstFileName =''
  670. var zNodes=[];
  671. var nodesMap={};
  672. for (let i=0;i<n_length;i++){
  673. parentNodeMap = nodesMap;
  674. var fileSplits = data[i].FileName.split("/");
  675. for(let j=0;j < fileSplits.length;j++){
  676. if(fileSplits[j] == ""){
  677. break;
  678. }
  679. if(parentNodeMap[fileSplits[j]] == null){
  680. parentNodeMap[fileSplits[j]] = {};
  681. }
  682. parentNodeMap = parentNodeMap[fileSplits[j]]
  683. }
  684. }
  685. convertToNode(zNodes,nodesMap);
  686. $.fn.zTree.init($("#treeDemo"), setting, zNodes);
  687. })
  688. }
  689. }
  690. function convertToNode(nodeList,nodesMap){
  691. var keyList = Object.keys(nodesMap);
  692. keyList.sort(function(a,b){
  693. return a-b;
  694. });
  695. var isFirst = true;
  696. for(var i=0; i<keyList.length;i++){
  697. var node = {};
  698. node["name"] = keyList[i];
  699. nodeList.push(node);
  700. if(nodesMap[keyList[i]] != null && Object.keys(nodesMap[keyList[i]]).length >0){
  701. node["children"]=[];
  702. if(isFirst){
  703. node["open"] = true;
  704. isFirst= false;
  705. }
  706. convertToNode(node["children"],nodesMap[keyList[i]]);
  707. }
  708. }
  709. }
  710. $('.menu .item').tab()
  711. $(document).ready(function () {
  712. $('.ui.accordion').accordion({ selector: { trigger: '.icon' } });
  713. });
  714. $(document).ready(function () {
  715. $('.secondary.menu .item').tab();
  716. });
  717. let userName
  718. let repoPath
  719. let jobID
  720. let downlaodFlag = {{ $.canDownload }}
  721. $(document).ready(function () {
  722. let url = window.location.href;
  723. let urlArr = url.split('/')
  724. userName = urlArr.slice(-5)[0]
  725. repoPath = urlArr.slice(-4)[0]
  726. jobID = urlArr.slice(-1)[0]
  727. })
  728. function stopBubbling(e) {
  729. e = window.event || e;
  730. if (e.stopPropagation) {
  731. e.stopPropagation(); //阻止事件 冒泡传播
  732. } else {
  733. e.cancelBubble = true; //ie兼容
  734. }
  735. }
  736. function showcreate(obj) {
  737. $('.ui.modal.second')
  738. .modal({
  739. centered: false,
  740. onShow: function () {
  741. $('input[name="Version"]').addClass('model_disabled')
  742. // $('input[name="JobId"]').text(obj.JobName)
  743. $('#JobName').val(obj.DisplayJobName).addClass('model_disabled')
  744. $('input[name="JobId"]').val(obj.JobID)
  745. $('input[name="VersionName"]').val(obj.VersionName).addClass('model_disabled')
  746. if(obj.EngineID ==122 || obj.EngineID ==35 || obj.EngineID ==-1){
  747. $('input[name="Engine_name"]').val("MindSpore").addClass('model_disabled');
  748. $('input[name="Engine"]').val(2);
  749. }
  750. if(obj.EngineID ==121){
  751. $('input[name="Engine_name"]').val("TensorFlow").addClass('model_disabled');
  752. $('input[name="Engine"]').val(1);
  753. }
  754. $('.ui.dimmer').css({ "background-color": "rgb(136, 136, 136,0.7)" })
  755. createModelName();
  756. loadSelectedModelFile(obj);
  757. },
  758. onHide: function () {
  759. var cityObj = $("#modelSelectedFile");
  760. cityObj.attr("value", "");
  761. document.getElementById("formId").reset();
  762. $('.ui.dimmer').css({ "background-color": "" })
  763. $('.ui.error.message').text()
  764. $('.ui.error.message').css('display', 'none')
  765. }
  766. })
  767. .modal('show')
  768. }
  769. function createModel() {
  770. let url_href = `/${userName}/${repoPath}/modelmanage/create_new_model`
  771. let data = $("#formId").serialize()
  772. $("#mask").css({ "display": "block", "z-index": "9999" })
  773. $.ajax({
  774. url: url_href,
  775. type: 'POST',
  776. data: data,
  777. success: function (res) {
  778. $('input[name="Engine_name"]').val("");
  779. $('input[name="Engine"]').val("");
  780. location.href = `/${userName}/${repoPath}/modelmanage/show_model`
  781. $('.ui.modal.second').modal('hide')
  782. },
  783. error: function (xhr) {
  784. // 隐藏 loading
  785. // 只有请求不正常(状态码不为200)才会执行
  786. $('.ui.error.message').text(xhr.responseText)
  787. $('.ui.error.message').css('display', 'block')
  788. },
  789. complete: function (xhr) {
  790. $("#mask").css({ "display": "none", "z-index": "1" })
  791. }
  792. })
  793. }
  794. function createModelName() {
  795. let repoName = location.pathname.split('/')[2]
  796. let modelName = repoName + '_model_' + Math.random().toString(36).substr(2, 4)
  797. $('#name').val(modelName)
  798. $('#version').val("0.0.1")
  799. }
  800. function refreshStatus(version_name) {
  801. $.get(`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}?version_name=${version_name}`, (data) => {
  802. // header status and duration
  803. $(`#${version_name}-duration-span`).text(data.JobDuration)
  804. $(`#${version_name}-status-span span`).text(data.JobStatus)
  805. $(`#${version_name}-status-span i`).attr("class", data.JobStatus)
  806. // detail status and duration
  807. $('#' + version_name + '-duration').text(data.JobDuration)
  808. $('#' + version_name + '-status').text(data.JobStatus)
  809. console.log(data)
  810. if (["KILLED", "FAILED", "START_FAILED", "STOPPED", "COMPLETED"].includes(data.JobStatus)) {
  811. $('#' + version_name + '-stop').addClass('disabled')
  812. }
  813. loadLog(version_name)
  814. }).fail(function (err) {
  815. console.log(err);
  816. });
  817. stopBubbling(arguments.callee.caller.arguments[0])
  818. }
  819. function deleteVersion(version_name) {
  820. stopBubbling(arguments.callee.caller.arguments[0])
  821. let flag = 1;
  822. $('.ui.basic.modal').modal({
  823. onDeny: function () {
  824. flag = false
  825. },
  826. onApprove: function () {
  827. $.post(`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/del_version`, { version_name: version_name }, (data) => {
  828. if (data.VersionListCount === 0) {
  829. location.href = `/${userName}/${repoPath}/modelarts/train-job`
  830. } else {
  831. $('#accordion' + version_name).remove()
  832. }
  833. }).fail(function (err) {
  834. console.log(err);
  835. });
  836. flag = true
  837. },
  838. onHidden: function () {
  839. if (flag == false) {
  840. $('.alert').html('您已取消操作').removeClass('alert-success').addClass('alert-danger').show().delay(1500).fadeOut();
  841. }
  842. }
  843. })
  844. .modal('show')
  845. }
  846. function stopVersion(version_name) {
  847. stopBubbling(arguments.callee.caller.arguments[0])
  848. $.post(`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/stop_version`, { version_name: version_name }, (data) => {
  849. if (data.StatusOK === 0) {
  850. $('#' + version_name + '-stop').addClass('disabled')
  851. refreshStatus(version_name)
  852. }
  853. }).fail(function (err) {
  854. console.log(err);
  855. });
  856. }
  857. function loadLog(version_name) {
  858. $.get(`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/log?version_name=${version_name}&lines=50&order=asc`, (data) => {
  859. $('input[name=end_line]').val(data.EndLine)
  860. $('input[name=start_line]').val(data.StartLine)
  861. $(`#log_file${version_name}`).text(data.Content)
  862. if(!data.CanLogDownload){
  863. $(`#${version_name}-log-down`).removeClass('ti-download-file').addClass('disabled')
  864. }
  865. }).fail(function (err) {
  866. console.log(err);
  867. });
  868. }
  869. function debounce(fn, delay) {
  870. let timer;
  871. return (...args) => {
  872. // 判断定时器是否存在,清除定时器
  873. if (timer) {
  874. clearTimeout(timer);
  875. }
  876. // 重新调用setTimeout
  877. timer = setTimeout(() => {
  878. fn.apply(this, args);
  879. }, delay);
  880. };
  881. }
  882. const fn = debounce(logScroll, 500)
  883. function logScroll(version_name) {
  884. let container = document.querySelector(`#log${version_name}`)
  885. let scrollTop = container.scrollTop
  886. let scrollHeight = container.scrollHeight
  887. let clientHeight = container.clientHeight
  888. let scrollLeft = container.scrollLeft
  889. if (((parseInt(scrollTop) + clientHeight == scrollHeight || parseInt(scrollTop) + clientHeight + 1 == scrollHeight || parseInt(scrollTop) + clientHeight - 1 == scrollHeight)) && parseInt(scrollTop) !== 0 && scrollLeft == 0) {
  890. let end_line = $(`#log${version_name} input[name=end_line]`).val()
  891. $.get(`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/log?version_name=${version_name}&base_line=${end_line}&lines=50&order=desc`, (data) => {
  892. if (data.Lines == 0) {
  893. $(`.message${version_name} #header`).text('您已翻阅至日志底部')
  894. $(`.message${version_name}`).css('display', 'block')
  895. setTimeout(function () {
  896. $(`.message${version_name}`).css('display', 'none')
  897. }, 1000)
  898. } else {
  899. if (end_line === data.EndLine) {
  900. return
  901. }
  902. else {
  903. $(`#log${version_name} input[name=end_line]`).val(data.EndLine)
  904. $(`#log${version_name}`).append('<pre>' + data.Content)
  905. }
  906. }
  907. }).fail(function (err) {
  908. console.log(err);
  909. });
  910. }
  911. if ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10].includes(scrollTop) && scrollLeft == 0) {
  912. let start_line = $(`#log${version_name} input[name=start_line]`).val()
  913. $.get(`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/log?version_name=${version_name}&base_line=${start_line}&lines=50&order=asc`, (data) => {
  914. if (data.Lines == 0) {
  915. $(`.message${version_name} #header`).text('您已翻阅至日志顶部')
  916. $(`.message${version_name}`).css('display', 'block')
  917. setTimeout(function () {
  918. $(`.message${version_name}`).css('display', 'none')
  919. }, 1000)
  920. } else {
  921. $(`#log${version_name} input[name=start_line]`).val(data.StartLine) //如果变动就改变所对应的值
  922. $(`#log${version_name}`).prepend('<pre>' + data.Content)
  923. }
  924. }).fail(function (err) {
  925. console.log(err);
  926. });
  927. }
  928. }
  929. function scrollAnimation(dom, currentY, targetY, currentX) {
  930. let needScrollTop = targetY - currentY;
  931. let _currentY = currentY;
  932. setTimeout(() => {
  933. // 一次调用滑动帧数,每次调用会不一样
  934. //取总距离的十分之一
  935. const dist = Math.ceil(needScrollTop / 10);
  936. _currentY += dist;
  937. //移动一个十分之一
  938. dom.scrollTo(currentX || 0, _currentY, 'smooth');
  939. // 如果移动幅度小于十个像素,直接移动,否则递归调用,实现动画效果
  940. if (needScrollTop > 10 || needScrollTop < -10) {
  941. scrollAnimation(dom, _currentY, targetY)
  942. } else {
  943. dom.scrollTo(0, targetY, 'smooth')
  944. }
  945. }, 1)
  946. }
  947. $('.log_top').click(function () {
  948. // let logContentDom = document.querySelector('.log')
  949. // if(!logContentDom)
  950. // return
  951. // let version_name = $('.log_top').data('version')
  952. let version_name = $(this).data('version')
  953. let logContentDom = document.querySelector(`#log${version_name}`)
  954. $(`#log_file${version_name}`).siblings('pre').remove()
  955. $.get(`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/log?version_name=${version_name}&base_line=&lines=50&order=asc`, (data) => {
  956. $(`#log${version_name} input[name=end_line]`).val(data.EndLine) //如果变动就改变所对应的值
  957. $(`#log${version_name} input[name=start_line]`).val(data.StartLine)
  958. $(`#log${version_name}`).prepend('<pre>' + data.Content)
  959. $(`.message${version_name} #header`).text('您已翻阅至日志顶部')
  960. $(`.message${version_name}`).css('display', 'block')
  961. setTimeout(function () {
  962. $(`.message${version_name}`).css('display', 'none')
  963. }, 1000)
  964. scrollAnimation(logContentDom, logContentDom.scrollTop, 0);
  965. })
  966. })
  967. $('.log_bottom').click(function (e) {
  968. let version_name = $(this).data('version')
  969. let logContentDom = document.querySelector(`#log${version_name}`)
  970. $(`#log_file${version_name}`).siblings('pre').remove()
  971. $.get(`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/log?version_name=${version_name}&base_line=&lines=50&order=desc`, (data) => {
  972. $(`#log${version_name} input[name=end_line]`).val(data.EndLine) //如果变动就改变所对应的值
  973. $(`#log${version_name} input[name=start_line]`).val(data.StartLine)
  974. $(`#log${version_name}`).append('<pre>' + data.Content)
  975. $.get(`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/log?version_name=${version_name}&base_line=${data.EndLine}&lines=50&order=desc`, (data) => {
  976. if (data.Lines == 0) {
  977. $(`.message${version_name} #header`).text('您已翻阅至日志底部')
  978. $(`.message${version_name}`).css('display', 'block')
  979. setTimeout(function () {
  980. $(`.message${version_name}`).css('display', 'none')
  981. }, 1000)
  982. } else {
  983. if (end_line === data.EndLine) {
  984. return
  985. }
  986. else {
  987. $(`#log${version_name} input[name=end_line]`).val(data.EndLine)
  988. $(`#log${version_name}`).append('<pre>' + data.Content)
  989. }
  990. }
  991. }).fail(function (err) {
  992. console.log(err);
  993. });
  994. scrollAnimation(logContentDom, logContentDom.scrollTop + 1, logContentDom.scrollHeight - logContentDom.clientHeight);
  995. })
  996. })
  997. </script>