Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save dataslayermedia/714ec5a9601249d9ee754919dea49c7e to your computer and use it in GitHub Desktop.
Save dataslayermedia/714ec5a9601249d9ee754919dea49c7e to your computer and use it in GitHub Desktop.
Install Coral AI PCIe Edge TPU on Raspberry Pi 5
#!/bin/bash
cd /
sudo apt update
echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-get update
sudo apt-get install libedgetpu1-std
sudo apt install -y devscripts debhelper
sudo apt install dkms
sudo apt-get install dh-dkms
# Clone the Gasket driver repository
sudo git clone https://github.com/google/gasket-driver.git
# Change directory to the cloned repository
cd gasket-driver
# Build the Gasket driver package
sudo debuild -us -uc -tc -b
# Go back to the parent directory
cd ..
# Install the built Gasket driver package
sudo dpkg -i gasket-dkms_1.0-18_all.deb
sudo sh -c "echo 'SUBSYSTEM==\"apex\", MODE=\"0660\", GROUP=\"apex\"' >> /etc/udev/rules.d/65-apex.rules"
sudo groupadd apex
sudo adduser $USER apex
# Update the boot configuration for Raspberry Pi
echo "kernel=kernel8.img" | sudo tee -a /boot/firmware/config.txt
# Back up the Device Tree Blob (DTB)
sudo cp /boot/firmware/bcm2712-rpi-5-b.dtb /boot/firmware/bcm2712-rpi-5-b.dtb.bak
# Decompile the DTB into a DTS file
sudo dtc -I dtb -O dts /boot/firmware/bcm2712-rpi-5-b.dtb -o ~/test.dts
# Modify the Device Tree Source (DTS)
sudo sed -i '/pcie@110000 {/,/};/{/msi-parent = <[^>]*>;/{s/msi-parent = <[^>]*>;/msi-parent = <0x67>;/}}' ~/test.dts
# Recompile the DTS back into a DTB
sudo dtc -I dts -O dtb ~/test.dts -o ~/test.dtb
# Replace the old DTB with the new one
sudo mv ~/test.dtb /boot/firmware/bcm2712-rpi-5-b.dtb
sudo reboot now
@sadontsev
Copy link

@mikegapinski yeah, thanks. I was promised by the seller that mine would support it. But maybe it was a trick.

Here's some info

@mikegapinski
Copy link

@mikegapinski yeah, thanks. I was promised by the seller that mine would support it. But maybe it was a trick.

Here's some info

In theory it does support it, but not fully. The Dual Edge variant needs a dedicated board

@sadontsev
Copy link

sadontsev commented May 18, 2024

@mikegapinski yeah, you're right.

Upd, maybe I found what's wrong:
$ dmesg
...
[ 5496.544355] apex 0000:01:00.0: RAM did not enable within timeout (12000 ms)
[ 5496.544364] apex 0000:01:00.0: Error in device open cb: -110
...

Which may related to the connection issue. See comment section here
Yet, it was too early to celebrate. For whatever reason, the TPU cannot be identified yet either by Frigate or simple Python script (bare metal w/ pyenv or via Docker).
I even tried a clean OS installation on a spare card but didn't help.
I appreciate if someone can suggest the next steps here:

Frigate:
Relevant pieces of the config:
--device /dev/apex_0:/dev/apex_0 \

detectors:
  coral1:
    type: edgetpu
    device: pci:0

Error:

2024-05-18 13:47:27.411259143    File "/usr/lib/python3/dist-packages/tflite_runtime/interpreter.py", line 160, in load_delegate
2024-05-18 13:47:27.411261273      delegate = Delegate(library, options)
2024-05-18 13:47:27.411262995    File "/usr/lib/python3/dist-packages/tflite_runtime/interpreter.py", line 119, in __init__
2024-05-18 13:47:27.411264198      raise ValueError(capture.message)
2024-05-18 13:47:27.411265106  ValueError
2024-05-18 13:47:27.411306013  
2024-05-18 13:47:27.411308217  During handling of the above exception, another exception occurred:
2024-05-18 13:47:27.411309050  
2024-05-18 13:47:27.411310198  Traceback (most recent call last):
2024-05-18 13:47:27.411312272  [2024-05-18 13:47:15] frigate.comms.mqtt             ERROR   : Unable to publish to eyeofsauron/motion: client is not connected
2024-05-18 13:47:27.411313883    File "/usr/lib/python3.9/multiprocessing/process.py", line 315, in _bootstrap
2024-05-18 13:47:27.411314828      self.run()
2024-05-18 13:47:27.411316643    File "/usr/lib/python3.9/multiprocessing/process.py", line 108, in run
2024-05-18 13:47:27.411318772      self._target(*self._args, **self._kwargs)
2024-05-18 13:47:27.411320291    File "/opt/frigate/frigate/object_detection.py", line 102, in run_detector
2024-05-18 13:47:27.411321920      object_detector = LocalObjectDetector(detector_config=detector_config)
2024-05-18 13:47:27.411323939    File "/opt/frigate/frigate/object_detection.py", line 53, in __init__
2024-05-18 13:47:27.411350791      self.detect_api = create_detector(detector_config)
2024-05-18 13:47:27.411352828    File "/opt/frigate/frigate/detectors/__init__.py", line 18, in create_detector
2024-05-18 13:47:27.411366994      return api(detector_config)
2024-05-18 13:47:27.411375383    File "/opt/frigate/frigate/detectors/plugins/edgetpu_tfl.py", line 41, in __init__
2024-05-18 13:47:27.411377031      edge_tpu_delegate = load_delegate("libedgetpu.so.1.0", device_config)
2024-05-18 13:47:27.411378772    File "/usr/lib/python3/dist-packages/tflite_runtime/interpreter.py", line 162, in load_delegate
2024-05-18 13:47:27.411380198      raise ValueError('Failed to load delegate from {}\n{}'.format(
2024-05-18 13:47:27.411381568  ValueError: Failed to load delegate from libedgetpu.so.1.0

Python:

from tflite_runtime.interpreter import Interpreter, load_delegate

try:
    delegate = load_delegate('libedgetpu.so.1')
    print("Edge TPU delegate loaded successfully")

    interpreter = Interpreter(
        model_path='mobilenet_ssd_v2_coco_quant_postprocess_edgetpu.tflite',
        experimental_delegates=[delegate]
    )
    interpreter.allocate_tensors()
    print("Model loaded and tensors allocated")
except ValueError as e:
    print(f"Failed to load Edge TPU delegate: {e}")
    import traceback
    traceback.print_exc()
Traceback (most recent call last):
  File "test_tflite_edgetpu.py", line 4, in <module>
    delegate = load_delegate('libedgetpu.so.1')
  File "/home/max/.pyenv/versions/tpu-env-3.8/lib/python3.8/site-packages/tflite_runtime/interpreter.py", line 168, in load_delegate
    raise ValueError('Failed to load delegate from {}\n{}'.format(
ValueError: Failed to load delegate from libedgetpu.so.1

While the device is here and can be recognised:

(tpu-env-3.8) max@nasnew:~/tpu $ lspci -nn | grep 089a
0000:01:00.0 System peripheral [0880]: Global Unichip Corp. Coral Edge TPU [1ac1:089a]
(tpu-env-3.8) max@nasnew:~/tpu $ ls /dev/apex_*
/dev/apex_0

@mikegapinski
Copy link

This can happen if the board you use does not have proper routing and a high quality FPC cable: raspberrypi/linux#6126

That is why the kernel overlay is not for coral itself, it does not work on all PCIe hats.

You can check for dmesg errors, but I think this is the problem

@askpatrickw
Copy link

FYI: There is an updated rpi-source which fixes the "ERROR: Unexpected processor 4 (use --processor argument)" issue https://github.com/RPi-Distro/rpi-source I installed from master and it fixed it on my RPI 5.

@askpatrickw
Copy link

askpatrickw commented Jun 1, 2024

Todays attempt with a clean SD Card image from the Raspiberry Pi Image

I ran lines 1-46 Up to adding the user to the group and then rebooted.

~ $ uname -a
Linux frigate 6.6.31+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.6.31-1+rpt1 (2024-05-29) aarch64 GNU/Linux~ $ ls /dev/a*
/dev/apex_0  /dev/autofs
~ $ lspci -nn | grep 089a
0000:01:00.0 System peripheral [0880]: Global Unichip Corp. Coral Edge TPU [1ac1:089a]

@stephenljk
Copy link

Hi, I found out that when I upgrade to 6.6.31+rpt-rpi-v8

~ $ sudo lspci -vvv|grep -i MSI-X
	Capabilities: [d0] MSI-X: Enable- Count=128 Masked-
	Capabilities: [b0] MSI-X: Enable+ Count=61 Masked-

this will fail [d0] MSI-X: Enable-, going back to 6.6.20+rpt-rpi-v8 everything will work again (as in the sample in pycoral will run). Not sure if its related to your issue. Anyone know why it breaks when upgrade to 6.6.31+rpt-rpi-v8?

@stephenljk
Copy link

Following up on this, i use apt-mark to lock the kernel:

~ $ sudo apt-mark hold linux-headers-rpi-2712
linux-headers-rpi-2712 set on hold.
~ $ sudo apt-mark hold linux-headers-rpi-v8
linux-headers-rpi-v8 set on hold.
~ $ sudo apt-mark hold linux-image-rpi-2712
linux-image-rpi-2712 set on hold.
~ $ sudo apt-mark hold linux-image-rpi-v8
linux-image-rpi-v8 set on hold.
~ $ sudo apt-mark hold linux-libc-dev
linux-libc-dev set on hold.

after upgrade the kernel remain the same but the same issue occurs, so its some other package that got updated and cause the MSI-X issue

@sadontsev
Copy link

This can happen if the board you use does not have proper routing and a high quality FPC cable: raspberrypi/linux#6126

That is why the kernel overlay is not for coral itself, it does not work on all PCIe hats.

You can check for dmesg errors, but I think this is the problem

The Pineberry board has just arrived and it solved all of my problems. Works like magic.

It just works, both cores are visible and usable.

—-
I noticed a new kernel version is available. Do you know if it included everything required to let the hat work just from the box?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment