体验英特尔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,也可能是我哪里没搞对吧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值