microsoft / onnxjs

ONNX.js: run ONNX models using JavaScript
Other
1.75k stars 130 forks source link

webgl: fix broken module import caused by trailing `.` #213

Closed niels-garve closed 4 years ago

niels-garve commented 4 years ago

Hello everyone!

First of all, thanks for ONNX.js!

I'd like to contribute a fix for an import error that I get while implementing inference using ONNX.js in an AWS Lambda function (Node 12.x). I am looking forward to your feedback.

The Error

I'm using ONNX.js in an AWS Lambda function (Node 12.x). When I invoke the function I get the following error.

{
  "errorType": "Runtime.ImportModuleError",
  "errorMessage": "Error: Cannot find module './glsl-encoding-lib.'\nRequire stack:\n- /var/task/node_modules/onnxjs/lib/backends/webgl/glsl-registered-libs.js\n- /var/task/node_modules/onnxjs/lib/backends/webgl/glsl-preprocessor.js\n- /var/task/node_modules/onnxjs/lib/backends/webgl/program-manager.js\n- /var/task/node_modules/onnxjs/lib/backends/webgl/session-handler.js\n- /var/task/node_modules/onnxjs/lib/backends/backend-webgl.js\n- /var/task/node_modules/onnxjs/lib/api/onnx-impl.js\n- /var/task/node_modules/onnxjs/lib/api/index.js\n- /var/task/node_modules/onnxjs-node/lib/index.js\n- /var/task/node_handler/lib/inference.js\n- /var/task/node_handler/handler.js\n- /var/runtime/UserFunction.js\n- /var/runtime/index.js",
  "trace": [
    "Runtime.ImportModuleError: Error: Cannot find module './glsl-encoding-lib.'",
    "Require stack:",
    "- /var/task/node_modules/onnxjs/lib/backends/webgl/glsl-registered-libs.js",
    "- /var/task/node_modules/onnxjs/lib/backends/webgl/glsl-preprocessor.js",
    "- /var/task/node_modules/onnxjs/lib/backends/webgl/program-manager.js",
    "- /var/task/node_modules/onnxjs/lib/backends/webgl/session-handler.js",
    "- /var/task/node_modules/onnxjs/lib/backends/backend-webgl.js",
    "- /var/task/node_modules/onnxjs/lib/api/onnx-impl.js",
    "- /var/task/node_modules/onnxjs/lib/api/index.js",
    "- /var/task/node_modules/onnxjs-node/lib/index.js",
    "- /var/task/node_handler/lib/inference.js",
    "- /var/task/node_handler/handler.js",
    "- /var/runtime/UserFunction.js",
    "- /var/runtime/index.js",
    "    at _loadUserApp (/var/runtime/UserFunction.js:100:13)",
    "    at Object.module.exports.load (/var/runtime/UserFunction.js:140:17)",
    "    at Object.<anonymous> (/var/runtime/index.js:43:30)",
    "    at Module._compile (internal/modules/cjs/loader.js:1138:30)",
    "    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1158:10)",
    "    at Module.load (internal/modules/cjs/loader.js:986:32)",
    "    at Function.Module._load (internal/modules/cjs/loader.js:879:14)",
    "    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)",
    "    at internal/main/run_main_module.js:17:47"
  ]
}

Here's the AWS Lambda function I'm using:

const onnx = require('onnxjs-node');
const path = require('path');

async function predict(preprocessedData, modelWidth, modelHeight) {
    const session = new onnx.InferenceSession();
    await session.loadModel(path.resolve(__dirname, 'model.onnx'));
    const inputTensor = new onnx.Tensor(preprocessedData, 'float32', [
        1,
        1,
        modelWidth,
        modelHeight,
    ]);
    const classProbabilities = await session.run([inputTensor]);
    return classProbabilities.values().next().value.data;
}

module.exports = {
    predict,
};

The fix

Renaming the file glsl-encoding-lib..ts to glsl-encoding-lib.ts solves the problem (removing the double ..).

Testing

I'm having trouble to provide a scenario so that you're able to reproduce this issue and the fix. You'll surely need the exact same AWS setup. Maybe it's possible to mimic this behaviour in an AWS Linux docker container. I won't hesitate to try to set something up. On the other hand it would take some time and maybe you'd like to remove the double .. from the filename even without an error?

Thanks and kind regards, Niels

ghost commented 4 years ago

CLA assistant check
All CLA requirements met.

niels-garve commented 4 years ago

Thanks @hanbitmyths and @fs-eire for your review and the merge!