Raspberry Pi 5向けにリリースされているHailoのAI Kitですが、実はx86_64環境もサポートしているようです。またHailo上で実行するHEF形式のファイル(アクセラレータの挙動を決めるプログラム)の生成も、x86_64上で変換するのだとか。そこで今回は、Raspberry Pi 5抜きでRaspberry Pi AI Kitをx86_64上のUbuntu22.04から使う手順 をまとめてみました(Ubuntu24.04はサポート外のようです)。
Ubuntu24.04でも動作したため、記事のタイトルを「Raspberry Pi 5無しでRaspberry Pi AI Kit をx86_64 Ubuntu 22.04 LTS上で遊ぶ」から「Raspberry Pi 5無しでRaspberry Pi AI Kit をx86_64 Ubuntu上で遊ぶ」に変更しました(GPUドライバはnvidia-driver-550
を選択しました)
ハードウェア構成
まずPCの電源を切った状態で、Raspberry Pi AI Kitから取り外したHailo8Lボードをx86_64 PCのマザーボードにあるM.2(PCIe Gen3以降 x1以上)のソケットに挿入します。また GPUリソースとしてRTX3060Ti を搭載しました。なお、Ubuntu22.04のインストーラがRTX3060Tiを認識しなかったため、以降の手順の「OSのインストール」の間はオンボードのHDMI出力を利用しました。
今回利用した機材とOS
Core i7-6700 RAM32GB + 1TB NVMe
Ubuntu Desktop 22.04.1 LTS
Raspberry Pi 5 に対応したAI Kit + M.2搭載用ネジ
OSのインストール
Ubuntu24.04を選びたかったのですが、HailoがサポートするOSはUbuntu22.04までとのことだったので Ubuntu22.04をインストール しました。OSインストール後は、以下の手順で環境をセットアップします。
# パッケージの一覧を取得
$ sudo apt update
# パッケージをすべて更新
$ sudo apt upgrade
# 再起動
$ sudo reboot
# sudoコマンドをパスワードレスで実行できるようにする
### -->> shino ALL=(ALL:ALL) NOPASSWD: ALL を末尾に追加
$ sudo vi /etc/sudoers
# sshサーバをインストールする
$ sudo apt install openssh-server
# リモートログインできるようにする
# ... 起動時にサービスが開始されるように設定する
$ sudo systemctl start ssh
$ sudo systemctl enable ssh
# sshに公開鍵でログインできるようにする
$ mkdir ~/.ssh
$ touch ~/.ssh/authorized_keys
$ chmod 0700 ~/.ssh
$ chmod 0640 ~/.ssh/authorized_keys
### -->> 必要なら公開鍵を書き込む
# 汎用グラフィックドライバを無効化する
# 新規ファイルを作成し、無効化設定を記述する
### 無効化してからRTX3060Tiを接続
$ sudo vi /etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0
# 保存したらinitramfsを更新して再起動
$ sudo update-initramfs -u
$ sudo reboot
GPUリソースをセットアップする
最初にGPU周りのセットアップをしていきましょう。
GPUのドライバをインストールする
汎用グラフィックドライバを無効化することで、Ubuntu22.04+RTX3060TiでもHDMI出力ができるようになります。ここでGPUを搭載し、以下の手順でGPUのドライバをインストールしましょう。
# グラフィクス関連のドライバをすべて削除
$ sudo apt --purge remove -y nvidia-*
$ sudo apt --purge remove -y cuda-*
$ sudo apt --purge remove -y libcudnn*
$ sudo apt --purge remove -y cudnn-*
# GPUを確認する
$ lspci | grep -i vga
# 01:00.0 VGA compatible controller: NVIDIA Corporation GA104 [GeForce RTX 3060 Ti Lite Hash Rate] (rev a1)
# グラフィックドライバが格納されているレポジトリを登録
$ sudo add-apt-repository ppa:graphics-drivers/ppa
# パッケージ一覧を更新
$ sudo apt update
# グラフィックドライバのリストを確認する
$ ubuntu-drivers devices
# == /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 ==
# modalias : pci:v000010DEd00002489sv00001462sd00008D9Bbc03sc00i00
# vendor : NVIDIA Corporation
# model : GA104 [GeForce RTX 3060 Ti Lite Hash Rate]
# driver : nvidia-driver-545-open - distro non-free
# driver : nvidia-driver-535 - distro non-free
# driver : nvidia-driver-535-server-open - distro non-free
# driver : nvidia-driver-555 - third-party non-free
# driver : nvidia-driver-550-open - third-party non-free
# driver : nvidia-driver-555-open - third-party non-free
# driver : nvidia-driver-545 - distro non-free
# driver : nvidia-driver-470-server - distro non-free
# driver : nvidia-driver-535-server - distro non-free
# driver : nvidia-driver-535-open - distro non-free
# driver : nvidia-driver-560 - third-party non-free recommended
# driver : nvidia-driver-470 - distro non-free
# driver : nvidia-driver-560-open - third-party non-free
# driver : nvidia-driver-550 - third-party non-free
# driver : xserver-xorg-video-nouveau - distro free builtin
# リストの対象外だがHailo開発環境が525までしかサポートしていないので
# nvidia-driver-525をインストールする
$ sudo apt install -y nvidia-driver-525
$ sudo reboot
# nvidia-smiでGPUが認識されていることを確認する
$ nvidia-smi
# Sat Dec 7 19:11:27 2024
# +---------------------------------------------------------------------------------------+
# | NVIDIA-SMI 535.183.01 Driver Version: 535.183.01 CUDA Version: 12.2 |
# |-----------------------------------------+----------------------+----------------------+
# | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
# | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
# | | | MIG M. |
# |=========================================+======================+======================|
# | 0 NVIDIA GeForce RTX 3060 Ti Off | 00000000:01:00.0 On | N/A |
# | 37% 34C P8 13W / 200W | 315MiB / 8192MiB | 0% Default |
# | | | N/A |
# +-----------------------------------------+----------------------+----------------------+
#
# +---------------------------------------------------------------------------------------+
# | Processes: |
# | GPU GI CI PID Type Process name GPU Memory |
# | ID ID Usage |
# |=======================================================================================|
# | 0 N/A N/A 972 G /usr/lib/xorg/Xorg 175MiB |
# | 0 N/A N/A 1179 G /usr/bin/gnome-shell 134MiB |
# +---------------------------------------------------------------------------------------+
参考にさせていただきました記事
CUDAとcuDNNのインストール
CUDA ToolkitのサイトよりPCの構成を選択し、インストール用のコマンドを確認します。今回は 「Linux」->「x86_64」->「Ubuntu」->「22.04」->「deb(local)」 を選択し、以降のコマンドによりCUDAをインストールしました。
# 公式サイトの手順に従ってインストールする
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-ubuntu2204.pin
$ sudo mv cuda-ubuntu2204.pin /etc/apt/preferences.d/cuda-repository-pin-600
$ wget https://developer.download.nvidia.com/compute/cuda/12.6.3/local_installers/cuda-repo-ubuntu2204-12-6-local_12.6.3-560.35.05-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu2204-12-6-local_12.6.3-560.35.05-1_amd64.deb
$ sudo cp /var/cuda-repo-ubuntu2204-12-6-local/cuda-*-keyring.gpg /usr/share/keyrings/
$ sudo apt-get update
$ sudo apt-get -y install cuda-toolkit-12-6
# ツールにパスを通す
$ vi ~/.bashrc
# 最後の行に下記の2行を追加する
export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
# 設定した環境変数を反映させる
$ source ~/.bashrc
# 開発ツールのバージョンを確認する
$ nvcc -V
# nvcc: NVIDIA (R) Cuda compiler driver
# Copyright (c) 2005-2024 NVIDIA Corporation
# Built on Tue_Oct_29_23:50:19_PDT_2024
# Cuda compilation tools, release 12.6, V12.6.85
# Build cuda_12.6.r12.6/compiler.35059454_0
# 最後に再起動する
$ sudo reboot
同様の手順でcuDNNもインストールします。 「Linux」->「x86_64」->「Ubuntu」->「22.04」->「deb(local)」 を選択しcuDNNをインストールしました。
# 公式サイトの手順に従ってインストールする
$ wget https://developer.download.nvidia.com/compute/cudnn/9.6.0/local_installers/cudnn-local-repo-ubuntu2204-9.6.0_1.0-1_amd64.deb
$ sudo dpkg -i cudnn-local-repo-ubuntu2204-9.6.0_1.0-1_amd64.deb
$ sudo cp /var/cudnn-local-repo-ubuntu2204-9.6.0/cudnn-*-keyring.gpg /usr/share/keyrings/
$ sudo apt-get update
$ sudo apt-get -y install cudnn
$ sudo apt-get -y install cudnn-cuda-12
# 最後に再起動する
$ sudo reboot
参考にさせていただきました記事
Docker環境のセットアップ
続いてDockerのセットアップを進めていきます。
Dockerのインストール
Dockerを公式ドキュメントに従ってインストールします。今回は 「Install using the apt repository」 のコマンドを参考にしました。
# Set up Docker's apt repository.
$ sudo apt-get update
$ sudo apt-get install ca-certificates curl
$ sudo install -m 0755 -d /etc/apt/keyrings
$ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
$ sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt-get update
# Install the Docker packages.
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Verify that the installation is successful by running the hello-world image
$ sudo docker run --rm hello-world
# sudo無しでもdockerを操作できるようユーザーに権限を与える
$ sudo usermod -aG docker $USER
$ sudo reboot
# Dockerコマンドをsudo無しで実行できることを確認する
$ docker image ls
# REPOSITORY TAG IMAGE ID CREATED SIZE
# hello-world latest d2c94e258dcb 19 months ago 13.3kB
$ docker image rm hello-world
$ docker image ls
# REPOSITORY TAG IMAGE ID CREATED SIZE
参考にさせていただきました記事
NVIDIA-dockerのインストール
Hailo開発環境が nvidia-docker2
を必要としていますが、公式リポジトリを参照するとThis project has been superseded by the NVIDIA Container Toolkit.
とされているので、下記の手順を参考にNVIDIA Container Toolkitをインストールします。
参考にさせていただきました記事
# NVIDIA Container Toolkitが格納されたリポジトリをシステムに追加する
$ curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
# NVIDIA Container Toolkitをインストールする
$ sudo apt-get update
$ sudo apt-get install -y nvidia-container-toolkit
# コンテナのランタイムがDockerであることを登録する
$ sudo nvidia-ctk runtime configure --runtime=docker
# INFO[0000] Config file does not exist; using empty config
# INFO[0000] Wrote updated config to /etc/docker/daemon.json
# INFO[0000] It is recommended that docker daemon be restarted.
$ sudo systemctl restart docker
# GPUが見えなくなる問題の対策
# -->> https://qiita.com/tttamaki/items/4f369633b7f53f5131a1
$ sudo vi /etc/docker/daemon.json
{
"runtimes": {
"nvidia": {
"args": [],
"path": "nvidia-container-runtime"
}
},
"exec-opts": ["native.cgroupdriver=cgroupfs"]
}
$ sudo systemctl restart docker
$ docker info | grep Cgroup
# Cgroup Driver: cgroupfs
# Cgroup Version: 2
# Dockerコンテナ内からGPUにアクセスできることを確認する
$ docker run --rm --gpus all pytorch/pytorch:2.5.1-cuda12.4-cudnn9-devel nvidia-smi
# Sat Dec 7 11:03:16 2024
# +------------------------------------------------------------------------------- --------+
# | NVIDIA-SMI 535.183.01 Driver Version: 535.183.01 CUDA Version: 1 2.4 |
# |-----------------------------------------+----------------------+-------------- --------+
# | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Unco rr. ECC |
# | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Com pute M. |
# | | | MIG M. |
# |=========================================+======================+============== ========|
# | 0 NVIDIA GeForce RTX 3060 Ti Off | 00000000:01:00.0 Off | N/A |
# | 37% 30C P8 9W / 200W | 284MiB / 8192MiB | 0% Default |
# | | | N/A |
# +-----------------------------------------+----------------------+-------------- --------+
#
# +------------------------------------------------------------------------------- --------+
# | Processes: |
# | GPU GI CI PID Type Process name GPU Memory |
# | ID ID Usa ge |
# |=============================================================================== ========|
# +------------------------------------------------------------------------------- --------+
HAILO開発リソースのセットアップ
以上でHailo8Lの開発に必要な下準備は整いましたので、Hailo8Lを開発するためのセットアップをはじめていきましょう。Hailo8L関連のソフトウェアは「hailo.ai/developer-zone/software-downloads/」より入手することができます。ユーザー登録が必要となりますので、ログイン用のメールアドレスをご準備ください。
「AI Software Suite」->「AI Software Suite」->「x86」->「Linux」->「Python Version 3.8」 を選択し 「Hailo AI Software Suite - Docker」 と 「HailoRT - PCIe driver Ubuntu package(deb)」 をダウンロードします。
Hailo8L向けPCIeドライバのインストール
Ubuntu22.04の場合、Hailo8Lのドライバが既にインストールされているようで、lspciでデバイス名を確認することができます。ただ、念のため、公式からダウンロードした最新のデバイスドライバをインストールしておきます。
# デバイスを認識できているか確認する
$ lspci | grep Co-processor
# 02:00.0 Co-processor: Hailo Technologies Ltd. Hailo-8 AI Processor (rev 01)
# Installation of the PCIe Driver Only を参照
# ダウンロードしたHailoRT - PCIe driver Ubuntu package(deb)を
# ~/ に格納した上で、下記のコマンドを実行
$ cd ~/
$ ls hailo*
# hailo_ai_sw_suite_2024-10_docker.zip
# hailort-pcie-driver_4.19.0_all.deb
$ sudo dpkg --install hailort-pcie-driver_4.19.0_all.deb
# ...
# Do you wish to use DKMS? [Y/n]: Y
# ...
# Please reboot your computer for the installation to take effect.
# 再起動
$ sudo reboot
# デバイスを認識できているか確認する
$ lspci | grep Co-processor
# 02:00.0 Co-processor: Hailo Technologies Ltd. Hailo-8 AI Processor (rev 01)
Dockerベースの開発環境のインストール
次にダウンロードした 「Hailo AI Software Suite - Docker」 をインストールします。ダウンロードしたファイルを ~/
に格納した上で、GUIのターミナルから 下記のコマンドを実行します。
# ファイルの確認
$ cd ~
$ ls hailo_ai_sw_suite*
# hailo_ai_sw_suite_2024-10_docker.zip
# 作業ディレクトリを作成
$ mkdir -p ~/hailo_devel_work
$ cd ~/hailo_devel_work
# 解凍する
$ unzip ~/hailo_ai_sw_suite_2024-10_docker.zip
# Archive: /home/shino/hailo_ai_sw_suite_2024-10_docker.zip
# inflating: hailo_ai_sw_suite_2024-10.tar.gz
# inflating: hailo_ai_sw_suite_docker_run.sh
$ ls
# hailo_ai_sw_suite_2024-10.tar.gz
# hailo_ai_sw_suite_docker_run.sh
# コンテナを起動する (GUIのある環境で実行)
# -->> 初回起動は非常に時間がかかります
$ ./hailo_ai_sw_suite_docker_run.sh
# Loading Docker image: /home/shino/hailo_devel_work/hailo_ai_sw_suite_2024-10.tar.gz
# INFO: Checking system requirements...
# INFO: System requirements check finished successfully.
# ...
######
### コンテナ内にログインできます
######
(hailo_virtualenv) /local/workspace $ hailortcli fw-control identify
# Executing on device: 0000:02:00.0
# Identifying board
# Control Protocol Version: 2
# Firmware Version: 4.19.0 (release,app,extended context switch buffer)
# Logger Version: 0
# Board Name: Hailo-8
# Device Architecture: HAILO8L
# Serial Number: HLDDLBB243301301
# Part Number: HM21LB1C2LAE
# Product Name: HAILO-8L AI ACC M.2 B+M KEY MODULE EXT TMP
参考にさせていただきました記事
hefファイルを読み込めることを確認
下記リストから 「Classification」->「Hailo-8L(Link)」->「resnet_v1_18」->「Compiled(download)」 を選択して学習済みモデルを入手し、Hailo8LにHEFを読み込めることを確認します。
下記手順によりHailo8L上でHEFファイルを実行できることを確認することができます。
# 作業ディレクトリ
$ pwd
/local/workspace
# Hailo8L向けのYOLOv8のモデルをダウンロード
$ wget https://hailo-model-zoo.s3.eu-west-2.amazonaws.com/ModelZoo/Compiled/v2.13.0/hailo8l/resnet_v1_18.hef
# HEFファイルをHailo8L上で実行
$ hailortcli run resnet_v1_18.hef
# Running streaming inference (resnet_v1_18.hef):
# Transform data: true
# Type: auto
# Quantized: true
# Network resnet_v1_18/resnet_v1_18: 100% | 4577 | FPS: 914.24 | ETA: 00:00:00
# > Inference result:
# Network group: resnet_v1_18
# Frames count: 4577
# FPS: 914.31
# Send Rate: 1101.03 Mbit/s
# Recv Rate: 7.31 Mbit/s
hef_platformが動作することを確認
続いてPythonコードからHailo8LにHEFファイルを読み込ませることができることを確認します。確認用に下記のPythonコードを用意しました。これはhailo tutorialから一部を変更したものです。hailo tutorial版のソースコードでは配列をnp.emptyで初期化した後にastypeのキャストするのですが、このキャストに失敗することがあるため、配列定義時にnp.uint8を指定するようにしました。
import numpy as np
from hailo_platform import VDevice, HailoSchedulingAlgorithm
timeout_ms = 1000
params = VDevice.create_params()
params.scheduling_algorithm = HailoSchedulingAlgorithm.ROUND_ROBIN
# The vdevice is used as a context manager ("with" statement) to ensure it's released on time.
with VDevice(params) as vdevice:
# Create an infer model from an HEF:
infer_model = vdevice.create_infer_model('./resnet_v1_18.hef')
# Configure the infer model and create bindings for it
with infer_model.configure() as configured_infer_model:
bindings = configured_infer_model.create_bindings()
# Set input and output buffers
buffer = np.empty(infer_model.input().shape, dtype=np.uint8)
bindings.input().set_buffer(buffer)
buffer = np.empty(infer_model.output().shape, dtype=np.uint8)
bindings.output().set_buffer(buffer)
# Run synchronous inference and access the output buffers
configured_infer_model.run([bindings], timeout_ms)
buffer = bindings.output().get_buffer()
# Run asynchronous inference
job = configured_infer_model.run_async([bindings])
job.wait(timeout_ms)
# 作業ディレクトリを作成し移動
### -->> 前手順でダウンロードした resnet_v1_18.hef があること
# スクリプトを実行、エラーが無ければOK
$ python test.py
### 何も表示されずにコマンドの実行に成功すればOK
これでRaspberry Pi 5なしにAI Kitを試すことができます。x86_64環境の方が、Raspberry Pi 5よりもリソースがリッチなので開発が捗りそうですね。