『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 2765|回复: 21

[技术探讨] ESXI下直通核显给Linux用于Frigate硬解视频和识别

[复制链接]

3

主题

30

帖子

311

积分

论坛技术达人

积分
311
金钱
281
HASS币
10
发表于 2024-3-20 11:13:06 | 显示全部楼层 |阅读模式
本帖最后由 hzw1199 于 2024-3-20 12:38 编辑

ESXI下有一个Linux虚拟机,其中通过Docker跑了个Frigate作为家庭NVR,同时用于人脸识别给中控屏做人来亮屏。由于我的宿主机的核心是3代i5的3317u,比较羸弱,所以Frigate中ffmpeg软解视频比较吃力,TensorFlow识别物体也比较吃力,CPU使用率就飙上去了,所以考虑将GPU核显利用起来。本文测试使用的码流为TP摄像头创建的子码流:640*480的H.264

将GPU直通给Linux
首先设置GPU直通并重启ESXI,并给Linux虚拟机添加GPU为PCI设备

                               
登录/注册后可看大图

                               
登录/注册后可看大图
接着进入ESXI的ssh,让ESXI启动时不去获取显卡控制权
esxcli system settings kernel set -s vga -v FALSE

重启ESXI,此时即使机器插着显示器,ESXI启动也不输出画面了
接着配置Linux虚拟机:
禁用虚拟显卡:将svga.present由TRUE改为FALSE
让GPU驱动不知道在虚拟机中运行:添加hypervisor.cpuid.v0为FALSE

重启虚拟机,svga画面输出已经消失了。hypervisor.cpuid.v0一定要配置,否则Linux虚拟机无法完成启动。
启动后,通过ssh连接虚拟机,验证直通效果:sudo lshw -C display或者lspci -vnn | grep VGA -A 12
$ sudo lshw -C display
  *-display
       description: VGA compatible controller
       product: 3rd Gen Core processor Graphics Controller
       vendor: Intel Corporation
       physical id: 0
       bus info: pci@0000:1b:00.0
       version: 09
       width: 64 bits
       clock: 33MHz
       capabilities: msi pm vga_controller bus_master cap_list
       configuration: driver=i915 latency=64
       resources: irq:66 memory:fc800000-fcbfffff memory:d0000000-dfffffff ioport:2000(size=64)
$ lspci -vnn | grep VGA -A 12
1b:00.0 VGA compatible controller [0300]: Intel Corporation 3rd Gen Core processor Graphics Controller [8086:0166] (rev 09) (prog-if 00 [VGA controller])
    DeviceName: pciPassthru0
    Subsystem: Intel Corporation 3rd Gen Core processor Graphics Controller [8086:2010]
    Physical Slot: 256
    Flags: bus master, fast devsel, latency 64, IRQ 66
    Memory at fc800000 (64-bit, non-prefetchable) [size=4M]
    Memory at d0000000 (64-bit, prefetchable) [size=256M]
    I/O ports at 2000 [size=64]
    Capabilities: <access denied>
    Kernel driver in use: i915
    Kernel modules: i915

可见GPU直通成功了。

配置Frigate
主要就是需要在docker参数中加上–device /dev/dri/renderD128和–privileged,然后在Frigate配置文件中加上hwaccel_args: preset-vaapi

进入Frigate查看效果:

                               
登录/注册后可看大图

                               
登录/注册后可看大图


GPU硬件加速成功,但是intel_gpu_top执行失败,这个原因未知,网上很多人有类似的问题:
Frigate log:
2024-03-12 15:21:21.941076931  [2024-03-12 15:21:21] frigate.util.services          ERROR   : Unable to poll intel GPU stats: Failed to detect engines! (No such file or directory)
2024-03-12 15:21:21.941085403  (Kernel 4.16 or newer is required for i915 PMU support.)
2024-03-12 15:21:21.941089240  timeout: the monitored command dumped core

直接运行intel_gpu_top:
$ intel_gpu_top
Failed to initialize PMU! (Permission denied)


将Detectors交给GPU
需要使用openvino。openvino也支持CPU,效率比默认的CPU Detector高,从文档看,只支持6代以上的CPU。
用我的这个3代i5试试。

修改Frigate配置文件:
detectors:
  ov:
    type: openvino
    device: AUTO
    model:
      path: /openvino-model/ssdlite_mobilenet_v2.xml

model:
  width: 300
  height: 300
  input_tensor: nhwc
  input_pixel_format: bgr
  labelmap_path: /openvino-model/coco_91cl_bkgr.txt

启动成功:
2024-03-12 15:28:42.137142043  [2024-03-12 15:28:42] frigate.detectors.plugins.openvino INFO    : Model Input Shape: [1,300,300,3]
2024-03-12 15:28:42.137157934  [2024-03-12 15:28:42] frigate.detectors.plugins.openvino INFO    : Model Output-0 Shape: [1,1,100,7]
2024-03-12 15:28:42.137176631  [2024-03-12 15:28:42] frigate.detectors.plugins.openvino INFO    : Model has 1 Output Tensors

使用CPU推理:

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图
可见延迟有287ms。CPU占用非常高,FPS才1.4

使用AUTO模式的OpenVINO推理:

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图
可见延迟下降到80ms,CPU占用降低了很多,FPS达到了4

后续
由于上述OpenVINO处于AUTO模式,试着从AUTO改为GPU,发现启动失败了,果然还是需要6代以上:
2024-03-12 15:50:55.499156863  Process detector:ov:
2024-03-12 15:50:55.502277448  Traceback (most recent call last):
2024-03-12 15:50:55.502450200    File "/usr/lib/python3.9/multiprocessing/process.py", line 315, in _bootstrap
2024-03-12 15:50:55.502457812      self.run()
2024-03-12 15:50:55.502467808    File "/usr/lib/python3.9/multiprocessing/process.py", line 108, in run
2024-03-12 15:50:55.502478795      self._target(*self._args, **self._kwargs)
2024-03-12 15:50:55.502486642    File "/opt/frigate/frigate/object_detection.py", line 102, in run_detector
2024-03-12 15:50:55.502521519      object_detector = LocalObjectDetector(detector_config=detector_config)
2024-03-12 15:50:55.502526047    File "/opt/frigate/frigate/object_detection.py", line 53, in __init__
2024-03-12 15:50:55.502530992      self.detect_api = create_detector(detector_config)
2024-03-12 15:50:55.502534675    File "/opt/frigate/frigate/detectors/__init__.py", line 18, in create_detector
2024-03-12 15:50:55.502540247      return api(detector_config)
2024-03-12 15:50:55.502545383    File "/opt/frigate/frigate/detectors/plugins/openvino.py", line 32, in __init__
2024-03-12 15:50:55.502585844      self.interpreter = self.ov_core.compile_model(
2024-03-12 15:50:55.502634947    File "/usr/local/lib/python3.9/dist-packages/openvino/runtime/ie_api.py", line 399, in compile_model
2024-03-12 15:50:55.502646924      super().compile_model(model, device_name, {} if config is None else config),
2024-03-12 15:50:55.502661726  RuntimeError: Failed to create plugin /usr/local/lib/python3.9/dist-packages/openvino/libs/libopenvino_intel_gpu_plugin.so for device GPU
2024-03-12 15:50:55.502667511  Please, check your environment
2024-03-12 15:50:55.502671411  Check 'error_code == 0' failed at src/plugins/intel_gpu/src/runtime/ocl/ocl_device_detector.cpp:194:
2024-03-12 15:50:55.502677424  [GPU] No supported OCL devices found or unexpected error happened during devices query.
2024-03-12 15:50:55.502682322  [GPU] Please check OpenVINO documentation for GPU drivers setup guide.
2024-03-12 15:50:55.502686670  [GPU] clGetPlatformIDs error code: -1001

下次攒一个新点的板子来试试GPU模式的Detector。



回复

使用道具 举报

9

主题

46

帖子

1089

积分

金牌会员

Rank: 6Rank: 6

积分
1089
金钱
1043
HASS币
0
发表于 2024-3-20 11:42:49 | 显示全部楼层
3代的cpu不支持  一般要7代及以后的cpu   官网有说明的
回复

使用道具 举报

7

主题

36

帖子

178

积分

注册会员

Rank: 2

积分
178
金钱
142
HASS币
0
发表于 2024-3-20 12:02:05 | 显示全部楼层
本帖最后由 wangzhiyong 于 2024-3-20 12:06 编辑

一直纠结在显卡直通上,目前宿主环境是Win,用的是VMware Workstation,没法子直通,也没敢一下子就上EXSI。需求场景串流解码以及部分用来蹭热度学习的模型计算。宿主机调为EXSI或者PVE,对我来说学习成本有点高。
多聊一句算是对家庭虚拟化的一个思考吧,按场景来说是数据存储、影音娱乐、智能家居、辅助办公以及研究学习,而影音娱乐是重度依赖硬件设备的,后端服务可以下沉到虚拟机中,但靠虚拟机做解码输出来播放蓝光片源甚至无损音乐在硬件上是否能支持到位,本身就是一个大疑问,我自己至少在当前折腾roon的时候,就遇到这种解耦的问题,到最后越解硬件设备越多。再说一个当初搞虚拟机的本心,就是三个房间会有用电脑的需求,本来是想弄个盒子接个漂亮的显示器就能组一台机器用,省掉不少线头缠绕,现在看,还有一段时间接着折腾。
回复

使用道具 举报

16

主题

381

帖子

2630

积分

金牌会员

Rank: 6Rank: 6

积分
2630
金钱
2249
HASS币
10
发表于 2024-3-20 12:47:46 | 显示全部楼层
这个人脸识别成功率高么?怎么判断是谁进门的,家里的海康总是识别不准确
回复

使用道具 举报

8

主题

870

帖子

5218

积分

论坛元老

Rank: 8Rank: 8

积分
5218
金钱
4348
HASS币
0
发表于 2024-3-20 13:02:18 | 显示全部楼层
学习学习,谢谢分享
回复

使用道具 举报

3

主题

30

帖子

311

积分

论坛技术达人

积分
311
金钱
281
HASS币
10
 楼主| 发表于 2024-3-20 14:20:01 | 显示全部楼层
牛驴鸭加钙 发表于 2024-3-20 11:42
3代的cpu不支持  一般要7代及以后的cpu   官网有说明的

是的,好像是6代以上
回复

使用道具 举报

3

主题

30

帖子

311

积分

论坛技术达人

积分
311
金钱
281
HASS币
10
 楼主| 发表于 2024-3-20 14:21:13 | 显示全部楼层
aiqienanguatou 发表于 2024-3-20 12:47
这个人脸识别成功率高么?怎么判断是谁进门的,家里的海康总是识别不准确
...

识别成功率还挺高的,还可以配置人脸方框面积大于阈值时触发,用于中控屏人来亮屏挺丝滑
回复

使用道具 举报

55

主题

299

帖子

5047

积分

元老级技术达人

积分
5047
金钱
4738
HASS币
80
发表于 2024-3-20 22:28:32 | 显示全部楼层
hzw1199 发表于 2024-3-20 14:21
识别成功率还挺高的,还可以配置人脸方框面积大于阈值时触发,用于中控屏人来亮屏挺丝滑 ...

frigate有人脸?哪个配置文档
回复

使用道具 举报

6

主题

117

帖子

899

积分

高级会员

Rank: 4

积分
899
金钱
782
HASS币
0
发表于 2024-3-20 22:51:49 来自手机 | 显示全部楼层
这么麻烦。还不如买块tpu。要买买双芯的。买单芯的有点后悔。
回复

使用道具 举报

3

主题

30

帖子

311

积分

论坛技术达人

积分
311
金钱
281
HASS币
10
 楼主| 发表于 2024-3-20 22:58:46 | 显示全部楼层
ryanh7 发表于 2024-3-20 22:28
frigate有人脸?哪个配置文档

其实就是person,https://docs.frigate.video/configuration/objects
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-23 04:42 , Processed in 0.355257 second(s), 31 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表