文档
注册

快速体验

本章将以CNN模型为例,在Atlas 800T A2 训练服务器上端到端的详细介绍如何进行迁移和训练PyTorch模型。

整体流程

昇腾AI处理器上搭建开发&运行环境并进行PyTorch模型迁移训练,整体流程如下图所示:
图1 PyTorch模型迁移训练整体流程

检查环境

在昇腾平台上进行开发运行环境搭建前,首先需要检查安装环境的NPU(Neural-Network Processing Unit,神经网络处理器单元,此处NPU指昇腾AI处理器)是否正常在位。

以Atlas 800T A2 训练服务器为例,执行lspci | grep d802命令检查NPU是否正常在位,如果服务器上有NN>0)路NPU芯片,回显中含“d802”字段的行数为N,则表示NPU正常在位。

01:00.0 Processing accelerators: Huawei Technologies Co., Ltd. Device d802 (rev 20)
02:00.0 Processing accelerators: Huawei Technologies Co., Ltd. Device d802 (rev 20)
41:00.0 Processing accelerators: Huawei Technologies Co., Ltd. Device d802 (rev 20)
42:00.0 Processing accelerators: Huawei Technologies Co., Ltd. Device d802 (rev 20)

准备软件包

下载NPU驱动和固件包以及配套版本的CANN开发套件包。下载本软件即表示您同意华为企业业务最终用户许可协议(EULA)的条款和条件。

表1 软件下载

软件类型

软件包名称和下载链接

昇腾NPU驱动

单击软件包链接,下载软件包Ascend-hdk-<soc_version>-npu-driver_24.1.rc2_linux-aarch64.run和对应的数字签名文件。

昇腾NPU固件

单击软件包链接,下载软件包Ascend-hdk-<soc_version>-npu-firmware_7.3.0.1.231.run和对应的数字签名文件。

CANN开发套件包

单击软件包链接,下载软件包Ascend-cann-toolkit_8.0.RC2_linux-aarch64.run和对应的数字签名文件。

其中<soc_version>代表昇腾AI处理器的型号。

安装驱动和固件

  1. 以root用户登录待安装环境,将驱动和固件包上传至安装环境的任意目录(如“/home/package”)。
  2. 创建驱动运行用户HwHiAiUser。
    groupadd -g HwHiAiUser
    useradd -g HwHiAiUser -d /home/HwHiAiUser -m HwHiAiUser -s /bin/bash
  3. 增加对软件包的可执行权限。
    chmod +x Ascend-hdk-<soc_version>-npu-driver_24.1.rc2_linux-aarch64.run
    chmod +x Ascend-hdk-<soc_version>-npu-firmware_7.3.0.1.231.run
  4. 执行如下命令,校验安装包的一致性和完整性。
    ./Ascend-hdk-<soc_version>-npu-driver24.1.rc2_linux-aarch64.run --check
    ./Ascend-hdk-<soc_version>-npu-firmware_7.3.0.1.231.run --check
  5. 执行以下命令,完成驱动固件安装,软件包默认安装路径为“/usr/local/Ascend”。
    • 安装驱动
      ./Ascend-hdk-<soc_version>-npu-driver_24.1.rc2_linux-aarch64.run --full --install-for-all
      出现类似如下回显信息,说明安装成功。
      Driver package installed successfully!
    • 安装固件
      ./Ascend-hdk-<soc_version>-npu-firmware_7.3.0.1.231.run --full
      出现类似如下回显信息,说明安装成功。
      Firmware package installed successfully! Reboot now or after driver installation for the installation/upgrade to take effect
  6. 驱动和固件安装完成后,重启系统。
    reboot
  7. 执行npu-smi info命令查看,出现类似如下信息,说明驱动加载成功。
    图2 回显示例

安装CANN

驱动固件安装完成后,就可以进行CANN软件包的安装了,本节以在昇腾AI处理器上安装开发套件包为例,介绍CANN软件安装的步骤。CANN开发套件包包含开发应用程序所需的库文件、开发辅助工具等,安装之后开发者可进行应用及自定义算子的开发。需要注意CANN开发套件包安装过程需要安装相关依赖,请确保安装环境能够连接外部网络,并已配置软件源,以下以root用户操作为例。

  1. 安装第三方依赖。
    • Ubuntu系统(Debian、UOS20、Linux等系统操作一致):
      apt-get install -y gcc g++ make cmake zlib1g zlib1g-dev openssl libsqlite3-dev libssl-dev libffi-dev unzip pciutils net-tools libblas-dev gfortran libblas3
    • openEuler系统(EulerOS、CentOS、BCLinux等系统操作一致):
      yum install -y gcc gcc-c++ make cmake unzip zlib-devel libffi-devel openssl-devel pciutils net-tools sqlite-devel lapack-devel gcc-gfortran
  2. 安装Python。

    可执行如下命令检查系统是否安装满足要求的python开发环境(要求python3.7.5~3.7.11、python3.8.0~3.8.11、python3.9.0~3.9.7和python3.10.0~3.10.12)。

    python3 --version
    pip3 --version
    如果返回信息满足Python版本要求,则直接进入下一步,若不满足请参考《CANN 软件安装指南》中的“安装依赖”章节,根据对应的操作系统安装python。

    若后续需要安装PyTorch 2.1.0版本、PyTorch 2.2.0或PyTorch 2.3.1的深度学习框架,python版本需要为python3.8.0~3.8.11、python3.9.0~3.9.7或python3.10.0~3.10.12,python3.7.5~3.7.11环境仅支持安装PyTorch 1.11.0。

  3. 安装相关依赖。
    pip3 install attrs numpy decorator sympy cffi pyyaml pathlib2 psutil protobuf scipy requests absl-py wheel typing_extensions
  4. 安装CANN开发套件包。
    1. 将CANN开发套件包上传至安装环境的任意目录,执行如下命令增加对软件包的可执行权限。
      chmod +x Ascend-cann-toolkit_8.0.RC2_linux-aarch64.run
    2. 执行如下命令校验软件包的一致性和完整性。
      ./Ascend-cann-toolkit_8.0.RC2_linux-aarch64.run --check
    3. 执行如下命令安装CANN开发套件包。
      ./Ascend-cann-toolkit_8.0.RC2_linux-aarch64.run --install

      用户需签署华为企业业务最终用户许可协议(EULA)后进入安装流程,根据回显页面输入y或Y接受协议,输入其他任意字符为拒绝协议,确认接受协议后开始安装。安装完成后,若显示如下信息,则说明软件安装成功。

      [INFO] Ascend-cann-toolkit install success
    4. 配置CANN环境变量。
      source /usr/local/Ascend/ascend-toolkit/set_env.sh

安装PyTorch框架及Ascend Extension for PyTorch插件

本节介绍了在操作系统架构为aarch64、python版本为3.9.x的环境下,安装PyTorch 2.1.0的操作步骤,更多场景请参考配置与安装

  1. 下载并安装官方2.1.0版本torch包。
    # 下载官方torch包
    wget https://download.pytorch.org/whl/cpu/torch-2.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
    
    # 安装官方torch包
    pip3 install torch-2.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
  2. 下载并安装昇腾提供的2.1.0版本的PyTorch适配插件Ascend Extension for PyTorch。
    # 下载Ascend Extension for PyTorch插件包
    wget https://gitee.com/ascend/pytorch/releases/download/v6.0.rc2-pytorch2.1.0/torch_npu-2.1.0.post6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
    
    # 安装Ascend Extension for PyTorch插件包
    pip3 install torch_npu-2.1.0.post6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
  3. 安装后验证。

    执行如下命令,验证是否可正常导入PyTorch以及Ascend Extension for PyTorch的python库,若返回True则说明安装成功。

    python3 -c "import torch;import torch_npu;print(torch_npu.npu.is_available())"
  4. 安装PyTorch扩展库torchvision,用于处理计算机视觉相关任务。
    pip3 install torchvision==0.16.0

模型迁移训练

本节提供了一个简单的模型迁移样例,采用了最简单的自动迁移方法,帮助用户快速体验GPU模型脚本迁移到昇腾NPU上的流程,将在GPU上训练CNN模型识别手写数字的脚本代码进行修改,使其可以迁移到昇腾NPU上进行训练。

  1. 新建脚本train.py,写入以下原GPU脚本代码。
    # 引入模块
    import time
    import torch
    import torch.nn as nn
    from torch.utils.data import Dataset, DataLoader
    import torchvision
    
    # 初始化运行device
    device = torch.device('cuda:0')   
    
    # 定义模型网络
    class CNN(nn.Module):
        def __init__(self):
            super(CNN, self).__init__()
            self.net = nn.Sequential(
                # 卷积层
                nn.Conv2d(in_channels=1, out_channels=16,
                          kernel_size=(3, 3),
                          stride=(1, 1),
                          padding=1),
                # 池化层
                nn.MaxPool2d(kernel_size=2),
                # 卷积层
                nn.Conv2d(16, 32, 3, 1, 1),
                # 池化层
                nn.MaxPool2d(2),
                # 将多维输入一维化
                nn.Flatten(),
                nn.Linear(32*7*7, 16),
                # 激活函数
                nn.ReLU(),
                nn.Linear(16, 10)
            )
        def forward(self, x):
            return self.net(x)
    
    # 下载数据集
    train_data = torchvision.datasets.MNIST(
        root='mnist',
        download=True,
        train=True,
        transform=torchvision.transforms.ToTensor()
    )
    
    # 定义训练相关参数
    batch_size = 64   
    model = CNN().to(device)  # 定义模型
    train_dataloader = DataLoader(train_data, batch_size=batch_size)    # 定义DataLoader
    loss_func = nn.CrossEntropyLoss().to(device)    # 定义损失函数
    optimizer = torch.optim.SGD(model.parameters(), lr=0.1)    # 定义优化器
    epochs = 10  # 设置循环次数
    
    # 设置循环
    for epoch in range(epochs):
        for imgs, labels in train_dataloader:
            start_time = time.time()    # 记录训练开始时间
            imgs = imgs.to(device)    # 把img数据放到指定NPU上
            labels = labels.to(device)    # 把label数据放到指定NPU上
            outputs = model(imgs)    # 前向计算
            loss = loss_func(outputs, labels)    # 损失函数计算
            optimizer.zero_grad()
            loss.backward()    # 损失函数反向计算
            optimizer.step()    # 更新优化器
    
    # 定义保存模型
    torch.save({
                   'epoch': 10,
                   'arch': CNN,
                   'state_dict': model.state_dict(),
                   'optimizer' : optimizer.state_dict(),
                },'checkpoint.pth.tar')
  2. 在train.py中添加以下加粗部分库代码。
    • 若用户使用Atlas 训练系列产品,由于其架构特性限制,用户在训练时需要开启混合精度(AMP),可以提升模型的性能。具体介绍可参见《PyTorch 训练模型迁移调优指南》中的“(可选)混合精度适配”章节
    • 若用户使用Atlas A2 训练系列产品,则可以选择不开启混合精度(AMP)。
    import time
    import torch
    ......
    import torch_npu
    from torch_npu.npu import amp # 导入AMP模块
    from torch_npu.contrib import transfer_to_npu    # 使能自动迁移

    若未使能自动迁移,用户可参考《PyTorch 训练模型迁移调优指南》中的“手工迁移”章节进行相关操作。

  3. 使能AMP混合精度计算。若用户使用Atlas A2 训练系列产品,则可以选择跳过此步骤。在模型、优化器定义之后,定义AMP功能中的GradScaler。
    ......
    loss_func = nn.CrossEntropyLoss().to(device)    # 定义损失函数
    optimizer = torch.optim.SGD(model.parameters(), lr=0.1)    # 定义优化器
    scaler = amp.GradScaler()    # 在模型、优化器定义之后,定义GradScaler
    epochs = 10
    这一部分我们在训练代码中添加AMP功能相关的代码开启AMP。
    ......
    for i in range(epochs):
        for imgs, labels in train_dataloader:
            imgs = imgs.to(device)
            labels = labels.to(device)
            with amp.autocast():
                outputs = model(imgs)    # 前向计算
                loss = loss_func(outputs, labels)    # 损失函数计算
            optimizer.zero_grad()
            # 进行反向传播前后的loss缩放、参数更新
            scaler.scale(loss).backward()    # loss缩放并反向转播
            scaler.step(optimizer)    # 更新参数(自动unscaling)
            scaler.update()    # 基于动态Loss Scale更新loss_scaling系数
  4. 执行命令启动训练脚本(命令脚本名称可根据实际修改)。
    python3 train.py

    训练结束后生成如下图权重文件,则说明迁移训练成功。

搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词