X2Paddle icon indicating copy to clipboard operation
X2Paddle copied to clipboard

pytorch转pp模型失败

Open levinzhangyd opened this issue 3 years ago • 11 comments

pytorch转pp模型,提示算子不支持。是否可以先转onnx,在转pp pytorch模型来源:https://github.com/cfzd/Ultra-Fast-Lane-Detection

工具:全部为最新版本

报错信息: INFO 2022-06-22 09:45:43,293 convert.py:333] Now translating model from PyTorch to Paddle. Traceback (most recent call last): File "E:\pythonProject\testLaneDetect\main.py", line 60, in pytorch2paddle(module=torch_model, File "C:\Users\uidq5147.conda\envs\paddle_dev\lib\site-packages\x2paddle\convert.py", line 343, in pytorch2paddle mapper = PyTorchOpMapper(model) File "C:\Users\uidq5147.conda\envs\paddle_dev\lib\site-packages\x2paddle\op_mapper\pytorch2paddle\pytorch_op_mapper.py", line 41, in init raise Exception("Model is not supported yet.") Exception: Model is not supported yet.

========= 1 OPs are not supported yet =========== ========== aten::linear ============

Process finished with exit code 1

levinzhangyd avatar Jun 22 '22 01:06 levinzhangyd

应该是算子不支持,但是有没有其他work around方法?

levinzhangyd avatar Jun 22 '22 02:06 levinzhangyd

@levinzhangyd X2Paddle是1.3.7版本吗,目前aten::linear已经支持

另外有两个问题可能需要您描述一下: 1、您具体的业务场景 2、为什么有转到Paddle部署的需求呢?

感谢~

wjj19950828 avatar Jun 22 '22 02:06 wjj19950828

1、您具体的业务场景 移动端开发,想把一些成熟的模型用到移动端进行集成 2、为什么有转到Paddle部署的需求呢? 转到paddleLite,是因为目前国内的MNN/NCNN/Paddle_Lite支持比较多一点,并且支持国产嘛。

另外:由于公司网络问题,github不容易登上去,咨询下社区是否有其他路径下的技术支持呢,有的话麻烦帮忙指引下,非常感谢。更新了最新版本的x2paddle,目前来看可以往下走了,谢谢~

levinzhangyd avatar Jun 22 '22 03:06 levinzhangyd

还是无法生成,求指导 Fail to generate inference model! Problem happend while export inference model from python code '***\pytorch_2_pp_out\x2paddle_code.py';

===================Error Information=============== Traceback (most recent call last): File "E:\pythonProject\testLaneDetect\main.py", line 62, in pytorch2paddle(module=torch_model, File "C:\Users\uidq5147.conda\envs\paddle_dev\lib\site-packages\x2paddle-1.3.7-py3.9.egg\x2paddle\convert.py", line 373, in pytorch2paddle mapper.paddle_graph.gen_model( File "C:\Users\uidq5147.conda\envs\paddle_dev\lib\site-packages\x2paddle-1.3.7-py3.9.egg\x2paddle\core\program.py", line 302, in gen_model raise e File "C:\Users\uidq5147.conda\envs\paddle_dev\lib\site-packages\x2paddle-1.3.7-py3.9.egg\x2paddle\core\program.py", line 296, in gen_model self.dygraph2static(save_dir, input_shapes, input_types) File "C:\Users\uidq5147.conda\envs\paddle_dev\lib\site-packages\x2paddle-1.3.7-py3.9.egg\x2paddle\core\program.py", line 579, in dygraph2static paddle.jit.save(static_model, File "C:\Users\uidq5147.conda\envs\paddle_dev\lib\site-packages\paddle\fluid\dygraph\jit.py", line 629, in wrapper func(layer, path, input_spec, **configs) File "C:\Users\uidq5147.conda\envs\paddle_dev\lib\site-packages\decorator.py", line 232, in fun return caller(func, *(extras + args), **kw) File "C:\Users\uidq5147.conda\envs\paddle_dev\lib\site-packages\paddle\fluid\wrapped_decorator.py", line 25, in impl return wrapped_func(*args, **kwargs) File "C:\Users\uidq5147.conda\envs\paddle_dev\lib\site-packages\paddle\fluid\dygraph\base.py", line 51, in impl return func(*args, **kwargs) File "C:\Users\uidq5147.conda\envs\paddle_dev\lib\site-packages\paddle\fluid\dygraph\jit.py", line 856, in save concrete_program = static_func.concrete_program_specify_input_spec( File "C:\Users\uidq5147.conda\envs\paddle_dev\lib\site-packages\paddle\fluid\dygraph\dygraph_to_static\program_translator.py", line 527, in concrete_program_specify_input_spec concrete_program, _ = self.get_concrete_program( File "C:\Users\uidq5147.conda\envs\paddle_dev\lib\site-packages\paddle\fluid\dygraph\dygraph_to_static\program_translator.py", line 436, in get_concrete_program concrete_program, partial_program_layer = self._program_cache[cache_key] File "C:\Users\uidq5147.conda\envs\paddle_dev\lib\site-packages\paddle\fluid\dygraph\dygraph_to_static\program_translator.py", line 801, in getitem self._caches[item_id] = self._build_once(item) File "C:\Users\uidq5147.conda\envs\paddle_dev\lib\site-packages\paddle\fluid\dygraph\dygraph_to_static\program_translator.py", line 785, in build_once concrete_program = ConcreteProgram.from_func_spec( File "C:\Users\uidq5147.conda\envs\paddle_dev\lib\site-packages\decorator.py", line 232, in fun return caller(func, *(extras + args), **kw) File "C:\Users\uidq5147.conda\envs\paddle_dev\lib\site-packages\paddle\fluid\wrapped_decorator.py", line 25, in impl return wrapped_func(*args, **kwargs) File "C:\Users\uidq5147.conda\envs\paddle_dev\lib\site-packages\paddle\fluid\dygraph\base.py", line 51, in impl return func(*args, **kwargs) File "C:\Users\uidq5147.conda\envs\paddle_dev\lib\site-packages\paddle\fluid\dygraph\dygraph_to_static\program_translator.py", line 740, in from_func_spec error_data.raise_new_exception() File "C:\Users\uidq5147.conda\envs\paddle_dev\lib\site-packages\paddle\fluid\dygraph\dygraph_to_static\error.py", line 336, in raise_new_exception six.exec("raise new_exception from None") File "", line 1, in TypeError: In transformed code:

File "E:\deep-learning\lane_detect\_Ultra_Fast_module\pytorch_2_pp_out\x2paddle_code.py", line 249, in forward
    x11 = self.x10(x9)
    x12 = paddle.flatten(x=x11, start_axis=1)
    x13 = self.linear__0(x12)
    ~~~~~~~~~~~~~~~~~~~~~~~~~ <--- HERE
    return x13

File "C:\Users\uidq5147\.conda\envs\paddle_dev\lib\site-packages\paddle\fluid\dygraph\layers.py", line 930, in __call__
return self._dygraph_call_func(*inputs, **kwargs)
File "C:\Users\uidq5147\.conda\envs\paddle_dev\lib\site-packages\paddle\fluid\dygraph\layers.py", line 915, in _dygraph_call_func
outputs = self.forward(*inputs, **kwargs)

TypeError: forward() missing 1 required positional argument: 'x2'

levinzhangyd avatar Jun 22 '22 04:06 levinzhangyd

@levinzhangyd 麻烦把模型参数、组网、转换脚本整体打包上传到百度云,这边看一下~

wjj19950828 avatar Jun 22 '22 06:06 wjj19950828

@wjj19950828

链接:https://pan.baidu.com/s/1zmMSJa7TC-Ezg69iC8LOpQ 提取码:1234

链接中的项目代码均来源于https://github.com/cfzd/Ultra-Fast-Lane-Detection 如果任何差异,以git上的版本为准。

转换使用的模型为:culane_18.pth

levinzhangyd avatar Jun 23 '22 03:06 levinzhangyd

补充一个点:我看到paddle上有人已经在用这个模型进行预测了。所以大概率是可以转的,但是中间报错,不知道当时社区的那个兄弟怎么处理的。 paddle上对应的Demo:https://aistudio.baidu.com/aistudio/projectdetail/1553836?channelType=0&channel=0

levinzhangyd avatar Jun 27 '22 08:06 levinzhangyd

@levinzhangyd hi,我这边验证了一下,没什么问题

注意版本:torch 1.7.1

然后在export.py加入如下代码

image

你在试一下~

wjj19950828 avatar Jun 27 '22 10:06 wjj19950828

重新开了一个虚拟环境: python=3.8 torch=1.7.1. 转换成paddle成功了,感谢~ 但是,这个版本下无法直接pip install paddlelite了······ 所以没法一步到位的转换成终端需要的文件,只能在分步骤转了,非常感谢 之前都用的最新版本 python=3.9 torch=1.11

咨询下此类问题的解决思路: 这种这个版本行,最新版本不行的问题,只能每次去试验吗?新手求思路。 是pytorch版本不向下兼容的问题,还是x2paddle无法适配到最新版pytorch的问题,有啥解决这种问题的建议吗?

levinzhangyd avatar Jun 28 '22 09:06 levinzhangyd

但是,这个版本下无法直接pip install paddlelite了

@levinzhangyd 不太理解这句话什么意思,为什么这个版本无法安装paddlelite呢

torch版本问题是因为X2Paddle开发都是基于torch 1.6~1.7去开发,所以最新版本的torch可能出现不适配情况~

wjj19950828 avatar Jun 28 '22 11:06 wjj19950828

大概试验清楚了: 如果使用python=3.9.可以pip直接安装paddlelite,但是无法安装pytorch=1.7.1.版本不兼容 如果使用python=3.8.pip安装paddlelite会提示找不到对应的版本(已经添加清华的源),但是可以安装pytorch=1.7.1.经过测试 1.用之前的转换方法直接pytorch转paddle模型可以 2因为无法安装paddlelite,所以不能一步转换到Lite,必须先转换到paddle模型,加载后使用opt工具在转到paddle-lite需要的nb文件。

x2paddle因为算子支持问题,必须使用代码装最新开发版(1.3.7)

一句话总结:各种版本问题,其实就是兼容性还做的不是很好。非常感谢楼主这一周以来对我的帮助,3q~~~

levinzhangyd avatar Jun 29 '22 02:06 levinzhangyd