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.

cloudbrainShow.js 14 kB

3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. export default async function initCloudrainSow() {
  2. function debounce(fn, delay) {
  3. let timer;
  4. return (...args) => {
  5. // 判断定时器是否存在,清除定时器
  6. if (timer) {
  7. clearTimeout(timer);
  8. }
  9. // 重新调用setTimeout
  10. timer = setTimeout(() => {
  11. fn.apply(this, args);
  12. }, delay);
  13. };
  14. }
  15. function logScroll(version_name) {
  16. let container = document.querySelector(`#log${version_name}`);
  17. let scrollTop = container.scrollTop;
  18. let scrollHeight = container.scrollHeight;
  19. let clientHeight = container.clientHeight;
  20. let scrollLeft = container.scrollLeft;
  21. if (
  22. (parseInt(scrollTop) + clientHeight == scrollHeight ||
  23. parseInt(scrollTop) + clientHeight + 1 == scrollHeight ||
  24. parseInt(scrollTop) + clientHeight - 1 == scrollHeight) &&
  25. scrollLeft === 0
  26. ) {
  27. let end_line = $(`#log${version_name} input[name=end_line]`).val();
  28. $.get(
  29. `/api/v1/repos/${userName}/${repoPath}/modelarts/inference-job/${jobID}/log?version_name=${version_name}&base_line=${end_line}&lines=50&order=desc`,
  30. (data) => {
  31. if (data.Lines == 0) {
  32. $(`.message${version_name} #header`).text("您已翻阅至日志底部");
  33. $(`.message${version_name}`).css("display", "block");
  34. setTimeout(function () {
  35. $(`.message${version_name}`).css("display", "none");
  36. }, 1000);
  37. } else {
  38. if (end_line === data.EndLine) {
  39. return;
  40. } else {
  41. $(`#log${version_name} input[name=end_line]`).val(data.EndLine);
  42. $(`#log${version_name}`).append("<pre>" + data.Content);
  43. }
  44. }
  45. }
  46. ).fail(function (err) {
  47. console.log(err);
  48. });
  49. }
  50. if (scrollTop == 0 && scrollLeft == 0) {
  51. let start_line = $(`#log${version_name} input[name=start_line]`).val();
  52. $.get(
  53. `/api/v1/repos/${userName}/${repoPath}/modelarts/inference-job/${jobID}/log?version_name=${version_name}&base_line=${start_line}&lines=50&order=asc`,
  54. (data) => {
  55. if (data.Lines == 0) {
  56. $(`.message${version_name} #header`).text("您已翻阅至日志顶部");
  57. $(`.message${version_name}`).css("display", "block");
  58. setTimeout(function () {
  59. $(`.message${version_name}`).css("display", "none");
  60. }, 1000);
  61. } else {
  62. $(`#log${version_name} input[name=start_line]`).val(data.StartLine); //如果变动就改变所对应的值
  63. $(`#log${version_name}`).prepend("<pre>" + data.Content);
  64. }
  65. }
  66. ).fail(function (err) {
  67. console.log(err);
  68. });
  69. }
  70. }
  71. const fn = debounce(logScroll, 500);
  72. $(".log-scroll").scroll(function () {
  73. let version_name = $(this).data("version");
  74. fn(version_name);
  75. });
  76. function scrollAnimation(dom, currentY, targetY, currentX) {
  77. let needScrollTop = targetY - currentY;
  78. let _currentY = currentY;
  79. setTimeout(() => {
  80. // 一次调用滑动帧数,每次调用会不一样
  81. //取总距离的十分之一
  82. const dist = Math.ceil(needScrollTop / 10);
  83. _currentY += dist;
  84. //移动一个十分之一
  85. dom.scrollTo(currentX || 0, _currentY, "smooth");
  86. // 如果移动幅度小于十个像素,直接移动,否则递归调用,实现动画效果
  87. if (needScrollTop > 10 || needScrollTop < -10) {
  88. scrollAnimation(dom, _currentY, targetY);
  89. } else {
  90. dom.scrollTo(0, targetY, "smooth");
  91. }
  92. }, 1);
  93. }
  94. $(".log_top").click(function () {
  95. // let logContentDom = document.querySelector('.log')
  96. // if(!logContentDom)
  97. // return
  98. // let version_name = $('.log_top').data('version')
  99. let version_name = $(this).data("version");
  100. let logContentDom = document.querySelector(`#log${version_name}`);
  101. $(`#log_file${version_name}`).siblings("pre").remove();
  102. $.get(
  103. `/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/log?version_name=${version_name}&base_line=&lines=50&order=asc`,
  104. (data) => {
  105. $(`#log${version_name} input[name=end_line]`).val(data.EndLine); //如果变动就改变所对应的值
  106. $(`#log${version_name} input[name=start_line]`).val(data.StartLine);
  107. $(`#log${version_name}`).prepend("<pre>" + data.Content);
  108. $(`.message${version_name} #header`).text("您已翻阅至日志顶部");
  109. $(`.message${version_name}`).css("display", "block");
  110. setTimeout(function () {
  111. $(`.message${version_name}`).css("display", "none");
  112. }, 1000);
  113. scrollAnimation(logContentDom, logContentDom.scrollTop, 0);
  114. }
  115. );
  116. });
  117. $(".log_bottom").click(function (e) {
  118. let version_name = $(this).data("version");
  119. let logContentDom = document.querySelector(`#log${version_name}`);
  120. $(`#log_file${version_name}`).siblings("pre").remove();
  121. $.get(
  122. `/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/log?version_name=${version_name}&base_line=&lines=50&order=desc`,
  123. (data) => {
  124. if (!data.CanLogDownload) {
  125. $(`#${version_name}-log-down`)
  126. .removeClass("ti-download-file")
  127. .addClass("disabled");
  128. }
  129. $(`#log${version_name} input[name=end_line]`).val(data.EndLine); //如果变动就改变所对应的值
  130. $(`#log${version_name} input[name=start_line]`).val(data.StartLine);
  131. $(`#log${version_name}`).append("<pre>" + data.Content);
  132. $.get(
  133. `/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/log?version_name=${version_name}&base_line=${data.EndLine}&lines=50&order=desc`,
  134. (data) => {
  135. if (data.Lines == 0) {
  136. $(`.message${version_name} #header`).text("您已翻阅至日志底部");
  137. $(`.message${version_name}`).css("display", "block");
  138. setTimeout(function () {
  139. $(`.message${version_name}`).css("display", "none");
  140. }, 1000);
  141. } else {
  142. if (end_line === data.EndLine) {
  143. return;
  144. } else {
  145. $(`#log${version_name} input[name=end_line]`).val(data.EndLine);
  146. $(`#log${version_name}`).append("<pre>" + data.Content);
  147. }
  148. }
  149. }
  150. ).fail(function (err) {
  151. console.log(err);
  152. });
  153. scrollAnimation(
  154. logContentDom,
  155. logContentDom.scrollTop + 1,
  156. logContentDom.scrollHeight - logContentDom.clientHeight
  157. );
  158. }
  159. );
  160. });
  161. //
  162. $(".content-pad").on("click", ".load-model-file", function () {
  163. let downloadFlag = $(this).data("download-flag") || "";
  164. let gpuFlag = $(this).data("gpu-flag") || "";
  165. let version_name = $(this).data("version");
  166. let parents = $(this).data("parents");
  167. let filename = $(this).data("filename");
  168. let init = $(this).data("init") || "";
  169. let path = $(this).data("path");
  170. let url = `/api/v1/repos${path}?version_name=${version_name}&parentDir=${parents}`;
  171. $.get(url, (data) => {
  172. $(`#dir_list${version_name}`).empty();
  173. renderDir(path, data, version_name, downloadFlag, gpuFlag);
  174. if (init === "init") {
  175. $(`input[name=model${version_name}]`).val("");
  176. $(`input[name=modelback${version_name}]`).val(version_name);
  177. $(`#file_breadcrumb${version_name}`).empty();
  178. let htmlBread = "";
  179. if (version_name) {
  180. htmlBread += `<div class='active section'>${version_name}</div>`;
  181. } else {
  182. htmlBread += `<div class='active section'>result</div>`;
  183. }
  184. htmlBread += "<div class='divider'> / </div>";
  185. $(`#file_breadcrumb${version_name}`).append(htmlBread);
  186. } else {
  187. renderBrend(path, version_name, parents, filename, init, downloadFlag);
  188. }
  189. }).fail(function (err) {
  190. console.log(err, version_name);
  191. });
  192. });
  193. function renderSize(value) {
  194. if (null == value || value == "") {
  195. return "0 Bytes";
  196. }
  197. var unitArr = new Array(
  198. "Bytes",
  199. "KB",
  200. "MB",
  201. "GB",
  202. "TB",
  203. "PB",
  204. "EB",
  205. "ZB",
  206. "YB"
  207. );
  208. var index = 0;
  209. var srcsize = parseFloat(value);
  210. index = Math.floor(Math.log(srcsize) / Math.log(1024));
  211. var size = srcsize / Math.pow(1024, index);
  212. size = size.toFixed(0); //保留的小数位数
  213. return size + unitArr[index];
  214. }
  215. function renderBrend(
  216. path,
  217. version_name,
  218. parents,
  219. filename,
  220. init,
  221. downloadFlag
  222. ) {
  223. if (init == "folder") {
  224. let htmlBrend = "";
  225. let sectionName = $(
  226. `#file_breadcrumb${version_name} .active.section`
  227. ).text();
  228. let parents1 = $(`input[name=model${version_name}]`).val();
  229. let filename1 = $(`input[name=modelback${version_name}]`).val();
  230. if (parents1 === "") {
  231. $(`#file_breadcrumb${version_name} .active.section`).replaceWith(
  232. `<a class='section load-model-file' data-download-flag='${downloadFlag}' data-path='${path}' data-version='${version_name}' data-parents='${parents1}' data-filename='' data-init='init'>${sectionName}</a>`
  233. );
  234. } else {
  235. $(`#file_breadcrumb${version_name} .active.section`).replaceWith(
  236. `<a class='section load-model-file' data-download-flag='${downloadFlag}' data-path='${path}' data-version='${version_name}' data-parents='${parents1}' data-filename='${filename1}'>${sectionName}</a>`
  237. );
  238. }
  239. htmlBrend += `<div class='active section'>${filename}</div>`;
  240. htmlBrend += "<div class='divider'> / </div>";
  241. $(`#file_breadcrumb${version_name}`).append(htmlBrend);
  242. $(`input[name=model${version_name}]`).val(parents);
  243. $(`input[name=modelback${version_name}]`).val(filename);
  244. } else {
  245. $(`input[name=model${version_name}]`).val(parents);
  246. $(`input[name=modelback${version_name}]`).val(filename);
  247. $(`#file_breadcrumb${version_name} a.section:contains(${filename})`)
  248. .nextAll()
  249. .remove();
  250. $(
  251. `#file_breadcrumb${version_name} a.section:contains(${filename})`
  252. ).replaceWith(`<div class='active section'>${filename}</div>`);
  253. $(
  254. `#file_breadcrumb${version_name} div.section:contains(${filename})`
  255. ).append("<div class='divider'> / </div>");
  256. }
  257. }
  258. function renderDir(path, data, version_name, downloadFlag, gpuFlag) {
  259. let html = "";
  260. html += "<div class='ui grid' style='margin:0;'>";
  261. html += "<div class='row' style='padding: 0;'>";
  262. html += "<div class='ui sixteen wide column' style='padding:1rem;'>";
  263. html += "<div class='dir list'>";
  264. html += "<table id='repo-files-table' class='ui single line table pad20'>";
  265. html += "<tbody>";
  266. // html += "</tbody>"
  267. for (let i = 0; i < data.Dirs.length; i++) {
  268. let dirs_size = renderSize(data.Dirs[i].Size);
  269. html += "<tr>";
  270. html += "<td class='name six wid'>";
  271. html += "<span class='truncate'>";
  272. html += "<span class='octicon octicon-file-directory'>";
  273. html += "</span>";
  274. if (data.Dirs[i].IsDir) {
  275. html += `<a class='load-model-file' data-download-flag='${downloadFlag}' data-path='${path}' data-version='${version_name}' data-parents='${data.Dirs[i].ParenDir}' data-filename='${data.Dirs[i].FileName}' data-init='folder'>`;
  276. html +=
  277. "<span class='fitted'><i class='folder icon' width='16' height='16' aria-hidden='true'></i>" +
  278. data.Dirs[i].FileName +
  279. "</span>";
  280. } else {
  281. if (downloadFlag) {
  282. if (gpuFlag) {
  283. if (path.includes("model_list")) {
  284. html += `<a href="${location.href}/download_model?version_name=${version_name}&fileName=${data.Dirs[i].FileName}&parentDir=${data.Dirs[i].ParenDir}&jobName=${data.task.JobName}">`;
  285. } else {
  286. html += `<a href="${location.href}/result_download?version_name=${version_name}&fileName=${data.Dirs[i].FileName}&parentDir=${data.Dirs[i].ParenDir}&jobName=${data.task.JobName}">`;
  287. }
  288. } else {
  289. if (path.includes("model_list")) {
  290. html += `<a href="${location.href}/model_download?version_name=${version_name}&file_name=${data.Dirs[i].FileName}&parent_dir=${data.Dirs[i].ParenDir}">`;
  291. } else {
  292. html += `<a href="${location.href}/result_download?version_name=${version_name}&file_name=${data.Dirs[i].FileName}&parent_dir=${data.Dirs[i].ParenDir}">`;
  293. }
  294. }
  295. } else {
  296. html += `<a class="disabled">`;
  297. }
  298. html +=
  299. "<span class='fitted'><i class='file icon' width='16' height='16' aria-hidden='true'></i>" +
  300. data.Dirs[i].FileName +
  301. "</span>";
  302. }
  303. html += "</a>";
  304. html += "</span>";
  305. html += "</td>";
  306. html += "<td class='message seven wide'>";
  307. if (data.Dirs[i].IsDir) {
  308. html += "<span class='truncate has-emoji'></span>";
  309. } else {
  310. html +=
  311. "<span class='truncate has-emoji'>" + `${dirs_size}` + "</span>";
  312. }
  313. html += "</td>";
  314. html += "<td class='text right age three wide'>";
  315. html +=
  316. "<span class='truncate has-emoji'>" + data.Dirs[i].ModTime + "</span>";
  317. html += "</td>";
  318. html += "</tr>";
  319. }
  320. html += "</tbody>";
  321. html += "</table>";
  322. html += "</div>";
  323. html += "</div>";
  324. html += "</div>";
  325. html += "</div>";
  326. $(`#dir_list${version_name}`).append(html);
  327. }
  328. }