【华为云-上云之路】决战黑客松——手把手教你实现Baseline赛题
本实验我们将聚焦于用ModelArts实现华为云开发者AI青年班黑客松大赛的Baseline赛题,手把手教你进行实验,带你用Notebook编写训练代码,带你将生成模型导入模型管理,带你将模型部署成在线服务,最后带你提交模型判分,教你实现黑客松大赛中的Baseline赛题。
1.准备实验环境与创建OBS桶
2.Notebook环境中编写脚本
3.将生成模型导入至模型管理
4.将模型部署成在线服务
5.提交模型判分
1
1.1密钥准备
点击页面的“控制台”切换至控制台界面,在账号名称的下拉菜单中点击“我的凭证”,进入创建管理访问密钥(AK/SK)的界面。位置如下图所示:
1.2创建OBS桶和目录
1.4创建文件夹
点击刚刚创建的桶,进入详情页:
点击“确定”完成添加
在ModelArts管理控制台,进入“数据管理->数据集”页面,单击“服务授权”
由具备授权的账号“同意授权”后,即可正常使用:
2
2.Notebook环境中编写脚本
在ModelArts平台左侧选择“开发环境”->“Notebook”
工作环境:Python3
资源池:公共资源池
类型与规格根据你的需求来设置,此处我设置为:
类型:GPU
规格:保持默认
存储配置:对象存储服务(文件夹是刚才创建的codes)
/obs-bin-baseline/codes/
单击“下一步”进行规格确认:
确认无误后单击“提交”,返回 Notebook 列表:
单击Notebook作业列表操作栏中“打开”,打开刚才创建的Notebook:
单击页签右上角“New”,选择“Pytorch-1.0.0”:
进入代码开发界面:
在代码输入栏中输入如下代码:
import moxing as mox
mox.file.copy_parallel('s3://obs-aifood-bj4/aifood',
's3://obs-bin-baseline/aifood')
print('Copy procedure is completed !')
注意:将“obs-bin-baseline/aifood”替换为您创建的存放竞赛数据集的OBS路径
运行界面如下:
在自己的OBS桶的aifood文件夹中可查看,下载好的数据:
下载baseline赛题压缩包:
https://developer.huaweicloud.cn/hero/forum.phpmod=viewthread&tid=52941
若链接失效,可在后台回复“赛题”下载:
打开Notebook进入代码开发界面后,单击“Upload”
将赛题文件夹中的aifood_baseline.ipynb上传至Notebook:
单击aifood_baseline.ipynb文件名称,进入代码编写/运行界面,
按照ipynb文件内容修改参数,运行所有代码。
在控制台,右方New处新建Folder,并取名aifood:
修改后,如下所示:
运行下列代码,将OBS桶的数据转移到Notebook的aifood文件夹中:
注意:将“obs-bin-baseline/aifood”替换为您创建的存放竞赛数据集的OBS路径
import moxing as mox
mox.file.copy_parallel('s3://obs-bin-baseline/aifood','./aifood/')
print("done")
运行结果如下所示:
运行下列代码,加载依赖:
from __future__ import print_function, division
import torch
import torch.nn as nn
import torch.optim as optim
from torch.optim import lr_scheduler
from torch.autograd import Variable
import torchvision
from torchvision import datasets, models, transforms
import time
import os
运行结果如下所示:
运行代码1和代码2,是为了实现加载数据集,并将其分为训练集和测试集的目的:
dataTrans = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
])
# image data path
data_dir = './aifood/images'
all_image_datasets = datasets.ImageFolder(data_dir, dataTrans)
#print(all_image_datasets.class_to_idx)
trainsize = int(0.8*len(all_image_datasets))
testsize = len(all_image_datasets) - trainsize
train_dataset, test_dataset = torch.utils.data.random_split(all_image_datasets,[trainsize,testsize])
image_datasets = {'train':train_dataset,'val':test_dataset}
# wrap your data and label into Tensor
dataloders = {x: torch.utils.data.DataLoader(image_datasets[x],
batch_size=64,
shuffle=True,
num_workers=4) for x in ['train', 'val']}
dataset_sizes = {x: len(image_datasets[x]) for x in ['train', 'val']}
# use gpu or not
use_gpu = torch.cuda.is_available()
代码2:
def train_model(model, lossfunc, optimizer, scheduler, num_epochs=10):
start_time = time.time()
best_model_wts = model.state_dict()
best_acc = 0.0
for epoch in range(num_epochs):
print('Epoch {}/{}'.format(epoch, num_epochs - 1))
print('-' * 10)
# Each epoch has a training and validation phase
for phase in ['train', 'val']:
if phase == 'train':
scheduler.step()
model.train(True) # Set model to training mode
else:
model.train(False) # Set model to evaluate mode
running_loss = 0.0
running_corrects = 0.0
# Iterate over data.
for data in dataloders[phase]:
# get the inputs
inputs, labels = data
# wrap them in Variable
if use_gpu:
inputs = Variable(inputs.cuda())
labels = Variable(labels.cuda())
else:
inputs, labels = Variable(inputs), Variable(labels)
# zero the parameter gradients
optimizer.zero_grad()
# forward
outputs = model(inputs)
_, preds = torch.max(outputs.data, 1)
loss = lossfunc(outputs, labels)
# backward + optimize only if in training phase
if phase == 'train':
loss.backward()
optimizer.step()
# statistics
running_loss += loss.data
running_corrects += torch.sum(preds == labels.data).to(torch.float32)
epoch_loss = running_loss / dataset_sizes[phase]
epoch_acc = running_corrects / dataset_sizes[phase]
print('{} Loss: {:.4f} Acc: {:.4f}'.format(
phase, epoch_loss, epoch_acc))
# deep copy the model
if phase == 'val' and epoch_acc > best_acc:
best_acc = epoch_acc
best_model_wts = model.state_dict()
elapsed_time = time.time() - start_time
print('Training complete in {:.0f}m {:.0f}s'.format(
elapsed_time // 60, elapsed_time % 60))
print('Best val Acc: {:4f}'.format(best_acc))
# load best model weights
model.load_state_dict(best_model_wts)
return model
本实验采用了resnet50神经网络结构训练模型,模型训练需要时间,等待该段代码运行完成后再往下执行:
如果想在最后进行模型优化,可以选择将此神经网络模型换成其它模型
# get model and replace the original fc layer with your fc layer
model_ft = models.resnet50(pretrained=True)
num_ftrs = model_ft.fc.in_features
model_ft.fc = nn.Linear(num_ftrs, 10)
if use_gpu:
model_ft = model_ft.cuda()
# define loss function
lossfunc = nn.CrossEntropyLoss()
# setting optimizer and trainable parameters
# params = model_ft.parameters()
# list(model_ft.fc.parameters())+list(model_ft.layer4.parameters())
#params = list(model_ft.fc.parameters())+list( model_ft.parameters())
params = list(model_ft.fc.parameters())
optimizer_ft = optim.SGD(params, lr=0.001, momentum=0.9)
# Decay LR by a factor of 0.1 every 7 epochs
exp_lr_scheduler = lr_scheduler.StepLR(optimizer_ft, step_size=7, gamma=0.1)
model_ft = train_model(model=model_ft,
lossfunc=lossfunc,
optimizer=optimizer_ft,
scheduler=exp_lr_scheduler,
num_epochs=10)
运行结果如下所示:
运行代码,将训练好的模型保存下来:
torch.save(model_ft.state_dict(), './model.pth')
运行结果如下:
运行下列代码,将模型保存到OBS桶中model文件夹下,为后续推理测试、模型提交做准备。
将如下代码中"obs-bin-baseline"修改成您OBS桶的名称。
import moxing as mox
mox.file.copy('./model.pth','s3://obs-aifood-baseline/model_output/model/resnet-50.pth')
print("done")
运行结果如下:
3
4
资源池:公共资源池
模型:刚才训练的模型
此处应选择为CPU,规格不能选为GPU,因为代码中设置中是用CPU计算,不然会出错。
点击“下一步”确认无误后:
点击“提交”即可,结下了就是等待部署:
部署成功:
5
5.部署服务
点击“部署”:
名称:自定义
(此处我设置的是service-faster)
资源池:公共资源池
选择模型及配置:
选择刚才导入的模型:model-faster
计算节点规格:自定义
其余保持默认
确认参数后,点击“下一步”
再次确认无误,点击“提交”:
等待部署完成:
部署完成,显示“运行中”
在“部署上线”的“在线服务”处,点击运行中的在线服务右侧的“预测”
进入到测试界面,单击“上传”图片,进行检测:
测试图片预测成功。
6
6.提交模型判分
在 ModelArts 左侧导航栏中选择“模型管理”,单击模型名称前方箭头;然后单击页面右侧操作栏中的“发布”,单击“参赛发布”。
确认信息无误,点击“确定”即可完成一次模型提交:
至此实验全部完成。
通过对实验结果的比对,可以看出利用
[华为云ModelArts]训练出来的物体检测模型是很棒的,六个字总结就是-高效,快捷,省心。
- 点赞
- 收藏
- 关注作者
评论(0)