Commit f253576f authored by Lijiao's avatar Lijiao Committed by QuanluZhang
Browse files

Support hyper-band (#358)

parent 1e9cd5fe
src/webui/public/icon.png

29.9 KB | W: | H:

src/webui/public/icon.png

29.9 KB | W: | H:

src/webui/public/icon.png
src/webui/public/icon.png
src/webui/public/icon.png
src/webui/public/icon.png
  • 2-up
  • Swipe
  • Onion skin
...@@ -103,6 +103,7 @@ class Overview extends React.Component<{}, OverviewState> { ...@@ -103,6 +103,7 @@ class Overview extends React.Component<{}, OverviewState> {
const clusterMetaData = sessionData.params.clusterMetaData; const clusterMetaData = sessionData.params.clusterMetaData;
const endTimenum = sessionData.endTime; const endTimenum = sessionData.endTime;
const assessor = sessionData.params.assessor; const assessor = sessionData.params.assessor;
const advisor = sessionData.params.advisor;
trialPro.push({ trialPro.push({
id: sessionData.id, id: sessionData.id,
author: sessionData.params.authorName, author: sessionData.params.authorName,
...@@ -118,6 +119,7 @@ class Overview extends React.Component<{}, OverviewState> { ...@@ -118,6 +119,7 @@ class Overview extends React.Component<{}, OverviewState> {
trainingServicePlatform: trainingPlatform, trainingServicePlatform: trainingPlatform,
tuner: sessionData.params.tuner, tuner: sessionData.params.tuner,
assessor: assessor ? assessor : undefined, assessor: assessor ? assessor : undefined,
advisor: advisor ? advisor : undefined,
clusterMetaData: clusterMetaData ? clusterMetaData : undefined clusterMetaData: clusterMetaData ? clusterMetaData : undefined
}); });
// search space format loguniform max and min // search space format loguniform max and min
......
...@@ -20,6 +20,7 @@ class TrialInfo extends React.Component<TrialInfoProps, {}> { ...@@ -20,6 +20,7 @@ class TrialInfo extends React.Component<TrialInfoProps, {}> {
trialConcurrency: tiralProInfo.runConcurren, trialConcurrency: tiralProInfo.runConcurren,
tuner: tiralProInfo.tuner, tuner: tiralProInfo.tuner,
assessor: tiralProInfo.assessor ? tiralProInfo.assessor : undefined, assessor: tiralProInfo.assessor ? tiralProInfo.assessor : undefined,
advisor: tiralProInfo.advisor ? tiralProInfo.advisor : undefined,
clusterMetaData: tiralProInfo.clusterMetaData ? tiralProInfo.clusterMetaData : undefined clusterMetaData: tiralProInfo.clusterMetaData ? tiralProInfo.clusterMetaData : undefined
}); });
return ( return (
......
...@@ -22,6 +22,11 @@ interface ParaState { ...@@ -22,6 +22,11 @@ interface ParaState {
visualValue: VisualMapValue; visualValue: VisualMapValue;
} }
interface SearchSpace {
_value: Array<number | string>;
_type: string;
}
message.config({ message.config({
top: 250, top: 250,
duration: 2, duration: 2,
...@@ -54,52 +59,11 @@ class Para extends React.Component<{}, ParaState> { ...@@ -54,52 +59,11 @@ class Para extends React.Component<{}, ParaState> {
}; };
} }
hyperParaPic = () => { getParallelAxis =
axios ( dimName: Array<string>, searchRange: SearchSpace,
.all([ parallelAxis: Array<Dimobj>, accPara: Array<number>,
axios.get(`${MANAGER_IP}/trial-jobs`), eachTrialParams: Array<string>, paraYdata: number[][]
axios.get(`${MANAGER_IP}/experiment`) ) => {
])
.then(axios.spread((res, res1) => {
if (res.status === 200 && res1.status === 200) {
if (res.data.length !== 0) {
const accParaData = res.data;
const accPara: Array<number> = [];
// specific value array
const speValue: Array<string> = [];
// yAxis specific name
const speDimName: Array<string> = [];
const parallelAxis: Array<Dimobj> = [];
const paraYdata: number[][] = [];
Object.keys(accParaData).map(item => {
if (accParaData[item].hyperParameters !== undefined) {
const tem = JSON.parse(accParaData[item].hyperParameters).parameters;
// get dim and every line specific number
speDimName.push(tem);
}
if (accParaData[item].status === 'SUCCEEDED') {
if (accParaData[item].finalMetricData && accParaData[item].hyperParameters) {
// get acc array
let acc;
let accReal;
acc = JSON.parse(accParaData[item].finalMetricData.data);
if (typeof (acc) === 'object') {
if (acc.default) {
accReal = acc.default;
}
} else {
accReal = acc;
}
accPara.push(accReal);
// get dim and every line specific number
const temp = JSON.parse(accParaData[item].hyperParameters).parameters;
speValue.push(temp);
}
}
});
// get [batch_size...] name, default each trial is same
// if (speValue.length !== 0) {
const dimName = Object.keys(speDimName[0]);
if (this._isMounted) { if (this._isMounted) {
this.setState(() => ({ this.setState(() => ({
dimName: dimName, dimName: dimName,
...@@ -110,7 +74,6 @@ class Para extends React.Component<{}, ParaState> { ...@@ -110,7 +74,6 @@ class Para extends React.Component<{}, ParaState> {
})); }));
} }
// search space range and specific value [only number] // search space range and specific value [only number]
const searchRange = JSON.parse(res1.data.params.searchSpace);
for (let i = 0; i < dimName.length; i++) { for (let i = 0; i < dimName.length; i++) {
const searchKey = searchRange[dimName[i]]; const searchKey = searchRange[dimName[i]];
switch (searchKey._type) { switch (searchKey._type) {
...@@ -154,40 +117,86 @@ class Para extends React.Component<{}, ParaState> { ...@@ -154,40 +117,86 @@ class Para extends React.Component<{}, ParaState> {
} }
} }
// get data for every lines. if dim is choice type // get data for every lines. if dim is choice type, number -> toString()
// number -> toString() Object.keys(eachTrialParams).map(item => {
Object.keys(speValue).map(item => {
let temp: Array<number> = []; let temp: Array<number> = [];
for (let i = 0; i < dimName.length; i++) { for (let i = 0; i < dimName.length; i++) {
if ('type' in parallelAxis[i]) { if ('type' in parallelAxis[i]) {
temp.push( temp.push(
speValue[item][dimName[i]].toString() eachTrialParams[item][dimName[i]].toString()
); );
} else { } else {
temp.push( temp.push(
speValue[item][dimName[i]] eachTrialParams[item][dimName[i]]
); );
} }
} }
paraYdata.push(temp); paraYdata.push(temp);
}); });
}
hyperParaPic = () => {
axios
.all([
axios.get(`${MANAGER_IP}/trial-jobs`),
axios.get(`${MANAGER_IP}/experiment`)
])
.then(axios.spread((res, res1) => {
if (res.status === 200 && res1.status === 200) {
if (res.data.length !== 0) {
const accParaData = res.data;
const accPara: Array<number> = [];
// specific value array
const eachTrialParams: Array<string> = [];
const parallelAxis: Array<Dimobj> = [];
const paraYdata: number[][] = [];
// experiment interface search space obj
const searchRange = JSON.parse(res1.data.params.searchSpace);
const reallySearchKeys = Object.keys(searchRange);
// trial-jobs interface list
Object.keys(accParaData).map(item => {
if (accParaData[item].status === 'SUCCEEDED') {
if (accParaData[item].finalMetricData && accParaData[item].hyperParameters) {
// get acc array
let acc;
let accReal;
acc = JSON.parse(accParaData[item].finalMetricData.data);
if (typeof (acc) === 'object') {
if (acc.default) {
accReal = acc.default;
}
} else {
accReal = acc;
}
accPara.push(accReal);
// get dim and every line specific number
const temp = JSON.parse(accParaData[item].hyperParameters).parameters;
eachTrialParams.push(temp);
}
}
});
const dimName = reallySearchKeys;
this.getParallelAxis(dimName, searchRange, parallelAxis, accPara, eachTrialParams, paraYdata);
// add acc // add acc
Object.keys(paraYdata).map(item => { Object.keys(paraYdata).map(item => {
paraYdata[item].push(accPara[item]); paraYdata[item].push(accPara[item]);
}); });
// according acc to sort ydata // according acc to sort ydata
if (paraYdata.length !== 0) { if (paraYdata.length !== 0) {
const len = paraYdata[0].length - 1; const len = paraYdata[0].length - 1;
paraYdata.sort((a, b) => b[len] - a[len]); paraYdata.sort((a, b) => b[len] - a[len]);
} }
if (this._isMounted) {
this.setState(() => ({ this.setState(() => ({
paraBack: { paraBack: {
parallelAxis: parallelAxis, parallelAxis: parallelAxis,
data: paraYdata data: paraYdata
} }
})); }));
const { percent, swapAxisArr } = this.state; }
const { paraBack } = this.state; const { percent, swapAxisArr, paraBack } = this.state;
// need to cut down the data // need to cut down the data
if (percent !== 0) { if (percent !== 0) {
const linesNum = paraBack.data.length; const linesNum = paraBack.data.length;
...@@ -198,13 +207,7 @@ class Para extends React.Component<{}, ParaState> { ...@@ -198,13 +207,7 @@ class Para extends React.Component<{}, ParaState> {
if (swapAxisArr.length >= 2) { if (swapAxisArr.length >= 2) {
this.swapGraph(paraBack, swapAxisArr); this.swapGraph(paraBack, swapAxisArr);
} }
// draw search space graph this.getOption(paraBack);
if (this._isMounted) {
this.setState({
option: this.getOption(paraBack)
});
}
// }
} }
} }
})); }));
...@@ -297,7 +300,12 @@ class Para extends React.Component<{}, ParaState> { ...@@ -297,7 +300,12 @@ class Para extends React.Component<{}, ParaState> {
}); });
} }
} }
return optionown; // draw search space graph
if (this._isMounted) {
this.setState(() => ({
option: optionown
}));
}
} }
// get swap parallel axis // get swap parallel axis
......
...@@ -32,6 +32,7 @@ interface Experiment { ...@@ -32,6 +32,7 @@ interface Experiment {
trainingServicePlatform: string; trainingServicePlatform: string;
tuner: object; tuner: object;
assessor?: object; assessor?: object;
advisor?: object;
clusterMetaData?: object; clusterMetaData?: object;
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment