模型训练

准备数据集

准备数据集并上传到运行环境的目录下,例如:/home/data/resnet50/imagenet。

准备模型训练

  1. 配置框架相关环境变量。

    source ${Pytorch安装目录}/env.sh                                 #PyTorch环境变量

  2. 配置训练相关环境变量shell脚本env_npu.sh,并执行脚本。

    CANN_INSTALL_PATH_CONF='/etc/Ascend/ascend_cann_install.info'
    
    if [ -f $CANN_INSTALL_PATH_CONF ]; then
        CANN_INSTALL_PATH=$(cat $CANN_INSTALL_PATH_CONF | grep Install_Path | cut -d "=" -f 2)
    else
        CANN_INSTALL_PATH="/usr/local/Ascend"
    fi
    
    if [ -d ${CANN_INSTALL_PATH}/ascend-toolkit/latest ]; then
        source ${CANN_INSTALL_PATH}/ascend-toolkit/set_env.sh
    else
        source ${CANN_INSTALL_PATH}/nnae/set_env.sh
    fi
    
    #将Host日志输出到串口,0-关闭/1-开启
    export ASCEND_SLOG_PRINT_TO_STDOUT=0
    #设置默认日志级别,0-debug/1-info/2-warning/3-error/4-null
    export ASCEND_GLOBAL_LOG_LEVEL=3
    #设置Event日志开启标志,0-关闭/1-开启
    export ASCEND_GLOBAL_EVENT_ENABLE=0
    #多机多卡训练时,自动获取IP环境变量
    export HCCL_IF_IP=$(hostname -I |awk '{print $1}')
    
    #设置device侧日志登记为error
    msnpureport -g error -d 0
    msnpureport -g error -d 1
    msnpureport -g error -d 2
    msnpureport -g error -d 3
    msnpureport -g error -d 4
    msnpureport -g error -d 5
    msnpureport -g error -d 6
    msnpureport -g error -d 7
    #关闭device侧Event日志
    msnpureport -e disable
    
    #export SCALAR_TO_HOST_MEM=1
    
    ulimit -SHn 512000
    
    path_lib=$(python3.7 -c """
    import sys
    import re
    result=''
    for index in range(len(sys.path)):
        match_sit = re.search('-packages', sys.path[index])
        if match_sit is not None:
            match_lib = re.search('lib', sys.path[index])
    
            if match_lib is not None:
                end=match_lib.span()[1]
                result += sys.path[index][0:end] + ':'
    
            result+=sys.path[index] + '/torch/lib:'
    print(result)"""
    )
    
    echo ${path_lib}
    
    export LD_LIBRARY_PATH=/usr/local/python3.7.5/lib/:${path_lib}:$LD_LIBRARY_PATH
    执行脚本,配置环境变量:
    source env_npu.sh

  3. 执行训练脚本拉起训练进程,例如:

    (以下参数为举例,用户可根据实际情况自行改动)
    • 单卡训练:
      python3 main.py /home/data/resnet50/imagenet   --batch-size 128 \       # 训练批次大小,请尽量设置为处理器核数的倍数以更好的发挥性能
                                                     --lr 0.1 \               # 学习率
                                                     --epochs 90 \            # 训练迭代轮数
                                                     --arch resnet50 \        # 模型架构
                                                     --world-size 1 \
                                                     --rank 0 \         
                                                     --workers 40 \           # 加载数据进程数
                                                     --momentum 0.9 \         # 动量  
                                                     --weight-decay 1e-4  \    # 权重衰减
                                                     --gpu 0                  # device号, 这里参数名称仍为gpu, 但迁移完成后实际训练设备已在代码中定义为npu
    • 分布式训练:
      python3 main.py /home/data/resnet50/imagenet   --workers 160 \                   # 加载数据进程数
                                                     --lr 0.8 \                        # 学习率
                                                     --arch resnet50 \                 # 模型架构
                                                     --dist-url 'tcp://127.0.0.1:**' \ # **为端口号,请根据实际选择一个闲置端口填写                 
                                                     --dist-backend 'hccl' \           # 通信方式
                                                     --multiprocessing-distributed \   # 使用多卡训练
                                                     --world-size 1 \
                                                     --batch-size 2048 \               # 训练批次大小,请尽量设置为处理器核数的倍数以更好的发挥性能
                                                     --epochs 90 \                     # 训练迭代轮数
                                                     --rank 0  \
                                                     --amp                             # 开启amp混合精度