今年も、2024年カレンダーを作成しました!

IMG_20231201_091458_446

お世話になりました。

先日は、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



↑このページのトップヘ