Skip to content

Commit

Permalink
Multi final metrics (microsoft#377)
Browse files Browse the repository at this point in the history
* Rest retrieve multiple final results for multiphase job

* updates
  • Loading branch information
chicm-ms authored Nov 27, 2018
1 parent e577baf commit 694bb53
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 11 deletions.
2 changes: 1 addition & 1 deletion src/nni_manager/common/datastore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ interface TrialJobInfo {
endTime?: number;
hyperParameters?: string[];
logPath?: string;
finalMetricData?: MetricDataRecord;
finalMetricData?: MetricDataRecord[];
stderrPath?: string;
}

Expand Down
18 changes: 12 additions & 6 deletions src/nni_manager/core/nniDataStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ class NNIDataStore implements DataStore {
}
const map: Map<string, TrialJobInfo> = this.getTrialJobsByReplayEvents(trialJobEvents);

const finalMetricsMap: Map<string, MetricDataRecord> = await this.getFinalMetricData(trialJobId);
const finalMetricsMap: Map<string, MetricDataRecord[]> = await this.getFinalMetricData(trialJobId);

for (const key of map.keys()) {
const jobInfo: TrialJobInfo | undefined = map.get(key);
Expand All @@ -181,17 +181,23 @@ class NNIDataStore implements DataStore {
return result;
}

private async getFinalMetricData(trialJobId?: string): Promise<Map<string, MetricDataRecord>> {
const map: Map<string, MetricDataRecord> = new Map();
private async getFinalMetricData(trialJobId?: string): Promise<Map<string, MetricDataRecord[]>> {
const map: Map<string, MetricDataRecord[]> = new Map();
const metrics: MetricDataRecord[] = await this.getMetricData(trialJobId, 'FINAL');

const multiPhase: boolean = await this.isMultiPhase();

for (const metric of metrics) {
if (map.has(metric.trialJobId) && !multiPhase) {
this.log.error(`Found multiple FINAL results for trial job ${trialJobId}`);
const existMetrics: MetricDataRecord[] | undefined = map.get(metric.trialJobId);
if (existMetrics !== undefined) {
if (!multiPhase) {
this.log.error(`Found multiple FINAL results for trial job ${trialJobId}, metrics: ${JSON.stringify(metrics)}`);
} else {
existMetrics.push(metric);
}
} else {
map.set(metric.trialJobId, [metric]);
}
map.set(metric.trialJobId, metric);
}

return map;
Expand Down
8 changes: 4 additions & 4 deletions src/nni_manager/rest_server/test/mockedNNIManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -159,28 +159,28 @@ export class MockedNNIManager extends Manager {
status: 'SUCCEEDED',
startTime: Date.now(),
endTime: Date.now(),
finalMetricData: {
finalMetricData: [{
timestamp: 0,
trialJobId: '3456',
parameterId: '123',
type: 'FINAL',
sequence: 0,
data: '0.2'
}
}]
};
const job2: TrialJobInfo = {
id: '3456',
status: 'FAILED',
startTime: Date.now(),
endTime: Date.now(),
finalMetricData: {
finalMetricData: [{
timestamp: 0,
trialJobId: '3456',
parameterId: '123',
type: 'FINAL',
sequence: 0,
data: '0.2'
}
}]
};

return Promise.resolve([job1, job2]);
Expand Down

0 comments on commit 694bb53

Please sign in to comment.