【华为云-上云之路】决战黑客松——手把手教你实现Baseline赛题

举报
看那个码农 发表于 2020/06/08 17:31:36 2020/06/08
【摘要】 决战黑客松——手把手教你实现Baseline赛题
华为云 华为公司倾力打造的云战略品牌,2011年成立,致力于为全球客户提供领先的公有云服务,包含弹性云服务器、云数据库、云安全等云计算服务,软件开发服务,面向企业的大数据和人工智能服务,以及场景化的解决方案。



image.png




华为云 用在线的方式将华为30多年在ICT基础设施领域的技术积累和产品解决方案开放给客户,致力于提供稳定可靠、安全可信、可持续创新的云服务,做智能世界的“黑土地”,推进实现“用得起、用得好、用得放心”的普惠AI。华为云作为底座,为华为全栈全场景AI战略提供强大的算力平台和更易用的开发平台。
image.png




华为云官方网站

ModelArts 华为云产品中面向开发者的一站式AI开发平台,为机器学习与深度学习提供海量数据预处理及半自动化标注、大规模分布式Training、自动化模型生成,及端-边-云模型按需部署能力,帮助用户快速创建和部署模型,管理全周期AI工作流。
image.png




华为云官方网站








决战黑客松——手把手教你实现Baseline赛题


本实验我们将聚焦于用ModelArts实现华为云开发者AI青年班黑客松大赛的Baseline赛题,手把手教你进行实验,带你用Notebook编写训练代码,带你将生成模型导入模型管理,带你将模型部署成在线服务,最后带你提交模型判分,教你实现黑客松大赛中的Baseline赛题。



image.png






决战黑客松——手把手教你实现Baseline赛题
实验流程


1.准备实验环境与创建OBS桶

2.Notebook环境中编写脚本

3.将生成模型导入至模型管理

4.将模型部署成在线服务

5.提交模型判分




1



1.1密钥准备



首先需要进入华为云官方网站
https://www.huaweicloud.com/


image.png



点击页面的“控制台”切换至控制台界面,在账号名称的下拉菜单中点击“我的凭证”,进入创建管理访问密钥(AK/SK)的界面。位置如下图所示:


image.png



什么是访问密钥?
访问密钥即AK/SK(Access Key ID/Secret Access Key),是您通过开发工具(API、CLI、SDK)访问华为云时的身份凭证,不能登录控制台。系统通过AK识别访问用户的身份,通过SK进行签名验证,通过加密签名验证可以确保请求的机密性、完整性和请求者身份的正确性。




选择 访问密钥”,点击“新增访问密钥


image.png




妥善保存系统自动下载的“credentials.csv”文件中的AK(Access Key Id)SK(Secret Access Key)以备后续步骤使用。
image.png




1.2创建OBS桶和目录



进入方式,“控制台”->“服务列表”->“存储”->“对象存储服务”,页面右上角点击“创建桶”按钮进入创建页面。


image.png



什么是OBS?
对象存储服务(Object Storage Service,OBS)是一个基于对象的海量存储服务,为客户提供海量、安全、高可靠、低成本的数据存储能力,包括:创建、修改、删除桶,上传、下载、删除对象等。

1.3 OBS桶设置

OBS桶设置参数如下:
区域:华北-北京四
桶名称:自定义(注意:此名称会在后续步骤使用)
根据自己的命名习惯,我将此处的桶名称取为
obs-bin-baseline
存储类别:标准存储
桶策略:私有
归档数据直读:关闭
多AZ:开启
 
点击"立即创建",完成创建


image.png



1.4创建文件夹


点击刚刚创建的桶,进入详情页:


image.png





左侧栏选择“对象”,点击“新建文件夹”,在弹出的新建窗口中:

文件夹名称:自定义 此名称会在后续步骤中使用)
根据自己的命名习惯,我将此处的文件夹名称取为 aifood


 

点击“确定”完成添加

image.png




aifood文件夹主要用于存放竞赛数据集

还需要一个文件夹存放代码文件,另外一个文件夹存放训练输出文件
我新建存放代码文件夹为codes:
image.png





我新建存放训练输出文件夹为model_output:
image.png





新建好了的三个文件夹:
image.png





1 .5 服务授权

由于本实验项目需要使用 ModelArts Notebook、训练作业、模型及服务时可能需要使用数据管理功能,在开始使用前,需为数据管理模块获取访问OBS权限。


在ModelArts管理控制台,进入“数据管理->数据集”页面,单击“服务授权


image.png


由具备授权的账号同意授权后,即可正常使用:


image.png




2



2.Notebook环境中编写脚本


在ModelArts平台左侧选择“开发环境”->“Notebook”

image.png




选择“创建”,并按照下列配置,填写相关参数:

名称:自定义(此处我设置的是notebook-bin)


工作环境:Python3

资源池:公共资源池


类型与规格根据你的需求来设置,此处我设置为:

类型:GPU

规格:保持默认

image.png


存储配置:对象存储服务(文件夹是刚才创建的codes)

/obs-bin-baseline/codes/


单击“下一步”进行规格确认:

image.png



确认无误后单击“提交”,返回 Notebook 列表

image.png



单击Notebook作业列表操作栏中“打开”,打开刚才创建的Notebook:

image.png


单击页签右上角“New”,选择“Pytorch-1.0.0”:

image.png


进入代码开发界面:

image.png



在代码输入栏中输入如下代码:



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路径


运行界面如下:

image.png



在自己的OBS桶的aifood文件夹中可查看,下载好的数据:

image.png


下载baseline赛题压缩包:


https://developer.huaweicloud.com/hero/forum.phpmod=viewthread&tid=52941


若链接失效,可在后台回复“赛题”下载:

image.png



打开Notebook进入代码开发界面后,单击“Upload

image.png



将赛题文件夹中的aifood_baseline.ipynb上传至Notebook:

image.png


单击aifood_baseline.ipynb文件名称,进入代码编写/运行界面,

按照ipynb文件内容修改参数,运行所有代码。

image.png



在控制台,右方New处新建Folder,并取名aifood:

image.png



修改后,如下所示:

image.png



运行下列代码,将OBS桶的数据转移到Notebook的aifood文件夹中:

注意:将“obs-bin-baseline/aifood”替换为您创建的存放竞赛数据集的OBS路径



import moxing as mox
mox.file.copy_parallel('s3://obs-bin-baseline/aifood','./aifood/')
print("done")



运行结果如下所示:

image.png



运行下列代码,加载依赖:



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



运行结果如下所示:

image.png



运行代码1和代码2,是为了实现加载数据集,并将其分为训练集和测试集的目的:



代码1:

dataTrans = transforms.Compose([
            transforms.Resize(256),
            transforms.CenterCrop(224),
            transforms.ToTensor(),
            transforms.Normalize([0.50.50.5], [0.50.50.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=4for 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




运行结果如下所示,无报错:


image.png



本实验采用了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)



运行结果如下所示:

image.png



运行代码,将训练好的模型保存下来:



torch.save(model_ft.state_dict(), './model.pth')



运行结果如下:

image.png



运行下列代码,将模型保存到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")



运行结果如下:

image.png




3




3.将生成模型导入至模型管理

导入模型前,需要利用OBS Browser+将附件中的baseline模型配置文件、推理代码,以及美食图片标签文件labels_10c.txt上传至model文件夹下。如下所示:
image.png





注意:文件需要放在model文件夹里面,而不是model_output文件夹下面

做好上述操作后,在 ModelArts 左侧导航栏选择“模型管理”,单击页面中“导入”:
image.png





在导入模型页面填写名称,选择元模型来源;其中元模型来源如从OBS中选择,请选择model文件夹上一级目录,其余保持默认。

本baseline model文件夹上一级目录为obs-bin-baseline/model_output:
image.png





确认无误后,单击“立即创建” 

单击模型名称进入模型详情页面,当模型版本状态为“正常”后,即导入模型成功,然后再进行下一步将模型部署为在线服务的操作。
image.png





已显示“正常”,进行下一步操作:
image.png






4




4.将模型部署为在线服务

点击进入ModelArts主页“部署上线->在线服务”处 点击“ 部署 ”:
image.png





进行参数设置:
image.png




资源池:公共资源池

模型:刚才训练的模型

此处应选择为CPU,规格不能选为GPU,因为代码中设置中是用CPU计算,不然会出错。


点击“下一步”确认无误后:

image.png



点击“提交”即可,结下了就是等待部署:

image.png



部署成功:

image.png




5



5.部署服务



进入ModelArts主页“部署上线->在线服务”处:
image.png




点击“部署”:

image.png


名称:自定义

(此处我设置的是service-faster)


资源池:公共资源池


选择模型及配置:

选择刚才导入的模型:model-faster

计算节点规格:自定义


其余保持默认


确认参数后,点击“下一步

image.png



再次确认无误,点击“提交”:

image.png



等待部署完成:

image.png



部署完成,显示“运行中

image.png



在“部署上线”的“在线服务”处,点击运行中的在线服务右侧的“预测

image.png


进入到测试界面,单击“上传图片,进行检测:

image.png



测试图片预测成功。




6



6.提交模型判分


在 ModelArts 左侧导航栏中选择“模型管理”,单击模型名称前方箭头;然后单击页面右侧操作栏中的“发布”,单击“参赛发布”。

image.png




确认信息无误,点击“确定”即可完成一次模型提交:

image.png





至此实验全部完成。



最后大家使用的云端资源记得全部删除如对象存储服务创建的OBS桶,文件夹;ModelArts创建的数据集,部署的模型等都需要删除,并停用访问密钥,以免造成不必要的花费。



通过对实验结果的比对,可以看出利用

[华为云ModelArts]训练出来的物体检测模型是很棒的,六个字总结就是-高效,快捷,省心


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。