onnx ファイル内の冗長ノード「identity」を削除します。
モデルのデプロイのプロセスで、変換された onnx モデルに多数の「アイデンティティ」ノードが含まれていることがわかりました。実際に測定したところ、これらのノードはonnxの推論結果やonnxから変換されたtensorrt推論エンジンの推論結果には影響を与えませんが、onnxの推論速度に重大な影響を与えることが分かりました。同時に、変換された tensorrt ファイルも通常よりもはるかに大きくなり、推論速度にも重大な影響が生じます。
したがって、「アイデンティティ」ノードのプルーニング プロセスとコードをここに記録します。
アイデンティティノード
なぜ「アイデンティティ」ノードがたくさんあるのかはまだわかりませんが、最終的な結果には影響せず、速度だけが影響を受けるようです。私の onnx ビジュアライゼーションは次のようになります:
カット後、次のようになります:
カット後、tensorrt ファイルを変換します。ファイル サイズは以前よりもはるかに小さくなり、速度は速くなります。
トリムコード
プルーニングにはonnx-simplifier を使用します。最初に以下をインストールします。
pip install onnx-simplifier
その後、それを直接使用できます。
import onnx
import onnxoptimizer
#加载修剪之前的模型
onnx_model = onnx.load(r"mmdeploy/s2anet2onnx2/resnet50+cat+fam+deform-1024-prune.onnx")
#去掉identity层
all_passes = onnxoptimizer.get_available_passes()
print("Available optimization passes:")
for p in all_passes:
print('\t{}'.format(p))
print()
#保存修剪后的模型
onnx_optimized = 'mmdeploy/s2anet2onnx2/resnet50+cat+fam+deform-1024-prune.onnx'
passes = ['eliminate_identity']
optimized_model = onnxoptimizer.optimize(onnx_model, passes)
onnx.save(optimized_model, onnx_optimized)