M1 MacBook执行npm run start-server报illegal hardware instruction错误如何解决
问题描述
目标
使用TensorFlow.js构建一个运行在服务端的、用于训练和分类模型的Node.js Web服务器,目前正按照官方教程学习TensorFlow.js。
预期结果
服务器能在本地对应端口正常运行,输出示例如下:
$ npm run start-server ... > Running socket on port: 8001 Epoch 1 / 1 eta=0.0 ========================================================================================================> 2432ms 34741us/step - acc=0.429 loss=1.49
实际报错
@MacBook-Pro baseball % npm run start-server > tfjs-examples-baseball-node@0.2.0 start-server > node server.js zsh: illegal hardware instruction npm run start-server
软硬件配置
- MacBook Pro (13英寸, M1, 2020)
- 芯片:Apple M1
- macOS Big Sur 版本 11.4
- @tensorflow/tfjs-node版本:^1.3.2
- Node.js版本:v14.17.5
- Xcode 12.5.1 / Build版本 12E507
已尝试的无效方案
- 使用@tensorflow/tfjs-node的更早版本,例如1.2.0、1.0.0
- 使用@tensorflow/tfjs-node的最新版本3.8.0
- 确认Mac已安装Python 2.7.16和Python 3.9.6
- 删除node_modules和package-lock.json后重新执行npm install
- 将Node.js升级到最新版本
- 确认Xcode已正确安装
可行解决方案
该报错是M1芯片的arm64架构和tfjs-node官方预构建的x86架构二进制包不兼容导致,可选择以下任意一种方案解决:
方案1:Rosetta转译运行(操作最简单)
- 打开访达→应用程序→实用工具,右键点击「终端」,选择「显示简介」
- 勾选「使用Rosetta打开」,重启终端
- 重新执行
npm install安装依赖,再启动服务即可正常运行
方案2:原生arm64运行(无转译性能损耗)
- 首先升级Node.js到16及以上版本(Node.js 16开始原生支持Apple M1架构,不要使用14版本)
- 卸载原有tfjs-node依赖,执行以下命令从源码编译安装:
npm install @tensorflow/tfjs-node --build-from-source
- 编译过程耗时约5-10分钟,完成后直接启动服务即可
临时过渡方案
如果仅做学习使用,不需要最高性能,可以直接替换为纯JS版本的TensorFlow.js:
- 卸载@tensorflow/tfjs-node,安装@tensorflow/tfjs
- 将代码中导入tf的语句从
require('@tensorflow/tfjs-node')修改为require('@tensorflow/tfjs'),其余代码无需改动即可正常运行
内容的提问来源于stack exchange,提问作者Sujay
相关产品推荐
相关产品推荐

