以下是修正后的文本:
该分享教程比较耗时,同时可能消耗您显示中的金钱,如无必要,够用就好。
起因
老家有个小主机(i5-8250U),上个月开始频繁死机重启,一直持续到写帖子现在依然没有彻底崩掉,也是经受考验了。
具体表现是 CPU 占用奇高,基本是顶着来运行,然后就是突然死机、重启,想要开个虚拟机备份一下资料都不行。
分析
- 硅脂不行了,导致散热不行。
- 实际上就跑了 OP 和 HA,没有其他服务。
- 外壳加了一个散热风扇,而且机柜门已经打开。
解决
排查后发现是 HA 占用了大量的 CPU,然后进一步发现是 Frigate 导致的,CPU 占用那是达到了百分之几百。
这就很奇怪了,之前不会的,同样的配置和硬件,怀疑是近期版本更新的缘故。
另外发现,同样三个摄像头,同样的分辨率,公司部署的 Frigate 也是顶着 CPU 跑,却没有频繁死机,N100 果然有两下子。
既然定位到了原因,查看对比了出租房、老家、公司,发现都是顶着跑,基本可以把 CPU 吃满,没有去看 Frigate 的更新日志,直接自适应:升级硬件。
购置设备
计划是出租房的小主机(i7-1165G7)换下老家的小主机,购买新的小主机。
经过对比和考虑,最终在联想 P3 Tiny 和 P3 Ultra 之间选择了 Ultra,选了标配的 i5-13600 + 8G 内存 + 500G M2 固态。
到手后第一步内存升级,4 根 32g D5 插满,频率会下降至 3600,两根的是 4000。官方文档显示支持 128g,实际支持 192g,感觉 64-96g 会比较合适。
然后虚拟机使用群晖 ABB 套件进行备份、还原。这次顺带将 Frigate 运行到 Debian 中,发现占用率依旧很高。而 HA 移除 Frigate 后,CPU 占用变得很低,从之前的十几个 GHz 下降到两三百 MHz。
因为这台机器的 PCIE 扩展比较丰富,所以开始购置独显进行硬件加速,Frigate 是其一,同时也想给 Jellyfin 硬件转码使用。
独显直通
这里面坑那是非常多,折腾了半个多月才算弄好。
先是购买了 A400,结果发现直通后可以安装驱动,但是 nvidia-smi
却找不到设备。
直通给 Windows 也是可以安装驱动,但是会报 43 错误,同时没有 GPU 在任务管理器。
开始各种找教程、各种尝试,发现一个人有一个人的说法,在综合了各种方法和尝试之后,根据目前直通成功的例子,总结了以下几个关键点:
- 确认显卡是否兼容,如果反复尝试均失败,考虑更换显卡。
- 有些机器不需要通过 BIOS 禁用集显和添加高级参数,有些需要。
- 找一个靠谱的显示器而不是便携屏,方便调试。
具体步骤
以下步骤请根据您的机器进行实际调整。
- 通过 BIOS 禁用集显,正常选择独显进行直通。
- 正常安装 Ubuntu Server,注意在引导选项中,选择 EFI 引导并取消“是否为此虚拟机启用 UEFI 安全引导”的勾选。
- 安装好系统后,添加高级参数:
hypervisor.cpuid.v0=FALSE
pciPassthru.use64bitMMIO=TRUE
- SSH 登录后,禁用 nouveau 驱动:
sudo bash -c "echo blacklist nouveau > /etc/modprobe.d/blacklist-nvidia-nouveau.conf"
sudo bash -c "echo options nouveau modeset=0 >> /etc/modprobe.d/blacklist-nvidia-nouveau.conf"
sudo update-initramfs -u
sudo reboot
- 安装依赖:
sudo apt update
sudo apt install gcc make build-essential libglvnd-dev pkg-config
- 安装驱动(根据自己的显卡型号下载):
wget https://cn.download.nvidia.com/X ... 6_64-550.107.02.run
chmod +x NVIDIA-Linux-x86_64-550.107.02.run
sudo ./NVIDIA-Linux-x86_64-550.107.02.run
- 安装 CUDA。
- 安装 NVIDIA Container Toolkit。
- 查看是否安装成功:
nvidia-smi
Frigate 配置
安装 Docker 和 Compose 方法有很多,这里主要贴配置:
services:
frigate:
image: ghcr.io/blakeblackshear/frigate:stable-tensorrt # 特定版本
container_name: frigate
privileged: true
restart: unless-stopped
shm_size: '256mb'
devices:
- /dev/nvidia0:/dev/nvidia0
environment:
- NVIDIA_VISIBLE_DEVICES=all
- NVIDIA_DRIVER_CAPABILITIES=compute,utility,video
- YOLO_MODELS=yolov4-608,yolov7x-640
- USE_FP16=false
volumes:
- /etc/localtime:/etc/localtime:ro
- /home/yourpatch/frigate/config:/config
- /home/yourpatch/frigate/media:/media/frigate
- type: tmpfs
target: /tmp/cache
tmpfs:
size: 1000000000
ports:
- "5000:5000"
- "8554:8554"
- "8555:8555/tcp"
- "8555:8555/udp"
deploy:
resources:
reservations:
devices:
- driver: nvidia
device_ids: ['0']
capabilities: [gpu]
备注:生成模型文件需要一段时间,会误以为卡在启动界面。
mqtt:
host: 192.168.xx.xx
port: 1883
user: username
password: userpassword
client_id: frigate
detectors:
tensorrt:
type: tensorrt
device: 0
model:
path: /config/model_cache/tensorrt/8.5.3/yolov7-320.trt # 根据实际路径填写
input_tensor: nchw
input_pixel_format: rgb
width: 320
height: 320
cameras:
cam_name:
ffmpeg:
hwaccel_args: preset-nvidia-h264 # 根据实际路径填写
inputs:
- path: rtsp://192.168.xx.xx:8554/cam_name
roles:
- detect
- rtmp
detect:
enabled: true
width: 1920
height: 1080
fps: 5
objects:
track:
- person # 需要检测的对象
record:
enabled: false
retain:
days: 3
mode: motion
events:
retain:
default: 7
mode: motion
snapshots:
enabled: true # 保留 jpg 格式到 /media/frigate/clips
clean_copy: false # 保留 png 格式到 /media/frigate/clips
retain:
default: 7 # 快照默认保留天数
objects:
person: 10 # 对象默认保留天数
quality: 100 # 图片质量
motion:
mask:
- 0,669,0,0,1220,0,1178,721 #不需要检测的区域坐标
version: 0.14
参考资料(不分先后)
写在最后
个人对 ESXi 了解不是很深入,仅限交流。有问题可以查询官方文档,写得很详细。
个人对 Frigate 仅限于一般配置和使用,配置好了就没管它了,这次要不是因为折腾这个都不知道界面更新得这么好看。
分享的步骤和方法如有疏漏或者错误的,请补充或指正,可以帮助折腾 ESXi 直通显卡的朋友少走一点弯路。
多陪陪家人、多出门走走。