カテゴリ: プログラミング

先日は、t4g.micro インスタンスでYOLO v5 による推論を実行してみました。

今日は、学習をさせてみたいと思います。

1. t2.micro で実行してみた


先日と同じ手順で、EC2にYOLO v5 をセットアップしました。t4gの無料キャンペーンがなくなった?(表示されなくなった)ので、t2.micro にしました。

学習は、以下のコマンドで実行できます。オプションで、独自のデータセットや初期パラメータを指定できますが、まずはデフォルトのままで。すると、coco128データセットとデフォルトの学習済みパラメータを使っての学習が実行されるようです。

python3 train.py

先日のとおり、4GBのスワップ(+1GBの標準メモリ)で実行したところ、途中で OOM キラーにより強制終了させられてしまいました。どうやら、学習は推論以上にリソースを食うようです。

追加で 4GB のスワップを設定して実行しました。今度は、学習がちゃんと動き出したようなのですが、やたらと遅い。

1バッチ目を終えるのに6分ほどかかりました。引き続き、2バッチ目・3バッチ目と進みますが、徐々に学習時間が遅くなっていきました。topコマンドで確認すると、CPUは上がらなくなっていて、kswapd0 プロセスが上位に出ています。

どうやら、メモリアクセスが頻繁すぎてスワップファイルの交換が追い付かなくなっているようです。

2. t3.large で再実行


次に、よりメモリの多い t3.large で再実行しました。搭載メモリが 8GB あるので、十分かもしれません。

同様に実行したところ、スワップ無しだとやはりOOMキラーで終了してしまいました。スワップファイル 4GB を追加したところ、継続的に学習されるようになりました。

top コマンドで確認すると、学習には約7GB のメモリが必要なようです(t2.micro では、搭載メモリが1GBあるので、スワップを含めて9GB用意できていた)。

top - 03:33:27 up 34 min,  2 users,  load average: 1.08, 1.03, 0.98
Tasks: 111 total,   2 running, 109 sleeping,   0 stopped,   0 zombie
%Cpu(s): 42.8 us,  8.8 sy,  0.0 ni, 48.4 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   7850.9 total,    254.1 free,   7273.8 used,    323.0 buff/cache
MiB Swap:   4096.0 total,   2907.0 free,   1189.0 used.    217.9 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
  16539 ubuntu    20   0    9.8g   6.6g  38800 R  99.7  85.7  24:11.10 python3

3. 出力されるファイル


学習を行うと、途中経過やモデルが /runs/train/exp に保存されます。
1バッチが終わると、train_batch0.jpg などの学習状況を示す画像が生成されました。
1エポックが終わると、results.csv と、weightsフォルダ内に best.ptとlast.ptが生成されました。これらを取得すると学習状況やその時点までの最適・最終モデルが取得できるようです。
1エポックの処理時間は、T3Unlimited 下で、おおよそ3分といった感じですね。途中のログでは、 16.75s/it と出てました(今回のデフォルトでは8バッチだったので、134秒となり、バリデーションを含めると3分ぐらいな気がします)

t4g.micro インスタンスに YOLO v5 を単純にインストールして、推論してみました。こちらの公式サイトを参考にしつつ実施しています。

Step2~4 を格納したシェルを用意しました→こちら

1. インスタンスの起動


AWS コンソールで、ubuntu 20.04 (ARM) を選択して、t4g.micro インスタンスを起動しました。ストレージは 32GB を割り当てました。

2. スワップの作成


t4g.micro インスタンスはメモリが 1GB しかないため、ビルドができません。なのでスワップを割り当てます。(全体で 4GB あればよいと思います)

sudo dd if=/dev/zero of=/swapfile bs=128M count=32
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo swapon -s
sudo sh -c "echo '/swapfile swap swap defaults 0 0' >> /etc/fstab"

3. pip と opencv のインストール


sudo apt update
sudo apt upgrade -y
sudo apt install python3-pip python3-opencv -y

4. YOLO v5 のインストール



git clone https://github.com/ultralytics/yolov5.git
cd yolov5
pip install -r requirements.txt

pip で、以下の画面表示で時間がかかりますが、待っていれば終わります(topコマンドで見ているとハングしていないことがわかります)

Building wheels for collected packages: grpcio
  Building wheel for grpcio (setup.py) ... \

5. 適当な画像を取得して推論



cd ..
wget "https://~~~~/ABCDEFG.jpg"

cd yolov5
python3 detect.py --source ../ABCDEFG.jpg


初回の実行で、最新のモデルが自動ダウンロードされました。

/home/ubuntu/.local/lib/python3.8/site-packages/torchvision/io/image.py:11: UserWarning: Failed to load image Python extension:
  warn(f"Failed to load image Python extension: {e}")
detect: weights=yolov5s.pt, source=../ABCDEFG.jpg, data=data/coco128.yaml, imgsz=[640, 640], conf_thres=0.25, iou_thres=0.45, max_det=1000, device=, view_img=False, save_txt=False, save_conf=False, save_crop=False, nosave=False, classes=None, agnostic_nms=False, augment=False, visualize=False, update=False, project=runs/detect, name=exp, exist_ok=False, line_thickness=3, hide_labels=False, hide_conf=False, half=False, dnn=False
YOLOv5 ? v6.0-163-gd95978a torch 1.10.1 CPU

Downloading https://github.com/ultralytics/yolov5/releases/download/v6.0/yolov5s.pt to yolov5s.pt...
100%|???????????????????????????????????????????????????????????????????????????????????????????| 14.0M/14.0M [00:00<00:00, 189MB/s]

Fusing layers...
Model Summary: 213 layers, 7225885 parameters, 0 gradients
image 1/1 /home/ubuntu/ABCDEFG.jpg: 448x640 1 person, 1 tie, 1 cup, 1 chair, 1 dining table, 1 clock, Done. (0.389s)
Speed: 1.5ms pre-process, 388.9ms inference, 15.4ms NMS per image at shape (1, 3, 640, 640)
Results saved to runs/detect/exp


結果は、以下のフォルダに保存されました。この画像ファイルにはバウンディングボックスが描画されています。
/home/ubuntu/yolov5/runs/detect/exp/ABCDEFG.jpg

上のログによると、
 前処理:   1.5ミリ秒
 推論 :388.9ミリ秒
 ボックスごとのNMS :15.4ミリ秒
のようです。1秒以内で推論できるようですね。

※著作権の関係で推論に使った画像は公開できないのですが、カップとクロックは誤認識でした。

6. まとめシェル


Step2~4 を格納したシェルを用意しました。以下のコマンドでシェルをダウンロードできます。

curl -O "https://aritel.net/public_shells/install_yolov5_t4gmicro.sh
bash -x install_yolov5_t4gmicro.sh



日曜日の朝3時に目が覚めてしまいましたので、React のWebサイトを新規に立ち上げて遊んでました。

Dockerのubuntu:20.04コンテナで、インストールしてWeb画面を表示するところまでの簡単な手順です。


1. 前提


Windows に Docker Desktop をインストールしました。


2. ubuntu コンテナの起動


コンテナの起動に際して、ポートフォワーディングが必要なのですが、Docker Desktop の画面でやり方がわからなかったため、docker run コマンドで実行しました。コマンドプロンプトを起動して、以下のコマンドを実行します。

> docker run -p 8080:8080 -it ubuntu:20.04 /bin/bash


3. nodejsのインストール



こちらを参考にしつつ、以下のコマンドでインストールします。

> apt update
> apt install nodejs npm


4. React App の作成



シンプルに Create React App を使いました。

> npx create-react-app my-app
> cd my-app


5. ビルド



追加の実装は何もしてないのですが、プロダクションビルドを実行します。

> npm run build

これで、追加で build ディレクトリが作成されました。


6. Webサーバのインストール



手短に http-server をインストールします。ただし、執筆時点の最新版(v14.0.0)だと、表示時にエラーが出てしまうので、古いバージョンで比較的ダウンロード数が多い v0.12.3 にしました。(セキュリティパッチなどが当たっていない可能性があるので、本番用としては使えないですね)

> npm install -g http-server@0.12.3


7. サーバーの実行



ビルドされたファイルがあるディレクトリで、コマンドを実行します。

> cd build
> http-server


8. ブラウザで表示する



ホストOS (Windows) 側でブラウザを立ち上げて、 localhost:8080 にアクセスします。




無事に表示されました。

aws の t4g インスタンス(AWS Graviton プロセッサ)のインスタンスが現時点で一番安価で何か使えないかなぁと思い、t4g.micro インスタンスで、Amazon Linux 2 と ubuntu 20.04 で、tensorflow が簡単にインストールできるのか試してみた。

> python3 -m pip install tensorflow

コマンドが通るかを試したけど、そんなモジュール無いというメッセージでインストールできず。

t2.micro では、Amazon Linux 2 ではそのままインストールができる。

ubuntu では、まず apt install python3-pip を行って pip をインストールしてから実行するとインストールできる。が、Disk Full で完了しなかったけど。

RaspberryPi(B)でJavaでアプリを作るメモ。

インストール関連


デフォルトではJDKが入ってないけど、簡単にインストールできます。
apt-get upgrade
apt-get install oracle-java8-jdk

アプリの自動起動


サイネージとして使うとか、OS起動とともに自動起動したいとき。

まずは簡単に起動するためのシェルを作る。
#!/bin/bash
java -jar ~pi/my_app/my_app.jar

起動するための設定を ~/.config/lxsession/LXDE/autostart に追記する。
@~/my_app/exec_my_app.sh

続きを読む

↑このページのトップヘ