物体検知AIモデルの軽量化リベンジ
こんにちは、小野です。前回に引き続き、「AIモデルの軽量化」のお話しです。まだまだ試行錯誤を続けて、AIモデル軽量化技術「PCAS」の可能性を探っていきます。
過去の回をご覧になられていない方は、ぜひ以下のリンクから過去の回をご覧ください!
(某探偵アニメのオープニング曲♪)
俺はOKIアイディエス、小野。
大先輩の渉さんと一緒にOKI独自のAIモデル軽量化技術『PCASを使ったYOLOXのAIモデルの軽量化に挑戦し、どのくらい軽量化できるのか試した。
早く実行して学習結果を得るのに夢中になっていた俺は、スクラッチ学習の条件設定が最適化されていないことに気づかなかった!
俺は、スクラッチ学習の時間短縮のためCOCOの代わりに、より小さいデータセットのCOCO128というデータセットを使ってみたが、全然精度が出ない結果となってしまった!
COCO128はあくまでAI実装デバッグする用途で作られたものだから、データ量が少なすぎたね。
このままではまた命を狙われ、周りの人間にも危害が及ぶ…。
それは冗談ですけど、このままでは悔しいので、「見た目(モデルサイズ)は子供、頭脳(性能)は大人」な物体検知AIモデルを目指して、PCASのリベンジをします。
そいつはいい!!前回の反省を活かして効率的にモデル軽量化してみよう。せっかくの改善案を活かさないのは試さないのはもったいない。リベンジマッチといこうか!
前回の反省
データセットは増やさないとだな。クラス毎に画像は1,500枚、クラス毎にオブジェクト数10,000個程度はそれぞれあることが理想だとされている。
ラジャー!データセットはCOCOを使うのがよさそうですね。でも、前回のブログでも書きましたが、スクラッチ学習と軽量化に1ヶ月もかかるのは、正直ありえません。次のブログ更新に間に合わなくなるし…。
まあブログ更新の事情は一旦置いておこうか(笑)
前回の終盤に出た改善案を盛り込んでいこう。
前回挙がった案としてスクラッチ学習のバッチサイズを大きくする案、それから、PCASループ数を減らして、圧縮率を高めることで、より効率的にモデルサイズを小さくするという案がありました。
この2つなら、実行コマンドですぐ調整できるからやってみるか。PC環境も前回と同じPC環境を用意してあるから、やってみてくれ。
ありがとうございます。ネットでバッチサイズについて調べると、32や64くらいが適切なようです。あまり大きくしすぎるとメモリー不足でエラーとなってしまうので、今回のバッチサイズは32にしてみます。
圧縮率は0.3にしてみます。CIFAR10モデルを以前軽量化した時、0.3に設定すると良好な結果が得られました。少ないPCASループ数で効率的に軽量化するなら、この値が適切だと思います。
おぉ、今までの知見が活かされているね。今回のPCASループ数は3回に設定しようか。あんまり多すぎると、しまいには精度が急激に落ちてしまうこともあるから慎重にな。
了解です。じゃあ早速、それらをもとに下記コマンドで実行してみますね。

10日後…
あれから10日ほどが経ちました。
とてもとても長い闘いでした。
でも実際はコマンド実行して後はただ待っていただけでしょ。
1エポックあたりどれくらい時間がかかっていたんだい?
実行中もときどき確認していたので、だいたい1エポックあたり15~20分くらいでしたね。多く見積もって20分×200エポック×3イテレーション=12,000分といったところでしょうか。10日というのは妥当な結果と思います。
1ヶ月もかかるよりは全然いいね。気になる結果のほうは…?
前回は精度が計算されませんでしたが、今回は精度や損失が計算されています。下記は軽量化3回目の軽量化と再学習後の結果の抜粋です。

モデルサイズも含めて整理してみた結果がこちらです。
ご覧ください。モデルサイズはPCASループが1回完了するごとに出力される.ckptファイルのサイズを見ています。

軽量化実施回数 |
val/AP@0.5 |
損失(Loss) |
モデルサイズ(MB) |
学習 |
0.62 |
0.46 |
101.69 |
1回目 |
0.61 |
0.48 |
60.78 |
2回目 |
nan |
0.54 |
36.77 |
3回目 |
0.59 |
0.61 |
22.63 |
ダジャレだね(笑)
この“nan”というのは、精度の指標となるAP50が正常に計算されなかったときに出力されるものだね。
ということは3回目の軽量化はうまくいっていないのでは?
その心配はないよ。mAPはあくまで評価(validation)で出力されるから、3回目の軽量化は正常に行われているよ。mAP算出の途中で偶然ゼロ除算でも発生したのかもしれない。PCASループをかけなおしてみれば、正常に計算されると思うよ。
なるほど。
一旦これは無視して、AP50を見ていきましょう。0.62, 0.61, 0.59という値ですが、これは高い方なのでしょうか?
YOLOXに関する論文などを調べると、性能指標としてAP50は0.65~0.69程度と言われるけど、それに近い値だ。軽量化が進んだ分としては妥当な結果だよ。YOLO v3なんかは0.63程度のようだね。
なるほど!
今回の結果を見るとAP50は、PCASループを実行する回数を重ねるにつれて、少しずつ減少していますが、ほんのわずかです。キープできているといえるのではないでしょうか。
損失を見ると、軽量化するたびに上がっていくのがわかる。軽量化が進むたびに精度の低下に伴ってこれも上がっていくのは仕方ないね。圧縮率を下げるか、繰り返し数を少なくすることで損失の増加は抑えられるけど、精度の低下と同様に、モデルサイズとのトレードオフになっているな。
開発者の見極めが大事になります。
その点を踏まえて、最初の軽量化実行時のパラメータを検討する必要がありますね。
そして、モデルサイズの話が出ましたが、この部分は大きく減少しています。101.69MBから最終的に22.63MBまで小さくすることができました。約77.7%の削減です!
時間はかかったけど、『PCAS』がYOLOXモデルに対しても軽量化の効果があることがわかったな。あと、今さらだけど、エポック回数の調整次第でもう少し時間短縮はできるかもしれない。
といいますと?今はエポック数200で実行しましたよね。
最初のスクラッチ学習時は精度が高くなるよう、エポック数を300くらいで実行して、以降のPCASループでの軽量化時のエポック数は100にする。そうすると精度も維持して時間短縮できそうかな。
なるほどです。バッチサイズも今回は32で設定しましたが、64とかでも動くようです。どこまで大きくできるかはやってみないとわからないですが、刻んでなるべく大きめに設定するとよいかもですね。
最後に
試してみたいことは一通りできて、結果も得られたしリベンジは成功だね!
ボスじゃないですか。推理、いや考察の時間は終わりましたよ?
なんだと?!さっきまで妙に眠くて眠くて、来るのが遅くなってしまいました。まるで麻酔でも打たれたかのように…。
ま、麻酔銃も蝶ネクタイ型変声機も持ってないですよ!!ほら、最近ブログでの出番が多すぎたから疲れてるんですよ。
ところで、YOLOXモデルをずっと軽量化してきましたが、YOLO v8など試したいモデルはまだまだあります。さらには物体検知に限らず姿勢検知とかセグメンテーション…。
我々の取り組みで『PCAS』に興味を持ってくれた読者の方々もいるんじゃないかな?
実は最近『PCAS』に関するご相談やお問い合わせをいただく機会が少しずつ増えてきました。「こんなAIモデルはPCASで軽量化できるだろうか?」とお考えの方はぜひお気軽に相談ください!
次回のブログ更新は5月を予定しています。
お楽しみに!
- ※記載されている会社名、製品名は、各社の商標または登録商標です。
- ※ここに記載されている仕様、デザインなどは予告なしに変更する場合があります。