migration_cn.rst 8.4 KB
Newer Older
C
Chen Long 已提交
1 2
Paddle 1 to Paddle 2
====================
3

C
Chen Long 已提交
4 5
飞桨框架v2.0-beta,最重要的变化为API体系的全面升级以及动态图能力的全面完善。下文将简要介绍Paddle
2的变化。
6

C
Chen Long 已提交
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234
主要变化
--------

在飞桨框架v2.0中,我们做了许多的升级。首先,全面完善了动态图模式,相较于静态图而言,动态图每次执行一个运算,可以立即得到结果,能够使算法的开发变得更加高效。此外,本版本对API目录,进行了较大的调整。将API体系从1.X版本的
``paddle.fluid.*`` 迁移到了 ``paddle.*`` 下。原则上,Paddle
2仍支持Paddle 1下的所有语法。但是,我们会逐步废弃掉 ``paddle.fluid``
下的API,强烈建议您将Paddle 1的代码迁移到Paddle
2下,以避免后续带来不必要的麻烦。下文将介绍手动与自动两种方式,来完成Paddle
1到Paddle 2的迁移。

手动将Paddle 1 的代码迁移到 Paddle 2
------------------------------------

本节将介绍如何将您的代码手动的从Paddle 1迁移到Paddle 2。

1、API的变化
~~~~~~~~~~~~

对于Paddle
1下的API,您可以通过我们提供的API升级表(TODO),查看每个API的升级关系,从而手动完成修改。
### 2、句法的变化 在Paddle 1中,通过 ``with fluid.dygraph.guard():``
开启动态图模式,在Paddle 2.0-beta中,可以直接通过
``paddle.disable_static()``\ 开启动态图。

Paddle1to2 自动迁移您的代码到Paddle2
------------------------------------

Paddle 2 包含了许多API的变化,为了节约您将代码从Paddle 1迁移到Paddle
2的时间,我们提供了自动迁移工具–Paddle1to2,能够帮助您快速完成代码迁移。

安装
~~~~

Paddle1to2可以通过pip的方式安装,方式如下:

.. code:: ipython3

    ! pip install -U paddle1to2

基本用法
~~~~~~~~

Paddle1to2 可以使用下面的方式,快速使用:

.. code:: ipython3

    ! paddle1to2 --inpath /path/to/model.py

这将在命令行中,以\ ``diff``\ 的形式,展示model.py从Paddle 1转换为Paddle
2的变化。如果您确认上述变化没有问题,只需要再执行:

.. code:: ipython3

    ! paddle1to2 --inpath /path/to/model.py --write

就会原地改写model.py,将上述变化改写到您的源文件中。
注意:我们会默认备份源文件,到~/.paddle1to2/下。

参数说明如下:

-  –inpath 输入文件路径,可以为单个文件或文件夹。
-  –write
   是否原地修改输入的文件,默认值False,表示不修改。如果为True,表示对文件进行原地修改。添加此参数也表示对文件进行原地修改。
-  –backup
   可选,是否备份源文件,默认值为\ ``~/.paddle1to2/``\ ,在此路径下备份源文件。
-  –no-log-file
   可选,是否需要输出日志文件,默认值为False,即输出日志文件。
-  –log-filepath
   可选,输出日志的路径,默认值为\ ``report.log``\ ,输出日志文件的路径。
-  –no-confirm
   可选,输入文件夹时,是否逐文件确认原地写入,只在\ ``--write``\ 为True时有效,默认值为False,表示需要逐文件确认。
-  –log-level 可选,log级别,可为[‘DEBUG’,‘INFO’,‘WARNING’,‘ERROR’]
   默认值:\ ``INFO``
-  –refactor 可选,debug时使用。
-  –print-match 可选,debug时使用。

使用教程
~~~~~~~~

开始
^^^^

在使用Paddle 1to2前,需要确保您已经安装了Paddle 2.0-beta版本。

.. code:: ipython3

    import paddle
    print (paddle.__version__)
    # TODO change to paddle 2.0-beta


.. parsed-literal::

    0.0.0


克隆\ `PaddlePaddle/models <https://github.com/PaddlePaddle/models>`__\ 来作为工具的测试。

.. code:: ipython3

    ! git clone https://github.com/PaddlePaddle/models


.. parsed-literal::

    Cloning into 'models'...
    remote: Enumerating objects: 8, done.
    remote: Counting objects: 100% (8/8), done.
    remote: Compressing objects: 100% (8/8), done.
    remote: Total 35011 (delta 1), reused 0 (delta 0), pack-reused 35003
    Receiving objects: 100% (35011/35011), 356.97 MiB | 1.53 MiB/s, done.
    Resolving deltas: 100% (23291/23291), done.


查看帮助文档
^^^^^^^^^^^^

paddle1to2 会随着 paddle
2.0-beta安装。所以您可以直接通过下面的方式,查看帮助文档。

.. code:: ipython3

    ! paddle1to2 -h


.. parsed-literal::

    usage: paddle1to2 [-h] [--log-level {DEBUG,INFO,WARNING,ERROR}]
                      [--no-log-file] [--log-filepath LOG_FILEPATH] --inpath
                      INPATH [--backup [BACKUP]] [--write] [--no-confirm]
                      [--refactor {refactor_import,norm_api_alias,args_to_kwargs,refactor_kwargs,api_rename,refactor_with,post_refactor}]
                      [--print-match]
    
    optional arguments:
      -h, --help            show this help message and exit
      --log-level {DEBUG,INFO,WARNING,ERROR}
                            set log level, default is INFO
      --no-log-file         don't log to file
      --log-filepath LOG_FILEPATH
                            set log file path, default is "report.log"
      --inpath INPATH       the file or directory path you want to upgrade.
      --backup [BACKUP]     backup directory, default is the "~/.paddle1to2/".
      --write               modify files in-place.
      --no-confirm          write files in-place without confirm, ignored without
                            --write.
      --refactor {refactor_import,norm_api_alias,args_to_kwargs,refactor_kwargs,api_rename,refactor_with,post_refactor}
                            this is a debug option. Specify refactor you want to
                            run. If none, all refactors will be run.
      --print-match         this is a debug option. Print matched code and node
                            for each file.


Paddle 1的例子
^^^^^^^^^^^^^^

这里是一个基于Paddle 1实现的一个mnist分类,部分内容如下:

.. code:: ipython3

    ! head -n 198 models/dygraph/mnist/train.py | tail -n  20


.. parsed-literal::

        with fluid.dygraph.guard(place):
            if args.ce:
                print("ce mode")
                seed = 33
                np.random.seed(seed)
                fluid.default_startup_program().random_seed = seed
                fluid.default_main_program().random_seed = seed
    
            if args.use_data_parallel:
                strategy = fluid.dygraph.parallel.prepare_context()
            mnist = MNIST()
            adam = AdamOptimizer(learning_rate=0.001, parameter_list=mnist.parameters())
            if args.use_data_parallel:
                mnist = fluid.dygraph.parallel.DataParallel(mnist, strategy)
    
            train_reader = paddle.batch(
                paddle.dataset.mnist.train(), batch_size=BATCH_SIZE, drop_last=True)
            if args.use_data_parallel:
                train_reader = fluid.contrib.reader.distributed_batch_reader(
                    train_reader)


使用Paddle1to2进行转化
^^^^^^^^^^^^^^^^^^^^^^

paddle1to2支持单文件的转化,您可以通过下方的命令直接转化单独的文件。

.. code:: ipython3

    !paddle1to2 --inpath models/dygraph/mnist/train.py

注意,对于参数的删除及一些特殊情况,我们都会打印WARNING信息,需要您仔细核对相关内容。
如果您觉得上述信息没有问题,可以直接对文件进行原地修改,方式如下:

.. code:: ipython3

    !paddle1to2 --inpath models/dygraph/mnist/train.py --write 

此时,命令行会弹出下方的提示:

.. code:: ipython3

    "models/dygraph/mnist/train.py" will be modified in-place, and it has been backed up to "/Users/chenlong/.paddle1to2/train.py_backup_2020_09_09_20_35_15_037821". Do you want to continue? [Y/n]:

输入\ ``y``
后即开始执行代码迁移。为了高效完成迁移,我们这里采用了原地写入的方式。此外,为了防止特殊情况,我们会备份转换前的代码到
``~/.paddle1to2`` 目录下,如果需要,您可以在备份目录下找到转换前的代码。

代码迁移完成后,会生成一个report.log文件,记录了迁移的详情。内容如下:

.. code:: ipython3

    ! cat report.log

注意事项
~~~~~~~~

-  本迁移工具不能完成所有API的迁移,有少量的API需要您手动完成迁移,具体信息可见WARNING。

使用Paddle 2
~~~~~~~~~~~~

完成迁移后,代码就从Paddle 1迁移到了Paddle 2,您就可以在Paddle
2下进行相关的开发。