ncnn
ncnn copied to clipboard
使用WASM Micro Runtime作为运行时,遇到文件不存在的问题
我使用emcc将基于NCNN框架的Resnet18代码编译成wasm文件,该代码从一个文件(dog.jpg)中读取输入并进行分类。在执行该文件时,我希望用WAMR(WASM Micro Runtime),但显示找不到该文件。我尝试了以下方法传递文件路径:
- 使用
--preload-file:
### 编译命令,指定--preload-file参数
emcc -g -s STANDALONE_WASM=1 \
-o build/resnet.wasm resnet_nocv.cpp \
-s FORCE_FILESYSTEM=1 \
-s INITIAL_MEMORY=256MB \
-Incnn/include/ncnn \
-I. \
-L ncnn/lib -lncnn \
--preload-file {ABSOLUTE_PATH}
### 执行命令
iwasm resnet.wasm
显示找不到文件dog.jpg。
2. 不使用--preload-file参数,而是使用WAMR的命令行参数:
### 编译命令
emcc -g -s STANDALONE_WASM=1 \
-o build/resnet.wasm resnet_nocv.cpp \
-s FORCE_FILESYSTEM=1 \
-s INITIAL_MEMORY=256MB \
-Incnn/include/ncnn \
-I. \
-L ncnn/lib -lncnn
### 执行命令,指定--dir参数
iwasm --dir={ABSOLUTE_PATH} resnet.wasm
显示找不到文件dog.jpg。
3. 同时使用--preload-file和--dir参数:
### 编译命令,指定--preload-file参数
emcc -g -s STANDALONE_WASM=1 \
-o build/resnet.wasm resnet_nocv.cpp \
-s FORCE_FILESYSTEM=1 \
-s INITIAL_MEMORY=256MB \
-Incnn/include/ncnn \
-I. \
-L ncnn/lib -lncnn \
--preload-file {ABSOLUTE_PATH}
### 执行命令,指定--dir参数
iwasm --dir={ABSOLUTE_PATH} resnet.wasm
依然显示找不到文件dog.jpg。
经过我的测试,找不到文件的内容可能是因为emcc的编译结果与WASI不兼容(WAMR默认使用WASI编译)。当我使用WASI编译一个测试文件读取的wasm应用时,使用--dir参数可以正确地找到并读取文件。但是NCNN框架使用了emscripten thread等特性,必须使用emcc进行编译,所以我想知道能否有方法让我可以在使用WAMR执行基于emcc编译的NCNN框架代码时正确读取文件dog.jpg?
ncnn可以用 WASI 编译,这里有相关的pr https://github.com/Tencent/ncnn/pull/5534