Tech Blog

見せてもらおうか、OKIの「PCAS」の性能とやらを…!

人物
小野です!
よろしくお願いします!!

こんにちは、小野あらため、オノ・アズナブルです。
今回は、PCAS(Pruning Channels with Attention Status)ツールを実際に使って、AIモデルを軽量化、その性能、実力を徹底的に暴いてやります!乞うご期待!!
前回からの続編になりますので、まだ前回をご覧になっていない方は、こちらも是非ご覧ください。









PCASの仕組み

人物
というわけで前回は環境構築が完了したな。
今回はいよいよPCASツールでAIモデルを軽量化していくぞ!
人物
ついにその性能が見られるんですね…!
その前に質問です。PCASは枝切りによって、AIモデルの中の不要なニューロンや接続を取り除く技術というのは理解しました。
その枝切りのステップをもう少し詳しく教えてもらおうか…。
人物
ん?今日は、なんか口調がいつもと違うような?
人物
今日は「PCAS」の性能を暴くということで、あるキャラになり切っているのだよ!
まあ、気にしないでください。
人物
そっか、じゃあ気にせずに進めよう….。
ふむ、そこの解説はしていなかったか。
PCASはattention、prune、trainという3つのモードを
順番にループさせて軽量化するという仕組みなんだ。

軽量化処理ループと各モード

人物
それぞれどんな処理がされているんですか?
人物
最初のattentionモードでは、学習したAIモデルの
アテンションモジュールの接続と学習を行うんだ。
アテンションモジュールは、ニューラルネットワークの
畳み込み層の出力に挿入する小型モデルのこと。
全ての層に対してこれを実施して、アテンション統計量を取る。推論結果に大きく寄与していればしているほど、高い値を出力するんだ。
人物
アテンション統計量ってニューロンの重要度を示すものですよね。どの層で枝切りをするのか決定するのに役立てられているんですね。
人物
そう!次のpruneモードでは本格的に枝切りを行う。
しかし、枝切りを行っただけでは、モデルの精度の
劣化が起きてしまう。
人物
となると対策が必要になりますよね。
人物
そこで、trainモードでファインチューニングを行い、
一度落ちた精度を回復させるんだ。この3つをループ制御し、少しずつAIモデルを軽量化していくんだ。
人物
各モードが実行されるたびに.ckptファイルというのが
生成される。これは学習モデルの計算やパラメータの数、更新された重みなどが含まれていて、いわば軽量化の進捗をまとめたファイルなんだ。
人物
これを次のモードに渡すことで処理が進められる仕組みなんですね。
人物
でも、少しずつ軽量化するより一気に軽量化する方が、
楽ちんだと思うんですけど…。
人物
段階的に軽量化を行うのには理由があるんだ!
1ループで一気に軽量化する設定にしてしまうと、必要なニューロンもまとめて削除されてしまって精度がガクンと落ちてしまう可能性が高いんだ。
でも少しずつ軽量化することで精度の劣化を抑えられるから、後でやってみたときの結果を楽しみにしてくれ。
人物
だからちょっとずつなんですね。
実際にその傾向が見られるのか気になります。
PCASを利用して結果を見てみたくなってきました!








PCASの実行

人物
今回はPCASツールのExampleフォルダ内のモデルと
データセットを活用して軽量化しようか。
人物
色んなモデルとデータセットが用意されているんですよね、どのモデルにしようか悩むな…。
人物
今回は、その中からデータセットはCIFAR 10、
モデルはVGG11を使用します。
人物
勝手に決められてしまった…。
ちなみにCIFAR 10は10クラス分類の画像データセットです。VGG11は8層の畳み込み層と3層の全結合層、
合計11層からなる畳み込みニューラルネットワークです。
人物
読者の皆さんへのご説明ありがとう。
ターミナルからPCASループを含む“train_plain.py”というファイルを実行するんだ。学習と軽量化を分けて行うこともできるけど、今回は学習と軽量化を連続実行してみよう。

python examples/classification/train_plain.py \
--outdir /path/to/output \
--data_dir /path/to/cifar10 \
--dataset cifar10 \
--model vgg11_cifar \
--pl_module classifier_plain \
--mode train \
--pcas_max_iters 6 \
--max_epochs 200 \
--learning_rate 0.1 \
--finetune_lr_ratio 0.5 \
--batch_size 128 \
--devices 1

人物
ここで設定している項目を簡単に説明するよ。

--outdir /path/to/output \   出力データの生成ディレクトリの指定(指定がなければ自動で生成)
--data_dir /path/to/cifar10 \  使用データセットのディレクトリの指定
--dataset cifar10 \       使用するデータセットの指定
--model vgg11_cifar \     使用するAIモデルの指定
--pl_module classifier_plain \ 登録した関数の呼び出し
--mode train \         開始時のモード指定(通常はtrainを指定)
--pcas_max_iters 6 \      イテレーション(重みの更新)回数の指定(軽量化実施前の学習を含む)
--max_epochs 200 \      最大のエポック数(計算回数)の指定
--learning_rate 0.1 \      学習率の指定
--finetune_lr_ratio 0.5 \    ファインチューニングの学習率の指定
--batch_size 128 \       バッチサイズの指定
--devices 1   \       使用するGPU数の指定

PCの環境
CPU: Xeon2123 3.60GHz コア数:8
GPU: GeForce RTX 2070 SUPER
OS: Ubuntu20.04.6
Nvidia ドライバー:476.256.02
CUDA:11.3

人物
わかりました。
初めてのAIモデル軽量化ですけど、まずは半分くらいのサイズに削減してみたいです。
人物
PCASはループを繰り返して軽量化するけど、何回繰り返すのかを指定するのが
イテレーション“pcas_max_iters”だよ。
各イテレーションにおけるモデルの圧縮率を追加で指定できたりするんだ。
とくに指定がなければ、デフォルトで15%だ。
人物
他にも細かな設定ができるようですが、今回はこの設定で挑戦します。
人物
ポチっとな。…動き出しました!
少し時間がかかるんですね。この感じだと数時間程度かな。
人物
結果が出るまで待ってよう。ということで…。
人物
計算結果出力の完了は数時間後を予定しています。
お楽しみに!!








数時間後…

人物
結果出力に3時間くらいかかりましたが、軽量化が完了したみたいです。ということで早速結果を確認します。
ドキドキです…!
人物
あ、終わったんだ。終わると最後に各イテレーションにおける精度や削減したパラメータ数についてまとめられたconsole.logというのが出力されるから、それをチェックするぞ。

console.log

人物
これがPCASによる軽量化を5回実施した結果です。軽量化前に比べると、たとえばParam数が前のイテレーションの時と比べて、24.62%削減されているのがわかります。まさに軽量化ですね。認識精度の方はどうなんでしょう。
どこを見ればわかるのかな。
人物
他にも結果についてまとめたファイルが出力されているはずだ。今度はそのうちの1つ、認識精度や損失の情報が記録されているpcas_summary.yamlをチェックするぞ。
  • 軽量化1回目

pcas_summary.yaml

  • 軽量化5回目

pcas_summary.yaml

人物
学習直後のVal/accuracyに着目すると93.13%であることがわかるね。それに対して軽量化5回目のVal/accuracyは90.96%と少し下がっていることがわかる。
人物
なるほど!ちょっとだけ認識精度が下がっています!
モデルサイズはどのように確認するのでしょうか?
人物
さっき説明した各trainモードの.ckptファイルのサイズを参考にするとモデルサイズがどのように推移しているかがわかるよ。認識精度とモデルサイズをグラフにまとめてみると…。

pcas_summary.yaml

人物
こんな結果になりました。
認識精度は93.1%から91.0%に変化して、2%程度落ちていますが、モデルサイズは38MBから13MBまで削減することができています。
おおぉぉぉ!認識精度をほぼ維持しつつ約65%モデルサイズを削減できているではないかぁ!!
人物
どれだけモデルサイズや認識精度が変化するかはAIモデルにもよるけど、今回はPCASの効果がよく見えたな。








計10回軽量化してみる

人物
渉さん、これって軽量化をもっと進めたらさらにモデルサイズを小さくできるんじゃないですか?
どこまでモデルサイズを削減できるか試してみましょうよ!
人物
軽量化を進めれば進めるほど、認識精度は少しずつ落ちていくけれど、限界まで軽量化した後は認識精度が突然落ち始めるポイントがあるはずなんだ。そこを探してみようか。
人物
はい、さらに5回追加してPCASで軽量化してみるぞ!!
見せてもらおうか、その実力を!!

モデルサイズと認識精度

人物
やはり急に認識精度が落ち始めるタイミングがあるね!
9回目のプルーニング後に認識精度が少し落ち始めていて、プルーニング10回目で大きく落ち始めているね。
人物
8回のプルーニングの結果、認識精度は93.1%から90.3%に、モデルサイズは38MBから6MBにそれぞれ変化しました。
一方、モデルサイズは8回目、9回目のプルーニングあたりからあまり変化が見られなくなりました。
ということは9回目がAIモデル軽量化の限界のようですね!!
人物
使用するAIモデルやPCASに設定するパラメータによって、結果は変わってくるけれど、このようにパラメータを調整しながら、認識精度やモデルサイズを…。
人物
見極めることができるんですね!「認識精度」を優先するのか、それとも「モデルサイズ」を優先するかといった、どこに重きを置くか、閾値をどう設定するのか、このように結果を見ながら、考えられるのが大きなメリットですね。








圧縮率を変えてみる

人物
パラメータを調整したら…という話が出たね。
モデルサイズをどの程度小さくするかに大きく関わるのが、圧縮率というパラメータなんだ。これを変えるとどのような結果になるのか…?
人物
その検証も早速試してみましょうよ。
今までの軽量化では圧縮率はデフォルトの15%です。
今度は圧縮率10%と30%それぞれで試してみます。PCASループを実行するときに圧縮率を指定できるんですよね。
人物
圧縮率を表す関数comp_rateを設定して、以下のように実行!

python examples/classification/train_plain.py \
--outdir /path/to/output \
--data_dir /path/to/cifar10 \
--dataset cifar10 \
--model vgg11_cifar \
--pl_module classifier_plain \
--mode train \
--pcas_max_iters 10 \
--max_epochs 200 \
--learning_rate 0.1 \
--finetune_lr_ratio 0.5 \
--batch_size 128 \
--comp_rate 0.10 \   圧縮率30%のときは0.3に設定
--devices 1

人物
結果が出ました。
ふむふむ、さっきと同じようにグラフにまとめます。

モデルサイズと認識精度

人物
圧縮率30%で実行したときはプルーニング5回目の時点でモデルサイズがこれ以上下がらない兆候が見えたので、ここで終了しました。
モデルサイズの変化に着目すると、どの圧縮率においても序盤のプルーニングでは大きく変化していることがわかります。圧縮率が高いとその分、モデルサイズも大きく削減されていることがわかります。
人物
一方、認識精度に着目すると、どの圧縮率においてもなだらかに認識精度が減少している傾向があるね。でも、圧縮率が高いほど、認識精度が落ちやすいみたいだ。認識精度が大きく減少するまでのプルーニング回数も、圧縮率が高いほど、少ないことがわかる。
人物
そして、モデルサイズがサチると、その後のプルーニングで認識精度も大きく落ちるという共通点もわかりました。
人物
圧縮率が高い場合、プルーニングする際に次の学習で重要となるはずだったニューロンが多く削除されてしまったことで、認識精度が大きく劣化してしまったのかもしれない。
圧縮率10%のように低い場合では、プルーニング9回目で認識精度がこんなに下がったけど、実際に認識精度の低下は少ないよね。
人物
興味深い結果になりましたね。
今回は一気通貫でPCASによる軽量化を行いましたけど、それぞれ3~5時間程度と結構長い時間がかかりました。
たとえばイテレーションの数を少なめに設定して、圧縮率は高めに設定して最初は実行して、その後はイテレーションの数を多く、圧縮率を低めに設定すると効率が良くなると思います。
人物
もっと良い性能のGPU搭載のグラフィックカードに変えたり、グラフィックカードの数を増やしたりすると、さらにPCASの処理が速く早くなるだろうね。さらに今回は変えなかったけど、ファインチューニングの学習率のパラメータを変化させることでも、軽量化の結果が変わってきそうだね。
人物
なるほど…。もっと検証したいことが出てきますね。
面白いなぁ~…。
人物
アレもコレも気になる…。
ああ、大型のモデルの軽量化も試してみたいな…
三日三晩くらいかかるかもしれないけど…。
人物
やりたいですけど、帰れないのはイヤですよぉ!
人物
どうもお坊っちゃん育ちが身に染み込み過ぎる、甘いな…。
人物
若者をいじめないでいただきたい。
(昭和とは違うのだよ!昭和とは!!)
人物
心の声が漏れてるぞ…。
ということで、また今度。たくさん出てきた気になった点を、もっともっと検証していこう。
人物
乞うご期待!
人物
次回のブログ更新は12月を予定しています。
お楽しみに!
  • 記載されている会社名、製品名は、各社の商標または登録商標です。
  • ここに記載されている仕様、デザインなどは予告なしに変更する場合があります。
  • YouTube

お問い合わせ

お問い合わせ