"lm_eval/models/seq2seq.py" did not exist on "ecde9d2e7cd1d5caff00cfbf178e291d899b0b22"
App.tsx 9.56 KB
Newer Older
Deshui Yu's avatar
Deshui Yu committed
1
import * as React from 'react';
2
import { Stack } from '@fluentui/react';
3
4
import { COLUMN } from './static/const';
import { EXPERIMENT, TRIALS } from './static/datamodel';
5
import { isManagerExperimentPage } from './static/function';
6
import NavCon from './components/NavCon';
7
import MessageInfo from './components/modals/MessageInfo';
8
import { SlideNavBtns } from './components/slideNav/SlideNavBtns';
9
10
11
12
const echarts = require('echarts/lib/echarts');
echarts.registerTheme('nni_theme', {
    color: '#3c8dbc'
});
13
import './App.scss';
14
import './static/style/common.scss';
15
import './static/style/trialsDetail.scss';
Deshui Yu's avatar
Deshui Yu committed
16

17
interface AppState {
18
    interval: number;
19
    columnList: string[];
20
21
    experimentUpdateBroadcast: number;
    trialsUpdateBroadcast: number;
22
    maxDurationUnit: string;
Lijiao's avatar
Lijiao committed
23
    metricGraphMode: 'max' | 'min'; // tuner's optimize_mode filed
24
25
    isillegalFinal: boolean;
    expWarningMessage: string;
Lijiaoa's avatar
Lijiaoa committed
26
    bestTrialEntries: string; // for overview page: best trial entreis
Lijiaoa's avatar
Lijiaoa committed
27
    isUpdate: boolean;
28
29
}

30
31
32
33
34
35
36
export const AppContext = React.createContext({
    interval: 10, // sendons
    columnList: COLUMN,
    experimentUpdateBroadcast: 0,
    trialsUpdateBroadcast: 0,
    metricGraphMode: 'max',
    bestTrialEntries: '10',
37
    maxDurationUnit: 'm',
38
39
40
41
42
43
44
45
46
    // eslint-disable-next-line @typescript-eslint/no-empty-function
    changeColumn: (_val: string[]): void => {},
    // eslint-disable-next-line @typescript-eslint/no-empty-function
    changeMetricGraphMode: (_val: 'max' | 'min'): void => {},
    // eslint-disable-next-line @typescript-eslint/no-empty-function
    changeMaxDurationUnit: (_val: string): void => {},
    // eslint-disable-next-line @typescript-eslint/no-empty-function
    changeEntries: (_val: string): void => {},
    // eslint-disable-next-line @typescript-eslint/no-empty-function
47
    updateOverviewPage: () => {}
48
49
});

50
class App extends React.Component<{}, AppState> {
51
52
    private timerId!: number | undefined;
    private firstLoad: boolean = false; // when click refresh selector options
53
54
55
56
57
58
59
    constructor(props: {}) {
        super(props);
        this.state = {
            interval: 10, // sendons
            columnList: COLUMN,
            experimentUpdateBroadcast: 0,
            trialsUpdateBroadcast: 0,
60
            metricGraphMode: 'max',
61
            maxDurationUnit: 'm',
62
            isillegalFinal: false,
Lijiaoa's avatar
Lijiaoa committed
63
            expWarningMessage: '',
Lijiaoa's avatar
Lijiaoa committed
64
65
            bestTrialEntries: '10',
            isUpdate: true
66
        };
67
68
    }

Lijiao's avatar
Lijiao committed
69
    async componentDidMount(): Promise<void> {
70
        await Promise.all([EXPERIMENT.init(), TRIALS.init()]);
71
72
        this.setState(state => ({
            experimentUpdateBroadcast: state.experimentUpdateBroadcast + 1,
Lijiaoa's avatar
Lijiaoa committed
73
            trialsUpdateBroadcast: state.trialsUpdateBroadcast + 1,
74
            metricGraphMode: EXPERIMENT.optimizeMode === 'minimize' ? 'min' : 'max'
Lijiaoa's avatar
Lijiaoa committed
75
76
        }));
        this.timerId = window.setTimeout(this.refresh, this.state.interval * 100);
77
78
    }

Lijiao's avatar
Lijiao committed
79
    changeInterval = (interval: number): void => {
80
81
        window.clearTimeout(this.timerId);
        if (interval === 0) {
Lijiaoa's avatar
Lijiaoa committed
82
            return;
83
        }
84
85
        // setState will trigger page refresh at once.
        // setState is asyc, interval not update to (this.state.interval) at once.
Lijiaoa's avatar
Lijiaoa committed
86
        this.setState({ interval }, () => {
87
88
89
            this.firstLoad = true;
            this.refresh();
        });
90
    };
91

92
    // TODO: use local storage
93
    changeColumn = (columnList: string[]): void => {
94
        this.setState({ columnList: columnList });
95
    };
96

Lijiao's avatar
Lijiao committed
97
    changeMetricGraphMode = (val: 'max' | 'min'): void => {
Lijiao's avatar
Lijiao committed
98
        this.setState({ metricGraphMode: val });
99
    };
Lijiao's avatar
Lijiao committed
100

Lijiaoa's avatar
Lijiaoa committed
101
102
    // overview best trial module
    changeEntries = (entries: string): void => {
Lijiaoa's avatar
Lijiaoa committed
103
        this.setState({ bestTrialEntries: entries });
104
    };
Lijiaoa's avatar
Lijiaoa committed
105

106
107
108
109
110
    // overview max duration unit
    changeMaxDurationUnit = (unit: string): void => {
        this.setState({ maxDurationUnit: unit });
    };

111
112
113
114
115
116
    updateOverviewPage = (): void => {
        this.setState(state => ({
            experimentUpdateBroadcast: state.experimentUpdateBroadcast + 1
        }));
    };

Lijiaoa's avatar
Lijiaoa committed
117
    shouldComponentUpdate(nextProps: any, nextState: AppState): boolean {
118
        if (!(nextState.isUpdate || nextState.isUpdate === undefined)) {
Lijiaoa's avatar
Lijiaoa committed
119
120
121
122
123
124
            nextState.isUpdate = true;
            return false;
        }
        return true;
    }

125
    render(): React.ReactNode {
126
127
128
129
130
131
132
133
        const {
            interval,
            columnList,
            experimentUpdateBroadcast,
            trialsUpdateBroadcast,
            metricGraphMode,
            isillegalFinal,
            expWarningMessage,
134
135
            bestTrialEntries,
            maxDurationUnit
136
        } = this.state;
137
        if (experimentUpdateBroadcast === 0 || trialsUpdateBroadcast === 0) {
138
            return null; // TODO: render a loading page
139
        }
Lijiaoa's avatar
Lijiaoa committed
140
141
142
143
144
145
146
147
        const errorList = [
            { errorWhere: TRIALS.jobListError(), errorMessage: TRIALS.getJobErrorMessage() },
            { errorWhere: EXPERIMENT.experimentError(), errorMessage: EXPERIMENT.getExperimentMessage() },
            { errorWhere: EXPERIMENT.statusError(), errorMessage: EXPERIMENT.getStatusMessage() },
            { errorWhere: TRIALS.MetricDataError(), errorMessage: TRIALS.getMetricDataErrorMessage() },
            { errorWhere: TRIALS.latestMetricDataError(), errorMessage: TRIALS.getLatestMetricDataErrorMessage() },
            { errorWhere: TRIALS.metricDataRangeError(), errorMessage: TRIALS.metricDataRangeErrorMessage() }
        ];
148

149
        return (
150
151
152
153
154
155
            <React.Fragment>
                {isManagerExperimentPage() ? null : (
                    <Stack className='nni' style={{ minHeight: window.innerHeight }}>
                        <div className='header'>
                            <div className='headerCon'>
                                <NavCon changeInterval={this.changeInterval} refreshFunction={this.lastRefresh} />
156
                            </div>
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
                        </div>
                        <Stack className='contentBox'>
                            <Stack className='content'>
                                {/* search space & config */}
                                <SlideNavBtns />
                                {/* if api has error field, show error message */}
                                {errorList.map(
                                    (item, key) =>
                                        item.errorWhere && (
                                            <div key={key} className='warning'>
                                                <MessageInfo info={item.errorMessage} typeInfo='error' />
                                            </div>
                                        )
                                )}
                                {isillegalFinal && (
                                    <div className='warning'>
                                        <MessageInfo info={expWarningMessage} typeInfo='warning' />
                                    </div>
                                )}
                                <AppContext.Provider
                                    value={{
                                        interval,
                                        columnList,
                                        changeColumn: this.changeColumn,
                                        experimentUpdateBroadcast,
                                        trialsUpdateBroadcast,
                                        metricGraphMode,
                                        maxDurationUnit,
                                        changeMaxDurationUnit: this.changeMaxDurationUnit,
                                        changeMetricGraphMode: this.changeMetricGraphMode,
                                        bestTrialEntries,
                                        changeEntries: this.changeEntries,
                                        updateOverviewPage: this.updateOverviewPage
                                    }}
                                >
                                    {this.props.children}
                                </AppContext.Provider>
                            </Stack>
                        </Stack>
196
                    </Stack>
197
198
                )}
            </React.Fragment>
199
200
201
        );
    }

Lijiao's avatar
Lijiao committed
202
    private refresh = async (): Promise<void> => {
203
204
205
206
207
208
209
210
211
212
213
214
        // resolve this question: 10s -> 20s, page refresh twice.
        // only refresh this page after clicking the refresh options
        if (this.firstLoad !== true) {
            const [experimentUpdated, trialsUpdated] = await Promise.all([EXPERIMENT.update(), TRIALS.update()]);
            if (experimentUpdated) {
                this.setState(state => ({ experimentUpdateBroadcast: state.experimentUpdateBroadcast + 1 }));
            }
            if (trialsUpdated) {
                this.setState(state => ({ trialsUpdateBroadcast: state.trialsUpdateBroadcast + 1 }));
            }
        } else {
            this.firstLoad = false;
215
216
        }

Lijiaoa's avatar
Lijiaoa committed
217
218
        // experiment status and /trial-jobs api's status could decide website update
        if (['DONE', 'ERROR', 'STOPPED'].includes(EXPERIMENT.status) || TRIALS.jobListError()) {
219
            // experiment finished, refresh once more to ensure consistency
Lijiaoa's avatar
Lijiaoa committed
220
            this.setState(() => ({ interval: 0, isUpdate: false }));
221
            return;
222
        }
223

Lijiaoa's avatar
Lijiaoa committed
224
        this.timerId = window.setTimeout(this.refresh, this.state.interval * 1000);
225
    };
226

227
    public async lastRefresh(): Promise<void> {
228
229
        await EXPERIMENT.update();
        await TRIALS.update(true);
230
231
232
233
        this.setState(state => ({
            experimentUpdateBroadcast: state.experimentUpdateBroadcast + 1,
            trialsUpdateBroadcast: state.trialsUpdateBroadcast + 1
        }));
234
    }
Deshui Yu's avatar
Deshui Yu committed
235
236
237
}

export default App;