下载
中文
注册

自动迁移样例

简介

下面介绍如何通过工具迁移ResNet50网络。

下载原始模型和数据集

  1. 从github下载ResNet50原始模型。

    git clone -b r1.13.0 https://github.com/tensorflow/models.git

    假设原始模型下载到了/root/models目录下,用户可以在/root/models/official/resnet/下查看到下载到的ResNet50原始脚本:

  2. 下载数据集。

    参考https://github.com/tensorflow/models/blob/r1.13.0/official/resnet/README.md的使用说明,下载数据集,具体操作为:

    cd /root/models/official/resnet/

    python cifar10_download_and_extract.py

    export PYTHONPATH="$PYTHONPATH:/root/models"

    数据集模型默认下载到/tmp/cifar10_data路径下。

使用迁移工具进行模型迁移

  1. 在运行环境上安装工具依赖。

    pip3 install pandas

    pip3 install xlrd==1.2.0

    pip3 install openpyxl

    pip3 install tkintertable

    pip3 install google_pasta

  2. 执行命令进行工具自动迁移。
    1. 进入迁移工具所在目录。

      cd <tfplugin安装目录>/tfplugin/latest/python/site-packages/npu_bridge/convert_tf2npu/

    2. 进行脚本迁移。
      • 若后续执行单Device训练,执行如下命令:
        python3 main.py -i /root/models/official/resnet/ -o /root/models/official/ -r /root/models/official/
        • -i:被迁移的原始脚本存储路径。
        • -o:指定的迁移后脚本存储路径,该路径不能为原始脚本路径的子目录。
        • -r:指定生成的迁移报告路径。
      • 若后续需要执行分布式训练,执行如下命令:

        python3 main.py -i /root/models/official/resnet/ -o /root/models/official/ -r /root/models/official/ -d tf_strategy

        其中“-d”代表原始脚本使用的分布式策略,“tf_strategy”表示原始脚本使用的是tf.distribute.Strategy分布式策略。

  3. /root/models/official/report_npu_***下查看迁移报告。

    打开api_analysis_report.xlsx,查看resnet网络中的API支持度情况:

    筛选“工具迁移API支持度”这一列,发现所有接口分为如下几类:

    • 支持(无需迁移):此类API在昇腾AI处理器上绝对支持,无需适配修改。
    • 工具迁移后API功能支持:工具迁移后,该API在昇腾AI处理器上可以支持。
    • 不支持(无迁移方案,建议不使用):经过分析,这些接口为keras分支才会使用到的接口,当前训练流程不会执行到,因此可以忽略。
    • 废弃类:经过分析,这个接口无需修改,不会引起迁移失败。
  4. /root/models/official/resnet目录下的原始脚本替换为迁移后脚本。

    迁移后脚本存放在/root/models/official/resnet_npu_***目录下。

    执行训练前,需要将resnet_npu_xxx目录脚本拷贝替换到resnet目录下,从而保证脚本能正常执行,例如:

    1. 备份resnet目录下原始脚本。
    2. 将训练后脚本替换原始脚本,例如:

      cp /root/models/official/resnet_npu_***/*.py /root/models/official/resnet

执行单Device训练

  1. 由于原始脚本支持分布式训练,迁移后的脚本中存在HCCL集合通信接口,所以执行训练前需要准备单Device的资源信息配置文件。(本示例以配置文件的方式设置资源信息,您也可以参见训练执行(环境变量方式设置资源信息)通过环境变量的方式设置资源信息。)
    单Device的资源信息配置文件中需包含一个Device资源,文件名举例:rank_table_1p.json,配置文件举例:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    {
    "server_count":"1", 
    "server_list":
    [
       {
            "device":[ 
                           {
                            "device_id":"0", 
                            "device_ip":"192.168.1.8", 
                            "rank_id":"0" 
                            }
                      ],
             "server_id":"10.0.0.10"
        }
    ],
    "status":"completed", 
    "version":"1.0"
    }
    

    配置文件的详细介绍请参考准备ranktable资源配置文件

  2. 配置训练进程启动依赖的环境变量。

    安装CANN软件后,使用CANN运行用户进行编译、运行时,需要以CANN运行用户登录环境,执行source ${install_path}/set_env.sh命令设置环境变量。其中${install_path}为CANN软件的安装目录,例如:/usr/local/Ascend/ascend-toolkit。除此之外,还需进行如下配置:

    # 请依据实际在下列场景中选择一个训练依赖包安装路径的环境变量设置(以HwHiAiUser安装用户为例)。
    # 场景一:昇腾设备安装部署开发套件包Ascend-cann-toolkit(此时开发环境可进行训练任务)。
    . /home/HwHiAiUser/Ascend/ascend-toolkit/set_env.sh 
    # 场景二:昇腾设备安装部署软件包Ascend-cann-nnae。
    . /home/HwHiAiUser/Ascend/nnae/set_env.sh 
    
    # tfplugin包依赖。
    . /home/HwHiAiUser/Ascend/tfplugin/set_env.sh
    
    # 若运行环境中存在多个python3版本时,需要在环境变量中配置python的安装路径。如下配置以安装python3.7.5为例,可根据实际修改。
    export PATH=/usr/local/python3.7.5/bin:$PATH
    export LD_LIBRARY_PATH=/usr/local/python3.7.5/lib:$LD_LIBRARY_PATH
    
    # 当前脚本所在路径,例如:
    export PYTHONPATH="$PYTHONPATH:/root/models"
    export JOB_ID=10086        # 训练任务ID,用户自定义,仅支持大小写字母,数字,中划线,下划线。不建议使用以0开始的纯数字
    export ASCEND_DEVICE_ID=0  # 指定昇腾AI处理器的逻辑ID,单卡训练也可不配置,默认为0,在0卡执行训练
    export RANK_ID=0           # 指定训练进程在集合通信进程组中对应的rank标识序号,单卡训练固定配置为0
    export RANK_SIZE=1         # 指定当前训练进程对应的Device在本集群大小,单卡训练固定配置为1
    export RANK_TABLE_FILE=/root/rank_table_1p.json # 如果用户原始训练脚本中使用了hvd接口或tf.data.Dataset对象的shard接口,需要配置,否则无需配置,需要注意rank_table中的参数“device_id”优先级高于环境变量“ASCEND_DEVICE_ID”。
  3. 执行训练脚本拉起训练进程:

    python3 /root/models/official/resnet/cifar10_main.py

  4. 检查训练过程是否正常,Loss是否收敛。

  5. 训练结束后,在tmp/cifar10_model下生成checkpoint文件。

在两个Device上执行分布式训练

  1. 准备包含两个Device的昇腾AI处理器资源信息配置文件,文件名举例:rank_table_2p.json,配置文件举例:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    {
    "server_count":"1",
    "server_list":
    [
       {
            "device":[
                           {
                            "device_id":"0",     // 此配置的优先级高于环境变量“ASCEND_DEVICE_ID”
                            "device_ip":"192.168.1.8",
                            "rank_id":"0"
                            },
                            {
                             "device_id":"1",
                             "device_ip":"192.168.1.9",   // 两个Device需要处于同一网段,0卡和1卡为同一网段
                             "rank_id":"1"
                             }
                      ],
             "server_id":"10.0.0.10" 
        }
    ],
    "status":"completed",
    "version":"1.0"
    }
    

    配置文件的详细介绍请参考准备ranktable资源配置文件

  2. 在不同的shell窗口依次拉起不同的训练进程。

    拉起训练进程0:

    安装CANN软件后,使用CANN运行用户进行编译、运行时,需要以CANN运行用户登录环境,执行source ${install_path}/set_env.sh命令设置环境变量。其中${install_path}为CANN软件的安装目录,例如:/usr/local/Ascend/ascend-toolkit。并进行如下配置:
    export JOB_ID=10086
    
    export RANK_ID=0
    export RANK_SIZE=2
    export RANK_TABLE_FILE=/root/rank_table_2p.json
    python3 /root/models/official/resnet/cifar10_main.py
    # 请依据实际在下列场景中选择一个训练依赖包安装路径的环境变量设置(以HwHiAiUser安装用户为例)。
    # 场景一:昇腾设备安装部署开发套件包Ascend-cann-toolkit(此时开发环境可进行训练任务)。
    . /home/HwHiAiUser/Ascend/ascend-toolkit/set_env.sh 
    # 场景二:昇腾设备安装部署软件包Ascend-cann-nnae。
    . /home/HwHiAiUser/Ascend/nnae/set_env.sh 
    
    # tfplugin包依赖。
    . /home/HwHiAiUser/Ascend/tfplugin/set_env.sh
    
    # 若运行环境中存在多个python3版本时,需要在环境变量中配置python的安装路径。如下配置以安装python3.7.5为例,可根据实际修改。
    export PATH=/usr/local/python3.7.5/bin:$PATH
    export LD_LIBRARY_PATH=/usr/local/python3.7.5/lib:$LD_LIBRARY_PATH
    
    # 当前脚本所在路径,例如:
    export PYTHONPATH=/root/models:$PYTHONPATH
    export JOB_ID=10086
    
    export RANK_ID=0
    export RANK_SIZE=2
    export RANK_TABLE_FILE=/root/rank_table_2p.json
    python3 /root/models/official/resnet/cifar10_main.py

    拉起训练进程1:

    安装CANN软件后,使用CANN运行用户进行编译、运行时,需要以CANN运行用户登录环境,执行source ${install_path}/set_env.sh命令设置环境变量。其中${install_path}为CANN软件的安装目录,例如:/usr/local/Ascend/ascend-toolkit。并进行如下配置:
    export PYTHONPATH=/root/models:$PYTHONPATH
    export JOB_ID=10086
    
    export RANK_ID=1
    export RANK_SIZE=2
    export RANK_TABLE_FILE=/root/rank_table_2p.json
    python3 /root/models/official/resnet/cifar10_main.py

    除了以上方式,您还可以通过自定义启动脚本通过循环方式依次拉起多个训练进程,具体样例请参考链接

  3. 训练结束后,每个Device的日志信息如下所示,代表训练结束,可查看Loss是否收敛。

    最终会在tmp/cifar10_model下生成checkpoint文件。