ModelArts(一)——从快速入门到远程开发丨【华为云AI贺新年】

irrational 发表于 2022/01/24 13:39:36 2022/01/24
【摘要】 关于ModelArts,你可能没有听说过很多。但是,你一定知道,云计算在现在日新月异的发展中有不可动摇的地位。你也一定知道notebook这款python应用在python编程中的重大作用,你也听说过人工智能中图片可以轻易的被计算机识别,效率大大高过人类;你也了解到Python可以进行智能预测,各项回归算法可以预测经济、新冠等的未来发展趋势。ModelArts就能够把云计算和我们熟知的jupyte
ModelArts(一)——从快速入门到远程开发

image-20220124133537067

引言

关于ModelArts,你可能没有听说过很多。但是,你一定知道,云计算在现在日新月异的发展中有不可动摇的地位。你也一定知道notebook这款python应用在python编程中的重大作用,你也听说过人工智能中图片可以轻易的被计算机识别,效率大大高过人类;你也了解到Python可以进行智能预测,各项回归算法可以预测经济、新冠等的未来发展趋势。ModelArts就能够把云计算和我们熟知的jupyter结合起来,让我们仅仅使用浏览器就可以运行各样的Python程序,还能训练自己的算法和模型,让你在十五分钟左右就能完成一个简单的图像分类,今天就让我们从入门走向算法训练师!

一、小白入手ModelArts

连Python都不熟,我能用modelarts吗?当然可以。

1、准备工作

1.1创建自动学习项目

进入modelarts官网,点击管理控制台

image-20220120173342626

点击自动学习

image-20220120173417252

我们去创建一个自动学习:图像分类项目。

image-20220120173658979

自定义名称,这个时候就需要找点数据集。

image-20220120173754371

没有桶的话,新建桶即可。为了让小白也能轻松上手,在这里演示一下,看官大佬们可自行跳过。

1.2创建桶并上传数据集

image-20220120181232749

选择新建桶。

多AZ存储能提高您的数据可用性,同时会采用相对较高的计费标准。由于桶存储是按需计费,我们的训练图片较少,这里选择多AZ存储即可。

配置信息:

区域 华北-北京四
数据冗余存储策略 多AZ存储
桶名称 自定义
存储类别 标准存储
桶策略 私有
默认加密 关闭
归档数据直读 关闭
标签 不添加

image-20220120181859087

立即创建。

单击进入新创建的桶nice-photos查看详情。

image-20220120182032708

点击对象,新建文件夹后上传对象。

image-20220120182115944

image-20220120183718385

新建文件夹input和output

image-20220120183901968

进入到input文件夹,上传文件。

image-20220120183934822

这里我们选择标准存储,上传从搜索引擎找到的鲸鱼和麻雀图片。如何利用爬虫查找图片,可参阅本人另一篇小短文Python批量自动下载获取图片

本地自定义一个路径,运行如下python代码:

import requests
from bs4 import BeautifulSoup
import json
import eventlet
import os

urlshu = 1      #url中first = urlshu
pictureshu = 1  #图片下载时的名字(加上异常图片的第几张图片)
soupshu = 0     #每35张soup列表中第soupshu个
whileshu = 35   #用于while循环的数(因为每个页面35张图片)



url1 = 'https://cn.bing.com/images/async?q='
url2 = '&first=%d&count=35&cw=1177&ch=737&relp=35&tsc=ImageBasicHover&datsrc=I&layout=RowBased&mmasync=1'
head1 = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.64'
    }
#有35张图片的网页的请求标头

head2 = {
'Cookie': 'Hm_lvt_d60c24a3d320c44bcd724270bc61f703=1624084633,1624111635',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.64'
    }
#具体图片的网页的请求标头

print('请输入查找内容:')
content = input()
if os.path.exists('./%s'%content):
    pass    #创建文件夹'图片'
else:
    os.mkdir('./%s'%content)
print('请输入查找图片数量:')
number = int(input())
url = url1 + content + url2 #合并成去往有35张图片的网址

while whileshu:
    r0 = requests.get(url%urlshu,headers = head1).text  #发送get请求并将内容转化成文本
    soup = BeautifulSoup(r0,features="html.parser").find_all('a','iusc')   #解析r0并找到a和class=iusc的标签
    data = str(soup[soupshu].get('m'))  #将列表soup的第soupshu位中的m提取出来
    zidian = json.loads(data)   #将data转化成字典形式
    ifopen = 1      #用于下方判断是否下载图片
    with eventlet.Timeout(1,False):     #设定1秒的超时判断
        try:
            picture = requests.get(zidian['murl'],headers = head2).content  #发送get请求并返回二进制数据
        except:
            #print('图片%d超时异常'%pictureshu)    #说明图片异常
            pictureshu -= 1
            ifopen = 0      #取消下载此图片,否则会一直卡着然后报错
    while ifopen == 1:
        text = open('%s/'%content + '%d'%pictureshu + '.jpg','wb')  #将图片下载至文件夹'图片'中
        text.write(picture)     #上行代码中'wb'为写入二进制数据
        text.close()
        ifopen = 0
        number = number - 1
        
    pictureshu = pictureshu + 1
    soupshu = soupshu + 1
    whileshu = whileshu - 1
    
    if whileshu == 0:   #第一页图片下载完成,将网址的first进1
        urlshu = urlshu + 1
        whileshu = 35
        soupshu = 0
        
    if number == 0:     #下载图片数量达标,退出循环
        print("查找完成")
        break

image-20220120191009971

image-20220120190958132

选择常用的数据集分割方法,训练集:验证集≈2:1,选择1~20,31~50为训练集,其余作为验证集,上传到input,output作为空文件夹输出。

image-20220120184503285

注意:此处不要选择加密,否则会出现训练无法读取数据的情况。

上传完成后,回到创建图像分类项目的界面,选择输入输出位置为刚刚上传的训练集和验证集,创建项目。至此,准备工作完成。

image-20220120191539737

2、开始训练

2.1标注数据集

刚刚上传的数据是未标注的,下面我们就来标注这些数据集。

enter添加标签:鲸、麻雀

image-20220120191926758

选中其中所有为鲸的图片,标注为鲸,其余标注为麻雀。

image-20220120192126726

标注完成,开始训练!

2.2训练数据集

image-20220120192220244

点击开始训练,训练规格作为测试,免费学习即可,注意填入自己设定的训练集比例。

image-20220120192311305

image-20220120192351393

提交,耐心等待训练,

image-20220120192410895

训练状态从发布中转为了训练中

image-20220120192437774

image-20220120192451306

image-20220120193007837

训练完成,时长两分钟,准确率100%,非常可人。

2.3部署模型

image-20220120193112614

image-20220120193204208

image-20220120193217098

提交,稍事等待。

image-20220120193236780

image-20220120194524958

部署成功,我们来测试一下。上传除训练集以外的图片,观察右侧输出结果。

image-20220120194755807

image-20220120194829638

image-20220120194850578

image-20220120194924901

预测准确度非常好。

2.4linuxAPI调用测试

使用curl命令发送预测请求的命令格式也分为文件输入、文本输入两类。

  1. 文件输入

    curl -kv -F 'images=@图片路径' -H 'X-Auth-Token:Token值' -X POST 在线服务地址
    
    • **“-k”**是指允许不使用证书到SSL站点。
    • **“-F”**是指上传数据的是文件,本例中参数名为“images”,这个名字可以根据具体情况变化,@后面是图片的存储路径。
    • **“-H”**是post命令的headers,Headers的Key值为“X-Auth-Token”,这个名字为固定的, Token值是用户获取到的token值(关于如何获取token,请参见获取请求认证)。
    • **“POST”**后面跟随的是在线服务的调用地址。

    curl命令文件输入样例:

    curl -kv -F 'images=@/home/data/test.png' -H 'X-Auth-Token:MIISkAY***80T9wHQ==' -X POST https://modelarts-infers-1.cn-north-1.myhuaweicloud.com/v1/infers/eb3e0c54-3dfa-4750-af0c-95c45e5d3e83
    
  2. 文本输入

    curl -kv -d '{"data":{"req_data":[{"sepal_length":3,"sepal_width":1,"petal_length":2.2,"petal_width":4}]}}' -H 'X-Auth-Token:MIISkAY***80T9wHQ==' -H 'Content-type: application/json' -X POST https://modelarts-infers-1.cn-north-1.myhuaweicloud.com/v1/infers/eb3e0c54-3dfa-4750-af0c-95c45e5d3e83
    

    **“-d”**是Body体的文本内容。

    进行token利用api需要注册IAM用户,此处不再赘述,请参考官网文档获取IAM用户Token

二、Python上手ModelArts

1、准备数据

1.1创建桶

参考实验步骤一中1.2创建桶,配置如下

①复制桶配置:不选

②区域:华北-北京四

③ 数据冗余存储策略:单AZ存储

④桶名称:自定义即可(需要记住此名称以备后续步骤使用)

⑤ 存储类别:标准存储

⑥桶策略:私有

⑦ 默认加密:关闭

⑧归档数据直读:关闭

然后新建一个文件夹data

1.2创建notebook

image-20220120220248038

在ModelArts控制台左侧,点击开发环境下的Notebook,点击创建,配置如下:

①名称:自定义

②自动停止:根据自己需要时间设置

③镜像:公共镜像-pytorch1.4-cuda10.1-cudnn7-ubuntu18.04

④资源池:公共资源池

⑥类型:CPU

⑦规格:CPU:2核心8GB

⑧存储配置:默认存储

⑨SSH远程开发:关闭

配置好后提交,返回,直到notebook状态变为运行中。

1.3创建Notebook Python开发环境

点击“打开”进入Notebook,如果习惯旧版本的Notebook,可以点击返回旧版,这里新版本打开的是jupyter Lab。这里再次演示一下旧版本如何设计。

image-20220120220709651

单击返回旧版,点击创建

image-20220120220737238

选择multiengine2.0

image-20220120222835221

选择对象存储服务,配置如下:

image-20220120222930981

image-20220120222954722

提交,返回Notebook列表

image-20220120223053039

状态变为运行中,打开,进入华为云远程jupyter界面,选择新建一个TensorFlow-2.1.0

image-20220120223223741

点击untitle,重命名

image-20220120223351878

测试有关功能

image-20220120223422571

2、Python代码实现

创建好了Notebook环境,接下来就跟我们平时的实验操作是一样的了。

我们来验证一下。

简单输出

image-20220120223635557

3、新版Jupyter Lab体验

最新版的已经可以打开Lab界面

image-20220120224152106

启动后单击打开

image-20220120224217594

image-20220120224302120

点击Python3.7.10即可新建Notebook

image-20220120224429487

进行基本操作完全没有问题

image-20220120224513287

文件读写操作,可以看到旁边生成了文件。

image-20220120224552972

拖拽可以上传文件,非常方便。

image-20220120224633461

三、自动学习

强化学习需要自己上传数据集。遵守有关规范。

1、图像分类

1.1数据准备

数据集要求

  • 文件名规范:不能有中文,不能有+、空格、制表符。
  • 保证图片质量:不能有损坏的图片目前支持的格式包括jpg、jpeg、bmp、png。
  • 不要把明显不同的多个任务数据放在同一个数据集内。
  • 每一类数据尽量多,尽量均衡。期望获得良好效果,图像分类项目中,建议训练数据集保证每类图片超过100张。
  • 为了保证模型的预测准确度,训练样本跟真实使用场景尽量相似。
  • 为保证模型的泛化能力,数据集尽量覆盖可能出现的各种场景。

OBS上传文件规范

  • 如不需要提前上传训练数据,请创建一个空文件夹用于存放工程后期生成的文件。如:“/bucketName/data-cat”。

  • 如需要提前上传待标注的图片,请创建一个空文件夹,然后将图片文件保存在该文件夹下,图片的目录结构如:“/bucketName/data-cat/cat.jpg”。

  • 如您将已标注好的图片上传至OBS桶,请按照如下规范上传。

    • 图像分类数据集要求将标注对象和标注文件存储在同一目录,并且一一对应,例如标注对象文件名为

      “10.jpg”

      ,那么标注文件的文件名应为

      “10.txt”

      数据文件存储示例:

      ├─<dataset-import-path>
            │      10.jpg
            │      10.txt    
            │      11.jpg 
            │      11.txt
            │      12.jpg 
            │      12.txt
      
    • 只支持JPG、JPEG、PNG、BMP格式的图片。在ModelArts管理控制台上传时,单张图片的大小不能超过5MB,单次上传的图片总大小不能超过8MB,数据量大时推荐使用OBS Browser+上传 。

    • 标签名是由中文、大小写字母、数字、中划线或下划线组成,且不超过32位的字符串。

    • 图像分类标签

      “.txt”

      规范如下。

      一行一个标签:

      cat
      dog
      ...
      

那这次我们就下载猫、狗、麻雀、鲸各100张

我已经编写好了一段代码供大家使用。mkdir一个路径用于存放图片,然后运行即可。

import requests
from bs4 import BeautifulSoup
import json
import eventlet
import os

urlshu = 1      #url中first = urlshu
pictureshu = 1  #图片下载时的名字(加上异常图片的第几张图片)
soupshu = 0     #每35张soup列表中第soupshu个
whileshu = 35   #用于while循环的数(因为每个页面35张图片)



url1 = 'https://cn.bing.com/images/async?q='
url2 = '&first=%d&count=35&cw=1177&ch=737&relp=35&tsc=ImageBasicHover&datsrc=I&layout=RowBased&mmasync=1'
head1 = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.64'
    }
#有35张图片的网页的请求标头

head2 = {
'Cookie': 'Hm_lvt_d60c24a3d320c44bcd724270bc61f703=1624084633,1624111635',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.64'
    }
#具体图片的网页的请求标头

print('请输入查找内容:')
content = input()
if os.path.exists('./%s'%content):
    pass    #创建文件夹'图片'
else:
    os.mkdir('./%s'%content)
print('请输入查找图片数量:')
number = int(input())
url = url1 + content + url2 #合并成去往有35张图片的网址

while whileshu:
    r0 = requests.get(url%urlshu,headers = head1).text  #发送get请求并将内容转化成文本
    soup = BeautifulSoup(r0,features="html.parser").find_all('a','iusc')   #解析r0并找到a和class=iusc的标签
    data = str(soup[soupshu].get('m'))  #将列表soup的第soupshu位中的m提取出来
    zidian = json.loads(data)   #将data转化成字典形式
    ifopen = 1      #用于下方判断是否下载图片
    with eventlet.Timeout(1,False):     #设定1秒的超时判断
        try:
            picture = requests.get(zidian['murl'],headers = head2).content  #发送get请求并返回二进制数据
        except:
            #print('图片%d超时异常'%pictureshu)    #说明图片异常
            pictureshu -= 1
            ifopen = 0      #取消下载此图片,否则会一直卡着然后报错
    while ifopen == 1:
        text = open('%s/'%content + '%d'%pictureshu + '.jpg','wb')  #将图片下载至文件夹'图片'中
        text.write(picture)     #上行代码中'wb'为写入二进制数据
        text.close()
        full_path = '%s/'%content + '%d'%pictureshu + '.txt'
        file = open(full_path, 'w',encoding="utf-8")
        #写入的语句
        file.write('%s'%content)
        ifopen = 0
        number = number - 1
        
    pictureshu = pictureshu + 1
    soupshu = soupshu + 1
    whileshu = whileshu - 1
    
    if whileshu == 0:   #第一页图片下载完成,将网址的first进1
        urlshu = urlshu + 1
        whileshu = 35
        soupshu = 0
        
    if number == 0:     #下载图片数量达标,退出循环
        print("查找完成,已完成标注")
        break

image-20220122212332554

image-20220122214047394

起始编号分别设置为1 101 201 301共400张图片。

image-20220122213619172

把利用代码下载好的图片和标注归到一个文件夹dataset-animals。

image-20220122214116451

比较过瘾的400个数据。

上传到obs,而一次只能上传100个。官网说上传文件较多,使用OBS Browser+,那我们下载了试试。win64下载地址:OBSBrowserPlus-win64,其余下载请参考下载OBS Browser+

解压运行

image-20220122214822192

安装完成后,利用AK/SK登录。

image-20220122214935434

image-20220122215059847

image-20220122215241394

image-20220122215417509

直接添加文件夹,这样就很爽。

1.2创建项目

ModelArts控制台,自动学习-图像分类创建项目

image-20220122213251635

image-20220122215708342

配置如图。

image-20220122215815458

需要稍等,会自动根据txt文件标注数据集

image-20220122215907156

全部标注完成。

1.3训练模型并部署上线

开始训练。默认配置即可。

image-20220122220037998

image-20220122220743116

训练完成,部署上线

image-20220122220801257

image-20220122221306573

image-20220122221342428

image-20220122221544151

上传图片进行检验,效果很好。

2、物体检测

2.1准备数据

数据集需要有xml文件标注,或者未经标注需要现场标注。xml格式参考准备数据_AI开发平台ModelArts_自动学习_物体检测_华为云 (huaweicloud.com)

这里我们选择上传图片后再标注。

我们从网上下载100张海鸥图片。

image-20220122220955668

2.2标注数据

上传50张进行标注

image-20220122221744067

创建物体检测项目

image-20220122221903333

image-20220122221959341

image-20220122222016718

挨个标注

image-20220122222150908

image-20220122223003285

image-20220122222932276

好了,全部变成了已标注,我们同步一下数据集

image-20220122223101513

image-20220122223121468

image-20220122223127425

2.3训练并发布

image-20220122223301276

image-20220122224333286

部署

image-20220122224350414

变为运行中后,选择后50个海鸥图片开始测试

image-20220122225459055

image-20220122225547437

不错,识别比较准确。

image-20220122225621649

image-20220122225639181

3、预测分析

3.1准备数据

我们使用鸢尾花数据集,下载链接http://download.tensorflow.org/data/iris_training.csv

有关鸢尾花数据集的更多信息,可以看我的这篇笔记鸢尾花数据集的各种玩法_kewei chen-CSDN博客

训练数据的csv文件不能包含表头,否则会导致训练失败。

因此我们删除第一行。在excel里,光标移到1行上,右击删除即可。

输入数据的格式必须为csv格式,数据文件不包括表头,有效数据行数必须大于100行。列数必须小于200列,数据总大小不能超过100MB。

3.2创建项目

image-20220122225021558

image-20220122225140000

image-20220122225207663

注意:当前由于特征筛选算法限制,标签列必须是数据集的最后一列。模型训练将会使用全部数据训练预测模型,该模型以其他列的数据为输入,以标签列的预测值为输出。

image-20220122225359490

配置完成,开始训练。

image-20220122225708843

3.3结果预测

键入以下内容

{
    "data": {
        "req_data": [{
            "attr_1": 5.1,
            "attr_2": 3.5,
            "attr_3": 1.4,
            "attr_4": 0.2
        }]
    }
}

image-20220122230143866

输出为0,即代表Setosa

image-20220122230205750

4、声音分类

数据准备

浏览记录 :: 第1页 :: 异种-canto (xeno-canto.org)

我们在这里,可以下载公益组织上传的鸟类声音。

利用如下代码,可以把文本转为人声

import pyttsx3

# 初始化来获取语音引擎
engine = pyttsx3.init()
text=input('请输入文本')
# 去掉文本中的换行符
text = text.replace('\n','')
# 保存音频到本地,格式为mp3
s = input('请输入你想要保存的文件名')
engine.save_to_file(text, '%s'%s+'.mp3')
engine.runAndWait()

使用以下代码,把mp3声音转为wav文件。

from ffmpy import FFmpeg as mpy # 音频格式转换对象

import os #  文件系统操作对象
def read_folder(mp3_folder, wav_folder):
    '''
    文件夹读取函数
    :param mp3_folder:
    :param wav_folder:
    :return:
    '''
    # 遍历需要转换的MP3文件夹中的MP3文件
    for a in os.listdir(mp3_folder):
        # 创建MP3文件的绝对路径
        mp3_file = os.path.join(mp3_folder, a)
        # 调用格式转换函数
        trans_to_wav(mp3_file, wav_folder)
def trans_to_wav(mp3_file, wav_folder):
    '''
    格式转换格式
    :param mp3_file:
    :param wav_folder:
    :return:
    '''
    # 格式化文件
    file_fmt = os.path.basename(mp3_file).strip()
    # 获取文件格式
    file_fmt = file_fmt.split('.')[-1]
    # 校验文件格式
    if file_fmt.strip() != 'mp3':
        raise Exception('改文件不是MP3格式,请检查!')
    elif file_fmt.strip() == '':
        raise Exception('文件格式出现异常,请检查!')
    # 创建wav的文件以供转换完成后输出
    wav_file_path = os.path.join(wav_folder)
    wav_file_path = os.path.join(wav_file_path, '{}.{}'.format(
        os.path.basename(mp3_file).strip().split('.')[0], 'wav'
    ))
    # 创建转换时的命令行参数字符串
    cmder = '-f wav -ac 1 -ar 16000'
    # 创建转换器对象
    mpy_obj = mpy(
        inputs={
            mp3_file: None
        },
        outputs={
            wav_file_path: cmder
        }
    )
    print('执行CMDER 命令:{}'.format(mpy_obj.cmd))

    # 执行转换
    mpy_obj.run()
if __name__ == '__main__':
    '''
    主函数入口
    '''
    # 输入MP3文件夹
    mp3_folder = input('输入MP3文件夹路径:\n')
    # 校验MP3文件夹是否存在
    if mp3_folder.strip() == '':
        raise Exception('输入空值,请检查!')
    elif mp3_folder.strip() != '':
        if os.path.exists(mp3_folder) is False:
            raise Exception('文件路径不存在')
    # 输入wav文件夹路径
    wav_folder = input('输入wav文件夹路径:\n')
    # 校验wav文件夹是否存在
    if wav_folder.strip() == '':
        raise Exception('输入空值,请检查!')
    #elif wav_folder.strip() != '':
    #    if os.path.exists(wav_folder) is False:
    #        raise Exception('文件路径不存在')
    # 调用文件夹读取批量文件
    read_folder(mp3_folder, wav_folder)

m4a转wav

'''
功能:读取指定文件夹下的所有mp3文件,转换为wav文件
用法:修改path路径 filter改为".m4a",就是遍历当前目录下的m4a文件,注释掉35行的cmd_command
转换其它的:最主要是用字符串拼接出cmd_command命令

'''

import os
path=r'./'

filter=[".m4a"] #设置过滤后的文件类型 当然可以设置多个类型

def all_path(dirname):

    result = []#所有的文件

    for maindir, subdir, file_name_list in os.walk(dirname):

        for filename in file_name_list:
            apath = os.path.join(maindir, filename)#合并成一个完整路径
            ext = os.path.splitext(apath)[1]  # 获取文件后缀 [0]获取的是除了文件名以外的内容

            if ext in filter:
                result.append(apath)

    return result

filenames=all_path(path)

for filename in filenames:
    filename=str(filename)
    temp=filename.split('.')

    #将.m4a格式转为wav格式的命令
    cmd_command = "ffmpeg -i {0} -acodec pcm_s16le -ac 1 -ar 16000 -y {1}.wav && del {0}".format(filename,temp[0])
    # 将.mp3格式转为wav格式的命令
    #cmd_command = "ffmpeg -loglevel quiet -y -i {0} -ar 16000 -ac 1 {1}.wav && del {0}".format(filename, temp[0])

    #print(cmd_command)
    os.system(cmd_command)

image-20220123220021965

最后那几个是用计算机合成的人声。其他的都是鸟类声音数据集。

登录我的obs控制台

image-20220123220152492

image-20220123220242794

上传。

创建声音分类项目。

image-20220123220421287

image-20220123220424460

进行批量标注

image-20220123220601438

image-20220123220620141

开始训练

image-20220123220936527

模型部署

image-20220123222205536

数据集小了,拟合效果还不够好。

增加数据集数目后,效果好多了。

image-20220123222949539

5、文本分类

我们使用中文数据集:链接

https://thunlp.oss-cn-qingdao.aliyuncs.com/THUCNews.zip

模仿上述自动学习步骤即可,此处不在赘述。

四、进阶体验

1、一键完成商超商品识别模型部署

订阅模型:商超商品识别 (huaweicloud.com),前往控制台

image-20220121135635623

部署为在线服务

image-20220121135756217

配置如下,提交

image-20220121140012392

在在线服务详情界面,点击预测

image-20220121140735694

点击上传,我上传了一张西瓜,预测结果如下

image-20220121140915480

可以看见,输出结果为西瓜,占了绝对优势。

image-20220121141334256

上传的苹果,给我预测成了石榴。。。

下面是香蕉

image-20220121141531276

2、一键运行Notebook实现工地钢筋盘点

进入案例界面基于计算机视觉的钢筋条数检测 (huaweicloud.com)

Run in modelarts

等待右上角链接完成

image-20220121141835945

链接成功,切换规格

image-20220121141919552

image-20220121141929641

选择限时免费的GPU,等待切换

image-20220121141952978

切换完成后,直接run即可

image-20220121142211339

还可以一键自动运行

image-20220121142336805

image-20220121142413759

image-20220121143556402

3、使用自动学习0代码开发图像分类AI模型

3.1下载数据集

进入AI Gallery,在“资产集市”>“数据”页面找到四类花卉图像分类小数据集,单击右侧“下载”。

image-20220121142547918

配置如图

image-20220121142651185

image-20220121142748521

3.2创建图像分类项目

进入ModelArts控制台,在左侧导航栏选择“自动学习”>“图象分类”,单击“创建项目”。

image-20220121142930282

配置如图

image-20220121143007456

开始训练

image-20220121143111256

image-20220121143136364

配置如图,训练完成后部署

image-20220121143635839

image-20220121143653920

模型变成了运行中

image-20220121161548511

image-20220121162429478

image-20220121162449884

上传玫瑰进行预测,准确度蛮高

image-20220121162519295

雏菊

image-20220121162604916

image-20220121163923642

image-20220121163942719

image-20220121164022065

使用完成后,选择停止

image-20220121164453141

4、使用订阅算法构建模型实现花卉识别

我们这次仍然以花卉识别为例,参考步骤{(四)3.1}下载数据集

将数据集下载:四类花卉图像分类小数据集 (huaweicloud.com)

下载到空目录:/test-modelartsz/dataset-flower/

image-20220121165424675

数据集下载后,记住下载路径,订阅识别算法图像分类-ResNet_v1_50 (huaweicloud.com)

image-20220121164906760

image-20220121164918301

image-20220121164945146

image-20220121165010750

提交

image-20220121165538831

image-20220121165649607

点击名称,进入详情界面,等待完成。

image-20220121170151127

完成后,点击右上角创建AI应用。

全部为默认即可,立即创建。

image-20220121170331789

部署为在线服务

image-20220121170857498

配置如下

image-20220121171041215

等待部署完成

image-20220121171136889

点击预测,选择上传

image-20220121171452583

image-20220121171516720

image-20220121171549886当然也有预测不准的时候,比如这个玫瑰给我搞成100%的雏菊。。。

image-20220121171704061

上面这个还比较合理。

不需要训练后,可以点击右上角的停止。

image-20220121171802588

5、使用自定义算法构建模型(手写数字识别)

5.1准备数据

点此下载数据集:数据集下载链接

解压后如图

image-20220121172306129

进入对象存储服务,选择桶。新建一个文件夹,取名test-modelarts-cz/dataset-mnist,会自动生成子路径。

image-20220121172551663

上传**“Mnist-Data-Set”**数据集

去gitee下载modelarts的工程zipModelArts-Lab

image-20220121172740029

image-20220121172937449

在新建的路径上传对象,上传,不要加密。

image-20220121173045910

再新建两个文件夹mnist-tensorflow-code和mnist-model,存放脚本和模型。

image-20220121173302164

下载完成后,解压缩“ModelArts-Lab-master.zip”文件,然后在“\ModelArts-Lab-master\official_examples\Using Custom Algorithms to Build Models on ModelArts\codes”目录中获取到训练脚本“train_mnist_tf.py”、推理代码“customize_service.py”和配置文件“config.json”,并上传至对应OBS路径。上传文件至OBS的操作指导请参见上传文件

文件名称 描述 上传至如下OBS路径中
“train_mnist_tf.py” 训练脚本。 “test-modelarts-cz/mnist-tensorflow-code”
“customize_service.py” 推理代码。 “test-modelarts-cz/mnist-model/model”**说明:**请在训练作业完成后,再执行上传操作。训练任务完成后,会在“test-modelarts-cz/mnist-model”路径下自动生成model文件夹,用于存放训练输出的模型。如果训练作业运行多次,在“mnist-model”目录下将生成多种版本的目录,如“V0001”、“V0002”,请基于训练作业的版本,将推理代码和配置文件上传至对应版本下的“model”文件夹内。
“config.json” 配置文件。 “test-modelarts-cz/mnist-model/model”训练完后再传

默认下载路径:C:\Users\25122\Downloads\ModelArts-Lab-master\official_examples\Using Custom Algorithms to Build Models on ModelArts\codes

先上传第一个,后两个先不传。

5.2创建算法并训练

image-20220121174215085

modelarts控制台-算法管理-我的算法-创建image-20220121174243549

配置如下图

image-20220121174607667

image-20220121174621019

提交即可。

ModelArts管理控制台>训练管理 > 训练作业(New)>创建

参数配置:

  • “算法>我的算法”:选择上一步创建的算法

  • “训练输入”:OBS中的“test-modelarts-cz/dataset-mnist”。

  • “训练输出”:OBS路径“test-modelarts-cz/mnist-model”。

  • “资源类型 ”:选GPU单卡,GPU: 1*NVIDIA-V100(32GB) | CPU: 8 核 64GB。

  • 配置如下

  • image-20220121175058162

    image-20220121175127708

    image-20220121175700151

    训练作业已完成。

5.3部署AI应用

推理代码“customize_service.py”和配置文件“config.json”并上传至OBS路径test-modelarts-cz/mnist-model/model中,请查看前面我们的表格。此推理代码和配置文件为ModelArts为操作样例提供的示例。也可以基于模型包规范,开发自己所需的推理代码及配置文件。

image-20220121180154450

ModelArts控制台 AI应用

image-20220121180243854

配置如图

image-20220121180452308

image-20220121180448695

部署为在线服务

image-20220121180739922

配置如图,其余默认。

image-20220121180900183

等待部署完成

image-20220121181018853

开启预测

image-20220121181632706

image-20220121181714123

和样例(点击另存为)img吻合很好,但是和自己写的就不怎么行了。

image-20220121184920624

至于为什么不行,本人有一篇小文说明原因:mnist模型为何识别咱自己写的字就不行?_kewei chen-CSDN博客

测试完成后,停止应用作业。

image-20220121185114736

6、使用PyCharm ToolKit在本地进行云上训练(手写数字识别)

在Pycharm中的插件,安装HUAWEI ModelArts

单击ToolKit工具的下载地址

重启。

image-20220121185749576

之后就可以看到顶部有modelarts这一栏了。

image-20220121190735144

点击第一行edit credential

即可把自己的AKSK输入

image-20220121190757446

点击OK,可以看到右下角的提示信息SUCCESS。

image-20220121190916406

下载mnist数据集数据集下载链接

解压,上传至“test-modelarts/dataset-mnist”OBS路径下

obs控制台,对象

image-20220121191158394

image-20220121191639961

克隆/下载gitee的ModelArts-Lab工程ZIP

下载完成后,解压缩“ModelArts-Lab-master.zip”文件,然后在“\ModelArts-Lab-master\official_examples\Using_MXNet_to_Create_a_MNIST_Dataset_Recognition_Application\codes”目录中获取到训练代码“train_mnist.py”。

打开PyCharm工具,单击**“File > New Project”**创建新工程, 在工程目录下创建“src”文件夹,并将训练代码文件“train_mnist.py”拷贝到“src”文件夹下。

image-20220121191856724

image-20220121224233961

在PyCharm工具栏中,选择**“ModelArts > Edit Training Job Configuration”**

image-20220122105850891

配置如图。

image-20220122110946570

image-20220122111216469

训练完成。

image-20220122111234598

右侧的信息提示我们去WEB端控制台看日志。

我们去modelarts控制台,训练作业旧版看。

这就是我们刚刚训练的。点击名称查看详情。

image-20220122111554390

日志让我们去找log。

image-20220122111702224

我们在本地也可以看到同样的信息。

这里超过max log length,应该是我把项目名称起太长了。

根据提示,我们在obs控制台的对象中找到log

点击下载

image-20220122112155106

我们看到了最后的成功信息。

image-20220122112239858

我们在pycharm的左侧栏,单击ModelArts Explorer

image-20220122112409518

第一版配置出现了一些错误,把AI引擎选错了,选成了TensorFlow,应该是MXNet,因此我们查看,对比两个版本

image-20220122112609912

image-20220122112626890

训练作业生成的模型存储在“test-modelarts/mnist-output/MA-mnist-11-30-16/output/V0002(根据自己版本决定)”路径下(其中MA-mnist-11-30-16是Job Name,笔者在配置时填写了自定义Job Name,则路径中就是自定义的Job Name),且系统将自动生成“model”文件夹,模型相关的文件存储在此目录下。将获取的“customize_service.py”和“config.json”(在\ModelArts-Lab-master\official_examples\Using Custom Algorithms to Build Models on ModelArts\codes)文件,上传至OBS的“model”文件夹下。

image-20220122112921039

image-20220122113057346

现在,在pycharm控制台,将其部署为在线服务。

image-20220122113245779

“Environment Variables”:填写运行参数,设置为“input_data_name=images;input_data_shape=0,1,28,28;output_data_shape=0,10”

配置如图

image-20220122113606804

image-20220122113703923

image-20220122114036176

部署完成后,会自动弹出链接。点击即可进入测试,也可以在控制台的在线服务中找到。

image-20220122114328004

下面我们开始预测工作,注意mnist模型需要黑底白字,使用windows画图制作几张即可。

image-20220122114444385

糟糕,预测超时了。

image-20220122115632871

查看日志

image-20220122115658930

报了一个路径不存在的错。

为什么呢?可能是上线的时候出了问题。

发现了问题的所在:模型路径错了,不应该是Using Custom Algorithms to Build Models on ModelArts,而是\ModelArts-Lab-master\official_examples\Using_MXNet_to_Create_a_MNIST_Dataset_Recognition_Application\codes

重新来V0003,训练完成

image-20220122131237790

image-20220122131311754

image-20220122131537150

上传,部署配置如图

image-20220122131823426

image-20220122131840474

开始部署,部署完成。

image-20220122132147161

可以了,预测成功。

image-20220122132240148

image-20220122132313235

预测成了8,把5的概率预测的那么小。。。

image-20220122132344094

image-20220122132418714

image-20220122132439081

image-20220122132515372

image-20220122132545205

image-20220122132559908

成功,不错!

最后,我们清除响应资源。

image-20220122132959833

停止在线服务

五、开发工具体验——远程开发

1、配置本地IDE(PyCharm ToolKit连接)

新建一个notebook实例

image-20220124095406209

image-20220124095647485

image-20220124095715228

image-20220124095730308

创建实例后,新建一个notebook

image-20220124100059431

在(四)6中已安装ToolKit的条件下,点击config

image-20220124100132684

image-20220124100254048

选择我们刚刚创建的Conatiner

apply后需要重启,首次约需20min进行update python interpreter

image-20220124100649940

链接成功后,右击即可stop

image-20220124100925734

单击即可链接

image-20220124100955769

image-20220124101007942

开启自动上传

image-20220124101109779

image-20220124101346941

可以选择远程python解释器

首次需要约20min更新解释器

image-20220124101509895

image-20220124105423825

上传后,我们可以看到如图所示的工程文件已经在云端了。

image-20220124105455410

image-20220124105632278

可以直接在本地运行,在控制台可以看到有关信息。

我们也可以断点调试,并且读出每一步变量的情况。

image-20220124105903923

image-20220124110226353

2、配置本地IDE(PyCharm手动连接)

手动SSH连接需要下载Pycharm专业版。

创建一个notebook实例

image-20220124110645472

在百度上查询自己的ip地址,配置ssh远程开发

image-20220124110729933

在实例详情界面,查看实例链接和端口

image-20220124111011414

在Pycharm中,选择File -> Settings -> Tools -> SSH Configurations,单击+号,增加一个SSH连接配置。

根据地址填写配置如图,选择密钥对方式连接,进行测试

image-20220124111525345

可以进行重命名,起个好听的名字。

然后,单击“Tools > Start SSH Session”,进入虚拟开发环境。

选择刚刚起好名字的notebook-kewei

cat /home/ma-user/README

执行上面这个命令查看有关配置。

image-20220124111947795

我们的notebook有两个环境,执行右侧的source命令可以进入具体环境。

image-20220124112148533

执行which python查看python路径并拷贝出来,以备后续配置云上Python Interpreter使用

image-20220124112305608

/home/ma-user/anaconda3/envs/python-3.7.10/bin/python就是Python的路径

  1. 单击“File > Settings > Project:PythonProject > Python Interpreter”,单击设置图标img,再单击“Add”,添加一个新的interpreter。image-20220124112439038image-20220124112456806

  2. 选择“Existing server configuration”,在下拉菜单中选择上一步配置好的SSH configuration,单击“Next”image-20220124112610327

  3. 解释器选择刚刚记录的解释器环境,工作文件夹选择modelarts的默认工作文件夹\home\ma-user\work,勾选自动上传到服务器。

  4. image-20220124113107556

  5. 完成配置。

    单击工具栏“Tools >Start SSH session”,选择SSH Configuration中配置的开发环境。可以执行pip install安装所需要的包。

    image-20220124113433500

跟我们命令行的一般操作是一样的。

image-20220124113507654

我们也可以像上一步一样,新建py或者ipynb文件,进行远程开发。

3、VScode远程开发

安装vscode:Windows用户直接单击此处下载:https://update.code.visualstudio.com/1.57.1/win32-x64-user/stable。

其他系统用户的下载地址: https://code.visualstudio.com/updates/v1_57

配置python解释器详见VSCode官方指导

下载ToolKit工具包下载链接

image-20220124104343177

image-20220124104347641

image-20220124104418750

右下角提示安装完成。点击ModelArts图标登录。AKSK我们已经用到多次,不在赘述。可参考:参考链接

image-20220124104503007

image-20220124104608673

开启了远程连接的,我们会看到状态

image-20220124121519142

初次登录需要选择密钥对。

image-20220124104937673

建议把keypair文件放到c/user/{{username}}下

vscode中,选择远程系统为Linux系统

image-20220124115836765

image-20220124115842326

左下角显示为具体的notebook实例名称,表示已经连接成功了。

打开文件件->确定

image-20220124120208954

image-20220124120212557

左侧会显示目录结构

image-20220124120657839

配置python解释器

image-20220124120702930

启动运行和调试。

在远程控制台也可以看见我们刚刚创建的文件

image-20220124120804181

4、手动配置VScode远程开发

安装vscode的ssh插件

image-20220124121505926

image-20220124121624629

进行远程配置

image-20220124121719991

HOST remote-dev
     hostname <instance connection host>
     port <instance connection port>
     user ma-user
     IdentityFile ~/.ssh/test.pem
     UserKnownHostsFile=/dev/null
     StrictHostKeyChecking no

  • User:登录用户只支持ma-user进行登录

单击“File > Preference > Settings > Extensions > Remote-SSH”, 在“Remote Platform”中,单击“Add Item”选项,设置**“Item”“Value”**,配置完成后,单击“OK”

image-20220124122303281

image-20220124122306843

image-20220124122415465

在SSH控制界面,单击此处

image-20220124122448799

连接成功

安装云端Python插件

image-20220124122530898

可以在云端安装常用的依赖库。比如常用的NLP处理包spacy。

  1. 在VSCode环境中,执行Ctrl+Shift+P。

  2. 搜Python:Select Interpreter,选择对应的Python环境。

    image-20220124122904254

  3. 单击页面上方的“Terminal > New Terminal”,此时打开的的命令行界面即为远端容器环境命令行。

  4. 进入引擎后,通过执行如下命令安装依赖包。

    pip install spacy
    

image-20220124123106273

image-20220124123223020

5、本地工具ssh远程开发

image-20220124123432298

创建一个ssh远程开发的实例。

下载并安装SSH远程连接工具,以PuTTY为例,下载链接

使用puttygen将密钥对.pem文件转成.ppk文件

image-20220124123738031

  1. 下载puttygen,并双击运行puttygen。

  2. 单击“Load”,上传.pem密钥(即在创建Notebook实例时创建并保存的密钥对文件)。

  3. 单击“Save private key”,保存生成的.ppk文件。.ppk文件的名字可以自定义,例如key.ppk。

image-20220124124255655

点击save,即可保存配置,下次可以直接使用

Translation:UTF-8

image-20220124124433033

image-20220124124507374

填写用户名,必须为ma-user

image-20220124124702749

image-20220124124725370

打开刚刚制作的ppk密码文件。

之后选择右下角open

image-20220124124709480

选择accept

成功连接到notebook实例。

cd到work目录下,创建一个python文件

image-20220124125013561

image-20220124125035937

运行成功。

小结

通过这次的实战演练,我们学会了基础的notebook操作,可以在云端实现jupyter lab愉快编程。在自动学习中的图像、声音、文本分类和预测,我们体会到了低代码运作的乐趣,短短十几分钟就可以做一个自己的物体识别程序。在远程开发中,我们可以用自己熟悉的Pycharm、vscode进行开发和程序设计,同时又能接触云上的算力,为我们的代码插上翅膀。这次体验,真是体会到了ModelArts的无限乐趣。
文章同步发表于CSDN:https://blog.csdn.net/weixin_54227557/article/details/122665425

【华为云AI贺新年】有奖征文火热进行中:https://bbs.huaweicloud.com/blogs/325842

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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