我使用tensorflow 1.15设计了一个简单的网络,并使用tfcoreml和coreltools4.0将其转换为mlmodel。我用系统版本ios13.5.1在iPhoneXS上对它们进行了测试,发现从coreltools4.0转换的mlmodel比从tfcoreml转换的要慢得多。
tensorflow的原始网络如下:
graph = tf.Graph()
with graph.as_default():
x = tf.placeholder(tf.float32, shape=[1, 1000, 1000, 4], name="input")
y = tf.layers.conv2d(x, 4, 1, padding='same', activation=tf.nn.relu)
output_names = [y.op.name]使用tfcoreml
转换为to模型
# using tfcoreml
coreml_save_tfcoreml_file = model_dir + "/debug_tfcoreml.mlmodel"
tfcoreml.convert(tf_model_path=frozen_graph_file,
mlmodel_path=coreml_save_tfcoreml_file,
output_feature_names=["conv2d/Relu:0"], # name of the output tensor (appended by ":0")
input_name_shape_dict={"input": [1, 1000, 1000, 4]}, # input tensor[1, height, width, channel]
minimum_ios_deployment_target='12')

基于coremltools4.0:的
coreml_save_coremltools_file = model_dir + "/debug_coremltools.mlmodel"
mlmodel = ct.convert(frozen_graph_file, source='tensorflow')
mlmodel.save(coreml_save_coremltools_file)

我在同一个iPhoneXS设备上测试了这两个mlmodel,无论是在cpu和cpu+gpu上还是使用ANE,#2都比#1花费更多的时间。
为了确认运行在ANE上的mlmodel,我在网络中插入了101x1卷积层,以增加计算量。它们都运行在And上,而且时间成本都是(所有< CpuAndGpu < CpuOnly)。但是,第二步仍然比#1花费更多的时间,大约慢了2倍。
Coreltools4.0似乎通过插入转置的层将数据类型从HWC更改为CHW格式。但是tf2coreml直接接受CHW格式。
如何删除coreltools4.0转换中的转置层以验证该层是否是导致性能下降的原因?
发布于 2020-11-04 12:33:07
是的,我想我找到了原因。我使用"MLModel手术“来修改to模型,移除两个转置层,并将输入形状和输出形状信息修改为NCHW格式。然后,使用coretools4.0的性能与tfcoreml相同。:)
https://stackoverflow.com/questions/64678536
复制相似问题