R3NE07 / Futro-S740

319 stars 49 forks source link

WIFI M.2 für Coral-TPU nutzen? #28

Open Bodengriller opened 1 year ago

Bodengriller commented 1 year ago

Hi, kann mir jemand sagen, ob man in dem WiFi-M.2-Port auch eine Google Coral TPU nutzen könnte?

z.B. CORAL M.2 ACCELERATOR MIT DUAL EDGE TPU oder CORAL M.2 ACCELERATOR A+E KEY

Ich spiele gerade mir frigade für meine Kameras herum, eine TPU entlastet die CPU bei der AI-Erkennung sehr stark. Eine USB-TPU wäre auch möglich, ist aber deutlich teurer als die einfache M.2-Version und freie USB-Ports kann man nie genug haben.

Bodengriller commented 1 year ago

Für die Nachwelt: Ja, es funktioniert! image

Hier wurde noch darauf hingewiesen, dass die Dual-Edge nicht funktionieren kann, da nur eine Lane am WiFi-M.2-Port angebunden ist. (Vermutlich würde einfach nur eine TPU der Dual-Edge erkannt werden -> rausgeworfenes Geld)

Ich habe nun die CORAL M.2 ACCELERATOR A+E KEY drin und erfolgreich in einem Docker-LXC auf Proxmox durchmappen können.

Hier sind noch ein paar Messungen dokumentiert

Nokius commented 10 months ago

@Bodengriller merci vielmal! 👍

MichaelPankow commented 3 months ago

Habe ebenfals den Coral M.2 A+E Key in meinem Futro im Wifi M.2 Slot verbaut und benutze ihn mit Proxmox im LXC Container mit Frigate (https://tteck.github.io/Proxmox/#frigate-lxc). Funktioniert soweit, allerding ist die Interefence Speed sehr hoch (200msec). Wie sieht dass bei dir aus?

Bodengriller commented 3 months ago

Der Inference-Speed liegt bei mir im Schnitt irgendwo bei knapp über 8ms image

Ich habe allerdings nicht das tteck-Template genutzt, bei mir läuft der LXC mit Debian 11 und Docker, in dem auch einige andere Containers laufen. Müsste ich vielleicht irgendwann mal upgraden, hab ich irgendwie wenig Bock drauf, läuft gut und stabil.

root@Docker:/home/frigate# cat /etc/*release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

Hier meine LXC-Config:

arch: amd64
cores: 4
features: keyctl=1,nesting=1
hostname: Docker
memory: 6144
mp0: /mnt/frigate_storage/,mp=/media/frigate_storage
net0: name=eth0,bridge=vmbr0,firewall=1,gw=192.168.abc.1,hwaddr=12:1B:9B:9B:xx:yy,ip=192.168.abc.xxx/24,type=veth
onboot: 1
ostype: debian
rootfs: local-lvm:vm-151-disk-1,size=16G
startup: order=4
swap: 6144
unprivileged: 1
lxc.cgroup2.devices.allow: c 226:128 rwm
lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file
lxc.cgroup2.devices.allow: c 120:0 rwm
lxc.mount.entry: /dev/apex_0 dev/apex_0 none bind,optional,create=file

Mein Docker-Compose-File:

version: "3.9"
services:
  frigate:
    container_name: frigate
    privileged: true # this may not be necessary for all setups
    restart: unless-stopped
    image: ghcr.io/blakeblackshear/frigate:stable
    shm_size: "128mb" # update for your cameras based on calculation above
    devices:
      - /dev/apex_0:/dev/apex_0 # passes a PCIe Coral
      - /dev/dri/renderD128 # for intel hwaccel
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /home/frigate/:/config/
      - /media/frigate_storage:/media/frigate
      - /home/frigate/custom-start.sh:/custom-start.sh
      - type: tmpfs # Optional: 1GB of memory, reduces SSD/SD Card wear
        target: /tmp/cache
        tmpfs:
          size: 1000000000
    #entrypoint: ["/bin/bash", "/custom-start.sh"]
    networks:
      bridge-network:
        ipv4_address: 172.20.0.12
    dns:
      - 127.0.0.1
      - 192.168.abc.1
    ports:
      - "5000:5000"
      - "1935:1935" # RTMP feeds
      - "8554:8554" # RTSP feeds
    environment:
      LIBVA_DRIVER_NAME: "i965"

networks:
  bridge-network:
    external: true
    name: my-bridge-network

(frag mich bitte nicht, wo ich damals den Wert für die shm_size her hatte...dafür müsste ich nochmal schwer in mich gehen)

Und hier meine frigate-config:

version: 0.14

detectors:
  coral:
    type: edgetpu
    device: pci

#activate hardware acceleration
ffmpeg:
  hwaccel_args: preset-vaapi
  input_args: -rtsp_transport tcp

mqtt:
  enabled: true
  host: 192.168.abc.xxx
  port: 1883
  user: username
  password: password

go2rtc:
  streams:
    Parkplatz:
      - rtsp://192.168.abc.xxx/ch0_0.h264
    Parkplatz_sub:
      - ffmpeg:rtsp://192.168.abc.xxx/ch0_1.h264#video=h264#hardware
    Carport:
      - rtsp://192.168.abc.xxx/ch0_0.h264
    Carport_sub:
      - rtsp://192.168.abc.xxx/ch0_1.h264
    Stellplatz:
      - rtsp://192.168.abc.xxx/ch0_0.h264
    Stellplatz_sub:
      - rtsp://192.168.abc.xxx/ch0_1.h264

##########----------General ui----------##########
ui:
  time_format: 24hour
  strftime_fmt: '%d.%m.%Y %H:%M'

birdseye:
  enabled: true
  restream: false
  mode: continuous

timestamp_style:
  position: br
  format: '%d.%m.%Y %H:%M:%S'
  effect: solid

##########----------General-Detection-Config----------##########
objects:
  track:
    - car
    - person
    - bicycle
    - motorcycle
    - cat
    - dog
  filters:
    car:
      # Optional: minimum score for the object to initiate tracking (default: 0.5)
      min_score: 0.5
      # Optional: minimum decimal percentage for tracked object's computed score to be considered a true positive (default: 0.7)
      threshold: 0.7
    person:
      # Optional: minimum score for the object to initiate tracking (default: 0.5)
      min_score: 0.4
      # Optional: minimum decimal percentage for tracked object's computed score to be considered a true positive (default: 0.7)
      threshold: 0.7

review:
  alerts:
    labels:
      - car
      - person
      - bicycle
      - motorcycle

snapshots:
  enabled: true
  clean_copy: false
  timestamp: true
  bounding_box: true
  retain:
    default: 10
    objects:
      person: 30

record:
  enabled: true
  retain:
    days: 7
    mode: all
  events:
    pre_capture: 10
    post_capture: 10
    retain:
      default: 30
      mode: motion

##########----------Camera-Config----------##########
camera_groups: {}
cameras:
  #####------Kamera Carport-----#####
  Carport:
    ui:
      order: 1
    ffmpeg:
      inputs:
        - path: rtsp://127.0.0.1:8554/Carport_sub
          input_args: preset-rtsp-restream
          roles:
            - detect
        - path: rtsp://127.0.0.1:8554/Carport
          input_args: preset-rtsp-restream
          roles:
            - record
    detect:
      enabled: true
      #width: 640
      #height: 360
      fps: 5
    snapshots:
      required_zones:
        - driving_zone
    review:
      alerts:
        required_zones:
          - driving_zone
          - parking_zone
      detections:
        required_zones:
          - driving_zone
          - parking_zone
    motion:
      mask: 
        0,1,0.192,1,0.16,0.47,0.403,0.383,0.497,0.389,0.5,0.408,0.796,0.454,0.775,0.777,0.689,0.805,0.566,0.9,0.457,1,1,1,1,0,0,0
      threshold: 30
      contour_area: 20
      improve_contrast: 'true'
      lightning_threshold: 0.7
    zones:
      driving_zone:
        coordinates: 
          0.753,0.771,0.767,0.623,0.472,0.539,0.316,0.671,0.288,0.648,0.182,0.746,0.35,0.964,0.546,0.91,0.672,0.806
        inertia: 3
        loitering_time: 1
      parking_zone:
        coordinates: 
          0.371,0.419,0.292,0.468,0.293,0.646,0.319,0.665,0.477,0.535,0.771,0.619,0.78,0.518
        inertia: 3
        loitering_time: 0
        objects: person
  #####-------------------------#####

  #####-----Kamera Parkplatz----#####
  Parkplatz:
    ui:
      order: 2
    ffmpeg:
      inputs:
        - path: rtsp://127.0.0.1:8554/Parkplatz_sub
          input_args: preset-rtsp-restream
          roles:
            - detect
        - path: rtsp://127.0.0.1:8554/Parkplatz
          input_args: preset-rtsp-restream
          roles:
            - record
    detect:
      enabled: true
      #width: 640
      #height: 360
      fps: 5
    snapshots:
      required_zones:
        - driving_zone
    review:
      alerts:
        required_zones:
          - driving_zone
          - street_zone
          - parking_zone
      detections:
        required_zones:
          - driving_zone
          - street_zone
          - parking_zone
    motion:
      mask: 
        0.5,1,0.428,0.787,0.158,0.849,0.156,0.272,0.437,0.246,0.579,0.296,0.582,0.283,0.853,0.417,0.802,0.815,0.522,1,1,1,1,0,0,0,0,1
      threshold: 30
      contour_area: 20
      improve_contrast: 'true'
      lightning_threshold: 0.7
    zones:
      driving_zone:
        coordinates: 
          0.436,0.774,0.516,0.984,0.784,0.815,0.83,0.523,0.553,0.359,0.524,0.367,0.17,0.457,0.182,0.809
        inertia: 3
        loitering_time: 1
      street_zone:
        coordinates: 0.576,0.362,0.585,0.291,0.844,0.432,0.834,0.514
        inertia: 3
        loitering_time: 5
      parking_zone:
        coordinates: 0.175,0.448,0.178,0.339,0.435,0.285,0.542,0.358
        loitering_time: 0
        objects: person
  #####-------------------------#####

  #####----Kamera Stellplatz----#####
        inertia: 3
  Stellplatz:
    ui:
      order: 3
    ffmpeg:
      inputs:
        - path: rtsp://127.0.0.1:8554/Stellplatz_sub
          input_args: preset-rtsp-restream
          roles:
            - detect
        - path: rtsp://127.0.0.1:8554/Stellplatz
          input_args: preset-rtsp-restream
          roles:
            - record
    detect:
      enabled: true
      #width: 640
      #height: 360
      fps: 5
    motion:
      mask: 
        0.284,1,0.228,0.678,0.191,0.244,0.512,0.132,0.768,0.2,0.725,0.729,0.562,1,1,1,1,0,0,0,0,1
      threshold: 30
      contour_area: 10
      improve_contrast: 'true'
      lightning_threshold: 0.75

  #####-------------------------#####

vielleicht kannst du Anhand der Vergleiche irgendeine Auffälligkeit bei dir finden.

BTW: Ich bin nun zweitmal drüber gestolpert - Vorsicht, wenn du Proxmox upgradest...ein neuer Kernel hat bei mir jedes Mal dazu geführt, dass der Coral-Treiber neu aufgesetzt werden musste. Ich hänge hier mal meine letzten Notizen für die Nachwelt an - vielleicht bringt's irgendwann jemanden was

Proxmox - Fehler bei Kernel Update .txt

Bodengriller commented 3 months ago

Ergänzung:

  1. im Docker-Compose-File oben muss die Zeile entrypoint: ["/bin/bash", "/custom-start.sh"] raus...das war eine Leiche (Ich hab's oben auskommentiert)

  2. Die Berechnung der shm_size ist hier erklärt: Die habe ich wohl sehr großzügig gewählt: (640 360 1.5 9 + 270480) / 1048576 = 3,224 MB 3,224 MB 3 + 30 = 39,672 MB <- 40MB hätten wohl ausgereicht....tjoar

MichaelPankow commented 3 months ago

Vielen Dank für die ausführliche Antwort. Gut zu wissen, das die identischen Hardware das zumindest hergibt. Den Coral Treiber hab ich auch aus dem Git Repo gebaut und installiert. Bisher gab es auch nach Kernel Updates kein Boot Problem. Was aber bei mir anders ist, ist das Durchreichen der Treiber für Intel HW Beschleunigung und des Coral Chips and den LXC Container. Ich habe das über die GUI (Resources) gemacht, dann steht in der LXC Config: dev0: /dev/dri/card0,gid=44 dev1: /dev/dri/renderD128,gid=104 dev2: /dev/apex_0,gid=1000

Hier werde ich zuerst ansetzten.

Bodengriller commented 3 months ago

Danke für die Rückmeldung. Ich denke es könnte auch zukünftig einigen anderen Hilfestellung leisten, wenn sie über das gleiche Problem stolpern, daher die Bitte: Gib uns Feedback 😁

Der Futro S740 ist für den Standard - Heimautomatisierungsuser halt wirklich ein wirklich gutes und Stromsparendes Gerät