Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PyTorchモデルの組み込み変換 / Pytorch Model Conversion

PyTorchモデルの組み込み変換 / Pytorch Model Conversion

Henry Cui

April 29, 2023
Tweet

More Decks by Henry Cui

Other Decks in Programming

Transcript

  1. PyTorchモデルの組み込み変換
    機械学習の社会実装勉強会第22回
    Henry
    2023/4/29

    View full-size slide

  2. Pytorchモデルを変換するモチベーション
    ■ モデル開発においては、Pytorchのエコシステムが活発
    ■ モデルデプロイ、特にエッジデバイスにおいては、Tensorflow
    のエコシステムが活発
    ■ Pytorchでモデルを学習して、Tensorflowモデルに変換しデプ
    ロイすることが考えられます
    ■ 今日はこの流れの基本と注意点について紹介
    2

    View full-size slide

  3. Pytorch ⇛ Tensorflow
    ■ 一回だけの変換ではできない
    ■ エッジではTF Liteモデルが多いので、実は以下のアプローチ
    になる
    ● Pytorch ⇛ ONNX ⇛ Tensorflow ⇛ TF Lite
    ■ 一つずつ見ていきます
    3

    View full-size slide

  4. Pytorch ⇛ ONNX
    ■ Open Neural Network Exchange (ONNX) は共通になろうと
    するニューラルネット記述方式
    ● https://onnx.ai/
    ■ pytorch_modelにモデルをロード
    ● 例えば pytorch_model = timm.create_model('mobilenetv2_100')
    ■ torchに内蔵された関数で変換できる
    ● torch.onnx.export(model=pytorch_model,
    args=torch.ones((1, 3, 224, 224)),
    f='./model.onnx',
    input_names=['input'],
    output_names=['output'])
    4

    View full-size slide

  5. ONNX ⇛ Tensorflow
    ■ ONNXライブラリに内蔵された関数で変換できる
    ■ モデルロード
    ● onnx_model = onnx.load('./model.onnx')
    ■ モデルチェック
    ● onnx.checker.check_model(onnx_model)
    ■ モデル変換
    ● from onnx_tf.backend import prepare
    prepare(onnx_model).export_graph('./model.tf')
    5

    View full-size slide

  6. Tensorflow ⇛ TF Lite
    ■ Tensorflowに内蔵される関数で変換できる
    ■ 変換準備
    ● converter =
    tf.lite.TFLiteConverter.from_saved_model('./model.tf')
    ■ 変換実行
    ● tflite_f32_model = converter.convert()
    ■ 変換書き出し
    ● with open('./model.tflite', 'wb') as f:
    f.write(tflite_f32_model)
    6

    View full-size slide

  7. Netronでモデル構造を可視化
    ■ ニューラルネットの構造と入出力の形を可視化するツール
    ● https://github.com/lutzroeder/netron
    ● パッケージ版とブラウザ版がある
    ■ 生成されたTF Liteモデルを渡すと
    ● 至るところでTranspose!
    7

    View full-size slide

  8. ライブラリのNCHWとNHWC
    ■ Pytorchを含むほとんどのライブラリは Batchsize, Channel ,
    Height, WidthのNCHW形式を取る
    ■ 残念ながらTensorflowがNHWC形式
    ■ 先のやり方では、ONNXをTensorflowへの変換では、NCHW
    の痕跡はまだ残っているので、計算の前後などでTranspose
    を入れてデータの軸を調整しないといけない
    8

    View full-size slide

  9. パラメータの軸を変換する
    ■ 以下のツールを使えば、NCHW形式のONNXモデルをきれい
    にNHWC形式のTensorflowモデルに変換できる
    ● https://github.com/PINTO0309/onnx2tf
    ■ 名の通り、ONNX ⇛ Tensorlflowなので、全体の変換手順が
    Pytorch ⇛ ONNX ⇛ Tensorflow ⇛ TF Liteのままで変わらな

    9

    View full-size slide

  10. 変換結果
    ■ Transpose層がちゃんと消えて、入力もNHWCに
    ■ バッチサイズ1の推論スピードも速くなる
    ● 改善前の10回平均:11.19 e-3秒 (±0.28 e-3秒)
    ● 改善後の10回平均: 7.82 e-3秒 (±0.14 e-3秒)
    10

    View full-size slide

  11. まとめ
    ■ モデル変換の基本
    ■ NCHWとNHWCの違いと注意
    11

    View full-size slide