先日は、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分ぐらいな気がします)