|
- <!--
- Copyright 2020 Huawei Technologies Co., Ltd.All Rights Reserved.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
- <template>
- <div class="prof-wrap">
- <div class="prof-content">
- <div class="prof-content-left"
- :class="{collapse:collapse}">
- <div class="helper"
- v-show="!collapse">
- <div class="summary-path">
- {{$t('trainingDashboard.summaryDirPath')}}
- <span>{{ summaryPath}}</span>
- </div>
- <div class="cur-card">
- <label>{{$t('profiling.curCard')}}</label>
- <el-select v-model="curDashboardInfo.curCardNum"
- class="card-select"
- :placeholder="$t('public.select')"
- @change="selectValueChange">
- <el-option v-for="item in CardNumArr"
- :key="item.value"
- :label="item.value + $t('operator.card')"
- :value="item.value">
- </el-option>
- </el-select>
- </div>
- <div class="helper-title">
- {{$t("profiling.smartHelper")}}
- </div>
- <div class="suggested-title">{{$t("profiling.suggestions")}}</div>
- <div id="helper-tips"></div>
- </div>
- <div class="collapse-btn"
- :class="{collapse:collapse}"
- @click="collapseLeft()">
- </div>
- </div>
- <div class="prof-content-right"
- :class="{collapse:collapse}">
- <router-view></router-view>
- <div class="close"
- @click="backToDdashboard"
- v-if="$route.path !== '/profiling-gpu/profiling-dashboard'">
- <img src="@/assets/images/close-page.png">
- </div>
- </div>
- </div>
- </div>
- </template>
- <script>
- import RequestService from '../../services/request-service';
- export default {
- data() {
- return {
- summaryPath: this.$route.query.summaryPath,
- tipsArrayList: [
- 'step_trace-iter_interval',
- 'minddata_pipeline-general',
- 'minddata_pipeline-dataset_op',
- 'minddata_pipeline-generator_op',
- 'minddata_pipeline-map_op',
- 'minddata_pipeline-batch_op',
- 'minddata_warning_op',
- ],
- moreParameter: ['minddata_device_queue', 'minddata_get_next_queue'],
- CardNumArr: [], // Card list
- collapse: false,
- curDashboardInfo: {
- // Current Select card info
- curCardNum: '',
- query: {},
- },
- };
- },
- watch: {},
- mounted() {
- this.$nextTick(() => {
- this.init();
- });
- },
- methods: {
- /**
- * Init function
- */
- init() {
- if (this.$route.query && this.$route.query.id && this.$route.query.dir) {
- this.curDashboardInfo.query.id = this.$route.query.id;
- this.curDashboardInfo.query.dir = this.$route.query.dir;
- this.curDashboardInfo.query.path = this.$route.query.path;
- this.getDeviceList();
- } else {
- this.curDashboardInfo.query.trainingJobId = '';
- this.curDashboardInfo.query.dir = '';
- this.curDashboardInfo.query.path = '';
- this.$message.error(this.$t('trainingDashboard.invalidId'));
- }
- },
- /**
- * When card mumber changed,request data again.
- */
- selectValueChange() {
- const helperDiv = document.getElementById('helper-tips');
- helperDiv.innerHTML = '';
- this.getDataOfProfileHelper();
- },
- /**
- * Get card number list
- */
- getDeviceList() {
- const params = {
- profile: this.curDashboardInfo.query.dir,
- train_id: this.curDashboardInfo.query.id,
- };
- RequestService.getProfilerDeviceData(params)
- .then(
- (res) => {
- if (res && res.data && res.data.length) {
- const deviceList = res.data;
- deviceList.forEach((item) => {
- this.CardNumArr.push({
- value: item,
- });
- });
- this.curDashboardInfo.curCardNum = this.CardNumArr[0].value;
- this.getDataOfProfileHelper();
- } else {
- this.CardNumArr = [];
- this.curDashboardInfo.curCardNum = '';
- this.curDashboardInfo.initOver = true;
- }
- },
- (error) => {
- this.CardNumArr = [];
- this.curDashboardInfo.curCardNum = '';
- this.curDashboardInfo.initOver = true;
- },
- )
- .catch(() => {
- this.curDashboardInfo.initOver = true;
- });
- },
- /**
- * Get profile helper data
- */
- getDataOfProfileHelper() {
- const params = {
- train_id: this.curDashboardInfo.query.id,
- profile: this.curDashboardInfo.query.dir,
- device_id: this.curDashboardInfo.curCardNum.toString()
- ? this.curDashboardInfo.curCardNum.toString()
- : '0',
- };
- RequestService.queryDataOfProfileHelper(params)
- .then((resp) => {
- if (resp && resp.data) {
- const dataKeys = Object.keys(resp.data);
- const helperDiv = document.getElementById('helper-tips');
- helperDiv.innerHTML = '';
- dataKeys.forEach((item) => {
- if (
- !this.tipsArrayList.includes(item) &&
- !this.moreParameter.includes(item) &&
- resp.data[item]
- ) {
- this.$t(`profiling`)[item] = resp.data[item];
- }
- if (item.endsWith('type_label')) {
- const divDom = document.createElement('div');
- divDom.setAttribute('class', 'suggested-items-style');
- divDom.innerHTML = `<div class="helper-icon"></div>
- <div class="helper-container-title">
- ${this.$t(`profiling`)[item].desc}
- </div>`;
- helperDiv.appendChild(divDom);
- } else if (this.tipsArrayList.includes(item)) {
- const divDom = document.createElement('div');
- divDom.setAttribute('class', 'content-style');
- const content = `${this.$t(`profiling`)[item].desc}`.replace(
- `{n1}`,
- resp.data[item][0],
- );
- divDom.innerHTML = `<div class="content-icon el-icon-caret-right"></div>
- <div class="helper-content-style">${content}</div>`;
- helperDiv.appendChild(divDom);
- } else if (item === 'minddata_device_queue') {
- const deviceEmpty =
- resp.data['minddata_device_queue'][0] >= 0
- ? resp.data['minddata_device_queue'][0]
- : '--';
- const deviceTotal =
- resp.data['minddata_device_queue'][1] >= 0
- ? resp.data['minddata_device_queue'][1]
- : '--';
- const deviceFull =
- resp.data['minddata_device_queue'][2] >= 0
- ? resp.data['minddata_device_queue'][2]
- : '--';
- const divDom = document.createElement('div');
- divDom.setAttribute('class', 'content-style');
- const content = `${this.$t(`profiling`)[item].desc}`
- .replace(
- `{n1}`,
- `<span class="nowrap-style"> ${deviceEmpty}</span>`,
- )
- .replace(
- `{n2}`,
- `<span class="nowrap-style"> ${deviceTotal}</span>`,
- )
- .replace(
- `{n3}`,
- `<span class="nowrap-style"> ${deviceFull}</span>`,
- )
- .replace(
- `{n4}`,
- `<span class="nowrap-style"> ${deviceTotal}</span>`,
- );
- divDom.innerHTML = `<div class="content-icon el-icon-caret-right"></div>
- <div class="helper-content-style">${content}</div>`;
- helperDiv.appendChild(divDom);
- } else if (item === 'minddata_get_next_queue') {
- const getNextEmpty =
- resp.data['minddata_get_next_queue'][0] >= 0
- ? resp.data['minddata_get_next_queue'][0]
- : '--';
- const getNextTotal =
- resp.data['minddata_get_next_queue'][1] >= 0
- ? resp.data['minddata_get_next_queue'][1]
- : '--';
- const divDom = document.createElement('div');
- divDom.setAttribute('class', 'content-style');
- const content = `${this.$t(`profiling`)[item].desc}`
- .replace(
- `{n1}`,
- `<span class="nowrap-style"> ${getNextEmpty}</span>`,
- )
- .replace(
- `{n2}`,
- `<span class="nowrap-style"> ${getNextTotal}</span>`,
- );
- divDom.innerHTML = `<div class="content-icon el-icon-caret-right"></div>
- <div class="helper-content-style">${content}</div>`;
- helperDiv.appendChild(divDom);
- } else if (this.$t(`profiling`)[item].anchor) {
- if (this.$t(`profiling`)[item].anchor.length === 1) {
- const divDom = document.createElement('div');
- divDom.setAttribute('class', 'content-style');
- divDom.innerHTML = `<div class="content-icon el-icon-caret-right"></div>
- <div class="helper-content-style">
- <a target="_blank" href="${this.$t(`profiling`)[item].url[0]}">
- ${this.$t(`profiling`)[item].desc}</a></div>`;
- helperDiv.appendChild(divDom);
- } else {
- const divDom = document.createElement('div');
- divDom.setAttribute('class', 'content-style');
- const anchorList = this.$t(`profiling`)[item].anchor;
- let anchorContent = this.$t(`profiling`)[item].desc;
- for (let i = 0; i < anchorList.length; i++) {
- const desc = anchorContent.relpace(
- anchorList[i],
- `<a target="_blank" href="${
- this.$t(`profiling`)[item].url[i]
- }">
- ${anchorList[i]}</a>`,
- );
- anchorContent = desc;
- }
- divDom.innerHTML = `<div class="content-icon el-icon-caret-right">
- </div><div class="helper-content-style">${anchorContent}</div>`;
- helperDiv.appendChild(divDom);
- }
- } else {
- const divDom = document.createElement('div');
- divDom.setAttribute('class', 'content-style');
- divDom.innerHTML = `${this.$t(`profiling`)[item].desc}`;
- helperDiv.appendChild(divDom);
- }
- });
- }
- })
- .catch(() => {});
- },
- /**
- * Router back to profiling-dashboard
- */
- backToDdashboard() {
- this.$router.push({
- path: '/profiling-gpu/profiling-dashboard',
- query: {
- dir: this.curDashboardInfo.query.dir,
- id: this.curDashboardInfo.query.id,
- path: this.curDashboardInfo.query.path,
- },
- });
- },
- collapseLeft() {
- this.collapse = !this.collapse;
- this.$bus.$emit('collapse');
- },
- },
- destroyed() {
- this.$bus.$off('collapse');
- },
- };
- </script>
- <style lang="scss">
- .prof-wrap {
- height: 100%;
- background: #fff;
- .prof-content {
- height: 100%;
- padding: 24px 24px 24px 0;
- & > div {
- float: left;
- height: 100%;
- }
- .prof-content-left {
- width: 22%;
- transition: width 0.2s;
- position: relative;
- .el-input__inner {
- padding: 0 10px;
- }
- .helper {
- padding: 32px;
- padding-top: 20px;
- height: 100%;
- overflow-y: auto;
- margin-left: 24px;
- background: #edf0f5;
- word-wrap: break-word;
- .summary-path {
- line-height: 24px;
- font-size: 14px;
- overflow: hidden;
- font-weight: bold;
- padding-bottom: 10px;
- word-break: break-all;
- text-overflow: -o-ellipsis-lastline;
- overflow: hidden;
- text-overflow: ellipsis;
- display: -webkit-box;
- -webkit-line-clamp: 4;
- -webkit-box-orient: vertical;
- }
- .nowrap-style {
- white-space: nowrap;
- }
- .cur-card {
- margin-bottom: 32px;
- .card-select {
- width: calc(100% - 120px);
- }
- & > label {
- margin-right: 14px;
- }
- }
- .helper-title {
- font-size: 20px;
- font-weight: bold;
- margin-bottom: 32px;
- .el-icon-rank {
- float: right;
- cursor: pointer;
- }
- }
- .helper-container-title {
- display: inline-block;
- padding: 0 6px;
- }
- .helper-icon {
- display: inline-block;
- width: 6px;
- height: 6px;
- margin-top: 6px;
- border-radius: 3px;
- background-color: #00a5a7;
- }
- .suggested-title {
- font-weight: bold;
- margin-bottom: 20px;
- font-size: 16px;
- }
- .container-bottom {
- margin-bottom: 16px;
- }
- .suggested-items-style {
- display: flex;
- font-weight: bold;
- margin-bottom: 6px;
- margin-top: 10px;
- }
- .helper-content-style {
- margin-left: 6px;
- line-height: 20px;
- word-break: break-all;
- text-overflow: ellipsis;
- overflow: hidden;
- display: -webkit-box;
- -webkit-box-orient: vertical;
- -webkit-line-clamp: 8;
- }
- }
- .content-icon {
- color: #00a5a7;
- padding-top: 3px;
- }
- .content-style {
- display: flex;
- }
- .collapse-btn {
- position: absolute;
- right: -21px;
- width: 31px;
- height: 100px;
- top: 50%;
- margin-top: -50px;
- cursor: pointer;
- line-height: 86px;
- z-index: 1;
- text-align: center;
- background-image: url('../../assets/images/collapse-left.svg');
- }
- .collapse-btn.collapse {
- background-image: url('../../assets/images/collapse-right.svg');
- }
- }
- .prof-content-left.collapse {
- width: 0;
- }
- .prof-content-right {
- width: 78%;
- padding-left: 20px;
- transition: width 0.2s;
- position: relative;
- .close {
- position: absolute;
- right: 0;
- top: -10px;
- cursor: pointer;
- }
- }
- .prof-content-right.collapse {
- width: 100%;
- }
- }
- }
- </style>
|