コンテンツにスキップ

チュートリアル

学習済みの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