This is an automated email from the ASF dual-hosted git repository.
tqchen pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tvm.git
The following commit(s) were added to refs/heads/main by this push:
new 26db8bfd7e [Web] Fix arrayDecodeStorage scope issue for q0f32 models
(#18415)
26db8bfd7e is described below
commit 26db8bfd7e527198f43f3cc379f404c7513a82ef
Author: Akaash Parthasarathy <[email protected]>
AuthorDate: Mon Nov 10 15:14:01 2025 -0500
[Web] Fix arrayDecodeStorage scope issue for q0f32 models (#18415)
---
web/emcc/tvmjs_support.cc | 1 +
web/emcc/wasm_runtime.cc | 20 +++++++-
web/package-lock.json | 122 +++++++++++++++++++++++-----------------------
web/src/rpc_server.ts | 2 +-
web/src/runtime.ts | 1 -
web/src/webgpu.ts | 4 +-
6 files changed, 83 insertions(+), 67 deletions(-)
diff --git a/web/emcc/tvmjs_support.cc b/web/emcc/tvmjs_support.cc
index 467fbbd4ab..d6b94bda32 100644
--- a/web/emcc/tvmjs_support.cc
+++ b/web/emcc/tvmjs_support.cc
@@ -31,6 +31,7 @@
#define TVM_FFI_ALWAYS_LOG_BEFORE_THROW 1
#define DMLC_USE_LOGGING_LIBRARY <tvm/runtime/logging.h>
+#include <tvm/ffi/extra/module.h>
#include <tvm/ffi/function.h>
#include <tvm/ffi/reflection/registry.h>
#include <tvm/runtime/device_api.h>
diff --git a/web/emcc/wasm_runtime.cc b/web/emcc/wasm_runtime.cc
index d787c295e0..c5541392d9 100644
--- a/web/emcc/wasm_runtime.cc
+++ b/web/emcc/wasm_runtime.cc
@@ -30,6 +30,7 @@
#define TVM_FFI_ALWAYS_LOG_BEFORE_THROW 1
#define DMLC_USE_LOGGING_LIBRARY <tvm/runtime/logging.h>
+#include <tvm/ffi/any.h>
#include <tvm/ffi/reflection/registry.h>
#include <tvm/runtime/logging.h>
@@ -52,6 +53,8 @@
#include "3rdparty/tvm-ffi/src/ffi/container.cc"
#include "3rdparty/tvm-ffi/src/ffi/dtype.cc"
#include "3rdparty/tvm-ffi/src/ffi/error.cc"
+#include "3rdparty/tvm-ffi/src/ffi/extra/env_c_api.cc"
+#include "3rdparty/tvm-ffi/src/ffi/extra/env_context.cc"
#include "3rdparty/tvm-ffi/src/ffi/extra/library_module.cc"
#include "3rdparty/tvm-ffi/src/ffi/extra/library_module_system_lib.cc"
#include "3rdparty/tvm-ffi/src/ffi/extra/module.cc"
@@ -145,7 +148,20 @@ void ArrayDecodeStorage(Tensor cpu_arr, std::string bytes,
std::string format, s
TVM_FFI_STATIC_INIT_BLOCK() {
namespace refl = tvm::ffi::reflection;
- refl::GlobalDef().def("tvmjs.array.decode_storage", ArrayDecodeStorage);
+ refl::GlobalDef().def_packed(
+ "tvmjs.array.decode_storage", [](ffi::PackedArgs args, ffi::Any* ret) {
+ Tensor cpu_arr = args[0].cast<Tensor>();
+ auto bytes = args[1].cast<ffi::Bytes>();
+ std::string format = args[2].cast<ffi::String>().operator
std::string();
+ std::string dtype = args[3].cast<ffi::String>().operator std::string();
+ ArrayDecodeStorage(cpu_arr, bytes, format, dtype);
+ if (ret != nullptr) {
+ auto* ret_data = reinterpret_cast<TVMFFIAny*>(ret);
+ ret_data->type_index = TVMFFITypeIndex::kTVMFFINone;
+ ret_data->zero_padding = 0;
+ ret_data->v_int64 = 0;
+ }
+ });
}
// Concatenate n TVMArrays
@@ -217,7 +233,7 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.def("tvmjs.runtime.TensorCopyFromBytes",
[](Tensor nd, TVMFFIByteArray* bytes) {
nd.CopyFromBytes(bytes->data, bytes->size); })
.def("tvmjs.runtime.TensorCopyToBytes", [](Tensor nd) -> ffi::Bytes {
- size_t size = GetDataSize(*(nd.operator->()));
+ size_t size = ffi::GetDataSize(*(nd.operator->()));
std::string bytes;
bytes.resize(size);
nd.CopyToBytes(bytes.data(), size);
diff --git a/web/package-lock.json b/web/package-lock.json
index 0dd9b49201..50a4ca2831 100644
--- a/web/package-lock.json
+++ b/web/package-lock.json
@@ -45,29 +45,29 @@
}
},
"node_modules/@babel/compat-data": {
- "version": "7.28.4",
- "resolved":
"https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz",
- "integrity":
"sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==",
+ "version": "7.28.5",
+ "resolved":
"https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz",
+ "integrity":
"sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/core": {
- "version": "7.28.4",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz",
- "integrity":
"sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==",
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz",
+ "integrity":
"sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.27.1",
- "@babel/generator": "^7.28.3",
+ "@babel/generator": "^7.28.5",
"@babel/helper-compilation-targets": "^7.27.2",
"@babel/helper-module-transforms": "^7.28.3",
"@babel/helpers": "^7.28.4",
- "@babel/parser": "^7.28.4",
+ "@babel/parser": "^7.28.5",
"@babel/template": "^7.27.2",
- "@babel/traverse": "^7.28.4",
- "@babel/types": "^7.28.4",
+ "@babel/traverse": "^7.28.5",
+ "@babel/types": "^7.28.5",
"@jridgewell/remapping": "^2.3.5",
"convert-source-map": "^2.0.0",
"debug": "^4.1.0",
@@ -99,13 +99,13 @@
}
},
"node_modules/@babel/generator": {
- "version": "7.28.3",
- "resolved":
"https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz",
- "integrity":
"sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==",
+ "version": "7.28.5",
+ "resolved":
"https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz",
+ "integrity":
"sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==",
"dev": true,
"dependencies": {
- "@babel/parser": "^7.28.3",
- "@babel/types": "^7.28.2",
+ "@babel/parser": "^7.28.5",
+ "@babel/types": "^7.28.5",
"@jridgewell/gen-mapping": "^0.3.12",
"@jridgewell/trace-mapping": "^0.3.28",
"jsesc": "^3.0.2"
@@ -197,9 +197,9 @@
}
},
"node_modules/@babel/helper-validator-identifier": {
- "version": "7.27.1",
- "resolved":
"https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
- "integrity":
"sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
+ "version": "7.28.5",
+ "resolved":
"https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
+ "integrity":
"sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
"dev": true,
"engines": {
"node": ">=6.9.0"
@@ -228,12 +228,12 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.28.4",
- "resolved":
"https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz",
- "integrity":
"sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==",
+ "version": "7.28.5",
+ "resolved":
"https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz",
+ "integrity":
"sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.28.4"
+ "@babel/types": "^7.28.5"
},
"bin": {
"parser": "bin/babel-parser.js"
@@ -449,17 +449,17 @@
}
},
"node_modules/@babel/traverse": {
- "version": "7.28.4",
- "resolved":
"https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz",
- "integrity":
"sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==",
+ "version": "7.28.5",
+ "resolved":
"https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz",
+ "integrity":
"sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.27.1",
- "@babel/generator": "^7.28.3",
+ "@babel/generator": "^7.28.5",
"@babel/helper-globals": "^7.28.0",
- "@babel/parser": "^7.28.4",
+ "@babel/parser": "^7.28.5",
"@babel/template": "^7.27.2",
- "@babel/types": "^7.28.4",
+ "@babel/types": "^7.28.5",
"debug": "^4.3.1"
},
"engines": {
@@ -467,13 +467,13 @@
}
},
"node_modules/@babel/types": {
- "version": "7.28.4",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz",
- "integrity":
"sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==",
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz",
+ "integrity":
"sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==",
"dev": true,
"dependencies": {
"@babel/helper-string-parser": "^7.27.1",
- "@babel/helper-validator-identifier": "^7.27.1"
+ "@babel/helper-validator-identifier": "^7.28.5"
},
"engines": {
"node": ">=6.9.0"
@@ -520,9 +520,9 @@
}
},
"node_modules/@eslint-community/regexpp": {
- "version": "4.12.1",
- "resolved":
"https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
- "integrity":
"sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+ "version": "4.12.2",
+ "resolved":
"https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity":
"sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
"dev": true,
"engines": {
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
@@ -1188,9 +1188,9 @@
"dev": true
},
"node_modules/@types/node": {
- "version": "20.19.23",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.23.tgz",
- "integrity":
"sha512-yIdlVVVHXpmqRhtyovZAcSy0MiPcYWGkoO4CGe/+jpP0hmNuihm4XhHbADpK++MsiLHP5MVlv+bcgdF99kSiFQ==",
+ "version": "20.19.24",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.24.tgz",
+ "integrity":
"sha512-FE5u0ezmi6y9OZEzlJfg37mqqf6ZDSF2V/NLjUyGrR9uTZ7Sb9F7bLNZ03S4XVUNRWGA7Ck4c1kK+YnuWjl+DA==",
"dev": true,
"dependencies": {
"undici-types": "~6.21.0"
@@ -1844,9 +1844,9 @@
}
},
"node_modules/baseline-browser-mapping": {
- "version": "2.8.19",
- "resolved":
"https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.19.tgz",
- "integrity":
"sha512-zoKGUdu6vb2jd3YOq0nnhEDQVbPcHhco3UImJrv5dSkvxTc2pl2WjOPsjZXDwPDSl5eghIMuY3R6J9NDKF3KcQ==",
+ "version": "2.8.25",
+ "resolved":
"https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.25.tgz",
+ "integrity":
"sha512-2NovHVesVF5TXefsGX1yzx1xgr7+m9JQenvz6FQY3qd+YXkKkYiv+vTCc7OriP9mcDZpTC5mAOYN4ocd29+erA==",
"dev": true,
"bin": {
"baseline-browser-mapping": "dist/cli.js"
@@ -1881,9 +1881,9 @@
"dev": true
},
"node_modules/browserslist": {
- "version": "4.26.3",
- "resolved":
"https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz",
- "integrity":
"sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==",
+ "version": "4.27.0",
+ "resolved":
"https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz",
+ "integrity":
"sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==",
"dev": true,
"funding": [
{
@@ -1900,11 +1900,11 @@
}
],
"dependencies": {
- "baseline-browser-mapping": "^2.8.9",
- "caniuse-lite": "^1.0.30001746",
- "electron-to-chromium": "^1.5.227",
- "node-releases": "^2.0.21",
- "update-browserslist-db": "^1.1.3"
+ "baseline-browser-mapping": "^2.8.19",
+ "caniuse-lite": "^1.0.30001751",
+ "electron-to-chromium": "^1.5.238",
+ "node-releases": "^2.0.26",
+ "update-browserslist-db": "^1.1.4"
},
"bin": {
"browserslist": "cli.js"
@@ -1992,9 +1992,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001751",
- "resolved":
"https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz",
- "integrity":
"sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==",
+ "version": "1.0.30001754",
+ "resolved":
"https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz",
+ "integrity":
"sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==",
"dev": true,
"funding": [
{
@@ -2415,9 +2415,9 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.5.238",
- "resolved":
"https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.238.tgz",
- "integrity":
"sha512-khBdc+w/Gv+cS8e/Pbnaw/FXcBUeKrRVik9IxfXtgREOWyJhR4tj43n3amkVogJ/yeQUqzkrZcFhtIxIdqmmcQ==",
+ "version": "1.5.249",
+ "resolved":
"https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.249.tgz",
+ "integrity":
"sha512-5vcfL3BBe++qZ5kuFhD/p8WOM1N9m3nwvJPULJx+4xf2usSlZFJ0qoNYO2fOX4hi3ocuDcmDobtA+5SFr4OmBg==",
"dev": true
},
"node_modules/emittery": {
@@ -5005,9 +5005,9 @@
}
},
"node_modules/node-releases": {
- "version": "2.0.26",
- "resolved":
"https://registry.npmjs.org/node-releases/-/node-releases-2.0.26.tgz",
- "integrity":
"sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA==",
+ "version": "2.0.27",
+ "resolved":
"https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
+ "integrity":
"sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
"dev": true
},
"node_modules/normalize-package-data": {
@@ -7094,9 +7094,9 @@
}
},
"node_modules/update-browserslist-db": {
- "version": "1.1.3",
- "resolved":
"https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
- "integrity":
"sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
+ "version": "1.1.4",
+ "resolved":
"https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz",
+ "integrity":
"sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==",
"dev": true,
"funding": [
{
diff --git a/web/src/rpc_server.ts b/web/src/rpc_server.ts
index b43d5706d7..3adab93be1 100644
--- a/web/src/rpc_server.ts
+++ b/web/src/rpc_server.ts
@@ -262,7 +262,7 @@ export class RPCServer {
const asyncInitServer = async (): Promise<void> => {
assert(args[1] instanceof Uint8Array);
const inst = await runtime.instantiate(
- args[1].buffer,
+ args[1].buffer as ArrayBuffer,
this.getImports(),
this.logger
);
diff --git a/web/src/runtime.ts b/web/src/runtime.ts
index c8b822316f..8143f970ed 100644
--- a/web/src/runtime.ts
+++ b/web/src/runtime.ts
@@ -227,7 +227,6 @@ class RuntimeContext implements Disposable {
this.tensorCacheGet.dispose();
this.tensorCacheRemove.dispose();
this.tensorCacheUpdate.dispose();
- this.tensorCacheClear.dispose();
this.arrayDecodeStorage.dispose();
this.paramModuleFromCache.dispose();
this.paramModuleFromCacheByName.dispose();
diff --git a/web/src/webgpu.ts b/web/src/webgpu.ts
index 27d68d887c..3c905f3800 100644
--- a/web/src/webgpu.ts
+++ b/web/src/webgpu.ts
@@ -476,7 +476,7 @@ export class WebGPUContext {
this.device.queue.writeBuffer(
this.gpuBufferFromPtr(toPtr),
toOffset,
- rawBytes,
+ rawBytes as GPUAllowSharedBufferSource,
0,
nbytes
);
@@ -861,7 +861,7 @@ export class WebGPUContext {
this.device.queue.writeBuffer(
this.gpuBufferFromPtr(to),
toOffset,
- rawBytes,
+ rawBytes as GPUAllowSharedBufferSource,
0,
nbytes
);