Ubuntu VPS运行依赖@tensorflow/tfjs-node的应用报非法指令如何解决
问题根因
你遇到的Illegal instruction报错核心原因是官方预编译的@tensorflow/tfjs-node包默认启用了AVX、AVX2等现代指令集优化,但你使用的QEMU Virtual CPU version 2.5+未开启这些指令集支持,加载原生扩展时触发指令异常。
无需编译的快速解决方案
优先尝试以下方案,落地成本最低:
- 切换纯JS后端的TensorFlow.js
放弃依赖原生扩展的@tensorflow/tfjs-node,改用纯JS实现的@tensorflow/tfjs包,@vladmandic/face-api完全兼容该后端。修改项目依赖后,在初始化代码中添加tf.setBackend('cpu')指定CPU后端即可正常运行。该方案仅会损失部分计算性能,请求量不大的场景完全可用。 - 安装低版本兼容包
TensorFlow.js 2.7.0及更早版本的官方预编译包未强制要求AVX指令集,可直接安装适配:
再安装对应兼容2.x版本tfjs的npm install @tensorflow/tfjs-node@2.7.0@vladmandic/face-api版本即可。
自定义编译适配版本的方案
如果必须使用高版本tfjs-node,可按以下步骤完成编译:
服务器本地编译(推荐)
你的VPS内存不足的问题可通过添加交换分区解决:
- 创建4G交换分区,执行以下命令:
如需开机自动挂载交换分区,将sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile/swapfile none swap sw 0 0追加到/etc/fstab文件中即可。 - 安装编译依赖:
build-essential、python3、对应tf版本要求的bazel、git、和项目Node版本一致的Node.js运行环境。 - 克隆tfjs仓库,进入
tfjs-node目录,编译时添加禁用AVX相关的参数:yarn build --config=opt --copt=-march=x86-64 --copt=-mno-avx --copt=-mno-avx2 --copt=-mno-fma - 编译完成后会生成对应架构的npm安装包,直接在你的项目中本地安装该包即可。
Windows本地交叉编译
如需在Windows上编译,不要直接使用Windows原生环境,安装WSL2并运行Ubuntu 20.04子系统,在子系统中按照上述服务器编译步骤操作即可,生成的二进制可直接在VPS上使用。
内容的提问来源于stack exchange,提问作者Joseph.Botros
相关产品推荐
相关产品推荐

