condaを使った仮想環境でAI Kitを動かす in Ubuntu 24.04【Raspberry Pi AI Kit】

# はじめに
本記事ではcondaを使った仮想環境で、Raspberry Pi AI Kitを動かすための環境構築について説明していきます。使用OSはUbuntu 24.04です。
他のアプリケーションを動かすために使っている依存関係に干渉させたくないためcondaを使います。

元々の環境がRaspberry Pi OSではなかったりする方の参考になればと思い、執筆いたしましした。

自分が環境構築でかなり手こずったため、この記事が皆様の一助になれば幸いです。

:::note warn
なお、Raspberry Pi公式ではRaspberry Pi OS 64bit (Bookworm)でvenvを使うやり方が紹介されているため、本記事での環境構築は推奨されていないと思います。環境構築の際は自己責任でお願いします。
:::

# 目次
1. [実装環境](#1-実装環境)
2. [Ubuntuのインストール](#2-ubuntuのインストール)
3. [Anaconda3のインストール](#3-Anaconda3のインストール)
4. [仮想環境の作成](#4-仮想環境の作成)
5. [HailoRT PCIe driverのインストール](#5-hailort-pcie-driverのインストール)
6. [HailoRTのインストール](#6-hailortのインストール)
7. [hailo_platformのインストール](#7-hailo_platformのインストール)
8. [動作確認](#8-動作確認)
9. [おわりに](#9-おわりに)
 
# 1. 実装環境
* Raspberry Pi 5 8GB
* Raspberry Pi AI Kit
* Micro SDカード 16GB

上記の環境にUbuntuやconda、HailoRTなどをインストールします。

# 2. Ubuntuのインストール、ソフトウェアのアップデート
Raspberry Pi Imagerを使ってSDカードに`Ubuntu`を書き込みます。
本記事では`Ubuntu 24.02`を使用します。
Raspberyy Pi Imagerは公式サイトからインストールしてください。

https://www.raspberrypi.com/software/

<details><summary>Raspberry Pi Imagerでの作業の様子</summary>

デバイスの選択
![デバイスの選択](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3558462/bdb04f93-4c82-4b93-6d49-ff3500f1636b.png)

OSの選択
![OSの選択](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3558462/ce60a3a2-b35e-f3f1-fa41-1d87bf2dcce6.png)

SDカードの選択
![SDカードの選択](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3558462/3c50fc2e-08bd-dc87-b034-34fe739353f9.png)

選択後のRaspberry Pi Imager
![Raspberry Pi Imager](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3558462/cdeb31a0-37c9-8a75-1104-13a77a425656.png)
</details>

書き込み終了後、SDカードをRaspberry Piに差し込み、Ubuntuをセットアップします。

<details><summary>Ubuntuのセットアップの様子</summary>

言語の選択
![言語の選択](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3558462/a90cf0e0-75b9-9bfe-378e-7920e32a6e4d.png)

キーボードレイアウトの選択
![キーボードレイアウトの選択](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3558462/5797e52c-b6aa-c22a-ca0c-9a17f26355b3.png)

タイムゾーンの選択
![タイムゾーンの選択](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3558462/779ff2cb-de06-7d80-4620-b972dee91e4d.png)

ユーザーの作成
![ユーザーの作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3558462/e14e7dcd-ce4c-2b57-741c-d3e634510fa6.png)

</details>

ターミナルを開き、パッケージのアップデートを行います。
```bash:パッケージのアップデート
sudo apt update
sudo apt upgrade -y
sudo reboot
```

このあとのインストール作業に必要なパッケージもあらかじめインストールしておきます。
```bash:パッケージのインストール
sudo apt install -y linux-headers-`uname -r` make cmake gcc g++ git
```

また、Raspberry Pi 5はインストール時、PCIeがGen2のためGen3に対応させます。
Gen3に対応させるためには`/boot/firmware/config.txt`に以下のパラメータを追加します。
```text:/boot/firmware/config.txt
dtparam=pciex1_gen=3
```
一度再起動しておきます
```
sudo reboot
```

# 3. Anaconda3のインストール

本記事ではcondaを使用するのにAnaconda3を使用します。

https://www.anaconda.com/

軽量版の[Miniconda](https://docs.anaconda.com/miniconda/)もありますが、こちらはARMアーキテクチャに対応していません。軽量版を使用したい場合はARMアーキテクチャに対応している[Miniforge](https://github.com/conda-forge/miniforge)を使用してください。
ちなみに今回使っている16GBのSDカードだと容量のほぼすべてを使うくらいになってしまったので、十分な容量がない場合はMiniforgeを使ったほうがいいと思います。

### 作業ディレクトリの作成
以降の作業ではこのディレクトリ内で行います。
```bash:作業ディレクトリの作成
mkdir ~/work
cd ~/work
```
### インストーラーのダウンロード、インストール
Anacondaのインストーラーのダウンロード、インストールを行います
```bash:~/work
wget https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-aarch64.sh
chmod +x Anaconda3-2024.06-1-Linux-aarch64.sh
./Anaconda3-2024.06-1-Linux-aarch64.sh
```

ライセンスの承諾やインストール場所などを指定できるため、適宜設定してください。
本記事ではホームディレクトリ直下にインストールしました。

インストール直後のターミナルだと`conda`コマンドが使用できないため、一度ターミナルを閉じて、再度起動してください。

# 4. 仮想環境の作成
condaを使用してPythonの仮想環境を作成します。
本記事では`Python 3.11`を使用します
```bash:仮想環境の作成
conda create -n hailo python=3.11
conda activate hailo
```
以降はこの仮想環境を使用して作業します。
バージョンは`python>=3.8`であれば動くと思います。

# 5. HailoRT PCIe driverのインストール
AI Kitに搭載されているHailo-8LをRaspberry Piに認識させるためには、HailoRT PCIe driverをインストールする必要があります。

https://github.com/hailo-ai/hailort-drivers

本記事ではGitHubの[Releases](https://github.com/hailo-ai/hailort-drivers/releases)からソースコードをダウンロードします。
ただ、執筆時の2024年8月1日時点では`v4.18.0`をコンパイルできなかったため、`v4.17.1`を使用します。
```bash:~/work
wget https://github.com/hailo-ai/hailort-drivers/archive/refs/tags/v4.17.1.zip
unzip v4.17.1.zip
rm v4.17.1.zip
```
### ドライバのコンパイル、インストール
ドライバのコンパイル、インストールを行います。
```bash:~/work/hailort-drivers-4.17.1/linux/pcie
make all
sudo make install
sudo modprobe hailo_pci
```

### ファームウェアの設定
ドライバのインストール後、ファームウェアを設定します。
```bash:~/work/hailort-drivers-4.17.1
./download_firmware.sh
sudo mkdir /lib/firmware/hailo
sudo mv hailo8_fw.4.17.1.bin /lib/firmware/hailo/hailo8_fw.bin
```

### Udevルールの追加
Udevルールを追加します。
```bash:~/work/hailort-drivers-4.17.1
sudo cp ./linux/pcie/51-hailo-udev.rules /etc/udev/rules.d/
```

上記が完了しましたら再起動をします。
```bash
sudo reboot
```

# 6. HailoRTのインストール
実際にHailo-8Lを使うためにはHailoRTをインストールする必要があります。

https://github.com/hailo-ai/hailort

こちらもHailoRT PCIe driverと同様、[Releases](https://github.com/hailo-ai/hailort/releases)から`v4.17.1`をインストールします。

```bash:~/work
wget https://github.com/hailo-ai/hailort/archive/refs/tags/v4.17.1.zip
unzip v4.17.1.zip
rm v4.17.1.zip
```

### HailoRTのコンパイル、インストール
はじめにコンパイル行います。
最初の`cmake`に適切な引数を与えると色々なライブラリ等もコンパイルされます。
[公式ドキュメント](https://hailo.ai/developer-zone/documentation/hailort-v4-17-0/?sp_referrer=install/install.html)をみてみるといいかもしれません。
```bash:~/work/hailort-4.17.1
cmake -H. -Bbuild -DCMAKE_BUILD_TYPE=Release && cmake --build build --config release
```
色々エラーでますが一応動きます。

インストールを行います。
`hailortcli`と`libhailort.so`を適切な場所にコピーします
```bash:~/work/hailort-4.17.1
sudo cp build/hailort/hailortcli/hailortcli /usr/local/bin/
cp build/hailort/libhailort/src/libhailort.so ~/anaconda3/envs/hailo/lib/
cp build/hailort/libhailort/src/libhailort.so.4.17.1 ~/anaconda3/envs/hailo/lib/
```

# 7. hailo_platformのインストール
HailoRTを使用するために、Pythonにhailo_platformをインストールします。

### wheelファイルの作成、インストール
hailo_platformのwheelファイルを作成します。
```bash:~/work/hailort-4.17.1/hailort/libhailort/bindings/python/platform
python setuo.py bdist_wheel
```
pipを使ってインストールします。
```bash:~/work/hailort-4.17.1/hailort/libhailort/bindings/python/platform/dist
pip install hailort-4.17.1-cp311-cp311-linux_aarch64.whl
```
### Python Bindingのコンパイル、インストール
上記でインストールしたhailo_platformだけでは正しく動かないため、Python Bindingを使用したライブラリを追加します。
まずはコンパイルです。
```bash:~/work/hailort-4.17.1
cmake -H. -Bbuild -DCMAKE_BUILD_TYPE=Release -DHAILO_BUILD_PYBIND=1 -DPYBIND11_PYTHON_VERSION=3.11 && cmake --build build --config release --target _pyhailort
```
作成した`_pyhailort.cpython-311-aarch64-linux-gnu.so`を適切な場所にコピーします。
```bash:~/work/hailort-4.17.1
cp build/hailort/libhailort/bindings/python/python/src/_pyhailort.cpython-311-aarch64-linux-gnu.so ~anaconda3/envs/hailo/lib/python3.11/site-packages/hailo_platform/pyhailort/
```
#### _pyhailortからGLIBCXX_3.4.32を求められた時
Pythonで`hailo_platform`をインポートした時、以下のようなエラーが出るかもしれません。
```bash
ImportError: /home/user/anaconda/envs/hailo/bin/../lib/libstdc++.so.6: version 'GLIBCXX_3.4.32' not found (required by /home/user/anaconda3/envs/hailo/lib/python3.11/site-packages/hailo_platform/pyhailort/_pyhailort.cpython-311-aarch64-linux-gnu.so
```
`_pyhailort.cpython-311-aarch64-linux-gnu.so`から`GLIBCXX_3.4.32`を求められるため、`libstdc++.so.6`を仮想環境下にコピーすることで解決します。
```bash
cp /usr/lib/aarch64-linux-gnu/libstdc++.so.6 ~/anaconda3/envs/hailo/lib/
```

# 8. 動作確認
インストール作業が完了したので動作確認を行います。
本記事では以下の動作確認を行います。

* `hailortcli`を用いてHailo-8Lが正しく認識されているか
* `hailortcli`を用いて`.hef`ファイルが読み込めるか
* `hailo tutorial`を用いて`hailo_platform`が正しく動作するか

3つ目だけ行っても全体の動作確認はできるので、一番最初に確認しても構いません。

:::note warn
本記事では、公式が用意している[
hailo-rpi5-examples](https://github.com/hailo-ai/hailo-rpi5-examples)を使った動作確認は行いません。
動作にHailo TAPPASが必要なのですが、今回はインストールしていないため動きません。また今度の機会に試してみます。
:::

### Hailo-8Lが正しく認識されているか
以下のコマンドを行って問題なく出力できれば正しく認識されています。
```
hailortcli fw-control identify
```
![出力](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3558462/ac7bc283-9924-54d8-7500-1229081ad843.png)

### .hefファイルが読み込めるか
`.hef`ファイルとは、Hailoで推論するために必要なファイルです。
他のライブラリで使用される`.pt`や`.onnx`をこのファイルに変換することで、Hailoで推論させることできます。

この`.hef`ファイルはHailo Model Zooでコンパイル済みのものが用意されています。

https://github.com/hailo-ai/hailo_model_zoo/

本記事では`HailoRT v4.17.1`に対応した`Hailo Model Zoo v2.11.0`を使用します。

https://github.com/hailo-ai/hailo_model_zoo/tree/6845dd2bad1d3ce3f45c228926b54178f84c7e01

コンパイル済みのモデルは[hailo_model_zoo/docs/public_models/HAILO8L](https://github.com/hailo-ai/hailo_model_zoo/tree/bc69734fd67f3c28ab00d5fae076618c70be149f/docs/public_models/HAILO8L)にリストアップされているので、お好みの`.hef`ファイルをダウンロードしてください。

```bash:~/work
wget https://hailo-model-zoo.s3.eu-west-2.amazonaws.com/ModelZoo/Compiled/v2.11.0/hailo8l/yolov8n.hef
```
`hailortcli`を使って実際に動かしてみます。
```
hailortcli run yolov8n.hef
```
![出力](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3558462/8aaa2688-7bce-10db-e92b-bc24e12066e4.png)

### hailo_platformが正しく動作するか
最後にhailo_platformが正しく動作するか確認します。
確認には`hailo turorial`というコマンドを使います。
コマンドを実行させると`Jupyter`が起動するので、事前にインストールします。
```bash:Jupyterのインストール
pip install jupyter
```
`hailo tutorial`で`.hef`ファイルを使うのですが、用意されていないのでこちらで準備します。
このファイルもHailo Model Zooからダウンロードします。
```bash:~/anaconda3/envs/hailo/lib/python3.11/site-packages/hailo_tutorial
mkdir hefs
cd hefs
wget https://hailo-model-zoo.s3.eu-west-2.amazonaws.com/ModelZoo/Compiled/v2.11.0/hailo8l/resnet_v1_18.hef
```
コマンドを実行します。
```
hailo tutorial
```
実行するとブラウザで`Jupyter`が起動するので確認します。

![起動後のJupyter](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3558462/c968fc18-b13b-0d8b-6fab-c07c5be613a7.png)

`HRT_0_Inference_Tutorial.ipynb`で動作確認を行います。
`HRT_1_Power_Measurement_Tutorial.ipynb`と`HRT_2_Inference_Tutorial_Multi_Process_Service.ipynb`は今回のインストール方法では動かないため、本記事では動作確認に使用しません。

最後の出力が画像のようになっていたら完了です。
![HRT_0_Inference_Tutorial.ipynb](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3558462/037b92e8-3265-9423-1081-de80b255028b.png)

以上で動作確認は完了です

# 9. おわりに
以上でcondaを使った仮想環境で、Raspberry Pi AI Kitを動かすための環境構築は完了です。
TAPPASをインストールしていないため完璧とは言えませんが、画像ファイルを推論するには十分な環境が整ったのではないでしょうか。
TAPPASのインストールに関しては時間があるときに試してみます。そのときはまた記事を書こうと思います。

長くなりましたがここまで読んでいただきありがとうございます。
自分のように環境構築が苦手な方の助けになっていれば幸いです。

# 参考サイト
* [Raspberry Pi 5でのPCIe Gen 3.0対応](https://tkyonezu.com/iot/raspberry-pi-5%E3%81%A7%E3%81%AEpcie-gen-3-0%E5%AF%BE%E5%BF%9C/)
* [Ubuntu上にAnacondaをインストールする方法 #Windows](https://qiita.com/L40S38/items/32115e0683218c621d88)
* [GLIBCXX_3.4.32' not found" error at runtime. GCC 13.2.0](https://stackoverflow.com/questions/76974555/glibcxx-3-4-32-not-found-error-at-runtime-gcc-13-2-0)
* [Raspberry Pi 5でHailo-8 AIアクセラレータを使用する - 河口研究室](https://www.ucl.nuee.nagoya-u.ac.jp/en/blog/2024/2024-05-14-raspi5hailo/)
* [AI Kit - Raspberry Pi Documentation](https://www.raspberrypi.com/documentation/accessories/ai-kit.html)
* [HailoRT v4.17.0](https://hailo.ai/developer-zone/documentation/hailort-v4-17-0/)