ModelArts_自定义镜像_Pytorch1.5训练LeNet

PyTorch1.5训练LeNet

文档描述

本样例使用成都人工智能计算中心(以下简称智算中心)ModelArts平台,通过PyTorch自定义镜像训练LeNet,为大家学习ModelArts提供参考。

前置条件

请检查以下条件要求是否满足,如不满足请按照备注进行相应处理。

条件要求备注
PyTorch镜像版本>=21.0.3PyTorch镜像为Ascend Hub镜像,请参考容器镜像服务指南下载并上传镜像至智算中心镜像服务
OBS Browser+安装请参考对象存储服务指南完成下载安装并登录,方便后续上传代码、数据集等
模型迁移迁移完成请参考PyTorch网络模型移植&训练指南完成NPU版PyTorch的网络模型迁移,可在modelarts调试

训练环境

  • 训练平台:成都人工智能计算中心-ModelArts服务
  • 底层硬件资源:Atlas 900 集群
  • 训练镜像:ascend-pytorch-arm-modelarts
  • 训练框架:PyTorch1.5
  • CANN版本:5.0.3

LeNet描述

LeNet是1998年提出的一种典型的卷积神经网络。它被用于数字识别并取得了巨大的成功。

论文: Y.Lecun, L.Bottou, Y.Bengio, P.Haffner.Gradient-Based Learning Applied to Document Recognition.Proceedings of the IEEE.1998.

模型架构

LeNet非常简单,包含5层,由2个卷积层和3个全连接层组成。

数据集

使用的数据集:FashionMNIST(使用torchvision.datasets下载)

  • 数据集大小:52.4M,共10个类,6万张 28*28图像
    • 训练集:6万张图像
    • 测试集:1万张图像
  • 数据格式:二进制文件
  • 目录结构如下:
└─data
    ├──FashionMNIST
        ├──raw
            ├──t10k-images-idx3-ubyte
            ├──t10k-labels.idx1-ubyte
            ├──train-images.idx3-ubyte
            ├──train-labels.idx1-ubyte

数据拷贝

自定义镜像训练过程中,OBS桶中的训练代码会自动上传至ModelArts分配的环境中,但数据集需手动拷贝(当前版本训练日志和保存的模型文件也需手动拷贝至OBS桶中),具体文档参考MoXing相关API。

# modelarts dataset path
data_path = '/cache/data'
# copy dataset to modelarts from ob,useage:mox.file.copy_parallel('obs://[bucket_name]/[data_dir]', [modelarts_data_dir])
mox.file.copy_parallel('obs://wesley/models/lenet_torch1.5/data', data_path)
# model save path
weight_path = '/cache/weights'
# mkdir on modelarts
os.mkdir(weight_path)


# copy train log to obs from modelarts
mox.file.copy('/tmp/log/train.log',
              'obs://wesley/models/lenet_torch1.5/train.log')
# copy models to obs from modelarts
mox.file.copy_parallel(weight_path, 'obs://wesley/models/lenet_torch1.5/weights')

注:ModelArts会挂载硬盘至“/cache”目录,Ascend规格资源该目录大小为3T,用户可以使用此目录来储存临时文件,如数据集和保存的模型文件等。

完整代码

代码基于PyTorch官网教程中的Quickstart修改,代码中的路径请自行修改

import torch
from torch import nn
from torch.utils.data import DataLoader
from torchvision import datasets
from torchvision.transforms import ToTensor
import os
import moxing as mox

# Define model
class LeNet5(nn.Module):
    def __init__(self):
        super().__init__()
        # input_shape 28*28
        self.conv1 = nn.Sequential(
            nn.Conv2d(in_channels=1, out_channels=6,
                      kernel_size=5, stride=1),
            nn.MaxPool2d(kernel_size=2)
        )
        self.conv2 = nn.Sequential(
            nn.Conv2d(in_channels=6, out_channels=16,
                      kernel_size=5, stride=1),
            nn.MaxPool2d(kernel_size=2)
        )
        self.fc1 = nn.Sequential(
            nn.Linear(in_features=4 * 4 * 16, out_features=120)
        )
        self.fc2 = nn.Sequential(
            nn.Linear(in_features=120, out_features=84)
        )
        self.fc3 = nn.Sequential(
            nn.Linear(in_features=84, out_features=10)
        )

    def forward(self, input):
        conv1_output = self.conv1(input)  # [28,28,1]
        conv2_output = self.conv2(conv1_output)
        conv2_output = conv2_output.view(-1, 4 * 4 * 16)
        fc1_output = self.fc1(conv2_output)
        fc2_output = self.fc2(fc1_output)
        output = self.fc3(fc2_output)
        return output



data_path = '/cache/data'
weight_path = '/cache/weights'
batch_size = 64
epochs = 5

# if dataset in obs, use mox.file.copy() to copy dataset to modelarts
mox.file.copy_parallel('obs://wesley/models/lenet_torch1.5/data', data_path)
os.mkdir(weight_path)

# Download training data from open datasets.
training_data = datasets.FashionMNIST(
    root=data_path,
    train=True,
    download=False,
    transform=ToTensor(),
)

# Download test data from open datasets.
test_data = datasets.FashionMNIST(
    root=data_path,
    train=False,
    download=False,
    transform=ToTensor(),
)

# Create data loaders.
train_dataloader = DataLoader(training_data, batch_size=batch_size)
test_dataloader = DataLoader(test_data, batch_size=batch_size)

for X, y in test_dataloader:
    print(f"Shape of X [N, C, H, W]: {X.shape}")
    print(f"Shape of y: {y.shape} {y.dtype}")
    break

    
# using ascend device 1p
device = "cpu" if not torch.npu.is_available() else f"npu:{torch.npu.current_device()}"
torch.npu.set_device(device)
print(f"Using {device} device")

model = LeNet5().to(device)
print(model)

# loss function
loss_fn = nn.CrossEntropyLoss()

# optimizer
optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)

# define train function

def train(dataloader, model, loss_fn, optimizer):
    size = len(dataloader.dataset)
    model.train()
    for batch, (X, y) in enumerate(dataloader):
        X, y = X.to(device), y.to(device)

        # Compute prediction error
        pred = model(X)
        loss = loss_fn(pred, y)

        # Backpropagation
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        if batch % 100 == 0:
            loss, current = loss.item(), batch * len(X)
            print(f"loss: {loss:>7f}  [{current:>5d}/{size:>5d}]")

# define test function

def test(dataloader, model, loss_fn):
    size = len(dataloader.dataset)
    num_batches = len(dataloader)
    model.eval()
    test_loss, correct = 0, 0
    with torch.no_grad():
        for X, y in dataloader:
            X, y = X.to(device), y.to(device)
            pred = model(X)
            test_loss += loss_fn(pred, y).item()
            correct += (pred.argmax(1) == y).type(torch.float).sum().item()
    test_loss /= num_batches
    correct /= size
    print(
        f"Test Error: \n Accuracy: {(100 * correct):>0.1f}%, Avg loss: {test_loss:>8f} \n")

# training

try:
    for t in range(epochs):
        print(f"Epoch {t + 1}\n-------------------------------")
        train(train_dataloader, model, loss_fn, optimizer)
        torch.save(model.state_dict(), f"{weight_path}/lenet_{t + 1}.pth")
        print(f"saved model lenet_{t + 1}.pth success")
        # copy models to obs from modelarts
        mox.file.copy_parallel(weight_path, 'obs://wesley/models/lenet_torch1.5/weights')
        test(test_dataloader, model, loss_fn)
    print("Done!")

finally:
    # copy train log to obs from modelarts
    mox.file.copy('/tmp/log/train.log', 'obs://wesley/models/lenet_torch1.5/train.log')

训练过程

创建训练作业

当前新版训练作业无法使用自定义镜像(非华为云ModelArts),请使用旧版训练作业,步骤如下:

在这里插入图片描述

1.算法来源:

选择自定义

2.镜像地址:

先择前置条件中的PyTorch21.0.3镜像

3.代码目录:

选择OBS桶中的训练代码目录

4.运行命令:

默认启动命令如下,可在本地运行PyTorch21.0.3镜像,在/home/work/run_train.sh中查看或修改。

/bin/bash /home/work/run_train.sh ${obs-code-path} ${the-base-name-of-obs-code-path}/${boot-file} '/tmp/log/train.log' ${python_file_parameter}

前两个参数不可修改,前五个参数的顺序不可修改,示例:

/bin/bash /home/work/run_train.sh 'obs://training-bucket/ascend-tf-1.15/resnet50/' 'resnet50/train.py' '/tmp/log/train.log' --'data_url'='obs://training-bucket/cifar-10/'
5.数据来源

数据集通过MoXing手动拷贝,此处可选择OBS桶中训练代码目录下的空文件夹

6.训练输出位置

训练日志和模型文件通过MoXing手动拷贝,此处可选择OBS桶中训练代码目录下的空文件夹

7.环境变量

训练中如需添加环境变量,点击增加即可

8.作业日志路径

该日志为训练过程中Ascend产生的plog日志,选择OBS桶中指定的文件夹即可

9.资源池

按照所需资源选择后点击创建作业即可

其他Python依赖

如果环境中没有训练代码所需Python依赖,在OBS桶中训练代码目录下上传requirements.txt,在其中添加所需依赖及版本即可

查看训练结果

在这里插入图片描述

查看训练日志
...
...
Epoch 5
-------------------------------
loss: 1.047490 [ 0/60000]
loss: 1.055037 [ 6400/60000]
loss: 0.821756 [12800/60000]
loss: 0.984526 [19200/60000]
loss: 0.920349 [25600/60000]
loss: 0.918822 [32000/60000]
loss: 0.933400 [38400/60000]
loss: 0.944582 [44800/60000]
loss: 0.886811 [51200/60000]
loss: 0.894010 [57600/60000]
saved model lenet_5.pth success
Test Error:
Accuracy: 67.5%, Avg loss: 0.883350
Done!
THPModule_npu_shutdown success.
[Modelarts Service Log]2022-05-16 09:51:58,597 - INFO - Begin destroy training processes
[Modelarts Service Log]2022-05-16 09:51:58,598 - INFO - proc-rank-0-device-0 (pid: 121) has exited
[Modelarts Service Log]2022-05-16 09:51:58,598 - INFO - End destroy training processes
...
...
[ModelArts Service Log][INFO][2022/05/16 09:51:59]: env MA_OUTPUTS is not found, skip the outputs handler
[ModelArts Service Log]modelarts-pipe: total length: 184
[Modelarts Service Log]Training end at 2022-05-16-09:52:00
[Modelarts Service Log]Training completed.
查看拷贝文件

训练结束后,查看OBS训练代码目录下模型、日志等是否拷贝成功

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 13
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: 要下载Chinese_roberta_wwm_ext_pytorch,首先需要确定下载来源和平台。一般来说,可以在开源社区或者代码托管平台找到该模型的下载链接。在网上搜索“Chinese_roberta_wwm_ext_pytorch下载”可以获得相关的下载资源。 在找到下载链接后,点击链接进入下载页面。根据页面上的指引和说明,选择合适的版本和格式进行下载。通常情况下,会提供预训练好的模型文件和相应的代码。 下载完成后,解压缩模型文件。通常情况下,模型文件会以压缩包的形式进行下载,所以需要解压缩以获得可用的模型文件。 接下来,可以使用Python的torch或者pytorch库进行模型的加载和使用。根据具体的使用场景和需求,可以参考相关的文档和代码示例。 要注意的是,Chinese_roberta_wwm_ext_pytorch是基于PyTorch框架的预训练模型,所以在下载前需要确保已安装PyTorch和相关的依赖库。 总结起来,要下载Chinese_roberta_wwm_ext_pytorch,首先找到下载链接,然后选择合适的版本和格式进行下载,解压缩模型文件,最后使用PyTorch库进行加载和使用。 ### 回答2: chinese_roberta_wwm_ext_pytorch是一个基于PyTorch框架的汉语预训练模型。它是对RoBERTa模型的扩展,专门为中文自然语言处理任务而设计。下载chinese_roberta_wwm_ext_pytorch分为以下几个步骤: 1. 在GitHub上搜索chinese_roberta_wwm_ext_pytorch,找到该模型的开源代码库。 2. 确保你已经安装了PyTorch框架以及其他相关依赖库,如Transformers。 3. 在代码库中找到下载链接,点击链接下载模型文件。通常,该模型文件的格式为.pth或.bin。 4. 下载完成后,将模型文件保存在你的工作目录中,以备后续使用。 使用chinese_roberta_wwm_ext_pytorch模型时,可以参考以下示例代码: ```python import torch from transformers import AutoTokenizer, AutoModel # 加载tokenizer和model tokenizer = AutoTokenizer.from_pretrained("chinese_roberta_wwm_ext_pytorch") model = AutoModel.from_pretrained("chinese_roberta_wwm_ext_pytorch") # 输入文本 text = "这是一个例子。" # 文本编码和模型推理 inputs = tokenizer(text, return_tensors="pt") outputs = model(**inputs) # 获取模型的预测结果 hidden_states = outputs.last_hidden_state ``` 以上代码中,我们首先通过`AutoTokenizer`和`AutoModel`加载了预训练的tokenizer和模型。然后,我们将文本输入通过tokenizer进行编码,生成模型所需的输入张量`inputs`。接下来,我们将编码后的输入传递给模型,得到模型的输出结果`outputs`。最后,我们从输出结果中获取最后一层的隐藏状态`hidden_states`,可用于后续任务。 总结来说,下载chinese_roberta_wwm_ext_pytorch模型需要找到相应的代码库并下载模型文件,然后使用PyTorch框架加载模型和tokenizer,进行文本编码和模型推理。 ### 回答3: chinese_roberta_wwm_ext_pytorch是一个预训练的中文RoBERTa模型,它基于PyTorch实现。RoBERTa在自然语言处理任务中具有很高的性能,可以用于文本分类、词性标注、命名实体识别等多种任务。 要下载chinese_roberta_wwm_ext_pytorch模型,首先需要在互联网上找到可靠的下载源。可以通过搜索引擎或者在GitHub等代码托管平台上查找。找到对应的下载链接后,点击链接进入下载页面。 在下载页面上,一般会提供下载命令或者直接提供预训练模型文件的下载链接。根据页面的提示进行相应的操作即可完成下载过程。 下载完成后,可以将模型文件解压缩到本地的指定目录中,以方便后续使用。通常模型文件会以一个文件夹的形式存在,其中包含了模型的参数、配置文件以及其他相关文件。 下载好模型后,就可以在项目中通过加载模型文件,使用其中的预训练参数进行文本处理任务。使用PyTorch的相关API可以很方便地加载模型,然后将待处理的文本输入模型,获取模型的输出结果。 总之,要下载chinese_roberta_wwm_ext_pytorch模型,需要找到可靠的下载源,按照下载页面的提示进行下载和解压缩,然后在项目中加载模型,使用其进行中文文本处理任务。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值