onnx / tensorflow-onnx

Convert TensorFlow, Keras, Tensorflow.js and Tflite models to ONNX
Apache License 2.0
2.31k stars 433 forks source link

AttributeError: 'FuncGraph' object has no attribute '_captures' #2172

Open rgaufman opened 1 year ago

rgaufman commented 1 year ago

Describe the bug I installed tf2onnx.convert with (I also tried the stable version, same result):

pip uninstall tf2onnx
pip3 install git+https://github.com/onnx/tensorflow-onnx

When I run it, I see:

$ python3 -m tf2onnx.convert --opset 10 \
  --saved-model ssd_mobilenet_v1_coco_2018_01_28/saved_model \
  --output model.onnx
<frozen runpy>:128: RuntimeWarning: 'tf2onnx.convert' found in sys.modules after import of package 'tf2onnx', but prior to execution of 'tf2onnx.convert'; this may result in unpredictable behaviour
2023-05-10 18:55:25,257 - WARNING - '--tag' not specified for saved_model. Using --tag serve
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
2023-05-10 18:55:25,739 - INFO - Saver not created because there are no variables in the graph to restore
2023-05-10 18:55:26,926 - INFO - Fingerprint not found. Saved model loading will continue.
2023-05-10 18:55:26,927 - INFO - Signatures found in model: [serving_default].
2023-05-10 18:55:26,927 - WARNING - '--signature_def' not specified, using first signature: serving_default
Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "/opt/homebrew/lib/python3.11/site-packages/tf2onnx/convert.py", line 710, in <module>
    main()
  File "/opt/homebrew/lib/python3.11/site-packages/tf2onnx/convert.py", line 242, in main
    graph_def, inputs, outputs, initialized_tables, tensors_to_rename = tf_loader.from_saved_model(
                                                                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/tf2onnx/tf_loader.py", line 611, in from_saved_model
    _from_saved_model_v2(model_path, input_names, output_names,
  File "/opt/homebrew/lib/python3.11/site-packages/tf2onnx/tf_loader.py", line 573, in _from_saved_model_v2
    graph_captures = concrete_func.graph._captures  # pylint: disable=protected-access
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'FuncGraph' object has no attribute '_captures'. Did you mean: 'captures'?

System information

To Reproduce I'm following the instructions here: https://ankane.org/tensorflow-ruby - I downloaded this pre-trained model: https://storage.googleapis.com/download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_2018_01_28.tar.gz and trying to convert it to onnx format.

Unfortunately I am not able to install any other versions of tensorflow, only 2.13.0rc0 appears to be available:

$ pip3 install tensorflow==2.11.1
ERROR: Could not find a version that satisfies the requirement tensorflow==2.11.1 (from versions: 2.13.0rc0)
ERROR: No matching distribution found for tensorflow==2.11.1
fatcat-z commented 1 year ago

This looks like an issue of tensorflow.

Could you please lower down your python version to 3.9 so that you can install different versions of tensorflow for a retry?

rgaufman commented 1 year ago

We have a dependency on python 3.11 for a few other things, is support for this version of python and newer versions of TensorFlow something that's in the works?

fatcat-z commented 1 year ago

This is a compatibility issue between Python and TensorFlow 2.11.1, so tf2onnx can't help on it. Do you mind to try a newer TensorFlow version on Python 3.11?

rgaufman commented 1 year ago

I believe 2.13.0rc0 is the latest? (it is also the only version selectable in pip3 install)

fatcat-z commented 1 year ago

I believe 2.13.0rc0 is the latest? (it is also the only version selectable in pip3 install)

Yes, it should be the latest rc version.

rgaufman commented 1 year ago

That's the one I used above in the issue report. It's the only one that's available for python 3.11.

guoqingbao commented 1 year ago

I have the same problem; my Tensorflow version is 2.13.0 (Python 3.9).

guoqingbao commented 1 year ago

@rgaufman This problem can be fixed by replacing:

graph_captures = concrete_func.graph._captures

to

    if hasattr(concrete_func.graph, "captures"):
        graph_captures = concrete_func.graph.captures  
        captured_inputs = [t_name.name for t_val, t_name in graph_captures]
    else:
        graph_captures = concrete_func.graph._captures  
        captured_inputs = [t_name.name for t_val, t_name in graph_captures.values()]
David-Leroye commented 1 year ago

I got the same problem. It worked when I decreased the tensorflow version to 2.12.1

carlos21 commented 1 year ago

@rgaufman were you able to find a solution?

yan12125 commented 1 year ago

@guoqingbao Do you consider a pull request for your fix? I discovered this after posting another fix for the same issue at https://github.com/onnx/tensorflow-onnx/issues/2180#issuecomment-1613201326, and your fix looks better than mine.

guoqingbao commented 1 year ago

@guoqingbao Do you consider a pull request for your fix? I discovered this after posting another fix for the same issue at #2180 (comment), and your fix looks better than mine.

Sure, I have created a pull request to fix this issue.

tuannguyen90 commented 1 year ago

I got the same problem. It worked when I decreased the tensorflow version to 2.12.1

This worked for me. For someone who is converting Transformers to ONNX with Hugging Face Optimum:

yan12125 commented 1 year ago

Awesome work at https://github.com/onnx/tensorflow-onnx/pull/2216 has been merged. The next tensorflow-onnx version should be compatible with tensorflow 2.13.

This issue can probably be closed?

EDIT: https://github.com/onnx/tensorflow-onnx/issues/2180 cannot be closed yet, as flatbuffers is still incompatible