ncnn icon indicating copy to clipboard operation
ncnn copied to clipboard

使用WASM Micro Runtime作为运行时,遇到文件不存在的问题

Open sjrrr13 opened this issue 1 year ago • 1 comments

我使用emcc将基于NCNN框架的Resnet18代码编译成wasm文件,该代码从一个文件(dog.jpg)中读取输入并进行分类。在执行该文件时,我希望用WAMR(WASM Micro Runtime,但显示找不到该文件。我尝试了以下方法传递文件路径:

  1. 使用--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?

sjrrr13 avatar Jan 15 '25 07:01 sjrrr13

ncnn可以用 WASI 编译,这里有相关的pr https://github.com/Tencent/ncnn/pull/5534

nihui avatar Apr 18 '25 08:04 nihui