最近入手了一台搭载Core Ultra 9的笔记本,本来是冲着它的NPU去的,想看看这个"AI PC"到底能不能跑起来目标检测。折腾了一周,把CPU、集成GPU、NPU三条路都试了一遍,记录一下实际体验。
先说结论
Core Ultra 9做目标检测,不仅够用,而且比想象中好用。
具体来说:
| 计算单元 | YOLOv8n推理速度 | 适用场景 |
|---|---|---|
| CPU (P-Core) | ~35 FPS | 通用场景,兼容性最好 |
| 集成GPU (Arc) | 70~100+ FPS | 追求帧率,需要OpenVINO |
| NPU | ~40 FPS | 长时间运行,功耗敏感 |
这个性能放在两年前,得上一张入门级独显才能做到。现在一颗移动端处理器全包了,而且功耗控制得很好。
Ultra 9的AI硬件配置
先搞清楚手里有什么牌。以Ultra 9 185H为例(Arrow Lake架构的285H类似):
CPU部分
- 6个P-Core(性能核)+ 8个E-Core(能效核)+ 2个LP E-Core(低功耗核)
- 支持VNNI指令集,INT8推理有加速
- 总算力约15 TOPS
集成GPU(Arc Graphics)
- 8个Xe核心,128个矢量引擎
- 支持XMX矩阵加速
- FP16算力约8 TOPS
NPU(Neural Processing Unit)
- 第三代NPU架构
- INT8算力13 TOPS
- 独立供电,可以后台常驻
三个单元加起来,平台总算力36 TOPS左右。虽然比不上Lunar Lake的120 TOPS(主要是NPU升级到48 TOPS),但跑目标检测绑绑有余。
环境配置:OpenVINO是关键
想榨干Ultra 9的性能,必须用OpenVINO。直接跑PyTorch或者ONNX Runtime,只能吃到CPU,白白浪费了GPU和NPU。
安装OpenVINO
bash
pip install openvino openvino-dev
验证安装:
python
from openvino import Core
core = Core()
print("可用设备:", core.available_devices)
# 输出: ['CPU', 'GPU', 'NPU']
如果NPU没识别出来,检查一下驱动。Windows下需要安装Intel NPU Driver,版本号32.x以上。
模型转换
把YOLOv8转成OpenVINO格式:
python
from ultralytics import YOLO
model = YOLO('yolov8n.pt')
model.export(format='openvino', half=True) # FP16量化
导出后会生成yolov8n_openvino_model/文件夹,里面有.xml和.bin文件。
三种计算单元实测对比
测试条件:
- 处理器:Core Ultra 9 185H
- 内存:32GB LPDDR5
- 输入分辨率:640x640
- 模型:YOLOv8n (FP16)
CPU推理
python
from ultralytics import YOLO
model = YOLO('yolov8n_openvino_model/')
results = model.predict(source=0, device='cpu', stream=True)
实测帧率:32~38 FPS
CPU推理的好处是兼容性最好,什么模型都能跑。OpenVINO对Intel CPU做了深度优化,自动调用VNNI和AMX指令。
GPU推理
python
results = model.predict(source=0, device='intel:gpu', stream=True)
实测帧率:70~100+ FPS
集成GPU跑推理是真的快。Arc Graphics虽然玩游戏一般,但矩阵运算确实有两把刷子。FP16模式下,比CPU快2~3倍。
有个坑要注意:第一次推理会有几秒的编译延迟(GPU kernel编译),后续就正常了。
NPU推理
python
results = model.predict(source=0, device='intel:npu', stream=True)
实测帧率:38~45 FPS
NPU的帧率不如GPU,但功耗低太多了。GPU跑推理时整机功耗35W左右,NPU只要15W。如果是做监控、门禁这种需要长时间运行的场景,NPU是更好的选择。
NPU目前对模型有一些限制,不是所有OP都支持。YOLOv8没问题,但一些自定义结构可能跑不起来,会自动fallback到CPU。
完整推理代码
下面是一个可以切换设备的完整示例:
python
import cv2
import time
from ultralytics import YOLO
class Ultra9Detector:
def __init__(self, model_path, device='cpu'):
"""
device: 'cpu', 'intel:gpu', 'intel:npu'
"""
self.model = YOLO(model_path)
self.device = device
# 预热(GPU需要编译kernel)
dummy = cv2.imread('test.jpg') if cv2.imread('test.jpg') is not None else \
(640, 640, 3)
if isinstance(dummy, tuple):
import numpy as np
dummy = np.zeros(dummy, dtype=np.uint8)
_ = self.model.predict(dummy, device=self.device, verbose=False)
print(f"模型预热完成,使用设备: {self.device}")
def detect(self, frame):
results = self.model.predict(
frame,
device=self.device,
verbose=False,
conf=0.5
)
return results[0]
def draw_results(self, frame, result):
boxes = result.boxes
for box in boxes:
x1, y1, x2, y2 = map(int, box.xyxy[0])
conf = float(box.conf[0])
cls_id = int(box.cls[0])
label = f"{result.names[cls_id]}: {conf:.2f}"
cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.putText(frame, label, (x1, y1 - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
return frame
def benchmark_devices(model_path, video_source=0):
"""对比三种设备的推理速度"""
devices = ['cpu', 'intel:gpu', 'intel:npu']
cap = cv2.VideoCapture(video_source)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
for device in devices:
print(f"\n测试设备: {device}")
try:
detector = Ultra9Detector(model_path, device)
except Exception as e:
print(f" 设备不可用: {e}")
continue
# 跑100帧取平均
times = []
for _ in range(100):
ret, frame = cap.read()
if not ret:
cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
ret, frame = cap.read()
start = time.time()
result = detector.detect(frame)
times.append(time.time() - start)
avg_time = sum(times) / len(times)
fps = 1.0 / avg_time
print(f" 平均推理时间: {avg_time*1000:.1f}ms")
print(f" 平均帧率: {fps:.1f} FPS")
cap.release()
def run_realtime(model_path, device='intel:gpu'):
"""实时检测"""
detector = Ultra9Detector(model_path, device)
cap = cv2.VideoCapture(0)
fps_list = []
while True:
ret, frame = cap.read()
if not ret:
break
start = time.time()
result = detector.detect(frame)
inference_time = time.time() - start
fps_list.append(1.0 / inference_time)
if len(fps_list) > 30:
fps_list.pop(0)
avg_fps = sum(fps_list) / len(fps_list)
frame = detector.draw_results(frame, result)
cv2.putText(frame, f"FPS: {avg_fps:.1f} ({device})", (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
cv2.imshow('Detection', frame)
if cv2.waitKey(1) == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
model_path = 'yolov8n_openvino_model/'
# 跑benchmark
# benchmark_devices(model_path)
# 实时检测
run_realtime(model_path, device='intel:gpu')
不同模型的性能表现
不止YOLOv8,我还测了几个常用模型(都是OpenVINO格式,FP16):
| 模型 | CPU | GPU | NPU | 备注 |
|---|---|---|---|---|
| YOLOv8n | 35 FPS | 95 FPS | 42 FPS | 最轻量 |
| YOLOv8s | 22 FPS | 65 FPS | 28 FPS | 精度提升明显 |
| YOLOv8m | 12 FPS | 38 FPS | 不支持 | NPU内存不够 |
| YOLOv11n | 33 FPS | 90 FPS | 40 FPS | 新架构 |
| NanoDet-Plus | 45 FPS | 110 FPS | 50 FPS | 专为CPU优化 |
| RT-DETR-r18 | 8 FPS | 22 FPS | 不支持 | Transformer架构 |
可以看到,轻量模型在Ultra 9上表现很好,GPU推理基本都能上60 FPS。中等模型(如YOLOv8m)也能流畅运行,但NPU跑不动了。
INT8量化:进一步提速
如果FP16还不够快,可以试试INT8量化。OpenVINO提供了Post-Training Quantization工具:
python
import nncf
from openvino import Core
# 加载FP16模型
core = Core()
model = core.read_model("yolov8n_openvino_model/yolov8n.xml")
# 准备校准数据集(100~300张图片)
def transform_fn(data_item):
# 预处理逻辑
return preprocessed_image
calibration_dataset = nncf.Dataset(calibration_data, transform_fn)
# 量化
quantized_model = nncf.quantize(
model,
calibration_dataset,
preset=nncf.QuantizationPreset.MIXED, # 混合精度
)
# 保存
from openvino import serialize
serialize(quantized_model, "yolov8n_int8.xml")
INT8量化后,CPU推理速度可以再提升30%~50%,GPU提升20%左右。精度损失通常在1%以内,可以接受。
实际应用建议
根据不同场景选择计算单元:
实时视频分析(追求帧率)
→ 用GPU,开FP16
→ YOLOv8n可以跑到100 FPS
边缘部署(长时间运行)
→ 用NPU,开INT8
→ 功耗低,发热小,适合工控机/嵌入式
通用开发调试
→ 用CPU
→ 兼容性最好,方便定位问题
多路视频
→ CPU + GPU + NPU混合调度
→ 三路同时跑,充分利用硬件
和独显对比
很多人会问:Ultra 9集显和入门独显比怎么样?
简单对比一下(YOLOv8n,FP16):
| 硬件 | 推理帧率 | 功耗 | 价格 |
|---|---|---|---|
| Ultra 9集显 | 95 FPS | ~25W | - |
| RTX 3050 Laptop | 150 FPS | ~60W | +2000 |
| RTX 4060 Laptop | 220 FPS | ~80W | +4000 |
集显帧率确实比不过独显,但考虑到功耗和成本,对于大多数应用场景够用了。除非你要跑4K多路视频或者大模型训练,否则没必要上独显。
一些坑
踩过的坑记录一下:
-
NPU驱动版本:低版本驱动可能识别不到NPU,或者推理结果不对。确保用32.0.100.3103以上版本。
-
显存共享:集成GPU和CPU共用内存,跑大模型时注意内存占用。32GB内存跑YOLOv8m没问题,16GB可能会吃紧。
-
功耗墙:笔记本在电池模式下可能限制功耗,GPU性能会打折。插电测试更准确。
-
预热时间:GPU第一次推理需要编译kernel,可能要等几秒。生产环境记得做预热。
-
模型兼容性 :不是所有模型都支持NPU,一些自定义OP会fallback到CPU。用
benchmark_app工具可以检查兼容性。
小结
Core Ultra 9做目标检测,性能完全够用。CPU跑轻量模型能到35 FPS,集成GPU能突破100 FPS,NPU提供低功耗的选择。配合OpenVINO,可以灵活选择计算单元,适应不同场景需求。
对于入门学习、原型开发、边缘部署这些场景,Ultra 9是一个性价比很高的选择。不用再纠结买不买独显了,先跑起来再说。