チュートリアル¶
学習済みのKerasモデルファイルをコンバートし、画像分類の推論実行及びチューニングによる高速化を行うチュートリアルを解説します。
なお、CLIツールおよびPythonパッケージのビルドと環境構築は完了しているものとします。
Kerasモデルのコンバート¶
CLIツールのimport-tensorflowコマンドを利用して、モデル名を指定したKerasモデルからDNNモデルへのコンバートを実行します。
このチュートリアルのコンバートではtf.keras.applicationsのVGG16をDNNファイルへのコンバートを実行します。
(softneuro)$ softneuro import-tensorflow --keras vgg16 vgg16.dnn
実行環境上でのプロファイリング・チューニング¶
コンバートで生成したDNNファイルを利用して、推論を実行する環境上でのプロファイリングおよびチューニングを行います。
各設定時の実行時間を計測・比較することで最適な設定内容を決定するので、
不要なアプリケーションは終了させた状態で実行することを推奨します。
チューニング処理の完了後、実行ディレクトリにvgg16_tuned.dnnが生成されたことを確認します。
(softneuro)$ softneuro tune vgg16.dnn vgg16_tuned.dnn
Profiling...100.0% [00:50]
[preprocessor]
# NAME SCHEMA ATIME TIME DESC PARAMS
0 input (source) * cpu
1 premute (permute) * cpu 136 cpu/naive
2 madd (madd) * cpu 18 cpu/avx {"ops_in_task":16384}
3 output (sink) * cpu
4 ? ()
154
[main]
# NAME SCHEMA ATIME TIME DESC PARAMS
0 input_1 (source) * cpu
1 block1_conv1 (conv2) * cpu 777 cpu/owc64_avx {"cache":8192,"task_ops":65536}
2 block1_conv2 (conv2) * cpu 5,680 cpu/wg2 {"tile_size":8}
3 block1_pool (max_pool2) * cpu 454 cpu/avx
4 block2_conv1 (conv2) * cpu 1,783 cpu/wg2 {"tile_size":8}
5 block2_conv2 (conv2) * cpu 2,930 cpu/wg2 {"tile_size":8}
6 block2_pool (max_pool2) * cpu 70 cpu/avx
7 block3_conv1 (conv2) * cpu 1,294 cpu/wg2 {"tile_size":8}
8 block3_conv2 (conv2) * cpu 2,280 cpu/wg2 {"tile_size":8}
9 block3_conv3 (conv2) * cpu 2,280 cpu/wg2 {"tile_size":8}
10 block3_pool (max_pool2) * cpu 45 cpu/avx
11 block4_conv1 (conv2) * cpu 1,362 cpu/wg2 {"tile_size":4}
12 block4_conv2 (conv2) * cpu 2,616 cpu/wg2 {"tile_size":4}
13 block4_conv3 (conv2) * cpu 2,616 cpu/wg2 {"tile_size":4}
14 block4_pool (max_pool2) * cpu 31 cpu/avx
15 block5_conv1 (conv2) * cpu 1,127 cpu/wg2 {"tile_size":2}
16 block5_conv2 (conv2) * cpu 1,127 cpu/wg2 {"tile_size":2}
17 block5_conv3 (conv2) * cpu 1,127 cpu/wg2 {"tile_size":2}
18 block5_pool (max_pool2) * cpu 22 cpu/avx
19 flatten (reshape) * cpu 0 cpu
20 fc1 (dense) * cpu 11,669 cpu/m1x1l_avx
21 fc2 (dense) * cpu 1,716 cpu/m1x1l_avx
22 predictions (dense) * cpu 210 cpu/avx {"task_ops":32}
23 predictions_softmax (softmax) * cpu 12 cpu/naive
24 sink_0 (sink) * cpu
25 ? ()
41,229
SCHEMAS cpu
TOTAL 41,383
また、attr
コマンドで TUNE 属性でスキーマを確認します。
(softneuro)$ softneuro attr -a vgg16_tuned.dnn
NAME NET INPUT OUTPUT #OPS CIPHER COMPRESS TUNE #THR AFFMASKS
vgg16_tuned.dnn preprocessor 1x224x224x3 1x1000 30,953,174,639 cpu
main cpu/naive
なお、プロファイルデータがファイルとして残るよう手動でinit
から実行する場合は以下のような手順となります。
(softneuro)$ softneuro init mobilenet.prof mobilenet.dnn
(softneuro)$ softneuro profile mobilenet.prof
(softneuro)$ softneuro tune mobilenet.dnn mobilenet_tuned.dnn --prof mobilenet.prof
チューニング結果の確認¶
チューニング前後のDNNファイルを指定してサンプル画像に対する推論を実行します。
ここでは例としてサンプルの画像ファイルshovel.jpgの推論(画像分類)を実行します。
表示される統計情報(Statistics)の推論処理(Dnn_forward())実行時間を比較することで、
チューニングによる推論高速化の効果を確認することができます。
速度測定結果の安定化のためにd -loop
オプションの指定が有効です。
詳細は runコマンドのオプション を参照してください。
チューニング前のDNNファイルを利用した推論実行
(softneuro)$ softneuro run vgg16.dnn shovel.jpg --top 5
---------------------------------
Top 5 Labels
---------------------------------
# SCORE LABEL
1 0.9948 shovel
2 0.0017 hatchet
3 0.0012 swab
4 0.0011 broom
5 0.0007 hammer
---------------------------------
Statistics
---------------------------------
FUNCTION AVE(us) MIN(us) MAX(us) #RUN
Dnn_load() 326,679 326,679 326,679 1
Dnn_compile() 333,007 333,007 333,007 1
Dnn_forward() 199,992 199,992 199,992 1
Used memory: 1,140,817,920 Bytes
チューニング後のDNNファイルを利用した推論実行
(softneuro)$ softneuro run vgg16_tuned.dnn shovel.jpg --top 5
---------------------------------
Top 5 Labels
---------------------------------
# SCORE LABEL
1 0.9948 shovel
2 0.0016 hatchet
3 0.0012 swab
4 0.0011 broom
5 0.0007 hammer
---------------------------------
Statistics
---------------------------------
FUNCTION AVE(us) MIN(us) MAX(us) #RUN
Dnn_load() 325,598 325,598 325,598 1
Dnn_compile() 446,959 446,959 446,959 1
Dnn_forward() 68,648 68,648 68,648 1
Used memory: 890,712,064 Bytes
DNNファイルの暗号化¶
cipher
コマンドでDNNファイルを暗号化することで設定内容を秘匿することができます。
cipher
コマンド完了後、実行ディレクトリにvgg16_tuned_enc.dnnが生成されます。
暗号化されたDNNファイルは CIPHER 属性がpassword
となります。
また、暗号化されたDNNファイルはview
コマンドを実行した際に情報が表示されなくなります。
(softneuro)$ softneuro cipher --new-pass 123456 vgg16_tuned.dnn vgg16_tuned_enc.dnn
(softneuro)$ softneuro attr -a vgg16_tuned_enc.dnn
NAME NET INPUT OUTPUT #OPS CIPHER COMPRESS TUNE #THR AFFMASKS
vgg16_tuned_enc.dnn ? password (invalid)
(softneuro)$ softneuro view vgg16_tuned_enc.dnn
mor_dnn.c:908:Error: Invalid password for dnn.
(softneuro)$ softneuro run vgg16_tuned_enc.dnn -p 123456
---------------------------------
Statistics
---------------------------------
FUNCTION AVE(us) MIN(us) MAX(us) #RUN
Dnn_load() 419,614 419,614 419,614 1
Dnn_compile() 860,013 860,013 860,013 1
Dnn_forward() 203,562 203,562 203,562 1
Used memory: 1,138,716,672 Bytes