体验英特尔ultra2 CPU(258V)下,基于openvino同时驱动CPU+GPU+NPU的示例任务(Deep-Live-Cam)

背景

  1. 搞了个很长的题目,原因是看了英特尔新发布了ultra2 系统。CPU,CPU、GPU、NPU啥都有,加上内存整合在了一个SoC芯片上,而且低功耗条件下的推理性能“可圈可点”,感觉有点心动——玩不起大算力还玩不起低功耗么,而且这个思路实际苹果M系列芯片也在用(但苹果太贵了),感觉提升低功耗推理能力,会是一个未来趋势。于是搞了一台258V+32G内存的轻薄本,想试试效果。
  2. 看了看B站视频,都在用stable diffusion和剪映做实验,结论是前者改吧改吧能跑英特尔的GPU、后者跑NPU、而且除了剪映,几乎没有应用能用到NPU,评论区都觉得这个东西没用。
  3. 英特尔出了自己的推理框架OpenVino,这个肯定支持自家的各种U,我就想如果基于这个东西,是否能找个例子,实现各种U混合跑的例子呢?至少看看潜力。
  4. 前端时间正好玩Deep live Cam ,就是那个人均马斯克的变脸应用,就是这个:
    在这里插入图片描述
    这个在CUDA118+英伟达显卡上跑起来很容易,官方教程很详细了。
    我也试过在CPU上跑,卡的一批。条件所限,我用的最强的CPU是i7-13700KF+64G内存的台式机,明显的卡,然后在第十一代和十二代低功耗CPU的笔记本也试过,打开摄像头之后,几乎是10秒刷新一帧。
  5. 这个应用也提供了openvino下的跑法,但是教程太糙了,实际也是基于openvino跑CPU,其他的U都用不起来,和直接用CPU跑没有区别。
  6. 我这个记录,就是终于调通了openvino下的3U一起跑,感觉很流程了,画面基本是实时的了,性能监控大概是这个效果:
    在这里插入图片描述
    如果纯跑CPU,那么CPU会跑到100%,GPU和NPU没动静,而且效果卡,这个就不放图了。

准备步骤

  1. 根据官网步骤做准备,建议基于conda。
  2. 需要Visual Studio 2022 Runtimes (Windows),编译insightface用。
  3. 需要FFMPEG:建立了虚拟环境后可以,conda install FFmpeg,或者用别的方法按上就行。
  4. git clone这个项目到合适的位置。
  5. 进入虚拟环境,进入项目目录 pip install -r requirements.txt
  6. 提前下载模型,放到models目录下面,注意看官网的说明:
    在这里插入图片描述
  • 首先,inswapper建议这个和“replacement version”都下载。
  • 其次,还需要提前下载一个:parsing_parsenet.pth,自己搜出来提前下载好,否则已启动又会遇到各种网络问题报错。

下面就是趟出来的东西了,只要是英特尔的ultra系列处理器,都可以试试:
7. 重新部署openvino和onnxruntime的版本:

pip install openvino==2024.3.0
pip install onnxruntime-gpu==1.19.0
pip uninstall onnxruntime onnxruntime-openvino
pip install onnxruntime-openvino==1.19.0
  • 其实就是对应上openvino、onnxruntime-gpu和onnxruntime-openvino这三者的版本。
  • 我自己猜,几个库的的大概关系是:onnxruntime-gpu提供了一个调用外部“GPU”等设备做provider的框架,onnxruntime-openvino基于这个框架提供了真正的openvino调用接口,openvino的库则提供实际驱动硬件设备的dll文件。
  • onnxruntime-openvino的github页面的release页上,能看到它和openvino的版本对应关系,但没说onnxruntime-gpu也要严格对应。但如果三者版本不对齐,则运行的时候报一些错,然后就直接跑CPU了,相当于这个openvino没用上。
  • 还有就是哪个uninstall的步骤,也最好加上,否则可能不认openvino的启动参数。

这个Deep live Cam在官网上列举了一大堆支持的推理框架,包括英伟达、苹果、AMD、微软和英特尔,但我试了DirectML和Openvino,给的教程都不太行。。。

改代码

1

在modules\globals.py ,在头部合适的地方加上:

import onnxruntime.tools.add_openvino_win_libs as utils
utils.add_openvino_libs_to_path()

如果不加这几句代码,onnxruntime会找不到openvino的dll,然后报一些126啥的错误,然后直接跑CPU。

2

找到modules\processors\frame\face_swapper.py,40行左右: get_face_swapper()函数,改大概43行,模型的名字为inswapper_128.onnx:

model_path = resolve_relative_path('../models/inswapper_128.onnx')#_fp16

还是get_face_swapper()函数,大概第44行,“FACE_SWAPPER = ……”语句,加一个provider_options参数:

            FACE_SWAPPER = insightface.model_zoo.get_model(model_path,
            providers=modules.globals.execution_providers,
            provider_options= [{'device_type':'GPU'}])

provider_options选项的可选内容参见:OpenVINO-ExecutionProvider,往下拉有个“Summary of options”的表。
注意所有选项值是大小写敏感的,要大写!链接这个表里都是小写,这个不对,会报错,要写CPU、FP16这种。
此外,NPU只支持FP16,在face_swapper中,如果provider_options指定NPU,效果是乱套的(但不报错)。

3

在modules\face_analyser.py中,大概22行修改:

        FACE_ANALYSER = insightface.app.FaceAnalysis(name='buffalo_l',
        providers=modules.globals.execution_providers, 
        provider_options=[{'device_type': 'NPU'}] )

其实就是也加一个provider_options选项,指定了NPU。这里也可以试试GPU,但有多种搞法,有的好使有的不行,这里不再一一列举了。

运行:

python run.py --execution-provider openvino

不出意外就能看到流畅的效果了。提供个素材,祝大家都能变彦祖。
在这里插入图片描述

小结

改代码步骤的2到3,总共其实就是改三个东西:

  • 一个是用哪个换脸模型(inswapper),FP16的还是另一个,差别应该在精度上,但我没仔细看。
  • 另一个是检测人脸和换脸用哪个设备跑,这里检测人脸用NPU、换脸用GPU,但CPU也在起作用,这个从之前的系统监控图能看出来。

这三个东西的组合我试了好几种方案,最后大概有两三种能在ultra轻薄本上流畅跑,写出来这种是最顺的。体现了ultra 2三种U的能力。

目前的结论

  1. ultra2代这个258v,B站测评这个架构玩一些大游戏也能差强人意,而且兼顾体积和续航,这个很厉害了。
  2. OpenVino+ultra系列芯片感觉未来可期,至少这个例子能看懂三个U各自发挥作用的潜力——从监控图来看,在默认设置下三个U都是轻载运行,还有潜力。低功耗的高性能推理应该是能让AIGC普及的重要推手。
  3. NPU这个东西还需要继续研究,看看适合干啥,比如为啥换脸的时候只能用GPU,不能用NPU,也可能是我哪里没搞对吧。
### CPUGPUNPU 的区别及其应用场景 #### 中央处理器 (CPU) 中央处理器(CPU),通常被称为计算机的大脑,设计用于处理广泛类型的计算任务。这些任务包括但不限于运行操作系统功能、管理输入输出操作以及执行应用程序逻辑。现代多核CPU能够高效地分配资源来并发处理多个线程的任务[^1]。 对于批处理大小设置,默认每设备训练批次大小为8,适用于CPU核心的配置说明也体现了这一点。这意味着,在训练期间,每个CPU核心会接收固定数量的数据样本进行处理,以此平衡负载并提升效率。 ```python per_device_train_batch_size: int = field( default=8, metadata={"help": "Batch size per GPU/TPU/MPS/NPU core/CPU for training."} ) ``` #### 图形处理器 (GPU) 图形处理器(GPU)最初是为了加速图像渲染而设计的硬件单元,但随着技术的发展,其应用范围已经扩展到通用计算领域。相比于传统CPUGPU拥有更多的处理单元(ALUs),特别适合大规模矩阵运算和平行数据流处理。因此,在机器学习特别是深度学习方面表现尤为突出,因为这类算法往往涉及大量相似结构化的重复计算工作[^2]。 当涉及到评估阶段时,同样采用默认值8作为每设备评测批次尺寸,表明即使是在不同架构下(如GPU),保持一致性的批量规模有助于维持稳定性和可预测性。 ```python per_device_eval_batch_size: int = field( default=8, metadata={"help": "Batch size per GPU/TPU/MPS/NPU core/CPU for evaluation."} ) ``` #### 神经网络处理器 (NPU) 神经网络处理器(NPU)是一种专门为人工智能推理和训练定制优化过的集成电路芯片。相较于其他两种类型,NPUs更专注于支持特定的人工智能框架和技术栈,比如TensorFlow或PyTorch等,并且内置了许多针对卷积层、激活函数以及其他常见AI组件的高度专业化指令集和支持库。这使得它们能够在更低能耗的情况下实现更高的吞吐量和更快的速度,非常适合部署在边缘端设备上完成实时分析任务。 例如,在移动平台上,通过利用像苹果公司的Metal API这样的接口,可以更好地发挥出集成在其SoC内部的小型专用AI协处理器——即所谓的“Apple Neural Engine”的潜力,从而显著改善用户体验同时减少延迟时间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值