2 min read

ติดตั้ง Frigate NVR โดยใช้ OpenVINO Detector ผ่านทาง Proxmox LXC

ติดตั้ง Frigate NVR โดยใช้ OpenVINO Detector ผ่านทาง Proxmox LXC

Frigate คือ NVR ที่มีการติดตั้ง AI object detection มาให้พร้อมใช้งาน โดยปกติแล้วการติดตั้ง Frigate เขาจะแนะนำให้ใช้ Google Coral TPU ซึ่งจะมีราคาค่อนข้างแพง และหาซื้อค่อนข้างยาก แต่ถ้าเราไม่มีก็สามารถใช้ CPU Detector ได้นะ ขั้นต่ำประมาณ 3 threads ทำงาน 100% ตลอดเวลา ฟังดูโหดร้ายมาก!

แต่สำหรับบทความนี้เราจะใช้ OpenVINO Detector โดยเจ้าตัว OpenVINO จะสามารถใช้งานกับ CPU intel เจนเนอเรชั่น 6 ขึ้นไปเท่านั้น! และติดตั้งผ่านทาง Proxmox LXC

วิธีเช็คว่าเครื่องเรารองรับ OpenVINO ให้เข้าไปที่ shell Proxmox จากนั้นใช้คำสั่ง

lscpu | grep -e avx2
สามารถใช้คำสั่ง lscpu | grep -o avx หรือ lscpu | grep -o avx2

ถ้าเจอ Flags: avx2 แสดงว่าเครื่องรองรับ OpenVINO

อีกอย่างนึงที่เราต้องเช็คคือ VAAPI (Video Acceleration API) โดยปกติจะมีอยู่ใน CPU intel อยู่แล้ว เราจะใช้สำหรับ ffmpeg transcode จะได้ไม่เปลือง CPU

คำสั่งเช็ค default GPU intel transcode video

ls -l /dev/dri

ถ้าเจอ renderD128 แสดงว่าเรามีสิ่งที่ต้องการครบแล้ว ไปกันต่อ...

ต่อไปเราจะติดตั้ง Docker บน LXC โดยจะใช้ auto scripts

bash -c "$(wget -qLO - https://github.com/tteck/Proxmox/raw/main/ct/docker.sh)"

copy และ paste แล้วก็ enter

ส่วนของ Docker LXC <yes> enter

ส่วนของ SETTINGS <yes> enter

รอจนกว่า script จะขึ้นความว่า

  • "Would you like to add Portainer? <y/N>" พิมพ์ N แล้ว enter
  • "Would you like to add the Portainer Agent? <y/N>" พิมพ์ N แล้ว enter
  • "Would you like to add Docker Compose? <y/N>" พิมพ์ N แล้ว enter

หลังจากติดตั้ง script เรียบร้อยแล้ว ให้เรามองหาตัว 2 บรรทัดนี้

  • ✓ LXC Container 107 was successfully created. คือ CT ID ของ LXC Container
  • ✓ Network Connected: 192.168.1.23 คือ ip ของ LXC Container

ต่อไปเราจะทำการ add GPU เข้าไปใน LXC Container โดยการเข้าไปแก้ config LXC

nano /etc/pve/lxc/107.conf

ให้ทำการ comment #unprivileged: 1 แล้วก็เพิ่มคำสั่ง

#unprivileged: 1
lxc.cgroup2.devices.allow: c 226:128 rwm
lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file

จากนั้นทำการ save (ctrl+x และ y แล้ว enter)

ทำการ reboot LXC Container 107

pct reboot 107

เข้าไปที่เครื่อง LXC Container 107

pct enter 107

เช็ค default GPU ด้วยคำสั่งเดิมอีกครั้ง ถ้าเจอ renderD128 แสดงว่าเราทำการ Passthrough GPU เข้ามาใน LXC Container เรียบร้อยแล้ว ไปกันต่อ...

ls -l /dev/dri

ต่อไปจะเป็นขั้นตอนการติดตั้ง Frigate หลังจากเตรียมความพร้อมกันมานาน สร้าง folder frigate และสร้างไฟล์ config.yml

mkdir -p ./frigate/config
nano frigate/config/config.yml

copy ข้างล่างไปวางในไฟล์ config.yml

mqtt:
  enabled: false

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

ffmpeg:
  hwaccel_args: preset-vaapi
  
cameras:
  front_house:
    ffmpeg:
      inputs:
        - path: rtsp://192.168.1.195:554/h264_stream
          roles:
            - detect

จากนั้นทำการ save (ctrl+x และ y แล้ว enter)

สั่ง run docker frigate

docker run -d \
  --name frigate \
  --restart=unless-stopped \
  --mount type=tmpfs,target=/tmp/cache,tmpfs-size=1000000000 \
  --privileged \
  --device /dev/dri/renderD128 \
  --shm-size=64m \
  -v /root/frigate/storage:/media/frigate \
  -v /root/frigate/config:/config \
  -v /etc/localtime:/etc/localtime:ro \
  -p 5000:5000 \
  ghcr.io/blakeblackshear/frigate:stable

ทดสอบเข้าใช้งาน http://192.168.1.23:5000/ แล้วให้ดูตรงส่วนของ System

ตอนนี้ Frigate ของเราได้ใช้ OpenVINO Detector เรียบร้อยแล้ว โดยให้ดู Inference Speed จะอยู่ประมาณ 97.39 ms (Inference speeds on CPU) หรือประมาณ ~ 15 ms

ส่วนของ ffmpeg ก็ใช้ CPU น้อยมากแค่ 4.0% เนื่องจากทำงานผ่านทาง  VAAPI