华为云用户手册

  • 功能介绍 统一存储主要用于工作流的目录管理,帮助用户统一管理一个工作流中的所有存储路径,主要分为以下两个功能: 输入目录管理:开发者在编辑开发工作流时可以对所有数据的存储路径做统一管理,规定用户按照自己的目录规划来存放数据,而存储的根目录可以根据用户自己的需求自行配置。该方式只做目录的编排,不会自动创建新的目录。 输出目录管理:开发者在编辑开发工作流时可以对所有的输出路径做统一管理,用户无需手动创建输出目录,只需要在工作流运行前配置存储根路径,并且可以根据开发者的目录编排规则在指定目录下查看输出的数据信息。此外同一个工作流的多次运行支持输出到不同的目录下,对不同的执行做了很好的数据隔离。
  • 常用方式 InputStorage(路径拼接) 该对象主要用于帮助用户统一管理输入的目录,使用示例如下: import modelarts.workflow as wf storage = wf.data.InputStorage(name="storage_name", title="title_info", description="description_info") # name字段必填,title, description可选填 input_data = wf.data.OBSPath(obs_path = storage.join("directory_path")) # 注意,如果是目录则最后需要加"/",例如:storage.join("/input/data/") 工作流运行时,如果storage对象配置的根路径为"/root/",则最后得到的路径为"/root/directory_path" OutputStorage(目录创建) 该对象主要用于帮助用户统一管理输出的目录,保证工作流每次执行输出到新目录,使用示例如下: import modelarts.workflow as wf storage = wf.data.OutputStorage(name="storage_name", title="title_info", description="description_info") # name字段必填,title, description可选填 output_path = wf.data.OBSOutputConfig(obs_path = storage.join("directory_path")) # 注意,只能创建目录,不能创建文件 。 工作流运行时,如果storage对象配置的根路径为"/root/",则系统自动创建相对目录,最后得到的路径为"/root/执行ID/directory_path"
  • 进阶用法 Storage 该对象是InputStorage和OutputStorage的基类,包含了两者的所有能力,可以供用户灵活使用。 属性 描述 是否必填 数据类型 name 名称。 是 str title 不填默认使用name的值。 否 str description 描述信息。 否 str create_dir 表示是否自动创建目录,默认为“False”。 否 bool with_execution_id 表示创建目录时是否拼接execution_id,默认为“False”。该字段只有在create_dir为True时才支持设置为True。 否 bool 使用示例如下: 实现InputStorage相同的能力 import modelarts.workflow as wf # 构建一个Storage对象, with_execution_id=False, create_dir=False storage = wf.data.Storage(name="storage_name", title="title_info", description="description_info", with_execution_id=False, create_dir=False) input_data = wf.data.OBSPath(obs_path = storage.join("directory_path")) # 注意,如果是目录则最后需要加"/",例如:storage.join("/input/data/") 工作流运行时,如果storage对象配置的根路径为"/root/",则最后得到的路径为"/root/directory_path" 实现OutputStorage相同的能力 import modelarts.workflow as wf # 构建一个Storage对象, with_execution_id=True, create_dir=True storage = wf.data.Storage(name="storage_name", title="title_info", description="description_info", with_execution_id=True, create_dir=True) output_path = wf.data.OBSOutputConfig(obs_path = storage.join("directory_path")) # 注意,只能创建目录,不能创建文件 工作流运行时,如果storage对象配置的根路径为"/root/",则系统自动创建相对目录,最后得到的路径为"/root/执行ID/directory_path" 通过join方法的参数实现同一个Storage的不同用法 import modelarts.workflow as wf # 构建一个Storage对象, 并且假设Storage配置的根目录为"/root/" storage = wf.data.Storage(name="storage_name", title="title_info", description="description_info", with_execution_id=False, create_dir=False) input_data1 = wf.data.OBSPath(obs_path = storage) # 得到的路径为:/root/ input_data2 = wf.data.OBSPath(obs_path = storage.join("directory_path")) # 得到的路径为:/root/directory_path,需要用户自行保证该路径存在 output_path1 = wf.data.OBSOutputConfig(obs_path = storage.join(directory="directory_path", with_execution_id=False, create_dir=True)) # 系统自动创建目录,得到的路径为:/root/directory_path output_path2 = wf.data.OBSOutputConfig(obs_path = storage.join(directory="directory_path", with_execution_id=True, create_dir=True)) # 系统自动创建目录,得到的路径为:/root/执行ID/directory_path Storage可实现链式调用 使用示例如下: import modelarts.workflow as wf # 构建一个基类Storage对象, 并且假设Storage配置的根目录为"/root/" storage = wf.data.Storage(name="storage_name", title="title_info", description="description_info", with_execution_id=False, create_dir=Fals) input_storage = storage.join("directory_path_1") # 得到的路径为:/root/directory_path_1 input_storage_next = input_storage.join("directory_path_2") # 得到的路径为: /root/directory_path_1/directory_path_2
  • 背景信息 只有“图片”的数据集,且版本标注类型为“物体检测”和“图像分类”的数据集版本支持数据特征分析。 只有发布后的数据集支持数据特征分析。发布后的Default格式数据集版本支持数据特征分析。 数据特征分析的数据范围,不同类型的数据集,选取范围不同: 对于标注任务类型为“物体检测”的数据集版本,当已标注样本数为0时,发布版本后,数据特征页签版本置灰不可选,无法显示数据特征。否则,显示已标注的图片的数据特征。 对于标注任务类型为“图像分类”的数据集版本,当已标注样本数为0时,发布版本后,数据特征页签版本置灰不可选,无法显示数据特征。否则,显示全部的图片的数据特征。 数据集中的图片数量要达到一定量级才会具有意义,一般来说,需要有大约1000+的图片。 “图像分类”支持分析指标有:“分辨率”、“图片高宽比”、“图片亮度”、“图片饱和度”、“清晰度”和“图像色彩的丰富程度”。“物体检测”支持所有的分析指标。目前ModelArts支持的所有分析指标请参见支持分析指标及其说明。
  • 支持分析指标及其说明 表1 分析指标列表 名称 说明 分析说明 分辨率 Resolution 图像分辨率。此处使用面积值作为统计值。 通过指标分析结果查看是否有偏移点。如果存在偏移点,可以对偏移点做resize操作或直接删除。 图片高宽比 Aspect Ratio 图像高宽比,即图片的高度/图片的宽度。 一般呈正态分布,一般用于比较训练集和真实场景数据集的差异。 图片亮度 Brightness 图片亮度,值越大代表观感上亮度越高。 一般呈正态分布,可根据分布中心判断数据集整体偏亮还是偏暗。可根据使用场景调整,比如使用场景是夜晚,图片整体应该偏暗。 图片饱和度 Saturation 图片的色彩饱和度,值越大表示图片整体色彩越容易分辨。 一般呈正态分布,一般用于比较训练集和真实场景数据集的差异。 清晰度 Clarity 图片清晰程度,使用拉普拉斯算子计算所得,值越大代表边缘越清晰,图片整体越清晰。 可根据使用场景判断清晰度是否满足需要。比如使用场景的数据采集来自高清摄像头,那么清晰度对应的需要高一些。可通过对数据集做锐化或模糊操作,添加噪声对清晰度做调整。 图像色彩的丰富程度 Colorfulness 横坐标:图像的色彩丰富程度,值越大代表色彩越丰富。 纵坐标:图片数量。 是观感上的色彩丰富程度,一般用于比较训练集和真实场景数据集的差异。 按单张图片中框的个数统计图片分布 Bounding Box Quantity 横坐标:单张图片中框的个数。 纵坐标:图片数量。 对模型而言一张图片的框个数越多越难检测,需要越多的这种数据用作训练。 按单张图片中框的面积标准差统计图片分布 Standard Deviation of Bounding Boxes Per Image 横坐标:单张图片中框的标准差。单张图片只有一个框时,标准差为0。标准差的值越大,表示图片中框大小不一程度越高。 纵坐标:图片数量。 对模型而言一张图中框如果比较多且大小不一,是比较难检测的,可以根据场景添加数据用作训练,或者实际使用没有这种场景可直接删除。 按高宽比统计框数量的分布 Aspect Ratio of Bounding Boxes 横坐标:目标框的高宽比。 纵坐标:框数量(统计所有图片中的框)。 一般呈泊松分布,但与使用场景强相关。多用于比较训练集和验证集的差异,如训练集都是长方形框的情况下,验证集如果是接近正方形的框会有比较大影响。 按面积占比统计框数量的分布 Area Ratio of Bounding Boxes 横坐标:目标框的面积占比,即目标框的面积占整个图片面积的比例,越大表示物体在图片中的占比越大。 纵坐标:框数量(统计所有图片中的框)。 主要判断模型中使用的anchor的分布,如果目标框普遍较大,anchor就可以选择较大。 按边缘化程度统计框数量的分布 Marginalization Value of Bounding Boxes 横坐标:边缘化程度,即目标框中心点距离图片中心点的距离占图片总距离的比值,值越大表示物体越靠近边缘。(图片总距离表示以图片中心点为起点画一条经过标注框中心点的射线,该射线与图片边界交点到图片中心点的距离)。 纵坐标:框数量(统计所有图片中的框)。 一般呈正态分布。用于判断物体是否处于图片边缘,有一些只露出一部分的边缘物体,可根据需要添加数据集或不标注。 按堆叠度统计框数量的分布 Overlap Score of Bounding Boxes 横坐标:堆叠度,单个框被其他的框重叠的部分,取值范围为0~1,值越大表示被其他框覆盖的越多。 纵坐标:框数量(统计所有图片中的框)。 主要用于判断待检测物体的堆叠程度,堆叠物体一般对于检测难度较高,可根据实际使用需要添加数据集或不标注部分物体。 按亮度统计框数量的分布 Brightness of Bounding Boxes 横坐标:目标框的图片亮度,值越大表示越亮。 纵坐标:框数量(统计所有图片中的框)。 一般呈正态分布。主要用于判断待检测物体的亮度。在一些特殊场景中只有物体的部分亮度较暗,可以看是否满足要求。 按清晰度统计框数量的分布 Clarity of Bounding Boxes 横坐标:目标框的清晰度,值越大表示越清晰。 纵坐标:框数量(统计所有图片中的框)。 主要用于判断待检测物体是否存在模糊的情况。比如运动中的物体在采集中可能变得模糊,需要重新采集。
  • 数据域迁移算子(CycleGan算子) 基于CycleGAN用于生成域迁移的图像,即将一类图片转换成另一类图片,把X空间中的样本转换成Y空间中的样本。CycleGAN可以利用非成对数据进行训练。模型训练时运行支持两个输入,分别代表数据的原域和目标域,在训练结束时会生成所有原域向目标域迁移的图像。 图5 CycleGan算子 表3 CycleGan算子高级参数 参数名 默认值 参数说明 do_validation True 是否进行数据校验,默认为True,表示数据生成前需要进行数据校验,否则只进行数据生成。 image_channel 3 生成图像的通道数。 image_height 256 图像相关参数:生成图像的高,大小需要是2的次方。 image_width 256 图像相关参数:生成图像的宽,大小需要是2的次方 batch_size 1 训练相关参数:批量训练样本个数。 max_epoch 100 训练相关参数:训练遍历数据集次数。 g_learning_rate 0.0001 训练相关参数:生成器训练学习率。 d_learning_rate 0.0001 训练相关参数:判别器训练学习率。 log_frequency 5 训练相关参数:日志打印频率(按step计数)。 save_frequency 5 训练相关参数:模型保存频率(按epoch计数)。 predict False 是否进行推理预测,默认为False。如果设置True,需要在resume参数设置已经训练完成的模型的obs路径。 resume empty 如果predict设置为True,需要填写Tensorflow模型文件的obs路径用于推理预测。当前仅支持“.pb”格式的模型。示例:obs://xxx/xxxx.pb。 默认值为empty。 输入说明 算子输入分为两种,“数据集”或“OBS目录”。 选择“数据集”,请从下拉框中选择ModelArts中管理的数据集及其版本。要求数据集类型与您在本任务中选择的场景类别一致。 选择“OBS目录”,图像生成算子不需要标注信息,输入支持单层级或双层级目录,存放结构支持“单层级”或“双层级”模式。 单层级目录结构如下所示: image_folder----0001.jpg ----0002.jpg ----0003.jpg ... ----1000.jpg 双层级目录结构如下所示: image_folder----sub_folder_1----0001.jpg ----0002.jpg ----0003.jpg ... ----0500.jpg ----sub_folder_2----0001.jpg ----0002.jpg ----0003.jpg ... ----0500.jpg ... ----sub_folder_100----0001.jpg ----0002.jpg ----0003.jpg ... ----0500.jpg 输出说明 输出目录的结构如下所示。其中“model”文件夹存放用于推理的“frozen pb”模型,“samples”文件夹存放训练过程中输出图像,“Data”文件夹存放训练模型生成的图像。 train_url----model----CYcleGan_epoch_10.pb ----CYcleGan_epoch_20.pb ... ----CYcleGan_epoch_1000.pb ----samples----0000_0.jpg ----0000_1.jpg ... ----0100_15.jpg ----Data----CYcleGan_0_0.jpg ----CYcleGan_0_1.jpg ... ----CYcleGan_16_8.jpg ----output_0.manifest 其中manifest文件内容示例如下所示。 { "id": "xss", "source": "obs://home/fc8e2688015d4a1784dcbda44d840307_14.jpg", "usage": "train", "annotation": [ { "name": "Cat", "type": "modelarts/image_classification" } ] }
  • 数据生成算子(StyleGan算子) 图像生成利用Gan网络依据已知的数据集生成新的数据集。Gan是一个包含生成器和判别器的网络,生成器从潜在空间中随机取样作为输入,其输出结果需要尽量模仿训练集中的真实样本。判别器的输入则为真实样本或生成网络的输出,其目的是将生成网络的输出从真实样本中尽可能分辨出来。而生成网络则要尽可能地欺骗判别网络。两个网络相互对抗、不断调整参数,最终目的是使判别网络无法判断生成网络的输出结果是否真实。训练中获得的生成器网络可用于生成与输入图片相似的图片,用作新的数据集参与训练。基于Gan网络生成新的数据集不会生成相应的标签。图像生成过程不会改动原始数据,新生成的图片或xml文件保存在指定的输出路径下。 基于StyleGan2用于在数据集较小的情形下,随机生成相似图像。StyleGAN提出了一个新的生成器结构,能够控制所生成图像的高层级属性(high-level attributes),如发型、雀斑等;并且生成的图像在一些评价标准上得分更好。而本算法又增加了数据增强算法,可以在较少样本的情况下也能生成较好的新样本,但是样本数尽量在70张以上,样本太少生成出来的新图像不会有太多的样式。 图4 StyleGan算子 表2 StyleGan算子高级参数 参数名 默认值 参数说明 resolution 256 生成正方形图像的高宽,大小需要是2的次方。 batch-size 8 批量训练样本个数。 total-kimg 300 总共训练的图像数量为total_kimg*1000。 generate_num 300 生成的图像数量,如果是多个类的,则为每类生成的数量。 predict False 是否进行推理预测,默认为False。如果设置True,需要在resume参数设置已经训练完成的模型的obs路径。 resume empty 如果predict设置为True,需要填写Tensorflow模型文件的obs路径用于推理预测。当前仅支持“.pb”格式的模型。示例:obs://xxx/xxxx.pb。 默认值为empty。 do_validation True 是否做数据校验,默认为True,表示数据生成前需要进行数据校验,否则只进行数据生成。 输入要求 算子输入分为两种,“数据集”或“OBS目录”。 选择“数据集”,请从下拉框中选择ModelArts中管理的数据集及其版本。要求数据集类型与您在本任务中选择的场景类别一致。 选择“OBS目录”,图像生成算子不需要标注信息,输入支持单层级或双层级目录,存放结构支持“单层级”或“双层级”模式。 单层级目录结构如下所示: image_folder----0001.jpg ----0002.jpg ----0003.jpg ... ----1000.jpg 双层级目录结构如下所示: image_folder----sub_folder_1----0001.jpg ----0002.jpg ----0003.jpg ... ----0500.jpg ----sub_folder_2----0001.jpg ----0002.jpg ----0003.jpg ... ----0500.jpg ... ----sub_folder_100----0001.jpg ----0002.jpg ----0003.jpg ... ----0500.jpg 输出说明 输出目录的结构如下所示。其中“model”文件夹存放用于推理的“frozen pb”模型,“samples”文件夹存放训练过程中输出图像,“Data”文件夹存放训练模型生成的图像。 train_url----model----CYcleGan_epoch_10.pb ----CYcleGan_epoch_20.pb ... ----CYcleGan_epoch_1000.pb ----samples----0000_0.jpg ----0000_1.jpg ... ----0100_15.jpg ----Data----CYcleGan_0_0.jpg ----CYcleGan_0_1.jpg ... ----CYcleGan_16_8.jpg ----output_0.manifest 其中manifest文件内容示例如下所示。 { "id": "xss", "source": "obs://home/fc8e2688015d4a1784dcbda44d840307_14.jpg", "usage": "train", "annotation": [ { "name": "Cat", "type": "modelarts/image_classification" } ] }
  • 数据扩增算子说明 数据扩增主要用于训练数据集不足或需要仿真的场景,能通过对已标注的数据集做变换操作来增加训练图片的数量,同时会生成相应的标签。在深度学习领域,增强有重要的意义,能提升模型的泛化能力,增加抗扰动的能力。数据扩增过程不会改动原始数据,扩增后的图片或xml文件保存在指定的输出路径下。 ModelArts提供以下数据扩增算子: 表1 数据扩增算子介绍 算子 算子说明 高级 AddNoise 添加噪声,模拟常见采集设备在采集图片过程中可能会产生的噪声。 noise_type:添加噪声的分布类型,Gauss为高斯噪声,Laplace为拉普拉斯噪声,Poisson是泊松噪声,Impulse是脉冲噪声,SaltAndPepper为椒盐噪声。默认值为Gauss loc:噪声分布的均值,仅在Gauss和Laplace生效。默认值为0 scale:噪声分布的标准差,仅在Gauss和Laplance生效。默认值为1 lam:泊松分布的lambda系数,仅在Poisson有效。默认值为2 p:对于每个像素点,出现脉冲噪声或椒盐噪声的概率,仅在Impulse和SaltAndPepper有效。默认值为0.01 do_validation:数据扩增前是否进行数据校验。默认值为True。 Blur 模糊,使用滤波器对图像进行滤波操作,有时用于模拟成像设备的成像。 blur_type:可选Gauss和Average两种模式,分别为高斯和均值滤波。默认值为Gauss do_validation:数据扩增前是否进行数据校验。默认值为True。 Crop 图片裁剪,随机裁剪图片的一部分作为新的图片。 crop_percent_min:各边裁剪占比的随机取值范围的最小值。默认值为0.0 crop_percent_max:各边裁剪占比的随机取值范围的最大值。默认值为0.2 do_validation:数据扩增前是否进行数据校验。默认值为True。 CutOut 随机擦除,在深度学习中常用的方法,用于模拟物体被障碍物遮挡。 do_validation:数据扩增前是否进行数据校验。默认值为True。 Flip 翻转,沿图片水平轴或竖直轴做翻转,是非常常见的增强方法。 lr_ud:选择翻转的方向,lr为水平翻转,ud为竖直翻转。默认值为lr flip_p:做翻转操作的概率。默认值为1。 do_validation:数据扩增前是否进行数据校验。默认值为True。 Grayscale 图片灰度化,将三通道的彩色图像转换到三通道的灰度图像。 do_validation:数据扩增前是否进行数据校验。默认值为True。 HistogramEqual 直方图均衡化,多半是使用于让图片的视觉效果更加好,在某些场景下会使用。 do_validation:数据扩增前是否进行数据校验。默认值为True。 LightArithmetic 亮度增强 ,对亮度空间做线性增强操作。 do_validation:数据扩增前是否进行数据校验。默认值为True。 LightContrast 亮度对比度增强,使用一定的非线性函数改变亮度空间的亮度值。 func:默认值为gamma gamma为常见方法伽马矫正,公式为255*((v/255)**gamma)') sigmoid为函数为S型曲线,公式为255*1/(1+exp(gain*(cutoff-I_ij/255)))') log为对数函数,公式为255*gain*log_2(1+v/255) linear为线性函数,公式为127 + alpha*(v-127)') do_validation:数据扩增前是否进行数据校验。默认值为True。 MotionBlur 运动模糊,模拟物体运动时产生的残影现象。 do_validation:数据扩增前是否进行数据校验。默认值为True。 Padding 图片填充,在边缘添加黑色的边。 px_top:图像顶端增加的像素行数。默认值为1 px_right:图像右侧增加的像素行数。默认值为1 px_left:图像左侧增加的像素行数。默认值为1 px_bottom:图像底侧增加的像素行数。默认值为1 do_validation:数据扩增前是否进行数据校验。默认值为True。 Resize 调整图片大小。 height:变换后的图片高度。默认值224 width:变换后的图片宽度。默认值224 do_validation:数据扩增前是否进行数据校验。默认值为True。 Rotate 旋转,将图像围绕中心点旋转的操作,操作完成之后保持图片原本的形状不变,不足的部分用黑色填充。 angle_min:旋转角度随机取值范围的最小值,每张图片会从范围中随机取值作为自己的参数。默认值为90° angle_max:旋转角度随机取值范围的最大值,每张图片会从范围中随机取值作为自己的参数。默认值为-90° do_validation:数据扩增前是否进行数据校验。默认值为True。 Saturation 色度饱和度增强,对图片的HSV中的H和S空间做线性的变化,改变图片的色度和饱和度。 do_validation:数据扩增前是否进行数据校验。默认值为True。 Scale 图片缩放,将图片的长或宽随机缩放到一定倍数。 scaleXY:缩放方向,X为水平,Y为垂直。默认值为X scale_min:缩放比例随机取值范围的最小值。默认为0.5 scale_max:缩放比例随机取值范围的最大值。默认值为1.5 do_validation:数据扩增前是否进行数据校验。默认值为True。 Sharpen 图像锐化,用于将边缘清晰化,让物体边缘更加明显。 do_validation:数据扩增前是否进行数据校验。默认值为True。 Shear 图片错切,一般用于图片的几何变换,通过线性函数将像素点进行映射。 shearXY:错切方向,X为水平,Y为竖直。默认值为X shear_min:错切角度随机取值范围的最小值。默认值为-30 shear_max:错切角度随机取值范围的最大值。默认值为30 do_validation:数据扩增前是否进行数据校验。默认值为True。 Translate 图片平移,将图片整体向X轴或Y轴平移,超出原图部分舍弃,丢失部分用黑色填充。 translateXY:平移的方向,X为水平,Y为竖直。默认值为X do_validation:数据扩增前是否进行数据校验。默认值为True。 Weather 添加天气,模拟天气效果。 weather_mode:添加天气的模式,默认值为Rain。 Rain:下雨 Fog:雾 Snow:雪 Clouds:云 do_validation:数据扩增前是否进行数据校验。默认值为True。 输入要求 算子输入分为两种,“数据集”或“OBS目录”。 选择“数据集”,请从下拉框中选择ModelArts中管理的数据集及其版本。要求数据集类型与您在本任务中选择的场景类别一致。 选择“OBS目录”,存放结构支持“包含图片和标注信息”模式。 “包含图片和标注信息”,根据不同场景类型,结构不同。 图像分类场景,其目录结构如下所示。如下目录结构,仅支持单标签场景。 input_path/ --label1/ ----1.jpg --label2/ ----2.jpg --../ 物体检测场景,其目录结构如下所示。支持jpg、jpeg、png、bmp格式的图片,xml为标准的PACAL VOC格式标注文件。 input_path/ --1.jpg --1.xml --2.jpg --2.xml ... 输出说明 由于算法中有些操作将会舍弃一些数据,输出文件夹里可能不包含全量数据集。例如,“Rotate”会舍弃标注框超出原始图片边界的图片。 输出目录结构如下所示。其中“Data”文件夹用于存放新生成的图片和标注信息,“manifest”文件存储文件夹中图片的结构,可直接导入到数据管理的数据集中。 |----data_url |----Data |----xxx.jpg |----xxx.xml(xxx.txt) |----output.manifest 其中manifest文件内容示例如下所示。 { "id": "xss", "source": "obs://home/fc8e2688015d4a1784dcbda44d840307_14.jpg", "usage": "train", "annotation": [ { "name": "Cat", "type": "modelarts/image_classification" } ] }
  • 新增在线服务 import modelarts.workflow as wf # 通过ServiceStep来定义一个服务部署节点,输入指定的模型进行服务部署 # 定义模型名称参数 model_name = wf.Placeholder(name="placeholder_name", placeholder_type=wf.PlaceholderType.STR) service_step = wf.steps.ServiceStep( name="service_step", # 服务部署节点的名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符),一个Workflow里的两个step名称不能重复 title="新增服务", # 标题信息 inputs=wf.steps.ServiceInput(name="si_service_ph", data=wf.data.ServiceInputPlaceholder(name="si_placeholder1", # 模型名称的限制/约束,在运行态只能选择该模型名称;一般与模型注册节点中的model_name使用同一个参数对象 model_name=model_name)),# ServiceStep的输入列表 outputs=wf.steps.ServiceOutput(name="service_output") # ServiceStep的输出 ) workflow = wf.Workflow( name="service-step-demo", desc="this is a demo workflow", steps=[service_step] )
  • 属性总览 您可以使用ServiceStep来构建服务部署节点,ServiceStep结构如下 表1 ServiceStep 属性 描述 是否必填 数据类型 name 服务部署节点的名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符),一个Workflow里的两个step名称不能重复 是 str inputs 服务部署节点的输入列表 否 ServiceInput或者ServiceInput的列表 outputs 服务部署节点的输出列表 是 ServiceOutput或者ServiceOutput的列表 title title信息,主要用于前端的名称展示 否 str description 服务部署节点的描述信息 否 str policy 节点执行的policy 否 StepPolicy depend_steps 依赖的节点列表 否 Step或者Step的列表 表2 ServiceInput 属性 描述 是否必填 数据类型 name 服务部署节点的输入名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符)。同一个Step的输入名称不能重复 是 str data 服务部署节点的输入数据对象 是 模型列表或服务相关对象,当前仅支持ServiceInputPlaceholder,ServiceData,ServiceUpdatePlaceholder 表3 ServiceOutput 属性 描述 是否必填 数据类型 name 服务部署节点的输出名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符)。同一个Step的输出名称不能重复 是 str service_config 服务部署相关配置信息 是 ServiceConfig 表4 ServiceConfig 属性 描述 是否必填 数据类型 infer_type 推理方式:取值可为real-time/batch/edge。默认为real-time。 real-time代表在线服务,将模型部署为一个Web Service。 batch为批量服务,批量服务可对批量数据进行推理,完成数据处理后自动停止。 edge表示边缘服务,通过华为云智能边缘平台,在边缘节点将模型部署为一个Web Service,需提前在IEF(智能边缘服务)创建好节点。 是 str service_name 服务名称,支持1-64位可见字符(含中文),名称可以包含字母、中文、数字、中划线、下划线。 说明: 该字段不填时默认为自动生成的服务名称。 否 str、Placeholder description 服务备注,默认为空,不超过100个字符。 否 str vpc_id 在线服务实例部署的虚拟私有云ID,默认为空,此时ModelArts会为每个用户分配一个专属的VPC,用户之间隔离。如需要在服务实例中访问名下VPC内的其他服务组件,则可配置此参数为对应VPC的ID。VPC一旦配置,不支持修改。当vpc_id与cluster_id一同配置时,只有专属资源池参数生效。 否 str subnet_network_id 子网的网络ID,默认为空,当配置了vpc_id则此参数必填。需填写虚拟私有云控制台子网详情中显示的“网络ID”。通过子网可提供与其他网络隔离的、可以独享的网络资源。 否 str security_group_id 安全组,默认为空,当配置了vpc_id则此参数必填。安全组起着虚拟防火墙的作用,为服务实例提供安全的网络访问控制策略。安全组须包含至少一条入方向规则,对协议为TCP、源地址为0.0.0.0/0、端口为8080的请求放行。 否 str cluster_id 专属资源池ID,默认为空,不使用专属资源池。使用专属资源池部署服务时需确保集群状态正常;配置此参数后,则使用集群的网络配置,vpc_id参数不生效;与下方real-time config中的cluster_id同时配置时,优先使用real-time config中的cluster_id参数。 否 str additional_properties 附加的相关配置信息。 否 dict apps 服务部署支持APP认证。支持填入多个app name。 否 str、Placeholder、list envs 环境变量 否 dict 示例: example = ServiceConfig() # 主要在服务部署节点的输出中使用 如果您没有特殊需求,可直接使用内置的默认值。
  • 定义超参 创建算法时,ModelArts Standard支持用户自定义超参,方便用户查阅或修改。定义超参后会体现在启动命令中,以命令行参数的形式传入您的启动文件中。 导入超参 您可以单击“增加超参”手动添加超参。 编辑超参 为保证数据安全,请勿输入敏感信息,例如明文密码。 超参的参数说明参见表6。 表6 超参编辑参数 参数 说明 名称 填入超参名称。 超参名称支持64个以内字符,仅支持大小写字母、数字、下划线和中划线。 类型 填入超参的数据类型。支持String、Integer、Float和Boolean。 默认值 填入超参的默认值。创建训练作业时,默认使用该值进行训练。 约束 单击“约束”。在弹出对话框中,支持用户设置默认值的取值范围或者枚举值范围。 必须 选择是或否。 选择否,则在使用该算法创建训练作业时,支持在创建训练作业页面删除该超参。 选择是,则在使用该算法创建训练作业时,不支持在创建训练作业页面删除该超参。 描述 填入超参的描述说明。 超参描述支持大小写字母、中文、数字、空格、中划线、下划线、中英文逗号和中英文句号。
  • 支持的策略 ModelArts Stanard支持用户使用自动化搜索功能。自动化搜索功能在零代码修改的前提下,自动找到最合适的超参,有助于提高模型精度和收敛速度。详细的参数配置请参考创建自动模型优化的训练作业。 自动搜索目前仅支持“tensorflow_2.1.0-cuda_10.1-py_3.7-ubuntu_18.04-x86_64”和“pytorch_1.8.0-cuda_10.2-py_3.7-ubuntu_18.04-x86_64”镜像
  • 输入输出管道设置 训练过程中,算法需要从OBS桶或者数据集中获取数据进行模型训练,训练产生的输出结果也需要存储至OBS桶中。用户的算法代码中需解析输入输出参数实现ModelArts后台与OBS的数据交互,用户可以参考准备模型训练代码完成适配ModelArts训练的代码开发。 创建基于预置框架的算法时,用户需要配置算法代码中定义的输入输出参数。 输入配置 表4 输入配置 参数 参数说明 参数名称 根据实际代码中的输入数据参数定义此处的名称。此处设置的代码路径参数必须与算法代码中解析的训练输入数据参数保持一致,否则您的算法代码无法获取正确的输入数据。 例如,算法代码中使用argparse解析的data_url作为输入数据的参数,那么创建算法时就需要配置输入数据的参数名称为“data_url”。 描述 输入参数的说明,用户可以自定义描述。 获取方式 输入参数的获取方式,默认使用“超参”,也可以选择“环境变量”。 输入约束 开启后,用户可以根据实际情况限制数据输入来源。输入来源可以选择“数据存储位置”或者“ModelArts数据集”。 如果用户选择数据来源为ModelArts数据集,还可以约束以下三种: 标注类型。数据类型请参考标注数据。 数据格式。可选“Default”和“CarbonData”,支持多选。其中“Default”代表Manifest格式。 数据切分。仅“图像分类”、“物体检测”、“文本分类”和“声音分类”类型数据集支持进行数据切分功能。 可选“仅支持切分的数据集”、“仅支持未切分数据集”和“无限制”。数据切分详细内容可参考发布数据版本。 添加 用户可以根据实际算法添加多个输入数据来源。 输出配置 表5 输出配置 参数 参数说明 参数名称 根据实际代码中的训练输出参数定义此处的名称。此处设置的代码路径参数必须与算法代码中解析的训练输出参数保持一致,否则您的算法代码无法获取正确的输出路径。 例如,算法代码中使用argparse解析的train_url作为训练输出数据的参数,那么创建算法时就需要配置输出数据的参数名称为“train_url”。 描述 输出参数的说明,用户可以自定义描述。 获取方式 输出参数的获取方式,默认使用“超参”,也可以选择“环境变量”。 添加 用户可以根据实际算法添加多个输出数据路径。
  • 设置算法启动方式(自定义) 选择“预置框架”+“自定义”镜像创建算法。 图3 完全使用 自定义镜像 创建算法 表3 启动方式参数说明 参数 说明 “启动方式” 选择“自定义”。 “镜像” 用户制作的镜像需要提前上传到SWR,才可以在这里选择。制作镜像的方式请参见训练作业的自定义镜像制作流程。 “代码目录” 算法代码存储的OBS路径。训练代码、依赖安装包或者预生成模型等训练所需文件上传至该代码目录下。如果自定义镜像中不含训练代码则需要配置该参数,如果自定义镜像中已包含训练代码则不需要配置。 请注意不要将训练数据放在代码目录路径下。训练数据比较大,训练代码目录在训练作业启动后会下载至后台,可能会有下载失败的风险。 训练作业启动时,ModelArts会将训练代码目录及其子目录下载至训练后台容器中。 例如:OBS路径“obs://obs-bucket/training-test/demo-code”作为代码目录,OBS路径下的内容会被自动下载至训练容器的“${MA_JOB_DIR}/demo-code”目录中,demo-code为OBS存放代码路径的最后一级目录,用户可以根据实际修改。 说明: 训练代码编程语言不限。训练启动文件必须为Python语言。 文件数(含文件、文件夹数量)小于或等于1000个。 文件总大小要小于或等于5GB。 文件深度要小于或等于32 “启动命令” 必填,镜像的启动命令。 运行训练作业时,当“代码目录”下载完成后,“启动命令”会被自动执行。 如果训练启动脚本用的是py文件,例如“train.py”,则启动命令如下所示。 python ${MA_JOB_DIR}/demo-code/train.py 如果训练启动脚本用的是sh文件,例如“main.sh”,则启动命令如下所示。 bash ${MA_JOB_DIR}/demo-code/main.sh 启动命令支持使用“;”和“&&”拼接多条命令,命令中的“demo-code”为存放代码目录的最后一级OBS目录,以实际情况为准。 训练支持的自定义镜像使用说明请参考使用自定义镜像创建训练作业。 完全使用自定义镜像场景下,指定的“conda env”启动训练方法如下: 由于训练作业运行时不是shell环境,因此无法直接使用“conda activate”命令激活指定的 “conda env”,需要使用其他方式以达成使用指定“conda env”来启动训练的效果。 假设您的自定义镜像中的“conda”安装于“/home/ma-user/anaconda3”目录“conda env”为“python-3.7.10”,训练脚本位于“/home/ma-user/modelarts/user-job-dir/code/train.py”。可通过以下方式使用指定的“conda env”启动训练: 方式一:为镜像设置正确的“DEFAULT_CONDA_ENV_NAME”环境变量与“ANACONDA_DIR”环境变量。 ANACONDA_DIR=/home/ma-user/anaconda3 DEFAULT_CONDA_ENV_NAME=python-3.7.10 您可以使用Python命令启动训练脚本。启动命令示例如下: python /home/ma-user/modelarts/user-job-dir/code/train.py 方式二:使用“conda env python”的绝对路径。 您可以使用“/home/ma-user/anaconda3/envs/python-3.7.10/bin/python”命令启动训练脚本。启动命令示例如下: /home/ma-user/anaconda3/envs/python-3.7.10/bin/python /home/ma-user/modelarts/user-job-dir/code/train.py 方式三:设置PATH环境变量。 您可以将指定的“conda env bin”目录配置到PATH环境变量中。您可以使用Python命令启动训练脚本。启动命令示例如下: export PATH=/home/ma-user/anaconda3/envs/python-3.7.10/bin:$PATH; python /home/ma-user/modelarts/user-job-dir/code/train.py 方式四:使用“conda run -n”命令。 您可以使用“/home/ma-user/anaconda3/bin/conda run -n python-3.7.10”命令来执行训练命令,启动命令示例如下: /home/ma-user/anaconda3/bin/conda run -n python-3.7.10 python /home/ma-user/modelarts/user-job-dir/code/train.py 如果在训练时发生找不到“$ANACONDA_DIR/envs/$DEFAULT_CONDA_ENV_NAME/lib ”目录下“.so”文件的相关报错,可以尝试将该目录加入到“LD_LIBRARY_PATH”,将以下命令放在上述启动方式命令前: export LD_LIBRARY_PATH=$ANACONDA_DIR/envs/$DEFAULT_CONDA_ENV_NAME/lib:$LD_LIBRARY_PATH; 例如,方式一的启动命令示例此时变为: export LD_LIBRARY_PATH=$ANACONDA_DIR/envs/$DEFAULT_CONDA_ENV_NAME/lib:$LD_LIBRARY_PATH; python /home/ma-user/modelarts/user-job-dir/code/train.py
  • 设置算法启动方式(预置框架+自定义) 选择“预置框架”+“自定义”镜像创建算法。 图2 使用预置框架+自定义镜像创建算法 用户需根据实际算法代码情况设置“镜像”、“代码目录”和“启动文件”。选择的AI镜像和编写算法代码时选择的框架必须一致。例如编写算法代码使用的是TensorFlow,则在创建算法时也要选择TensorFlow镜像。 表2 启动方式参数说明 参数 说明 “启动方式” 选择“预置框架”。 预置框架的引擎版本选择“自定义”。 “镜像” 用户制作的镜像需要提前上传到SWR,才可以在这里选择。制作镜像的方式请参见训练作业的自定义镜像制作流程。 “代码目录” 算法代码存储的OBS路径。训练代码、依赖安装包或者预生成模型等训练所需文件上传至该代码目录下。 请注意不要将训练数据放在代码目录路径下。训练数据比较大,训练代码目录在训练作业启动后会下载至后台,可能会有下载失败的风险。 训练作业启动时,ModelArts会将训练代码目录及其子目录下载至训练后台容器中。 例如:OBS路径“obs://obs-bucket/training-test/demo-code”作为代码目录,OBS路径下的内容会被自动下载至训练容器的“${MA_JOB_DIR}/demo-code”目录中,demo-code为OBS存放代码路径的最后一级目录,用户可以根据实际修改。 说明: 训练代码编程语言不限。训练启动文件必须为Python语言。 文件数(含文件、文件夹数量)小于或等于1000个。 文件总大小要小于或等于5GB。 文件深度要小于或等于32 “启动文件” 必须为“代码目录”下的文件,且以“.py”结尾,即ModelArts目前只支持使用Python语言编写的启动文件。 代码目录路径中的启动文件为训练启动的入口。 选择预置框架+自定义时,该功能的后台行为与直接基于预置框架运行训练作业相同,例如: 系统将会自动注入一系列环境变量 PATH=${MA_HOME}/anaconda/bin:${PATH} LD_LIBRARY_PATH=${MA_HOME}/anaconda/lib:${LD_LIBRARY_PATH} PYTHONPATH=${MA_JOB_DIR}:${PYTHONPATH} 您选择的启动文件将会被系统自动以python命令直接启动,因此请确保镜像中的Python命令为您预期的Python环境。注意到系统自动注入的PATH环境变量,您可以参考下述命令确认训练作业最终使用的Python版本: export MA_HOME=/home/ma-user; docker run --rm {image} ${MA_HOME}/anaconda/bin/python -V docker run --rm {image} $(which python) -V 系统将会自动添加预置框架关联的超参
  • 选择算法的实现方式 ModelArts提供如下方式实现模型训练前的算法准备。 使用订阅算法 ModelArts的AI Gallery提供了可以直接订阅的算法,不需要进行代码开发,即可使用现成的算法进行模型构建。 使用预置框架 如果您需要使用自己开发的算法,可以选择使用ModelArts预置框架。ModelArts支持了大多数主流的AI引擎,详细请参见预置训练引擎。这些预置引擎预加载了一些额外的python包,例如numpy等;也支持您通过在代码目录中使用“requirements.txt”文件安装依赖包。使用预置框架创建训练作业请参考开发用于预置框架训练的代码指导。 使用预置框架 + 自定义镜像: 如果先前基于预置框架且通过指定代码目录和启动文件的方式来创建的算法;但是随着业务逻辑的逐渐复杂,您期望可以基于预置框架修改或增加一些软件依赖的时候,此时您可以使用预置框架 + 自定义镜像的功能,即选择预置框架名称后,在预置框架版本下拉列表中选择“自定义”。 此功能与直接基于预置框架创建算法的区别仅在于,镜像是由用户自行选择的。用户可以基于预置框架制作自定义镜像。基于预置框架制作自定义镜像可参考使用基础镜像构建新的训练镜像章节。 完全自定义镜像: 订阅算法和预置框架涵盖了大部分的训练场景。针对特殊场景,ModelArts支持用户构建自定义镜像用于模型训练。用户遵循ModelArts镜像的规范要求制作镜像,选择自己的镜像,并且通过指定代码目录(可选)和启动命令的方式来创建的训练作业。 自定义镜像需上传至 容器镜像服务 (SWR),才能用于ModelArts上训练,请参考使用自定义镜像训练模型。由于自定义镜像的制作要求用户对容器相关知识有比较深刻的了解,除非订阅算法和预置引擎无法满足需求,否则不推荐使用。 当使用完全自定义镜像创建训练作业时,“启动命令”必须在“/home/ma-user”目录下执行,否则训练作业可能会运行异常。
  • 设置算法启动方式(预置框架) 选择“预置框架”创建算法。 图1 使用预置框架创建算法 用户需根据实际算法代码情况设置“镜像”、“代码目录”和“启动文件”。选择的AI镜像和编写算法代码时选择的框架必须一致。例如编写算法代码使用的是TensorFlow,则在创建算法时也要选择TensorFlow镜像。 表1 启动方式参数说明 参数 说明 “启动方式” 选择“预置框架”。 选择算法使用的预置框架引擎和引擎版本。 “代码目录” 算法代码存储的OBS路径。训练代码、依赖安装包或者预生成模型等训练所需文件上传至该代码目录下。 请注意不要将训练数据放在代码目录路径下。训练数据比较大,训练代码目录在训练作业启动后会下载至后台,可能会有下载失败的风险。 训练作业创建完成后,ModelArts会将代码目录及其子目录下载至训练后台容器中。 例如:OBS路径“obs://obs-bucket/training-test/demo-code”作为代码目录,OBS路径下的内容会被自动下载至训练容器的“${MA_JOB_DIR}/demo-code”目录中,demo-code为OBS存放代码路径的最后一级目录,用户可以根据实际修改。 说明: 编程语言不限。 文件数(含文件、文件夹数量)小于或等于1000个。 文件总大小小于或等于5GB。 “启动文件” 必须为“代码目录”下的文件,且以“.py”结尾,即ModelArts目前只支持使用Python语言编写的启动文件。 代码目录路径中的启动文件为训练启动的入口。
  • 场景介绍 ModelArts含有许多“作业”类型(作业为统称,并非单指训练作业),其中有一部分是可以运行在专属资源池上的,包括“训练”、“推理”服务及“Notebook”开发环境。 专属资源池提供了动态设置作业类型的功能,您可以在创建资源池时、创建完成后,对资源池支持的作业类型进行编辑(新增或减少)。当前支持的“作业类型”有“训练作业”、“推理服务”和“开发环境”,用户可按需自行选择。 设置某一作业类型后,即可在此专属资源池中下发此种类型的作业,没有设置的作业类型不能下发。 为了支持不同的作业类型,后台需要在专属资源池上进行不同的初始化操作,例如安装插件、设置网络环境等。其中部分操作需要占据资源池的资源,导致用户实际可用资源减少。因此建议用户按需设置,避免不必要的资源浪费。
  • 标注音频(声音分类) 标注作业详情页中,展示了此标注作业中“未标注”和“已标注”的音频,默认显示“未标注”的音频列表。单击音频左侧,即可进行音频的试听。 在“未标注”页签,勾选需进行标注的音频。 手工点选:在音频列表中,单击音频,当右上角出现蓝色勾选框时,表示已勾选。可勾选同类别的多个音频,一起添加标签。 批量选中:如果音频列表的当前页,所有音频属于一种类型,可以在列表的右上角单击“选择当前页”,则当前页面所有的音频将选中。 添加标签。 在右侧的“添加标签”区域中,单击“标签”下侧的文本框设置标签。 方式一(已存在标签):单击“标签”下方的文本框,在快捷键下拉列表中选择快捷键,然后在标签文本输入框中选择已有的标签名称,然后单击“确定”。 方式二(新增标签):在“标签”下方的文本框中,在快捷键下拉列表中选择快捷键,然后在标签文本输入框中输入新的标签名称,然后单击“确定”。 选中的音频将被自动移动至“已标注”页签,且在“未标注”页签中,标签的信息也将随着标注步骤进行更新,如增加的标签名称、各标签对应的音频数量。 快捷键的使用说明:为标签指定快捷键后,当您选择一段音频后,在键盘中按快捷键,即可为此音频增加为此快捷键对应的标签。例如“aa”标签对应的快捷键是“1”,在数据标注过程中,选中1个或多个文件,按“1”,界面将提示是否需要将此文件标注为“aa”标签,单击确认即可完成标注。 快捷键对应的是标签,1个标签对应1个快捷键。不同的标签,不能指定为同一个快捷键。快捷键的使用,可以提升标注效率。 图2 添加音频标签
  • 标注音频(语音分割) 标注作业详情页中,展示了此标注作业中“未标注”和“已标注”的音频,默认显示“未标注”的音频列表。 在“未标注”页签左侧音频列表中,单击目标音频文件,在右侧的区域中出现音频,单击音频下方,即可进行音频播放。 根据播放内容,选取合适的音频段,在下方“语音内容”文本框中填写音频标签和内容。 图4 语音标签音频标注 输入内容后单击下方的“确认标注”按钮完成标注。音频将被自动移动至“已标注”页签。
  • 标注图片(图像分割) 标注作业详情页中,展示了此标注作业中“全部”、“未标注”和“已标注”的图片,默认显示“未标注”的图片列表。 在“未标注”页签图片列表中,单击图片,自动跳转到标注页面。在标注页面,常用按钮的使用可参见表4。 选择标注方式。 在标注页面,上方工具栏提供了常用的表3及表4,系统默认的标注方式为多边形标注。选择多边形标注或极点标注。 标注第一张图片时,一旦选择其中一种,其他所有图片都需要使用此方式进行标注。 图6 工具栏 图7 工具栏 表3 标注方式 图标 使用说明 多边形。在标注对象所在范围内,鼠标左键单击完成一个点的标注,沿着物体的形状边缘,通过鼠标指定多个点,最终单击到第一个点的位置,由所有的点组成一个多边形形状。使得需标注的对象在此标注框内。 极点标注。在目标物体轮廓的最上、最左、最下、最右的位置分别标注四个极点,极点要在物体的轮廓上。系统将根据标注的极点推理出物体的轮廓。 表4 工具栏常用按钮 按钮图标 功能说明 撤销上一个操作。 重做上一个操作。 放大图片。 缩小图片。 删除当前图片中的所有标注框。 显示或隐藏标注框。只有在已标注图片中可使用此操作。 拖动,可将标注好的框拖动至其他位置,也可以选择框的边缘,更改框的大小。 复位,与上方拖动为同组操作,当执行了拖动后,可以单击复位按钮快速将标注框恢复为拖动前的形状和位置。 全屏显示标注的图片。 标注物体。 以极点标注为例。识别图片中的物体,单击左键分别定位物体的最上、最左、最下、最右的位置点。确定位置后,将弹出对话框,填入标签名称,单击确定添加物体的标签。确定后系统将自动推理出物体的轮廓。 完成一张图片标注后,可单击图片下方展开缩略图,查看图片列表,快速选中其他未标注的图片,然后在标注页面中执行标注操作。 图8 标注物体轮廓 单击页面上方“返回数据标注预览”查看标注信息,在弹框中单击“确定”保存当前标注并离开标注页面。 选中的图片被自动移动至“已标注”页签,且在“未标注”和“全部”页签中,标签的信息也将随着标注步骤进行更新,如增加的标签名称、标签对应的图片数量。
  • 标注图片(物体检测) 标注作业详情页中,展示了此数据集中“全部”“未标注”和“已标注”的图片,默认显示“未标注”的图片列表。 在“未标注”页签图片列表中,单击图片,自动跳转到标注页面。在标注页面,常用按钮的使用可参见表2。 在页面上方工具栏选择合适的标注图形,系统默认的标注图形为矩形。本示例使用矩形工具进行标注。 页面左侧可以选择多种形状对图片进行标注。标注第一张图片时,一旦选择其中一种,其他图片默认使用此形状进行标注,用户可以根据自己需求再进行切换。 表1 支持的标注框 图标 使用说明 矩形。也可使用快捷键 【1】。鼠标单击标注对象左上角边缘位置,界面将出现矩形框,移动鼠标使得矩形框覆盖标注对象,然后单击完成标注。 多边形。也可使用快捷键【2】。在标注对象所在范围内,鼠标左键单击完成一个点的标注,沿着物体的形状边缘,通过鼠标指定多个点,最终单击到第一个点的位置,由所有的点组成一个多边形形状。使得需标注的对象在此标注框内。 圆形。也可使用快捷键【3】。在标注对象中,选择物体的中心点位置,单击鼠标确定圆心,然后移动鼠标,使得圆形框覆盖标注对象,然后再单击鼠标完成标注。 直线。也可使用快捷键【4】。在标注对象中,选择物体的起始点,单击鼠标确定直线的起始点,然后使得直线覆盖标注对象,然后再单击鼠标完成标注。 虚线。也可使用快捷键【5】。在标注对象中,选择物体的起始点,单击鼠标确定虚线的起始点,然后使得虚线覆盖标注对象,然后再单击鼠标完成标注。 点。也可使用快捷键【6】。单击图片中的物体所在位置,即可完成点的标注。 在弹出的添加标签文本框中,直接输入新的标签名,在文本框前面选中标签颜色,然后单击“添加”。如果已存在标签,从下拉列表中选择已有的标签,单击“添加”。 逐步标注图片中所有物体所在位置,一张图片可添加多个标签。完成一张图片标注后,可单击图片右上角来切换下一张(也可使用快捷键【D】直接切换),快速选中其他未标注的图片,然后在标注页面中执行标注操作。 图5 添加物体检测标签 单击页面上方“返回数据标注预览”查看标注信息,在弹框中单击“确定”保存当前标注并离开标注页面。 选中的图片被自动移动至“已标注”页签,且在“未标注”和“全部”页签中,标签的信息也将随着标注步骤进行更新,如增加的标签名称、标签对应的图片数量。 表2 标注界面的常用按钮 按钮图标 功能说明 撤销上一个操作。也可使用快捷键【Ctrl+Z】 重做上一个操作。也可使用快捷键【Ctrl+Shift+Z】 放大图片。也可以使用滚轮进行放大。 缩小图片。也可以使用滚轮进行缩小。 删除当前图片中的所有标注框。也可使用快捷键【Shift+Delete】 显示或隐藏标注框。只有在已标注图片中可使用此操作。也可使用快捷键【Shift+H】 拖动,可将标注好的框拖动至其他位置,也可以选择框的边缘,更改框的大小。也可使用【X+鼠标左键】 复位,与上方拖动为同组操作,当执行了拖动后,可以单击复位按钮快速将标注框恢复为拖动前的形状和位置。也可使用快捷键【Esc】
  • 方式二:使用Java语言发送预测请求 下载Java SDK并在开发工具中完成SDK配置。具体操作请参见在Java环境中集成API请求签名的SDK 创建Java类,进行预测请求。 由于在APIG的Java SDK中,“request.setBody()”只支持String类型,所以只支持输入为文本格式的预测请求。如果输入的是文件格式,需要先进行base64编码转换成文本。 输入为文件格式 此处以json格式为例介绍读取本地预测文件并进行base64编码的请求体,请求体示例如下: package com.apig.sdk.demo; import com.cloud.apigateway.sdk.utils.Client; import com.cloud.apigateway.sdk.utils.Request; import org.apache.commons.codec.binary.Base64; import org.apache.http.HttpHeaders; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; public class MyAkSkTest2 { public static void main(String[] args) { String url = "在线服务的调用地址"; // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; // 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 String ak = System.getenv("HUAWEICLOUD_SDK_AK"); String sk = System.getenv("HUAWEICLOUD_SDK_SK"); String filePath = "预测文件的本地路径"; try { // Create request Request request = new Request(); // Set the AK/SK to sign and authenticate the request. request.setKey(ak); request.setSecret(sk); // Specify a request method, such as GET, PUT, POST, DELETE, HEAD, and PATCH. request.setMethod(HttpPost.METHOD_NAME); // Add header parameters request.addHeader(HttpHeaders.CONTENT_TYPE, "application/json"); // Set a request URL in the format of https://{Endpoint}/{URI}. request.setUrl(url); // build your json body String body = "{\"image\":\"" + getBase64FromFile(filePath) + "\"}"; // Special characters, such as the double quotation mark ("), contained in the body must be escaped. request.setBody(body); // Sign the request. HttpRequestBase signedRequest = Client.sign(request); // Send request. CloseableHttpResponse response = HttpClients.createDefault().execute(signedRequest); // Print result System.out.println(response.getStatusLine().getStatusCode()); System.out.println(EntityUtils.toString(response.getEntity())); } catch (Exception e) { e.printStackTrace(); } } /** * Convert the file into a byte array and Base64 encode it * @return */ private static String getBase64FromFile(String filePath) { // Convert the file into a byte array InputStream in = null; byte[] data = null; try { in = new FileInputStream(filePath); data = new byte[in.available()]; in.read(data); in.close(); } catch (IOException e) { e.printStackTrace(); } // Base64 encode return new String(Base64.encodeBase64(data)); } } 使用base64编码方式,需要在模型推理代码中增加对请求体解码的代码。 输入为文本格式(json类型) // Package name of the demo. package com.apig.sdk.demo; import com.cloud.apigateway.sdk.utils.Client; import com.cloud.apigateway.sdk.utils.Request; import org.apache.http.HttpHeaders; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; public class MyAkSkTest { public static void main(String[] args) { String url = "在线服务的调用地址"; // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; // 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 String ak = System.getenv("HUAWEICLOUD_SDK_AK"); String sk = System.getenv("HUAWEICLOUD_SDK_SK"); try { // Create request Request request = new Request(); // Set the AK/SK to sign and authenticate the request. request.setKey(ak); request.setSecret(sk); // Specify a request method, such as GET, PUT, POST, DELETE, HEAD, and PATCH. request.setMethod(HttpPost.METHOD_NAME); // Add header parameters request.addHeader(HttpHeaders.CONTENT_TYPE, "application/json"); // Set a request URL in the format of https://{Endpoint}/{URI}. request.setUrl(url); // Special characters, such as the double quotation mark ("), contained in the body must be escaped. String body = "{}"; request.setBody(body); // Sign the request. HttpRequestBase signedRequest = Client.sign(request); // Send request. CloseableHttpResponse response = HttpClients.createDefault().execute(signedRequest); // Print result System.out.println(response.getStatusLine().getStatusCode()); System.out.println(EntityUtils.toString(response.getEntity())); } catch (Exception e) { e.printStackTrace(); } } } “body”由具体文本格式决定,此处以json为例。
  • 方式一:使用Python语言发送预测请求 下载Python SDK并在开发工具中完成SDK配置。具体操作请参见在Python环境中集成API请求签名的SDK。 创建请求体,进行预测请求。 输入为文件格式 # coding=utf-8 import requests import os from apig_sdk import signer if __name__ == '__main__': # Config url, ak, sk and file path. url = "在线服务的调用地址" # 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; # 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 ak = os.environ["HUAWEICLOUD_SDK_AK"] sk = os.environ["HUAWEICLOUD_SDK_SK"] file_path = "预测文件的本地路径" # Create request, set method, url, headers and body. method = 'POST' headers = {"x-sdk-content-sha256": "UNSIGNED-PAYLOAD"} request = signer.HttpRequest(method, url, headers) # Create sign, set the AK/SK to sign and authenticate the request. sig = signer.Signer() sig.Key = ak sig.Secret = sk sig.Sign(request) # Send request files = {'images': open(file_path, 'rb')} resp = requests.request(request.method, request.scheme + "://" + request.host + request.uri, headers=request.headers, files=files) # Print result print(resp.status_code) print(resp.text) “file_path”为预测文件的本地路径,既可使用绝对路径(如Windows格式"D:/test.png",Linux格式"/opt/data/test.png"),也可以使用相对路径(如"./test.png")。 “files”参数的请求体样式为“files={"请求参数":("文件路径",文件内容,“文件类型”)}”,参数填写可以参考表1。 表1 files参数说明 参数 是否必填 说明 请求参数 是 在线服务输入参数名称。 文件路径 否 上传文件的路径。 文件内容 是 上传文件的内容。 文件类型 否 上传文件类型。当前支持以下类型: txt类型:text/plain jpg/jpeg类型:image/jpeg png类型:image/png 输入为文本格式(json类型) 读取本地预测文件并进行base64编码的请求体示例如下: # coding=utf-8 import base64 import json import os import requests from apig_sdk import signer if __name__ == '__main__': # Config url, ak, sk and file path. url = "在线服务的调用地址" # 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; # 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 ak = os.environ["HUAWEICLOUD_SDK_AK"] sk = os.environ["HUAWEICLOUD_SDK_SK"] file_path = "预测文件的本地路径" with open(file_path, "rb") as file: base64_data = base64.b64encode(file.read()).decode("utf-8") # Create request, set method, url, headers and body. method = 'POST' headers = { 'Content-Type': 'application/json' } body = { 'image': base64_data } request = signer.HttpRequest(method, url, headers, json.dumps(body)) # Create sign, set the AK/SK to sign and authenticate the request. sig = signer.Signer() sig.Key = ak sig.Secret = sk sig.Sign(request) # Send request resp = requests.request(request.method, request.scheme + "://" + request.host + request.uri, headers=request.headers, data=request.body) # Print result print(resp.status_code) print(resp.text) “body”中的参数名由在线服务的输入参数决定,需要和“类型”为“string”的输入参数“名称”保持一致。此处以“image”为例。“body”中的base64_data值为string类型。
  • 获取AK/SK 如果已生成过AK/SK,则可跳过此步骤,找到原来已下载的AK/SK文件,文件名一般为:credentials.csv。 如下图所示,文件包含了租户名(User Name),AK(Access Key Id),SK(Secret Access Key)。 图1 credential.csv文件内容 AK/SK生成步骤: 注册并登录管理控制台。 单击右上角的用户名,在下拉列表中单击“我的凭证”。 单击“访问密钥”。 单击“新增访问密钥”,进入“身份验证”页面。 根据提示完成身份验证,下载密钥,并妥善保管。
  • 出错的任务如何卡在运行中状态 创建训练作业时,启动命令末尾新增"|| sleep 5h",并启动训练任务,例如下方的cmd为您的启动命令: cmd || sleep 5h 如果训练失败,则会执行sleep命令,此时可通过Cloud Shell登录容器镜像中调试。 在Cloud Shell中调试多节点训练作业时,需要在Cloud Shell中切换work0、work1来实现对不同节点下发启动命令,否则任务会处于等待其他节点的状态。
  • 如何防止Cloud Shell的Session断开 如果需要长时间运行某一个任务,为避免在期间连接断开导致任务失败,可通过使用screen命令使得任务在远程终端窗口运行。 如果镜像中未安装screen,则执行“apt-get install screen”安装。 创建screen终端。 # 使用 -S 创建一个叫name的screen终端 screen -S name 显示已创建的screen终端。 screen -ls There are screens on: 2433.pts-3.linux (2013年10月20日 16时48分59秒) (Detached) 2428.pts-3.linux (2013年10月20日 16时48分05秒) (Detached) 2284.pts-3.linux (2013年10月20日 16时14分55秒) (Detached) 2276.pts-3.linux (2013年10月20日 16时13分18秒) (Detached) 4 Sockets in /var/run/screen/S-root. 连接“screen_id”为“2276”的screen终端。 screen -r 2276 按下“Ctrl”+“a”+“d”键离开screen终端。离开后,screen会话仍将是活跃的,之后可以随时重新连接。 更多Screen使用说明可参考Screen User's Manual。
  • 同步或添加图片 在“数据标注”节点单击“实例详情”进入数据标注页面,数据标注的图片来源有两种,通过本地添加图片和同步OBS中的图片数据。 图3 添加本地图片 图4 同步OBS图片数据 添加数据:您可以将本地图片快速添加到ModelArts,同时自动上传至创建项目时所选择的OBS路径中。单击“添加数据”,根据弹出的对话框的引导,输入正确的数据并添加。 同步新数据:将图片数据上传至创建项目时指定的OBS目录,然后单击“同步新数据”,快速将原OBS目录中的新数据添加到ModelArts数据集。 删除图片:您可以依次单击选中图片进行删除,也可以勾选“选择当前页”对该页面所有图片进行删除。 所有的删除操作均不可恢复,请谨慎操作。
  • 图片标注 在新版自动学习页面单击“实例详情”按钮,前往数据标注页面。单击任意一张图片,进入图片标注界面。 用鼠标框选图片中的物体所在区域,然后在弹出的对话框中选择标签颜色,输入标签名称,例如此示例中的“yunbao”,按“Enter”键完成此标签的添加。标注完成后,左侧图片目录中此图片的状态将显示为“已标注”。 数据标注的更多说明: 您可以在图片上方或下方单击左右切换键,或者按键盘的左右方向键,选择其他图片,重复上述操作继续进行图片标注。如果一张图片有多个物体,您可以标注多处。 同一个物体检测自动学习项目内,可以增加多个标签,且标签可选择不同颜色,方便识别。使用鼠标完成物体框选后,在弹出的对话框中,选择新的颜色,输入新的标签名称,即可添加一个新的标签。 自动学习项目中,物体检测仅支持矩形标注框。在“数据管理”功能中,物体检测类型的数据集,支持更多类型的标注框。 在标注窗口中,您可以滚动鼠标,放大或缩小图片,方便您快速定位到物体位置。 图2 物体检测图片标注 “物体检测”类型的数据集,在标注时,支持在一张图片中添加多个标注框以及标签。需注意的是,标注框不能超过图片边缘。 当图片目录中所有图片都完成标注后,返回“自动学习工作流”页面,单击“继续运行”按钮,工作流将会自动发布数据标注版本,并进行下一步训练步骤。
  • 修改标注 当数据完成标注后,您还可以进入已标注页签,对已标注的数据进行修改。 基于图片修改 在数据集详情页面,单击“已标注”页签,然后在图片列表中选中待修改的图片,在右侧“标注”区域中对图片信息进行修改。 修改标签:“标注”区域中,单击编辑按钮,在文本框中输入正确的标签名,然后单击确定按钮完成修改。标签颜色不支持修改。 删除标签:在“标注”区域中,单击删除按钮,即可删除此图片中的标签。 标签删除后,单击页面左上角的项目名称离开标注页面。该图片会重新回到“未标注”页签。 图5 编辑物体检测标签 基于标签修改 在数据标注作业概览页,单击右侧的“标签管理”,进入标签管理页面,标签管理页展示所有标签信息。 图6 标签管理页 修改标签:单击操作列的“修改”按钮,然后在弹出的对话框中输入修改后的标签名,然后单击“确定”完成修改。修改后,之前添加了此标签的图片,都将被标注为新的标签名称。 删除标签:单击操作列的“删除”按钮,在弹出的对话框中,根据界面提示选择删除对象,然后单击“确定”。 删除后的标签无法再恢复,请谨慎操作。
共100000条