-
-
Save dataslayermedia/714ec5a9601249d9ee754919dea49c7e to your computer and use it in GitHub Desktop.
#!/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 |
@mikegapinski yeah, thanks. I was promised by the seller that mine would support it. But maybe it was a trick.
In theory it does support it, but not fully. The Dual Edge variant needs a dedicated board
@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
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
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.
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]
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?
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
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?
@mikegapinski yeah, thanks. I was promised by the seller that mine would support it. But maybe it was a trick.
Here's some info