@@ -132,6 +137,18 @@ class OpenRow extends React.Component
{
)
}
+ {EXPERIMENT.metadata.tag.includes('retiarii') ? (
+
+
+
Visualize models with 3rd-party tools.
+
+
+
+ ) : null}
diff --git a/ts/webui/src/static/interface.ts b/ts/webui/src/static/interface.ts
index e1c54eb9ae..561fddbbb2 100644
--- a/ts/webui/src/static/interface.ts
+++ b/ts/webui/src/static/interface.ts
@@ -165,6 +165,21 @@ interface ExperimentProfile {
revision: number;
}
+interface ExperimentMetadata {
+ id: string;
+ port: number;
+ startTime: number | string;
+ endTime: number | string;
+ status: string;
+ platform: string;
+ experimentName: string;
+ tag: any[];
+ pid: number;
+ webuiUrl: any[];
+ logDir: string;
+ prefixUrl: string | null;
+}
+
interface NNIManagerStatus {
status: string;
errors: string[];
@@ -230,6 +245,7 @@ export {
MetricDataRecord,
TrialJobInfo,
ExperimentProfile,
+ ExperimentMetadata,
NNIManagerStatus,
EventMap,
SingleAxis,
diff --git a/ts/webui/src/static/model/experiment.ts b/ts/webui/src/static/model/experiment.ts
index 9c8b12fa60..0bf940c6bc 100644
--- a/ts/webui/src/static/model/experiment.ts
+++ b/ts/webui/src/static/model/experiment.ts
@@ -1,6 +1,6 @@
import { MANAGER_IP } from '../const';
import { ExperimentConfig, toSeconds } from '../experimentConfig';
-import { ExperimentProfile, NNIManagerStatus } from '../interface';
+import { ExperimentProfile, ExperimentMetadata, NNIManagerStatus } from '../interface';
import { requestAxios } from '../function';
import { SearchSpace } from './searchspace';
@@ -32,8 +32,24 @@ const emptyProfile: ExperimentProfile = {
revision: 0
};
+const emptyMetadata: ExperimentMetadata = {
+ id: '',
+ port: 0,
+ startTime: '',
+ endTime: '',
+ status: '',
+ platform: '',
+ experimentName: '',
+ tag: [],
+ pid: 0,
+ webuiUrl: [],
+ logDir: '',
+ prefixUrl: null
+};
+
class Experiment {
private profileField?: ExperimentProfile;
+ private metadataField?: ExperimentMetadata = undefined;
private statusField?: NNIManagerStatus = undefined;
private isNestedExperiment: boolean = false;
private isexperimentError: boolean = false;
@@ -82,10 +98,14 @@ class Experiment {
public async update(): Promise {
let updated = false;
- await requestAxios(`${MANAGER_IP}/experiment`)
- .then(data => {
- updated = updated || !compareProfiles(this.profileField, data);
- this.profileField = data;
+ await Promise.all([requestAxios(`${MANAGER_IP}/experiment`), requestAxios(`${MANAGER_IP}/experiment-metadata`)])
+ .then(([profile, metadata]) => {
+ updated ||= !compareProfiles(this.profileField, profile);
+ this.profileField = profile;
+
+ if (JSON.stringify(this.metadataField) !== JSON.stringify(metadata)) {
+ this.metadataField = metadata;
+ }
})
.catch(error => {
this.isexperimentError = true;
@@ -111,6 +131,10 @@ class Experiment {
return this.profileField === undefined ? emptyProfile : this.profileField;
}
+ get metadata(): ExperimentMetadata {
+ return this.metadataField === undefined ? emptyMetadata : this.metadataField;
+ }
+
get config(): ExperimentConfig {
return this.profile.params;
}
diff --git a/ts/webui/src/static/style/openRow.scss b/ts/webui/src/static/style/openRow.scss
index ba49acba06..52a2b8a7ec 100644
--- a/ts/webui/src/static/style/openRow.scss
+++ b/ts/webui/src/static/style/openRow.scss
@@ -55,3 +55,8 @@ $bgColor: #f2f2f2;
}
}
}
+
+#visualizationText {
+ margin: 5px 0 10px 15px;
+ font-size: 14px;
+}