2026年04月28日 研究日志¶

今日主题:研究学校发给我用的这台研究生电脑的NPU如何运行。

早就听说过神经网络计算单元NPU了,听说优势在于长时间的小模型推理,但手头的机器没这个东西(我个人笔记本Surface Notebook2已经是7年前买的了),今天发现学校配给我的笔记本有这玩意,赶紧试一试。

In [1]:
import onnxruntime as ort
print(ort.get_available_providers())
['DmlExecutionProvider', 'CPUExecutionProvider']

能用欸,这个DmlExecutionProvider就是NPU处理器了

In [2]:
import numpy as np
from PIL import Image
In [3]:
session = ort.InferenceSession(
    "mobilenetv2-10.onnx",
    providers = ["DmlExecutionProvider"]
)

搞个移动端版本的超轻量YOLO试试水。

In [12]:
img = Image.open("cat.jpg").resize((224, 224))
img = np.array(img).astype(np.float32) / 255.0
img = np.transpose(img, (2, 0, 1))
img = np.expand_dims(img, axis = 0)
In [13]:
inputs = {session.get_inputs()[0].name: img}
outputs = session.run(None, inputs)
In [14]:
print("output shape:", outputs[0].shape)
output shape: (1, 1000)

能行欸,至少能跑。


试试速度好了

In [7]:
import time

x = np.random.randn(1, 3, 224, 224).astype(np.float32)

def benchmark(provider):
    session = ort.InferenceSession(
    "mobilenetv2-10.onnx",
    providers = [provider]
    )
    inputs = {session.get_inputs()[0].name: x}
    
    session.run(None, inputs)
    
    t0 = time.time()
    for _ in range(100):
        session.run(None, inputs)
    t1 = time.time()
    
    print(provider, "time: ", t1 - t0, "s")

benchmark("CPUExecutionProvider")
benchmark("DmlExecutionProvider")
CPUExecutionProvider time:  0.5689356327056885 s
DmlExecutionProvider time:  0.961871862411499 s

哇……CPU(AMD Ryzen 5 PRO 230 w/ Radeon 760M Graphics)速度更快……这玩意的优势就是能耗更低吗?说真的,我对硬件也不了解。就先这样吧,我还有科研工作要做呢,以后在琢磨吧,今天就到此为止了,以后有时间zai