この記事について
ここ数日RasPi 5関連での記事投稿が続いていますが、この記事で一旦終わりとし、次の投稿は別のネタにしようと思います。最後のネタは折角ロマン構成を実現したので、コンテナ上からもHailo-8L(NPU)を利用出来ないかという試みです。
セットアップ中に気付いたこと
Hailo-8Lをセットアップ中に、Hailo社はDockerのコンテナ上でもHailo NPUを実行出来る様に資材を提供していることに気付きました。ところが、この資材x86にしか対応していない、Hailo-8L版は存在しないなどなどRasPi 5 with Hailo-8L環境では使えません。しかし、RasPi 5はDockerが動作します。資材が無いので有れば、作ってしまえば良いとばかりに今回自作してみました。
作成した資材
今回Hailo-8Lをコンテナ上から動作させるという目標を達成するために、以下のDockerfileとcompose.yamlを作成しました。資材は過去記事で紹介したperfをコンテナから実行出来る資材を改良して作成する方針を採用しています。packagesディレクトリを作成して、配下にインストールに必要な資材を格納し、ビルド時にコンテナ内にコピーするという仕組みです。workディレクトリは筆者の好みで追加しているため、必須ではありません。(本記事ではDockerのセットアップ方法については扱いません。)pyHailoRTについてもインストールしています。PEP 668対策でvenvを用いていますが、コンテナなので--break-system-packagesオプションを付与してpipを実行しても良いかもしれません。
FROM ubuntu:24.04
ENV DEBIAN_FRONTEND=noninteractive
# ビルドに必要なパッケージをインストール
RUN apt-get update && apt-get install -y --no-install-recommends \
software-properties-common \
&& add-apt-repository ppa:deadsnakes/ppa \
&& apt-get update && apt-get install -y --no-install-recommends \
build-essential git ca-certificates pkg-config \
libelf-dev libdw-dev libaudit-dev libunwind-dev libnuma-dev binutils-dev \
flex bison libssl-dev bc wget curl python3.13 python3.13-dev python3.13-venv \
python3 python3-dev python-is-python3 python3-pip gnupg \
&& rm -rf /var/lib/apt/lists/*
# カーネルツール(perf)を取得してビルド
RUN git clone --depth 1 --branch stable_20250916 https://github.com/raspberrypi/linux.git /tmp/linux && \
make -C /tmp/linux ARCH=arm64 defconfig && \
make -C /tmp/linux ARCH=arm64 prepare modules_prepare && \
make -C /tmp/linux ARCH=arm64 NO_JEVENTS=1 NO_LIBTRACEEVENT=1 NO_BPF=1 tools/perf -j$(nproc) && \
install -m0755 /tmp/linux/tools/perf/perf /usr/local/bin/perf && \
rm -rf /tmp/linux
# パッケージファイルのコピー
COPY ../packages/hailort_4.24.0_arm64.deb /root/
COPY ../packages/hailort-4.24.0-cp313-cp313-linux_aarch64.whl /root/
# HailoRTパッケージのインストール
RUN dpkg --install /root/hailort_4.24.0_arm64.deb
# pyHailoRTのインストール
RUN python3.13 -m venv /opt/pyhailort-venv && \
/opt/pyhailort-venv/bin/python -m pip install --upgrade pip && \
/opt/pyhailort-venv/bin/python -m pip install /root/hailort-4.24.0-cp313-cp313-linux_aarch64.whl
ENV PATH="/opt/pyhailort-venv/bin:${PATH}"
services:
rpi-compose-perf:
build:
context: .
dockerfile: Dockerfile
image: rpi-perf:latest
working_dir: /work
privileged: true
security_opt:
- seccomp:unconfined
network_mode: host
tty: true
restart: "no"
devices:
- /dev/hailo0:/dev/hailo0
volumes:
- /dev:/dev
- /lib/firmware:/lib/firmware
- /lib/udev/rules.d:/lib/udev/rules.d
- /sys:/sys:ro
- /proc:/proc:ro
- /lib/modules:/lib/modules:ro
- ./work:/work
- 参考情報
コンテナからHailo-8Lが認識出来るか確認
上記資材をビルドし、コンテナを起動します。起動が完了したら、コンテナ上でHailo-8Lが認識出来ているか、確認します。
docker compose build
$ docker compose up -d
[+] up 1/1
✔ Container raspi-rpi-compose-perf-1 Started
$ docker compose exec -it rpi-compose-perf hailortcli scan
Hailo Devices:
[-] Device: 0000:03:00.0
認識に成功しています。今後この資材を用いてNPUを活用していこうと思います。
まとめ
Dockerを用いて起動したコンテナ上からHailo-8Lを認識させることに成功しました。ローカル環境だと環境を壊せばOS初期化からやり直しですが、コンテナなら壊しても再度作り直せば良いだけなので、心置きなく色々実験できます。さてそこで気になるのが本家のx86にしか対応していないコンテナ資材。。。一体どんな作りになっているのやら。。。