Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

raise error if signature is missing #1406

Merged
merged 1 commit into from Mar 17, 2021
Merged

raise error if signature is missing #1406

merged 1 commit into from Mar 17, 2021

Conversation

guschmue
Copy link
Collaborator

Signed-off-by: Guenther Schmuelling guschmue@microsoft.com

Signed-off-by: Guenther Schmuelling <guschmue@microsoft.com>
@guschmue
Copy link
Collaborator Author

I think its hard for the in-memory model to select the signature by number.
Much easier to specify the signature.
If none is given raise error.

@guschmue guschmue merged commit 2554534 into master Mar 17, 2021
@guschmue
Copy link
Collaborator Author

#1377

@HalfVoxel
Copy link

Nice. However I think the function signature should probably be changed so that the parameter doesn't have a default value. Right now it says input_signature=None which kinda implies to the user that leaving it out is acceptable.

@guschmue guschmue deleted the gs/api-nosig branch April 20, 2021 14:15
@felker
Copy link

felker commented May 19, 2021

I am a bit confused what input_signature type should be passed under this new API. If I pass tf.TensorSpec(batch_input_shape) as the README indicates:

Traceback (most recent call last):
  File "mpi_learn.py", line 133, in <module>
    mpi_train(conf, shot_list_train, shot_list_validate, loader,
  File "/Users/felker/Desktop/plasma-python/plasma/models/mpi_runner.py", line 970, in mpi_train
    specific_builder.save_model_weights(train_model, int(round(e)))
  File "/Users/felker/Desktop/plasma-python/plasma/models/builder.py", line 407, in save_model_weights
    model_proto, external_tensor_storage = tf2onnx.convert.from_keras(
  File "/usr/local/Caskroom/miniconda/base/envs/frnn-tf2/lib/python3.8/site-packages/tf2onnx/convert.py", line 315, in from_keras
    function = _saving_utils.trace_model_call(model, input_signature)
  File "/usr/local/Caskroom/miniconda/base/envs/frnn-tf2/lib/python3.8/site-packages/tensorflow/python/keras/saving/saving_utils.py", line 127, in trace_model_call
    def _wrapped_model(*args):
  File "/usr/local/Caskroom/miniconda/base/envs/frnn-tf2/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py", line 1598, in decorated
    decorator_func=Function(
  File "/usr/local/Caskroom/miniconda/base/envs/frnn-tf2/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py", line 536, in __init__
    self._function_spec = function_lib.FunctionSpec.from_function_and_signature(
  File "/usr/local/Caskroom/miniconda/base/envs/frnn-tf2/lib/python3.8/site-packages/tensorflow/python/eager/function.py", line 2410, in from_function_and_signature
    return FunctionSpec(
  File "/usr/local/Caskroom/miniconda/base/envs/frnn-tf2/lib/python3.8/site-packages/tensorflow/python/eager/function.py", line 2477, in __init__
    raise TypeError("input_signature must be either a tuple or a "
TypeError: input_signature must be either a tuple or a list, received <class 'tensorflow.python.framework.tensor_spec.TensorSpec'>

If I pass a tuple batch_input_shape:

Traceback (most recent call last):
  File "mpi_learn.py", line 133, in <module>
    mpi_train(conf, shot_list_train, shot_list_validate, loader,
  File "/Users/felker/Desktop/plasma-python/plasma/models/mpi_runner.py", line 970, in mpi_train
    specific_builder.save_model_weights(train_model, int(round(e)))
  File "/Users/felker/Desktop/plasma-python/plasma/models/builder.py", line 408, in save_model_weights
    model_proto, external_tensor_storage = tf2onnx.convert.from_keras(
  File "/usr/local/Caskroom/miniconda/base/envs/frnn-tf2/lib/python3.8/site-packages/tf2onnx/convert.py", line 315, in from_keras
    function = _saving_utils.trace_model_call(model, input_signature)
  File "/usr/local/Caskroom/miniconda/base/envs/frnn-tf2/lib/python3.8/site-packages/tensorflow/python/keras/saving/saving_utils.py", line 126, in trace_model_call
    @def_function.function(input_signature=input_signature, autograph=False)
  File "/usr/local/Caskroom/miniconda/base/envs/frnn-tf2/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py", line 1586, in function
    function_lib.validate_signature(input_signature)
  File "/usr/local/Caskroom/miniconda/base/envs/frnn-tf2/lib/python3.8/site-packages/tensorflow/python/eager/function.py", line 3397, in validate_signature
    raise TypeError("Invalid input_signature {}; input_signature must be "
TypeError: Invalid input_signature (128, 128, 14); input_signature must be a possibly nested sequence of TensorSpec objects.

@TomWildenhain-Microsoft
Copy link
Contributor

It should be a list of TensorSpec objects. Try [tf.TensorSpec(batch_input_shape)]

BTW If you use the latest tf2onnx from github an input signature is actually optional.

@guschmue
Copy link
Collaborator Author

I guess we could improve the docs a little. As Tom said - the latest version will not require it but that could fail.
If you need a spec, for keras-resnet50 it might look like this:
(tf.TensorSpec((None, 224, 224, 3), tf.float32, name="input"),)
basically a tuple of tf.TensorSpec with shape, type and name of each input.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants