2.0 升级常见问题

环境变化

问题:paddle 2.0 是否支持 python2,python3.5 ?

  • 答复:paddle 2.0依然提供了python2,python3.5的官方安装包,但未来的某个版本将不再支持python2,python3.5。(python 官方已停止对python2,python3.5的更新和维护)


问题:paddle 2.0 是否支持 CUDA9 ?

  • 答复:本版本依然提供了CUDA9的官方安装包,但从未来的某个版本起,将不再支持CUDA9。


问题:paddle 2.0 是否支持 CentOS6.0 ?

  • 答复:对于CentOS6.0,本版本仅提供了有限度的支持(仅发布了CentOS6下,Python3.7 CUDA10.2/CUDNN7 和CPU的安装包)。(CentOS6官方已宣布了停止更新和维护)


问题:paddle 2.0 是否支持 AVX指令的x86机器 ?

  • 答复:2.0版本依然提供了对不支持AVX指令的x86机器上运行飞桨的支持,但未来的某个版本将会废弃对不支持AVX指令的x86机器的支持。


问题:2.0 版本移除了哪些第三方库 ?

  • 答复:2.0 版本移除的第三方依赖库为:nltk、opencv、scipy、rarfile、prettytable、pathlib、matplotlib、graphviz、objgraph。由于某些功能依然会有对opencv的依赖,在使用到时,会提示用户进行安装。

具体表现为:

  1. 删除依赖这些库的API,原来Paddle基于这些第三方库提供了一些API,在删除这些依赖库的同时也删除了这些API,如:移除matplotlib的同时,paddle.utils.plot也被删除了。

  2. 删除依赖第三方库的数据集,如:移除nltk的同时,依赖nltk的数据集sentiment(nltk.movie_reivew)也被删除了。

  3. 删除依赖的第三方库后,如果需要使用这些库,需要重新安装pip install objgraph,直接import objgraph可能会报错。


问题:从1.x版本升级为2.0版本,哪些API有变动 ?

  • 答复:飞桨框架2.0.0版本推荐用户使用位于paddle根目录下的API,同时在paddle.fluid目录下保留了所有的1.x版本的API,保留对之前版本API体系的支持。

查看API变动的两种方法:

  1. 依据1.8版本API到2.0版本API的对应关系表对API进行升级,请参考文档 飞桨框架API映射表

  2. 飞桨提供了迁移工具,来方便用户将旧版本的代码迁移为2.0.1版本的代码,详情请见:版本迁移工具


问题:2.0 版本中是否有LoDTensor ?

  • 答复:2.0 版本没有LoDTensor的概念,统一使用Tensor来表示数据。

  • 解决方案:

  1. 使用padding/bucketing的方式对数据进行处理后,使用Tensor来表示数据,进行模型训练,具体示例请参考:IMDB 数据集使用BOW网络的文本分类使用注意力机制的LSTM的机器翻译

  2. 在使用padding/bucketing方案对性能影响极大的场景下,请谨慎升级,并请期待未来的paddle对该功能更加易用和高效的实现。


问题:1.8开发的静态图代码能在2.0版本中运行吗 ?

  • 答复:

所有1.8的静态图模型在2.0版本中都会报错。

  • 问题分析:

2.0版本默认开启了动态图模式。即当调用import paddle后,此时Paddle已经运行在动态图模式下。基于1.8开发的静态图代码,在2.0版本下直接执行会出错。为此,在静态图的一些入口API 中加入了报错检查,例如直接调用fluid.data会遇到如下错误:

图片

  • 解决方案:

  1. 旧版本(1.8及之前版本)静态图下的代码,需要在import paddle后的头部位置加入paddle.enable_static()来开启静态图模式,这样才能正常运行。

  2. 原来通过dygraph guard写的动态图代码仍然可以正常执行。但在2.0下可以不需要像以前写dygraph guard,直接按照动态图模式编写代码。

  3. 同时,请注意对于GPU版本的paddle,在import paddle时默认开启动态图会选择CUDAPlace作为默认place。如果要修改place,可以通过paddle.set_device()来完成。


问题:2.0版本中loss.backward() 是否默认清空上个step 的梯度?

  • 答复:

2.0版本新增动态图梯度累加功能,起到变相“扩大BatchSize”的作用,backward()接口默认不清空上个step梯度。

  • 解决方案:

调用optimizer.minimize()后,显式调用optimizer.clear_grad()来清空梯度。