YOLOv5 での学習(デフォルト値で)
先日は、t4g.micro インスタンスでYOLO v5 による推論を実行してみました。
今日は、学習をさせてみたいと思います。
先日と同じ手順で、EC2にYOLO v5 をセットアップしました。t4gの無料キャンペーンがなくなった?(表示されなくなった)ので、t2.micro にしました。
学習は、以下のコマンドで実行できます。オプションで、独自のデータセットや初期パラメータを指定できますが、まずはデフォルトのままで。すると、coco128データセットとデフォルトの学習済みパラメータを使っての学習が実行されるようです。
python3 train.py
先日のとおり、4GBのスワップ(+1GBの標準メモリ)で実行したところ、途中で OOM キラーにより強制終了させられてしまいました。どうやら、学習は推論以上にリソースを食うようです。
追加で 4GB のスワップを設定して実行しました。今度は、学習がちゃんと動き出したようなのですが、やたらと遅い。
1バッチ目を終えるのに6分ほどかかりました。引き続き、2バッチ目・3バッチ目と進みますが、徐々に学習時間が遅くなっていきました。topコマンドで確認すると、CPUは上がらなくなっていて、kswapd0 プロセスが上位に出ています。
どうやら、メモリアクセスが頻繁すぎてスワップファイルの交換が追い付かなくなっているようです。
次に、よりメモリの多い t3.large で再実行しました。搭載メモリが 8GB あるので、十分かもしれません。
同様に実行したところ、スワップ無しだとやはりOOMキラーで終了してしまいました。スワップファイル 4GB を追加したところ、継続的に学習されるようになりました。
top コマンドで確認すると、学習には約7GB のメモリが必要なようです(t2.micro では、搭載メモリが1GBあるので、スワップを含めて9GB用意できていた)。
学習を行うと、途中経過やモデルが /runs/train/exp に保存されます。
1バッチが終わると、train_batch0.jpg などの学習状況を示す画像が生成されました。
1エポックが終わると、results.csv と、weightsフォルダ内に best.ptとlast.ptが生成されました。これらを取得すると学習状況やその時点までの最適・最終モデルが取得できるようです。
1エポックの処理時間は、T3Unlimited 下で、おおよそ3分といった感じですね。途中のログでは、 16.75s/it と出てました(今回のデフォルトでは8バッチだったので、134秒となり、バリデーションを含めると3分ぐらいな気がします)
今日は、学習をさせてみたいと思います。
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でYOLO v5 を動かす
t4g.micro インスタンスに YOLO v5 を単純にインストールして、推論してみました。こちらの公式サイトを参考にしつつ実施しています。
Step2~4 を格納したシェルを用意しました→こちら
AWS コンソールで、ubuntu 20.04 (ARM) を選択して、t4g.micro インスタンスを起動しました。ストレージは 32GB を割り当てました。
t4g.micro インスタンスはメモリが 1GB しかないため、ビルドができません。なのでスワップを割り当てます。(全体で 4GB あればよいと思います)
git clone https://github.com/ultralytics/yolov5.git
pip で、以下の画面表示で時間がかかりますが、待っていれば終わります(topコマンドで見ているとハングしていないことがわかります)
cd ..
cd yolov5
初回の実行で、最新のモデルが自動ダウンロードされました。
結果は、以下のフォルダに保存されました。この画像ファイルにはバウンディングボックスが描画されています。
上のログによると、
前処理: 1.5ミリ秒
推論 :388.9ミリ秒
ボックスごとのNMS :15.4ミリ秒
のようです。1秒以内で推論できるようですね。
※著作権の関係で推論に使った画像は公開できないのですが、カップとクロックは誤認識でした。
Step2~4 を格納したシェルを用意しました。以下のコマンドでシェルをダウンロードできます。
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