ONNXのopsetとは
ONNXファイルには、ファイル作成時のバージョンとしてopsetを指定する機能があります。opsetの値に応じて、使用できるオペレータやその機能(オペレータのプロパティ)が変わります。特に指定が無い場合は最新のopsetとして扱います。
Deep Learning系のツールによってはONNXファイルのopsetの値を確認し、自分自身が処理できるかどうかを確認するルーチンが含まれています。そこの確認ルーチンではじかれた場合は、opsetを下げて再度ONNXファイルを作る必要があります。
ここを見るとそれぞれのオペレータが対応しているバージョンを確認出来ます。例えば、ABSではバージョンとして1,6,13が存在し、13ではABSで使える型としてbfloat16が追加されていることが分かります。
Kerasでopsetを指定してONNXファイルを作る
opsetの指定方法はコンバーターによって違いますが、大抵は引数にopsetのバージョンを指定できます。
keras2onnxを使う場合の指定方法です。
import tensorflow
import onnx
import keras2onnx
model_file = 'foo.h5'
#opsetを設定して保存
keras_model = tensorflow.keras.models.load_model(model_file)
onnx_model = keras2onnx.convert_keras(keras_model, 'foo1', target_opset=9)
target_opsetを指定することで、opset=9のONNXファイルが生成されます。
直接ONNXファイルを修正する
使われているオペレータが明らかに古いオペレータと互換性があることが分かっている場合(新しい機能を使っていない場合)、単にコンバータのチェックを通すためだけにONNXファイルのopsetの値を指定したい時もあります。この場合はONNXファイルを直接編集してopsetを変更することも出来ます。
上のソースの続きとして
onnx_model.opset_import[0].version = 10
with open("op10.onnx", 'wb') as f:
f.write(onnx_model.SerializeToString())
onnxファイルのopset_import[0].versionに直接値を指定しています。保存されるときには10がopsetとして使われます。
opsetの確認方法
てっとり早い方法としてはprint(onnx_model)で直接onnxを文字列として出力すると、最後の方にopset_importとして値が表示されます。
opset_import {
domain: ""
version: 10
}
opsetは10に設定されています。