* fix(frontend): example-validator visualization for TFX 0.27.0 * support any split_names
This commit is contained in:
parent
81e083cddf
commit
89c3b61a09
|
|
@ -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({
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue