重い腰をあげてようやくラズパイ4を購入したので、機械学習をやろうと思い、からあげ本をやってみたときの備忘録です。
環境は以下になります。
- OS:ubuntu 20.04
- docker:20.10.7
- ラズパイ4 メモリ8GB
- web camera: Logitech C270
OSは etcher で焼いて使用しています。
https://www.balena.io/etcher/
作成したものはコチラ にあります。
docker イメージもdocker hubにはpushしてあります。
docker をインストール
自分の場合は基本的にクリーンな環境でやりたいこともあるのですが、セットアップにあれこれ時間がかかるのはどうだろうなぁということと、インストール手順とか忘れてしまうのでコードで残せるように基本的にdockerを使って色々やっています。
ubuntuの場合、一番簡単なのは以下かなぁと思っていつも最初に実行してインストールします。
$ curl -L https://get.docker.com | sudo bash
dockerイメージの作成
現状tensorflowのバージョンとしては2.5.0が最新っぽいのでコレを使用します。
tensorflowのページを見ながらビルドもしてみたのですが、うまくいかなかったので
最終的には @PINTO さんの使用させていただきました。
感謝です!!
https://github.com/PINTO0309/Tensorflow-bin
2.5.0 のものは↓を使用しました。
https://github.com/PINTO0309/Tensorflow-bin/blob/main/tensorflow-2.5.0-cp38-none-linux_aarch64_download.sh
コチラを使用したDockerfileは以下になります。
FROM ubuntu:20.04
ENV WORKUSER jupyter
ARG LOCALUID=1000
ARG LOCALGID=1000
ARG DEBIAN_FRONTEND=noninteractive
RUN apt update \
&& apt upgrade -y \
&& groupadd --gid $LOCALGID $WORKUSER \
&& useradd --uid $LOCALUID --gid $WORKUSER --shell /bin/bash --create-home $WORKUSER \
&& gpasswd -a $WORKUSER video \
&& apt install -y \
curl \
cython3 \
gcc \
gfortran \
git \
libatlas-base-dev \
libatlas-base-dev \
libatlas3-base \
libblas-dev \
libc-ares-dev \
libeigen3-dev \
libgfortran5 \
libhdf5-dev \
liblapack-dev \
libopenblas-base \
libopenblas-dev \
libopencv-dev \
libopenmpi-dev \
openmpi-bin \
python3-dev \
python3-pip \
tmux \
vim \
v4l-utils\
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /home/$WORKUSER
USER $WORKUSER
RUN pip3 install pip --upgrade \
&& curl -LO "https://raw.githubusercontent.com/PINTO0309/Tensorflow-bin/main/tensorflow-2.5.0-cp38-none-linux_aarch64_download.sh" \
&& bash ./tensorflow-2.5.0-cp38-none-linux_aarch64_download.sh \
&& pip3 install tensorflow-2.5.0-cp38-none-linux_aarch64.whl \
&& pip3 install -U --user six==1.15.0 wheel mock \
&& pip3 install pybind11 \
&& pip3 install keras_applications==1.0.8 --no-deps \
&& pip3 install keras_preprocessing==1.1.0 --no-deps \
&& pip3 install -U pandas \
&& pip3 install -U numpy==1.20.3 \
&& pip3 install -U opencv-python \
&& pip3 install -U jupyterlab \
&& pip3 install -U matplotlib \
&& pip3 install -U scipy \
&& pip3 install -U sklearn \
&& pip3 install -U seaborn \
&& rm tensorflow-2.5.0-cp38-none-linux_aarch64.whl \
&& rm tensorflow-2.5.0-cp38-none-linux_aarch64_download.sh \
&& rm -rf ~/.cache/pip
COPY ./jupyterlab/entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD ["jupyter", "lab", "--ip=0.0.0.0", "--no-browser"]
基本的には、Example of Python 3.x + Tensorflow v2 seriesをベースにDockerfileを作成していたのですが、作成するときにも色々手こずりました。
躓いたところを以下に書いていきたいと思います。
python公式の3.8系のdockerイメージだと何故かインストールに失敗する
最初はpython公式の3.8系のdockerイメージをベースにパッケージをインストールしていけばいいと思っていたのですが、どうもうまくいきません。
ちゃんと調べれてないですけど、@PINTO さんのところでも、tensorflow-2.5.0-cp38-none-linux_aarch64.whl はubuntu 20.04 と書いてあるので、python公式のdockerイメージはdebian busterなのでだめだったのかも。
tensorflow-2.5.0-cp38-none-linux_aarch64.whlを入れるとnumpyが1.19のバージョンになる
tensorflow-2.5.0-cp38-none-linux_aarch64.whlを入れるとnumpyのバージョンが1.19.5 が入ります。
ですが、動かすためには1.20系をインストールする必要があるようです。
そのため、最初にtensorflow-2.5.0-cp38-none-linux_aarch64.whl をインストールし、その後1.20.3のバージョンのnumpyをインストールするようにしています。
webカメラがOpenCV で開けない
これは、うーんと悩んでたんですけど、よくよく考えてみると、作成したjupyterユーザがvideoグループに属していないためでした。(たぶん)
なので、作成したjupyterユーザをvideoグループに追加しています。
まとめ
これでようやくラズパイ上で機械学習ができるようになりました。
docker化したので、とりあえずdockerだけ入れておけばサクッとお試しで動かせるようにできたかなと思います。
まだ、からあげ本のチャプター2の1しか試せていないので、ほかも試していきたいと思います。
jupyterlab 上でwebカメラをリアルタイムで表示するのってどうするんだろう。。。
ここまでお付き合いしていただきありがとうございます。