fix(frontend): example-validator visualization for TFX 0.27.0. Part of #5137 (#5186)

* fix(frontend): example-validator visualization for TFX 0.27.0

* support any split_names
This commit is contained in:
Yuan (Bob) Gong 2021-02-25 13:23:15 +08:00 committed by Yuan Gong
parent 81e083cddf
commit 89c3b61a09
1 changed files with 41 additions and 23 deletions

View File

@ -294,21 +294,36 @@ export class OutputArtifactLoader {
return buildArtifactViewer({ script, namespace }); return buildArtifactViewer({ script, namespace });
}), }),
); );
const anomaliesArtifactUris = filterArtifactUrisByType( const anomaliesArtifacts = filterArtifactsByType('ExampleAnomalies', artifactTypes, artifacts);
'ExampleAnomalies',
artifactTypes,
artifacts,
);
viewers = viewers.concat( viewers = viewers.concat(
anomaliesArtifactUris.map(uri => { anomaliesArtifacts
uri = uri + '/anomalies.pbtxt'; .map(artifact => {
const splitNamesJSON = artifact
.getPropertiesMap()
.get('split_names')
?.getStringValue();
if (!splitNamesJSON) {
return [];
}
let splitNames;
try {
splitNames = JSON.parse(splitNamesJSON);
} catch (e) {
logger.warn('Failed to parse split names as a JSON array:', e);
}
if (!Array.isArray(splitNames)) {
return [];
}
return splitNames.map(name => {
const script = [ const script = [
'import tensorflow_data_validation as tfdv', 'import tensorflow_data_validation as tfdv',
`anomalies = tfdv.load_anomalies_text('${uri}')`, `anomalies = tfdv.load_anomalies_text('${artifact.getUri()}/${name}')`,
'tfdv.display_anomalies(anomalies)', 'tfdv.display_anomalies(anomalies)',
]; ];
return buildArtifactViewer({ script, namespace }); return buildArtifactViewer({ script, namespace });
}), });
})
.flat(),
); );
const EvaluatorArtifactUris = filterArtifactUrisByType( const EvaluatorArtifactUris = filterArtifactUrisByType(
'ModelEvaluation', 'ModelEvaluation',
@ -452,22 +467,25 @@ async function getArtifactTypes(): Promise<ArtifactType[]> {
return res.getArtifactTypesList(); return res.getArtifactTypesList();
} }
function filterArtifactsByType(
artifactTypeName: string,
artifactTypes: ArtifactType[],
artifacts: Artifact[],
): Artifact[] {
const artifactTypeIds = artifactTypes
.filter(artifactType => artifactType.getName() === artifactTypeName)
.map(artifactType => artifactType.getId());
return artifacts.filter(artifact => artifactTypeIds.includes(artifact.getTypeId()));
}
function filterArtifactUrisByType( function filterArtifactUrisByType(
artifactTypeName: string, artifactTypeName: string,
artifactTypes: ArtifactType[], artifactTypes: ArtifactType[],
artifacts: Artifact[], artifacts: Artifact[],
): string[] { ): string[] {
const artifactTypeIds = artifactTypes return filterArtifactsByType(artifactTypeName, artifactTypes, artifacts)
.filter(artifactType => artifactType.getName() === artifactTypeName)
.map(artifactType => artifactType.getId());
const matchingArtifacts = artifacts.filter(artifact =>
artifactTypeIds.includes(artifact.getTypeId()),
);
const tfdvArtifactsPaths = matchingArtifacts
.map(artifact => artifact.getUri()) .map(artifact => artifact.getUri())
.filter(uri => uri); // uri not empty .filter(uri => uri); // uri not empty
return tfdvArtifactsPaths;
} }
async function buildArtifactViewer({ async function buildArtifactViewer({