I’m exploring what TVM can do for wasm and webgpu, however I am having some issues running it. I’ve made as much progress as I can, with one or two ugly hacks.
According to the web README, building is straightforward, just ensure that Emscripten
is set up properly, and run make
then npm install
.
However, for me (on TVM v0.10.0), make
fails with:
/tvm/include/tvm/runtime/ndarray.h:51:45: error: integer value -1 is outside the valid range of values [0, 15] for this enumeration type [-Wenum-constexpr-conversion]
constexpr DLDeviceType kInvalidDeviceType = static_cast<DLDeviceType>(-1);
^
1 error generated.
emcc: error: '/root/emsdk/upstream/bin/clang++ -target wasm32-unknown-emscripten -fignore-exceptions -fvisibility=default -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr -DEMSCRIPTEN --sysroot=/root/emsdk/upstream/emscripten/cache/sysroot -Xclang -iwithsysroot/include/fakesdl -Xclang -iwithsysroot/include/compat -I/tvm -I/tvm/include -I/tvm/3rdparty/dlpack/include -I/tvm/3rdparty/dmlc-core/include -I/tvm/3rdparty/compiler-rt -O3 -std=c++17 -Wno-ignored-attributes -c emcc/wasm_runtime.cc -o dist/wasm/wasm_runtime.bc' failed (returned 1)
Looking at the line that causes the error, it was committed around 2 years ago, which makes me think that it’s not the responsible party. I am able to build regular TVM with this line intact.
There is a TVM web CI test here, so I can feel somewhat confident that the feature has not fallen to bitrot. Not sure what is causing it, perhaps my environment, but I am in a freshly pulled Ubuntu 20.04 docker container.
I can fix the web build by changing the invalid device type to some other valid value, e.g. 10. And I can then run npm install
without an issue.
Now, trying to get an example running, I am following the webgpu-example
from @tqchen. It is is a few years old, so I’ve had to make a few changes, as you can see in this git diff. Most importantly, it does not seem like the file tvmjs.bundle.js
is generated any more, so I am assuming that tvmjs_runtime.js
does the same thing.
However, now the part I am stuck on is I fail with the error:
ValueError: Error when parsing target["target"]: Cannot recognize 'target'. Candidates are: cl-opt, opt-level, fast-math-contract, fast-math-nsz, fast-math-nnan, fast-math-arcp, fast-math, keys, device, tag, model, host, mcpu, num-cores, mattr, fast-math-ninf, mtriple, libs, mfloat-abi, fast-math-reassoc, from_device, mabi. Target creation from string failed: llvm -target=wasm32-unknown-unknown-wasm -system-lib
Basically it doesn’t seem like my target is valid. It is possible that the target definition for wasm has changed, but I haven’t found a more up-to-date tutorial.