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

pytorch模型直接转TFLite可以支持动态维度输入吗? #73

Open
LinJinwhy opened this issue May 19, 2022 · 13 comments
Open

pytorch模型直接转TFLite可以支持动态维度输入吗? #73

LinJinwhy opened this issue May 19, 2022 · 13 comments
Labels
enhancement New feature or request

Comments

@LinJinwhy
Copy link

LinJinwhy commented May 19, 2022

因为有些模型的输入shape是不固定的,请问转换方法支持转出的TFLite模型是动态输入大小的吗?

@LinJinwhy LinJinwhy changed the title pytorch pytorch模型直接转TFLite可以支持动态维度输入吗? May 19, 2022
@peterjc123 peterjc123 added the enhancement New feature or request label May 19, 2022
@peterjc123
Copy link
Collaborator

peterjc123 commented May 19, 2022

据我所知,TFLite模型不支持动态输入大小,只能在AllocateTensors前用ResizeInput来一次性的改变输入的大小。如你有支持动态维度输入的TFLite模型,麻烦提供一个给我们,我们可以研究下怎么实现。

@zhiqwang
Copy link
Contributor

zhiqwang commented May 19, 2022

PyTorch 动态 shape 模型的话似乎必须要用 torch.jit.script 来导出?

@peterjc123
Copy link
Collaborator

PyTorch 动态 shape 模型的话似乎必须要用 torch.jit.script 来导出?

PyTorch这边其实无所谓,只要TFLite能支持,我们这边可以添加接口,通过一个pass来传播shape的动态性就可以了

@LinJinwhy
Copy link
Author

据我所知,TFLite模型不支持动态输入大小,只能在AllocateTensors前用ResizeInput来一次性的改变输入的大小。如你有支持动态维度输入的TFLite模型,麻烦提供一个给我们,我们可以研究下怎么实现。

您好,关于TFLite模型是否支持动态输入大小这个问题,我了解不深,只是参阅了 https://stackoverflow.com/questions/55701663/input-images-with-dynamic-dimensions-in-tensorflow-lite/55732431#55732431tensorflow/tensorflow#41807 这两个链接的回答

@peterjc123
Copy link
Collaborator

据我所知,TFLite模型不支持动态输入大小,只能在AllocateTensors前用ResizeInput来一次性的改变输入的大小。如你有支持动态维度输入的TFLite模型,麻烦提供一个给我们,我们可以研究下怎么实现。

您好,关于TFLite模型是否支持动态输入大小这个问题,我了解不深,只是参阅了 https://stackoverflow.com/questions/55701663/input-images-with-dynamic-dimensions-in-tensorflow-lite/55732431#55732431tensorflow/tensorflow#41807 这两个链接的回答

你试下你的模型走resize_input_tensor可以正常工作吗?

@LinJinwhy
Copy link
Author

据我所知,TFLite模型不支持动态输入大小,只能在AllocateTensors前用ResizeInput来一次性的改变输入的大小。如你有支持动态维度输入的TFLite模型,麻烦提供一个给我们,我们可以研究下怎么实现。

您好,关于TFLite模型是否支持动态输入大小这个问题,我了解不深,只是参阅了 https://stackoverflow.com/questions/55701663/input-images-with-dynamic-dimensions-in-tensorflow-lite/55732431#55732431tensorflow/tensorflow#41807 这两个链接的回答

你试下你的模型走resize_input_tensor可以正常工作吗?

会出现类似这样的问题: RuntimeError: tensorflow/lite/kernels/reshape.cc:66 num_input_elements != num_output_elements (10519065 != 51300000) Node number 0 (RESHAPE) failed to prepare. (截取自 https://discuss.tf.wiki/t/topic/303)

@peterjc123
Copy link
Collaborator

peterjc123 commented May 19, 2022

嗯,那reshape算子都得特殊处理下,你看下导出的torchscript包不包含shape相关的操作?如果有相关操作的话,我们只需要把shape跟踪下来就行了,如果没有就比较复杂了

@moses574
Copy link

请问您最后是如何解决这个问题的?已经被困扰三四天了

@peterjc123
Copy link
Collaborator

@moses574 截至目前(2024/08/23)为止,TinyNN还没支持动态维度的TFLite模型导出。如果动态维度存在实际的应用场景(最好提供对应的性能数据),我们可以考虑支持。但是根据我的了解,目前tflite的动态维度每次都需要resize tensor的空间,因此如果频繁更换shape的情况,应该开销会很大。所以从目前的评估来说,优先级比较低。

@peterjc123
Copy link
Collaborator

@moses574 如果你问的是目前怎么生成这种类型的模型,那么先假设你是转一个浮点的模型,可以先用tinynn转一个固定shape的模型,然后用contrib下面的tflite2tf生成转换代码(转换到tf savedmodel),然后应该可以通过自己修改这段代码来生成动态shape的tf savedmodel,然后再走tf自己的tfliteconverter应该可以导出动态shape的模型。

@moses574
Copy link

@moses574 截至目前(2024/08/23)为止,TinyNN还没支持动态维度的TFLite模型导出。如果动态维度存在实际的应用场景(最好提供对应的性能数据),我们可以考虑支持。但是根据我的了解,目前tflite的动态维度每次都需要resize tensor的空间,因此如果频繁更换shape的情况,应该开销会很大。所以从目前的评估来说,优先级比较低。
首先感谢您的回复,但是我在resize tensor后仍会报形状不匹配问题:RuntimeError: tensorflow/lite/kernels/reshape.cc:58 stretch_dim != -1 (0 != -1)Node number 1275 (RESHAPE) failed to prepare.

此外,我尝试使用converter.input_shapes = {
'input_ids': [1, 512],
'token_type_ids': [1, 512],
'attention_mask': [1, 512]
}来在生成tflite时指定一个固定形状,但是不知为何也不生效。

@peterjc123
Copy link
Collaborator

@moses574 截至目前(2024/08/23)为止,TinyNN还没支持动态维度的TFLite模型导出。如果动态维度存在实际的应用场景(最好提供对应的性能数据),我们可以考虑支持。但是根据我的了解,目前tflite的动态维度每次都需要resize tensor的空间,因此如果频繁更换shape的情况,应该开销会很大。所以从目前的评估来说,优先级比较低。
首先感谢您的回复,但是我在resize tensor后仍会报形状不匹配问题:RuntimeError: tensorflow/lite/kernels/reshape.cc:58 stretch_dim != -1 (0 != -1)Node number 1275 (RESHAPE) failed to prepare.

此外,我尝试使用converter.input_shapes = { 'input_ids': [1, 512], 'token_type_ids': [1, 512], 'attention_mask': [1, 512] }来在生成tflite时指定一个固定形状,但是不知为何也不生效。

额,因为我们目前没有支持动态shape,所以所有shape都被折叠为常量了,所以用resize_input肯定就没法正常工作。

@peterjc123
Copy link
Collaborator

此外,我尝试使用converter.input_shapes = {
'input_ids': [1, 512],
'token_type_ids': [1, 512],
'attention_mask': [1, 512]
}来在生成tflite时指定一个固定形状,但是不知为何也不生效。

这个你用的不是tinynn的converter吧,你可以去tf那边问问

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

No branches or pull requests

4 participants