alibaba / TinyNeuralNetwork

TinyNeuralNetwork is an efficient and easy-to-use deep learning model compression framework.
MIT License
753 stars 116 forks source link

请问下 转tflite 模型能支持签名吗? #299

Open xsong-AI opened 6 months ago

xsong-AI commented 6 months ago

在tflite2.7 版本后 已经支持多签名了:https://tensorflow.google.cn/lite/guide/signatures?hl=zh-cn

class Model(tf.Module):

  @tf.function(input_signature=[tf.TensorSpec(shape=[None], dtype=tf.float32)])
  def encode(self, x):
    result = tf.strings.as_string(x)
    return {
         "encoded_result": result
    }

  @tf.function(input_signature=[tf.TensorSpec(shape=[None], dtype=tf.string)])
  def decode(self, x):
    result = tf.strings.to_number(x)
    return {
         "decoded_result": result
    }

model = Model()

# Save the model
SAVED_MODEL_PATH = 'content/saved_models/coding'

tf.saved_model.save(
    model, SAVED_MODEL_PATH,
    signatures={
      'encode': model.encode.get_concrete_function(),
      'decode': model.decode.get_concrete_function()
    })

# Convert the saved model using TFLiteConverter
converter = tf.lite.TFLiteConverter.from_saved_model(SAVED_MODEL_PATH)
converter.target_spec.supported_ops = [
    tf.lite.OpsSet.TFLITE_BUILTINS,  # enable TensorFlow Lite ops.
    tf.lite.OpsSet.SELECT_TF_OPS  # enable TensorFlow ops.
]
tflite_model = converter.convert()

# Print the signatures from the converted model
interpreter = tf.lite.Interpreter(model_content=tflite_model)
signatures = interpreter.get_signature_list()
print(signatures)

这样一个tflite文件可以有多个graph,在调用的时候可以通过签名来找到子graph. 请教一下TinyNeuralNetwork能否支持一下这个功能?非常感谢啊!

zk1998 commented 6 months ago

您好,我已经收到您的邮件,我会尽快查看并在第一时间回复您。

peterjc123 commented 6 months ago

等下,这个需要tf.lite.OpsSet.SELECT_TF_OPS的吧,我们暂时还不想碰这些东西

peterjc123 commented 6 months ago

话说你可以用contrib里面的tflite2tf(生成tf.function)再结合你这段代码来暂时满足这个需求

xsong-AI commented 6 months ago

等下,这个需要tf.lite.OpsSet.SELECT_TF_OPS的吧,我们暂时还不想碰这些东西

啊,不需要tf.lite.OpsSet.SELECT_TF_OPS, 这只是网页的示例,我只需要生成多个graph的需求满足就行了

xsong-AI commented 6 months ago

tflite2tf(生成tf.function)

我先试一下这个tflite2tf,不过感觉支持的op不是很多,可能不太能满足需求。

peterjc123 commented 6 months ago

等下,这个需要tf.lite.OpsSet.SELECT_TF_OPS的吧,我们暂时还不想碰这些东西

啊,不需要tf.lite.OpsSet.SELECT_TF_OPS, 这只是网页的示例,我只需要生成多个graph的需求满足就行了

那我这边先前期研究一下,说实话我更偏向于添加把多个graph给merge起来的功能,这样至少core代码不用动

peterjc123 commented 6 months ago

tflite2tf(生成tf.function)

我先试一下这个tflite2tf,不过感觉支持的op不是很多,可能不太能满足需求。

不够可以添加的,这个难度不高,你懂的

xsong-AI commented 6 months ago

等下,这个需要tf.lite.OpsSet.SELECT_TF_OPS的吧,我们暂时还不想碰这些东西

啊,不需要tf.lite.OpsSet.SELECT_TF_OPS, 这只是网页的示例,我只需要生成多个graph的需求满足就行了

那我这边先前期研究一下,说实话我更偏向于添加把多个graph给merge起来的功能,这样至少core代码不用动

嗯嗯,那非常感谢了! 主要是现在有一些需求是固定一个backone, 后面接不同的功能,如果能分开graph的化会比较灵活

peterjc123 commented 6 months ago

等下,这个需要tf.lite.OpsSet.SELECT_TF_OPS的吧,我们暂时还不想碰这些东西

啊,不需要tf.lite.OpsSet.SELECT_TF_OPS, 这只是网页的示例,我只需要生成多个graph的需求满足就行了

那我这边先前期研究一下,说实话我更偏向于添加把多个graph给merge起来的功能,这样至少core代码不用动

嗯嗯,那非常感谢了! 主要是现在有一些需求是固定一个backone, 后面接不同的功能,如果能分开graph的化会比较灵活

这边试了下,确实是不需要tf的ops就可以完成转换,主要需要支持TFLite Model的SubGraphs以及SignatureDefs,工作量在于需要把不同的SubGraph的信息读出来重新进行组织成新的Model。如前面所说的,会新增一个将多个tflite模型合并在一起的一个函数