Unverified Commit 95f731e4 authored by J-shang's avatar J-shang Committed by GitHub
Browse files

experiment management backend (#3081)



* step 1 nnictl generate experimentId & merge folder

* step 2.1 modify .experiment structure

* step 2.2 add lock for .experiment rw in nnictl

* step 2.2 add filelock dependence

* step 2.2 remove uniqueString from main.js

* fix test bug

* fix test bug

* setp 3.1 add experiment manager

* step 3.2 add getExperimentsInfo

* fix eslint

* add a simple file lock to support stale

* step 3.3 add test

* divide abs experiment manager from manager

* experiment manager refactor

* support .experiment sync update status

* nnictl no longer uses rest api to update status or endtime

* nnictl no longer uses rest api to update status or endtime

* fix eslint

* support .experiment sync update endtime

* fix test

* fix settimeout bug

* fix test

* adjust experiment endTime

* separate simple file lock class

* modify name

* add 'id' in .experiment

* update rest api format

* fix eslint

* fix issue in comments

* fix rest api format

* add indent in json in experiments manager

* fix unittest

* fix unittest

* refector file lock

* fix eslint

* remove '__enter__' in filelock

* filelock support never expire
Co-authored-by: default avatarNing Shang <nishang@microsoft.com>
parent fc0ff8ce
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
'use strict';
import { ExperimentManager } from '../../common/experimentManager';
import { Provider } from 'typescript-ioc';
export const testExperimentManagerProvider: Provider = {
get: (): ExperimentManager => { return new mockedeExperimentManager(); }
};
export class mockedeExperimentManager extends ExperimentManager {
public getExperimentsInfo(): Promise<JSON> {
const expInfo = JSON.parse(JSON.stringify({
"test": {
"port": 8080,
"startTime": 1605246730756,
"endTime": "N/A",
"status": "RUNNING",
"platform": "local",
"experimentName": "testExp",
"tag": [], "pid": 11111,
"webuiUrl": [],
"logDir": null
}
}));
return new Promise<JSON>((resolve, reject) => {
resolve(expInfo);
});
}
public setExperimentPath(newPath: string): void {
return
}
public setExperimentInfo(experimentId: string, key: string, value: any): void {
return
}
public stop(): Promise<void> {
return new Promise<void>(()=>{});
}
}
...@@ -10,12 +10,14 @@ import { Container } from 'typescript-ioc'; ...@@ -10,12 +10,14 @@ import { Container } from 'typescript-ioc';
import * as component from '../../common/component'; import * as component from '../../common/component';
import { DataStore } from '../../common/datastore'; import { DataStore } from '../../common/datastore';
import { ExperimentProfile, Manager } from '../../common/manager'; import { ExperimentProfile, Manager } from '../../common/manager';
import { ExperimentManager } from '../../common/experimentManager'
import { TrainingService } from '../../common/trainingService'; import { TrainingService } from '../../common/trainingService';
import { cleanupUnitTest, prepareUnitTest } from '../../common/utils'; import { cleanupUnitTest, prepareUnitTest } from '../../common/utils';
import { MockedDataStore } from '../../core/test/mockedDatastore'; import { MockedDataStore } from '../../core/test/mockedDatastore';
import { MockedTrainingService } from '../../core/test/mockedTrainingService'; import { MockedTrainingService } from '../../core/test/mockedTrainingService';
import { NNIRestServer } from '../nniRestServer'; import { NNIRestServer } from '../nniRestServer';
import { testManagerProvider } from './mockedNNIManager'; import { testManagerProvider } from './mockedNNIManager';
import { testExperimentManagerProvider } from './mockedExperimentManager';
describe('Unit test for rest server', () => { describe('Unit test for rest server', () => {
...@@ -26,6 +28,7 @@ describe('Unit test for rest server', () => { ...@@ -26,6 +28,7 @@ describe('Unit test for rest server', () => {
Container.bind(Manager).provider(testManagerProvider); Container.bind(Manager).provider(testManagerProvider);
Container.bind(DataStore).to(MockedDataStore); Container.bind(DataStore).to(MockedDataStore);
Container.bind(TrainingService).to(MockedTrainingService); Container.bind(TrainingService).to(MockedTrainingService);
Container.bind(ExperimentManager).provider(testExperimentManagerProvider)
const restServer: NNIRestServer = component.get(NNIRestServer); const restServer: NNIRestServer = component.get(NNIRestServer);
restServer.start().then(() => { restServer.start().then(() => {
ROOT_URL = `${restServer.endPoint}/api/v1/nni`; ROOT_URL = `${restServer.endPoint}/api/v1/nni`;
...@@ -84,6 +87,16 @@ describe('Unit test for rest server', () => { ...@@ -84,6 +87,16 @@ describe('Unit test for rest server', () => {
}); });
}); });
it('Test GET experiments-info', (done: Mocha.Done) => {
request.get(`${ROOT_URL}/experiments-info`, (err: Error, res: request.Response) => {
expect(res.statusCode).to.equal(200);
if (err) {
assert.fail(err.message);
}
done();
});
});
it('Test change concurrent-trial-jobs', (done: Mocha.Done) => { it('Test change concurrent-trial-jobs', (done: Mocha.Done) => {
request.get(`${ROOT_URL}/experiment`, (err: Error, res: request.Response, body: any) => { request.get(`${ROOT_URL}/experiment`, (err: Error, res: request.Response, body: any) => {
if (err) { if (err) {
......
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