From 814b46c9f242669b506b6b550dbb2b59b756f8d3 Mon Sep 17 00:00:00 2001 From: Na Li Date: Mon, 24 Aug 2020 15:15:15 -0700 Subject: [PATCH 1/7] Fix backend not ready problem. --- tfjs-core/src/jasmine_util.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tfjs-core/src/jasmine_util.ts b/tfjs-core/src/jasmine_util.ts index 9a57dff59bb..7b896f279df 100644 --- a/tfjs-core/src/jasmine_util.ts +++ b/tfjs-core/src/jasmine_util.ts @@ -259,7 +259,8 @@ function executeTests( } env().set('IS_TEST', true); // Await setting the new backend since it can have async init. - await ENGINE.setBackend(testEnv.backendName); + ENGINE.setBackend(testEnv.backendName); + await ENGINE.ready(); }); beforeEach(() => { From 7f282a1c4e2dd082aa1227f010a6593bd584ef57 Mon Sep 17 00:00:00 2001 From: Na Li Date: Mon, 24 Aug 2020 15:40:29 -0700 Subject: [PATCH 2/7] Add more logging. --- tfjs-backend-wasm/src/backend_wasm.ts | 18 +++++++++++++++--- tfjs-core/src/jasmine_util.ts | 3 +-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/tfjs-backend-wasm/src/backend_wasm.ts b/tfjs-backend-wasm/src/backend_wasm.ts index b1a7f4dc162..a2fe5d52d00 100644 --- a/tfjs-backend-wasm/src/backend_wasm.ts +++ b/tfjs-backend-wasm/src/backend_wasm.ts @@ -44,8 +44,13 @@ export class BackendWasm extends KernelBackend { constructor(public wasm: BackendWasmModule) { super(); - this.wasm.tfjs.init(); - this.dataIdMap = new DataStorage(this, engine()); + + try { + this.wasm.tfjs.init(); + this.dataIdMap = new DataStorage(this, engine()); + } catch (e) { + throw new Error(`Unable to initialize an instance of BackendWasm: ${e}`); + } } write(values: backend_util.BackendValues, shape: number[], dtype: DataType): @@ -176,7 +181,14 @@ export class BackendWasm extends KernelBackend { } registerBackend('wasm', async () => { - const {wasm} = await init(); + let wasm; + + try { + wasm = (await init()).wasm; + } catch (e) { + throw new Error(`Unable to initialize the wasm module: ${e}`); + } + return new BackendWasm(wasm); }, WASM_PRIORITY); diff --git a/tfjs-core/src/jasmine_util.ts b/tfjs-core/src/jasmine_util.ts index 7b896f279df..9a57dff59bb 100644 --- a/tfjs-core/src/jasmine_util.ts +++ b/tfjs-core/src/jasmine_util.ts @@ -259,8 +259,7 @@ function executeTests( } env().set('IS_TEST', true); // Await setting the new backend since it can have async init. - ENGINE.setBackend(testEnv.backendName); - await ENGINE.ready(); + await ENGINE.setBackend(testEnv.backendName); }); beforeEach(() => { From f0e3437280e1d364844324e7a16f90c4487db3c1 Mon Sep 17 00:00:00 2001 From: Na Li Date: Mon, 24 Aug 2020 16:05:15 -0700 Subject: [PATCH 3/7] Improve wasm karma config. --- tfjs-backend-wasm/karma.conf.js | 75 +++++++++++++++++++++------------ tfjs-backend-wasm/package.json | 2 +- 2 files changed, 48 insertions(+), 29 deletions(-) diff --git a/tfjs-backend-wasm/karma.conf.js b/tfjs-backend-wasm/karma.conf.js index 796311cd15c..a24c907346c 100644 --- a/tfjs-backend-wasm/karma.conf.js +++ b/tfjs-backend-wasm/karma.conf.js @@ -42,6 +42,34 @@ const karmaTypescriptConfig = { include: ['src/', 'wasm-out/'] }; +const devConfig = { + frameworks: ['jasmine', 'karma-typescript'], + files: [ + {pattern: './node_modules/@babel/polyfill/dist/polyfill.js'}, + // Setup the environment for the tests. + 'src/setup_test.ts', + // Serve the wasm file as a static resource. + {pattern: 'wasm-out/**/*.wasm', included: false}, + // Import the generated js library from emscripten. + {pattern: 'wasm-out/**/*.js'}, + // Import the rest of the sources. + {pattern: 'src/**/*.ts'}, + ], + exclude: ['src/test_node.ts'], + preprocessors: { + 'wasm-out/**/*.js': ['karma-typescript'], + '**/*.ts': ['karma-typescript'] + }, + karmaTypescriptConfig, + reporters: ['dots', 'karma-typescript'] +}; + +const browserstackConfig = { + ...devConfig, + hostname: 'bs-local.com', + singleRun: true +}; + module.exports = function(config) { const args = []; if (config.grep) { @@ -50,45 +78,35 @@ module.exports = function(config) { if (config.flags) { args.push('--flags', config.flags); } + + let extraConfig = null; + + if (config.browserstack) { + extraConfig = browserstackConfig; + } else { + extraConfig = devConfig; + } + config.set({ + ...extraConfig, basePath: '', - frameworks: ['jasmine', 'karma-typescript'], - files: [ - {pattern: './node_modules/@babel/polyfill/dist/polyfill.js'}, - // Setup the environment for the tests. - 'src/setup_test.ts', - // Serve the wasm file as a static resource. - {pattern: 'wasm-out/**/*.wasm', included: false}, - // Import the generated js library from emscripten. - {pattern: 'wasm-out/**/*.js'}, - // Import the rest of the sources. - {pattern: 'src/**/*.ts'}, - ], - exclude: ['src/test_node.ts'], - preprocessors: { - 'wasm-out/**/*.js': ['karma-typescript'], - '**/*.ts': ['karma-typescript'] - }, - karmaTypescriptConfig, // Redirect the request for the wasm file so karma can find it. proxies: { '/base/node_modules/karma-typescript/dist/client/tfjs-backend-wasm.wasm': '/base/wasm-out/tfjs-backend-wasm.wasm', }, - reporters: ['dots', 'karma-typescript'], - port: 9876, - colors: true, - autoWatch: true, browsers: ['Chrome'], browserStack: { username: process.env.BROWSERSTACK_USERNAME, - accessKey: process.env.BROWSERSTACK_KEY + accessKey: process.env.BROWSERSTACK_KEY, + timeout: 1800 }, - singleRun: false, - captureTimeout: 120000, + captureTimeout: 3e5, reportSlowerThan: 500, - browserNoActivityTimeout: 180000, - client: {jasmine: {random: false}, args: args}, + browserNoActivityTimeout: 3e5, + browserDisconnectTimeout: 3e5, + browserDisconnectTolerance: 0, + browserSocketTimeout: 1.2e5, customLaunchers: { // For browserstack configs see: // https://www.browserstack.com/automate/node @@ -99,6 +117,7 @@ module.exports = function(config) { os: 'OS X', os_version: 'High Sierra' } - } + }, + client: {jasmine: {random: false}, args: args}, }) } diff --git a/tfjs-backend-wasm/package.json b/tfjs-backend-wasm/package.json index 20bd899614f..a5f7276cc8d 100644 --- a/tfjs-backend-wasm/package.json +++ b/tfjs-backend-wasm/package.json @@ -32,7 +32,7 @@ "test-node": "ts-node --skip-ignore -P tsconfig.test.json src/test_node.ts", "test-bundle-size": "./scripts/test-bundle-size.js", "test-cc": "bazel test //src/cc:cc_tests --test_output=all", - "test-browser-ci": "karma start --singleRun --browsers=bs_chrome_mac" + "test-browser-ci": "karma start --browserstack --browsers=bs_chrome_mac" }, "browser": { "fs": false, From 88da6d12a599b67022a6e47a4edca8f7bff52c72 Mon Sep 17 00:00:00 2001 From: Na Li Date: Mon, 24 Aug 2020 16:15:28 -0700 Subject: [PATCH 4/7] Add more device testing. --- tfjs-backend-wasm/cloudbuild.yml | 2 +- tfjs-backend-wasm/karma.conf.js | 37 ++++++++++++++++++++++++++++ tfjs-backend-wasm/package.json | 2 +- tfjs-backend-wasm/scripts/test-ci.sh | 9 ++++++- 4 files changed, 47 insertions(+), 3 deletions(-) diff --git a/tfjs-backend-wasm/cloudbuild.yml b/tfjs-backend-wasm/cloudbuild.yml index 0eb676044f1..23ed11ce2d8 100644 --- a/tfjs-backend-wasm/cloudbuild.yml +++ b/tfjs-backend-wasm/cloudbuild.yml @@ -45,7 +45,7 @@ steps: args: ['test-ci'] waitFor: ['yarn', 'build-deps', 'build', 'lint'] env: ['BROWSERSTACK_USERNAME=deeplearnjs1'] - secretEnv: ['BROWSERSTACK_KEY'] + secretEnv: ['BROWSERSTACK_KEY', 'NIGHTLY=$_NIGHTLY'] # Run C++ tests. - name: 'gcr.io/learnjs-174218/wasm' diff --git a/tfjs-backend-wasm/karma.conf.js b/tfjs-backend-wasm/karma.conf.js index a24c907346c..fb879c7ea15 100644 --- a/tfjs-backend-wasm/karma.conf.js +++ b/tfjs-backend-wasm/karma.conf.js @@ -116,6 +116,43 @@ module.exports = function(config) { browser_version: 'latest', os: 'OS X', os_version: 'High Sierra' + }, + bs_firefox_mac: { + base: 'BrowserStack', + browser: 'firefox', + browser_version: 'latest', + os: 'OS X', + os_version: 'High Sierra' + }, + bs_safari_mac: { + base: 'BrowserStack', + browser: 'safari', + browser_version: 'latest', + os: 'OS X', + os_version: 'High Sierra' + }, + bs_ios_11: { + base: 'BrowserStack', + device: 'iPhone X', + os: 'iOS', + os_version: '11.0', + real_mobile: true + }, + bs_android_9: { + base: 'BrowserStack', + device: 'Google Pixel 3 XL', + os: 'android', + os_version: '9.0', + real_mobile: true + }, + win_10_chrome: { + base: 'BrowserStack', + browser: 'chrome', + // Latest Chrome on Windows has WebGL problems: + // https://github.com/tensorflow/tfjs/issues/2272 + browser_version: '77.0', + os: 'Windows', + os_version: '10' } }, client: {jasmine: {random: false}, args: args}, diff --git a/tfjs-backend-wasm/package.json b/tfjs-backend-wasm/package.json index a5f7276cc8d..92c253a7861 100644 --- a/tfjs-backend-wasm/package.json +++ b/tfjs-backend-wasm/package.json @@ -32,7 +32,7 @@ "test-node": "ts-node --skip-ignore -P tsconfig.test.json src/test_node.ts", "test-bundle-size": "./scripts/test-bundle-size.js", "test-cc": "bazel test //src/cc:cc_tests --test_output=all", - "test-browser-ci": "karma start --browserstack --browsers=bs_chrome_mac" + "run-browserstack": "karma start --browserstack" }, "browser": { "fs": false, diff --git a/tfjs-backend-wasm/scripts/test-ci.sh b/tfjs-backend-wasm/scripts/test-ci.sh index 873c7aa2fee..bfcf43a3eaf 100755 --- a/tfjs-backend-wasm/scripts/test-ci.sh +++ b/tfjs-backend-wasm/scripts/test-ci.sh @@ -11,4 +11,11 @@ set -e # Regular testing. yarn test-node -yarn test-browser-ci + +if [ "$NIGHTLY" = true ]; then + yarn run-browserstack --browsers=bs_safari_mac,bs_ios_11 + yarn run-browserstack --browsers=bs_firefox_mac,bs_chrome_mac + yarn run-browserstack --browsers=win_10_chrome,bs_android_9 +else + yarn run-browserstack --browsers=bs_chrome_mac +fi From a8d695c785bd05b345765e1783271806968b0bf2 Mon Sep 17 00:00:00 2001 From: Na Li Date: Mon, 24 Aug 2020 16:23:50 -0700 Subject: [PATCH 5/7] Add more device testing. --- tfjs-backend-wasm/src/backend_wasm.ts | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/tfjs-backend-wasm/src/backend_wasm.ts b/tfjs-backend-wasm/src/backend_wasm.ts index a2fe5d52d00..b1a7f4dc162 100644 --- a/tfjs-backend-wasm/src/backend_wasm.ts +++ b/tfjs-backend-wasm/src/backend_wasm.ts @@ -44,13 +44,8 @@ export class BackendWasm extends KernelBackend { constructor(public wasm: BackendWasmModule) { super(); - - try { - this.wasm.tfjs.init(); - this.dataIdMap = new DataStorage(this, engine()); - } catch (e) { - throw new Error(`Unable to initialize an instance of BackendWasm: ${e}`); - } + this.wasm.tfjs.init(); + this.dataIdMap = new DataStorage(this, engine()); } write(values: backend_util.BackendValues, shape: number[], dtype: DataType): @@ -181,14 +176,7 @@ export class BackendWasm extends KernelBackend { } registerBackend('wasm', async () => { - let wasm; - - try { - wasm = (await init()).wasm; - } catch (e) { - throw new Error(`Unable to initialize the wasm module: ${e}`); - } - + const {wasm} = await init(); return new BackendWasm(wasm); }, WASM_PRIORITY); From 8e2834a1df2a6745e5a09efb6c5a1748124b7282 Mon Sep 17 00:00:00 2001 From: Na Li Date: Mon, 24 Aug 2020 16:26:40 -0700 Subject: [PATCH 6/7] . --- tfjs-backend-wasm/cloudbuild.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tfjs-backend-wasm/cloudbuild.yml b/tfjs-backend-wasm/cloudbuild.yml index 23ed11ce2d8..59bfffaf0d9 100644 --- a/tfjs-backend-wasm/cloudbuild.yml +++ b/tfjs-backend-wasm/cloudbuild.yml @@ -44,8 +44,8 @@ steps: id: 'test-wasm' args: ['test-ci'] waitFor: ['yarn', 'build-deps', 'build', 'lint'] - env: ['BROWSERSTACK_USERNAME=deeplearnjs1'] - secretEnv: ['BROWSERSTACK_KEY', 'NIGHTLY=$_NIGHTLY'] + env: ['BROWSERSTACK_USERNAME=deeplearnjs1', 'NIGHTLY=$_NIGHTLY'] + secretEnv: ['BROWSERSTACK_KEY'] # Run C++ tests. - name: 'gcr.io/learnjs-174218/wasm' From 3014e3cbd1b5ca4848febb6a2547784ed72a350c Mon Sep 17 00:00:00 2001 From: Na Li Date: Mon, 24 Aug 2020 18:38:42 -0700 Subject: [PATCH 7/7] . --- tfjs-backend-wasm/scripts/test-ci.sh | 3 ++- tfjs-backend-wasm/src/setup_test.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tfjs-backend-wasm/scripts/test-ci.sh b/tfjs-backend-wasm/scripts/test-ci.sh index bfcf43a3eaf..7ad2d412d3e 100755 --- a/tfjs-backend-wasm/scripts/test-ci.sh +++ b/tfjs-backend-wasm/scripts/test-ci.sh @@ -13,9 +13,10 @@ set -e yarn test-node if [ "$NIGHTLY" = true ]; then - yarn run-browserstack --browsers=bs_safari_mac,bs_ios_11 + yarn run-browserstack --browsers=bs_safari_mac yarn run-browserstack --browsers=bs_firefox_mac,bs_chrome_mac yarn run-browserstack --browsers=win_10_chrome,bs_android_9 + yarn run-browserstack --browsers=bs_ios_11 else yarn run-browserstack --browsers=bs_chrome_mac fi diff --git a/tfjs-backend-wasm/src/setup_test.ts b/tfjs-backend-wasm/src/setup_test.ts index 9f84a680730..9f05e017c38 100644 --- a/tfjs-backend-wasm/src/setup_test.ts +++ b/tfjs-backend-wasm/src/setup_test.ts @@ -224,7 +224,7 @@ const TEST_FILTERS: TestFilter[] = [ {include: 'oneHot'}, {include: 'split'}, {include: 'pad ', excludes: ['complex', 'zerosLike']}, - {include: 'clip', excludes: ['gradient']}, + {include: 'clip', excludes: ['gradient', 'propagates NaNs']}, {include: 'addN'}, {include: 'nonMaxSuppression'}, {include: 'argmax', excludes: ['gradient']},