UNPKG

@tensorflow/tfjs-node

Version:

This repository provides native TensorFlow execution in backend JavaScript applications under the Node.js runtime, accelerated by the TensorFlow C binary under the hood. It provides the same API as [TensorFlow.js](https://js.tensorflow.org/api/latest/).

217 lines (216 loc) 11 kB
"use strict"; /** * @license * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ Object.defineProperty(exports, "__esModule", { value: true }); // We import index.ts so that the Node backend gets registered. require("./index"); // tslint:disable-next-line: no-imports-from-dist require("@tensorflow/tfjs-core/dist/public/chained_ops/register_all_chained_ops"); // tslint:disable-next-line: no-imports-from-dist require("@tensorflow/tfjs-core/dist/register_all_gradients"); var tf = require("@tensorflow/tfjs"); // tslint:disable-next-line:no-imports-from-dist var jasmine_util = require("@tensorflow/tfjs-core/dist/jasmine_util"); var yargs_1 = require("yargs"); Error.stackTraceLimit = Infinity; // tslint:disable-next-line:no-require-imports var jasmineCtor = require('jasmine'); // tslint:disable-next-line:no-require-imports process.on('unhandledRejection', function (e) { throw e; }); jasmine_util.setTestEnvs([{ name: 'test-tensorflow', backendName: 'tensorflow', flags: {}, isDataSync: true }]); var IGNORE_LIST = [ // Always ignore version tests: 'bitwiseAnd', 'version version', 'unreliable is true due to both auto gc and string tensors', 'unreliable is true due to auto gc', // See https://github.com/tensorflow/tfjs/issues/161 'depthwiseConv2D', 'separableConv2d', 'complex64 memory', // See https://github.com/tensorflow/tfjs-core/pull/1270 'depthToSpace test-tensorflow {} throws when blocksize < 2', // tslint:disable-next-line:max-line-length 'depthToSpace test-tensorflow {} throws when CPU backend used with data format NCHW', // See https://github.com/tensorflow/tfjs/issues/806 'scatterND test-tensorflow {} should work for 2d', 'scatterND test-tensorflow {} should work for simple 1d', 'scatterND test-tensorflow {} should work for multiple 1d', 'scatterND test-tensorflow {} should sum the duplicated indices', 'scatterND test-tensorflow {} should work for tensorLike input', // https://github.com/tensorflow/tfjs/issues/1077 // tslint:disable-next-line:max-line-length 'maxPool test-tensorflow {} x=[2,2,3] f=[2,2] s=3 p=1 default dimRoundingMode', 'maxPool test-tensorflow {} x=[2,2,3] f=[1,1] s=2 p=1 dimRoundingMode=floor', 'maxPool test-tensorflow {} x=[2,2,3] f=[2,2] s=3 p=1 dimRoundingMode=floor', 'maxPool test-tensorflow {} x=[2,2,3] f=[2,2] s=3 p=1 dimRoundingMode=round', 'maxPool test-tensorflow {} x=[2,2,3] f=[2,2] s=3 p=1 dimRoundingMode=ceil', // Node backend which uses TF 2.4.0 doesn't support explicit padding 'avgPool test-tensorflow {} x=[3,3,1] f=[3,3] s=1 p=explicit', // tslint:disable-next-line:max-line-length 'avgPool test-tensorflow {} x=[2,2,3] f=[2,2] s=3 p=1 default dimRoundingMode', 'avgPool test-tensorflow {} x=[2,2,3] f=[1,1] s=2 p=1 dimRoundingMode=floor', 'avgPool test-tensorflow {} x=[2,2,3] f=[2,2] s=3 p=1 dimRoundingMode=floor', 'avgPool test-tensorflow {} x=[2,2,3] f=[2,2] s=3 p=1 dimRoundingMode=round', 'avgPool test-tensorflow {} x=[2,2,3] f=[2,2] s=3 p=1 dimRoundingMode=ceil', // Node backend which uses TF 2.4.0 doesn't support explicit padding 'avgPool test-tensorflow {} gradient x=[3,3,1] f=[3,3] s=1 p=explicit', // tslint:disable-next-line:max-line-length 'avgPool3d test-tensorflow {} x=[1,2,2,2,1] f=[2,2,2] s=1 p=1 roundingMode=floor', // https://github.com/tensorflow/tensorflow/issues/58758 'avgPool3d test-tensorflow {} x=[1,1,1,1,1] f=[1,1,3] s=1 p=valid', // Node backend which uses TF 2.11.0 doesn't support number padding 'avgPool3d test-tensorflow {} x=[1,1,1,1,1] f=[2,2,2] s=1 p=2', // Node backend which uses TF 2.4.0 doesn't support explicit padding 'maxPool test-tensorflow {} x=[3,3,1] f=[3,3] s=1 p=explicit', 'maxPoolBackprop test-tensorflow {} gradient x=[3,3,1] f=3 s=1 p=explicit', // tslint:disable-next-line:max-line-length 'maxPool3d test-tensorflow {} x=[1,2,2,2,1] f=[2,2,2] s=1 p=1 roundingMode=floor', // libtensorflow doesn't support 6D ArgMax yet. 'argmax test-tensorflow {} 6D, axis=0', 'diag test-tensorflow {} complex', 'diag test-tensorflow {} bool', // See https://github.com/tensorflow/tfjs/issues/1891 'conv2d test-tensorflow {} x=[2,1,2,2] f=[1,1,1,1] s=1 d=1 p=0 NCHW', 'conv2d test-tensorflow {} x=[1,2,2] f=[2,2,1,1] s=1 d=1 p=explicit NCHW', 'conv2d test-tensorflow {} x=[1,2,2] f=[2,2,1,1] s=1 d=1 p=same NCHW', 'conv2d test-tensorflow {} x=[2,2,2] f=[2,2,2,1] s=1 d=1 p=same NCHW', 'conv2d test-tensorflow {} x=[2,1,2,2] f=[2,2,1,1] s=1 d=1 p=same NCHW', 'conv2d test-tensorflow {} gradient x=[1,1,3,3] f=[2,2,1,1] s=1 p=0 NCHW', 'conv2d test-tensorflow {} gradient x=[2,1,3,3] f=[2,2,1,1] s=1 p=0 NCHW', // Node backend which uses TF 2.4.0 doesn't support explicit padding 'conv2dTranspose test-tensorflow {} input=3x3x1,d2=1,f=2,s=2,p=explicit', // tslint:disable-next-line:max-line-length 'conv2dTranspose test-tensorflow {} input=8x8x8,output=4x4x8,f=8,s=1,inDepth=8,p=same vec4', // tslint:disable-next-line:max-line-length 'conv2dTranspose test-tensorflow {} gradient input=[1,3,3,1] f=[2,2,2,1] s=[1,1] p=explicit', 'fused conv2d test-tensorflow {} basic in NCHW', 'fused conv2d test-tensorflow {} im2row in NCHW', 'fused conv2d test-tensorflow {} batch in NCHW', 'maxPoolWithArgmax', 'rotate', // FIXME: unique NaN-handling is inconsistent between TFJS and TFPY 'unique test-tensorflow {} 1d tensor with NaN and Infinity', // Node backend which uses TF 2.4.0 doesn't support explicit padding 'pool test-tensorflow {} max x=[3,3,1] f=[3,3] s=1 d=1 p=explicit', // tslint:disable-next-line:max-line-length 'pool test-tensorflow {} max x=[3,3,1] f=[3,3] s=3 d=1 p=explicit defualt dimRoundingMode', // tslint:disable-next-line:max-line-length 'pool test-tensorflow {} max x=[3,3,1] f=[3,3] s=3 d=1 p=explicit dimRoundingMode=floor', // tslint:disable-next-line:max-line-length 'pool test-tensorflow {} max x=[3,3,1] f=[3,3] s=3 d=1 p=explicit dimRoundingMode=round', // tslint:disable-next-line:max-line-length 'pool test-tensorflow {} max x=[3,3,1] f=[3,3] s=3 d=1 p=explicit dimRoundingMode=ceil', // tslint:disable-next-line:max-line-length 'pool test-tensorflow {} avg x=[3,3,1] f=[3,3] s=3 d=1 p=explicit defualt dimRoundingMode', // tslint:disable-next-line:max-line-length 'pool test-tensorflow {} avg x=[3,3,1] f=[3,3] s=3 d=1 p=explicit dimRoundingMode=floor', // tslint:disable-next-line:max-line-length 'pool test-tensorflow {} avg x=[3,3,1] f=[3,3] s=3 d=1 p=explicit dimRoundingMode=round', // tslint:disable-next-line:max-line-length 'pool test-tensorflow {} avg x=[3,3,1] f=[3,3] s=3 d=1 p=explicit dimRoundingMode=ceil', // tslint:disable-next-line:max-line-length 'pool test-tensorflow {} max x=[2,2,3] f=[1,1] s=2 p=1 fractional outputs default rounding', // Node backend which uses TF 2.4.0 doesn't support explicit padding 'pool test-tensorflow {} avg x=[3,3,1] f=[3,3] s=1 d=1 p=explicit', // tslint:disable-next-line:max-line-length 'pool test-tensorflow {} avg x=[2,2,3] f=[1,1] s=2 p=1 fractional outputs default rounding', // not available in tf yet. 'denseBincount', // only available in tf addon. 'image.transform', 'sign test-tensorflow {} basic', 'sign test-tensorflow {} does not propagate NaNs', 'sign test-tensorflow {} accepts a tensor-like object', 'einsum test-tensorflow {} 2d matrix calculate trace: duplicate axes not implemented yet', 'einsum test-tensorflow {} nonexistent dimension throws error', 'raggedGather', 'raggedRange', 'raggedTensorToTensor', 'searchSorted', 'sparseFillEmptyRows', 'sparseReshape', 'sparseSegmentMean', 'sparseSegmentSum', 'stringNGrams', 'stringSplit', 'stringToHashBucketFast', 'greaterEqual test-tensorflow {} should support string comparison', 'greater test-tensorflow {} should support string comparison', 'lessEqual test-tensorflow {} should support string comparison', 'less test-tensorflow {} should support string comparison', // int32 input for the following ops not supported by TF 2.4.0. 'leakyrelu test-tensorflow {} int32', 'step kernel test-tensorflow {} with int32 tensor', // upperBound and lowerBound use SearchSorted, which is unsupported 'upperBound', 'lowerBound', 'multinomial test-tensorflow {} creates the same data given the same seed', 'tan test-tensorflow {} numbers exceed float32 precision', ]; if (process.platform === 'win32') { // Ignore tensorboard on windows because tmp folder cleanup used in tests // fails with tmp folder cleanup: // https://github.com/tensorflow/tfjs/issues/1692 IGNORE_LIST.push('tensorboard'); IGNORE_LIST.push('tensorBoard'); // Windows has two failing tests: // https://github.com/tensorflow/tfjs/issues/598 IGNORE_LIST.push('clip test-tensorflow {} propagates NaNs'); IGNORE_LIST.push('maxPool test-tensorflow {} [x=[3,3,1] f=[2,2] s=1 ignores NaNs'); } var grepRegex = new RegExp(yargs_1.argv.grep); var runner = new jasmineCtor(); runner.loadConfig({ spec_files: ['src/**/*_test.ts'], random: false, jsLoader: 'require', }); // Also import tests from core. // tslint:disable-next-line: no-imports-from-dist require("@tensorflow/tfjs-core/dist/tests"); if (process.env.JASMINE_SEED) { runner.seed(process.env.JASMINE_SEED); } var env = jasmine.getEnv(); // // Filter method that returns boolean, if a given test should return. env.configure({ specFilter: function (spec) { // Filter based on the grep flag. if (!grepRegex.test(spec.getFullName())) { return false; } // Return false (skip the test) if the test is in the ignore list. for (var i = 0; i < IGNORE_LIST.length; ++i) { if (spec.getFullName().indexOf(IGNORE_LIST[i]) > -1) { return false; } } // Otherwise run the test. return true; } }); // TODO(kreeger): Consider moving to C-code. console.log("Running tests against TensorFlow: ".concat(tf.backend().binding.TF_Version)); runner.execute();