from ultralytics import YOLO # Load the exported NCNN model onnx_model = YOLO("best.pt") # Run inference results = onnx_model(r'img_test1.jpg') # Save results to disk results[0].save(filename=f"result_pt1.jpg")(yolo) root@unihiker:~/ultralytics# python pt_predict.py 非法指令
时间: 2025-07-11 16:52:54 浏览: 10
<think>好的,我现在需要帮用户解决他们在运行YOLO模型时遇到的“非法指令”错误。用户使用的是从best.pt加载的模型,然后进行推理,但执行时系统报错。首先,我得分析可能的原因。
首先,“非法指令”通常与CPU不支持的指令集有关。比如,如果模型是用AVX2等较新指令集编译的,而用户的CPU不支持这些指令,就会触发这个错误。用户的环境是YOLO在Unihiker设备上运行,这可能是一个嵌入式设备,使用的CPU可能比较老旧,不支持某些指令集。
接下来,我需要检查用户代码中的潜在问题。用户导入了YOLO,然后通过YOLO("best.pt")加载模型。这里可能的问题是,直接加载.pt模型并运行推理时,PyTorch可能会编译一些依赖本地CPU架构的代码。如果PyTorch版本或编译时启用了特定的指令集,而设备不支持,就会出错。
可能的解决步骤包括:
1. 确认PyTorch是否针对旧CPU编译。用户可能需要安装不依赖高级指令集的PyTorch版本,比如使用CPU-only版本或者针对特定架构编译的版本。
2. 导出模型到ONNX或其他格式时可能优化过度。用户提到导出的是NCNN模型,但代码中却使用了ONNX模型?需要检查是否正确导出和加载。例如,用户加载的是.pt文件,但变量名是onnx_model,可能存在混淆。
3. 使用NCNN或其他推理引擎时,需要确保正确配置,支持目标设备的CPU架构。可能需要重新编译NCNN库,禁用高级指令集。
4. 检查Unihiker设备的CPU型号和支持的指令集,比如通过lscpu命令,确认是否缺少AVX、SSE4等指令。
5. 用户代码中是否有其他依赖库的问题,比如Ultralytics YOLO版本是否兼容当前环境。
另外,用户代码中的注释提到加载的是NCNN模型,但实际代码是加载.pt文件,这可能是误解。正确的流程应该是将.pt模型导出为NCNN格式,然后用NCNN的库加载。如果用户直接使用YOLO加载.pt,可能并没有使用NCNN优化,导致PyTorch运行时出现指令问题。
因此,解决方案可能包括:
- 确保PyTorch安装正确,适合旧CPU。
- 正确导出模型到ONNX或NCNN格式,并使用对应的推理引擎。
- 重新编译依赖库,禁用不支持指令集。
需要用户提供更多环境信息,如PyTorch版本、CPU型号、导出命令等,才能更准确诊断。但根据现有信息,先建议用户安装CPU优化的PyTorch版本,检查导出步骤是否正确,并考虑使用NCNN进行推理。</think>遇到运行YOLO模型时出现`非法指令`错误,这通常与CPU指令集不兼容相关。以下是分步解决方案:
---
### **第一步:定位问题根源**
1. **CPU指令集不匹配**(常见原因)
- 当PyTorch或ONNXRuntime等库使用`AVX/AVX2`等高级指令集编译时,若你的设备CPU不支持这些指令(常见于老旧设备/嵌入式设备如Unihiker),就会触发`Illegal instruction`错误。
2. **模型导出方式问题**
- 直接加载`.pt`文件时,PyTorch可能自动编译依赖本地指令集的优化代码。
---
### **第二步:验证CPU支持的指令集**
通过SSH登录设备后执行:
```bash
cat /proc/cpuinfo | grep flags
```
检查输出是否包含`avx`、`avx2`、`sse4`等关键词。若缺失,则确认是CPU指令集问题。
---
### **第三步:安装兼容的PyTorch版本**
卸载当前PyTorch后安装**无AVX指令集**的版本:
```bash
pip uninstall torch torchvision
pip install torch==1.8.0+cpu torchvision==0.9.0+cpu -f https://download.pytorch.org/whl/torch_stable.html
```
---
### **第四步:正确导出模型为NCNN格式**
你的代码中混合了ONNX和NCNN的概念,正确流程应为:
```python
from ultralytics import YOLO
# 加载原始PyTorch模型
model = YOLO("best.pt")
# 导出为ONNX格式(先过渡)
model.export(format="onnx") # 生成 best.onnx
# 使用NCNN工具转换ONNX到NCNN格式
# 需要安装ncnn工具链:https://github.com/Tencent/ncnn
# 命令行执行:./onnx2ncnn best.onnx best.param best.bin
```
---
### **第五步:使用NCNN部署模型**
1. **编译NCNN时禁用AVX**
在设备上重新编译NCNN库:
```bash
git clone https://github.com/Tencent/ncnn
cd ncnn && mkdir build && cd build
cmake -DCMAKE_CXX_FLAGS="-march=armv7-a" .. # 根据设备架构调整
make -j4
```
2. **编写NCNN推理代码**
参考NCNN官方示例加载`best.param`和`best.bin`进行推理。
---
### **替代方案:强制PyTorch使用基础指令**
在代码开头添加环境变量限制指令集:
```python
import os
os.environ["ATEN_CPU_CAPABILITY"] = "default" # 禁用高级优化
os.environ["OMP_NUM_THREADS"] = "1" # 减少多线程冲突
from ultralytics import YOLO
model = YOLO("best.pt")
results = model('img_test1.jpg')
results[0].save(filename="result_pt1.jpg")
```
---
### **附加建议**
- 检查设备架构:执行`uname -a`确认是否为32位系统(需对应安装32位PyTorch)。
- Ultralytics版本:尝试`pip install ultralytics==8.0.20`降级。
- 测试纯CPU模式:确保代码未错误调用GPU。
---
通过以上步骤,可逐步排查并解决因CPU指令集不兼容导致的非法指令错误。
阅读全文
相关推荐

















