华为云用户手册

  • 自定义镜像 的配置规范 镜像对外接口 设置镜像的对外服务接口,推理接口需与config.json文件中apis定义的url一致,当镜像启动时可以直接访问。下面是mnist镜像的访问示例,该镜像内含mnist数据集训练的模型,可以识别手写数字。其中listen_ip为容器IP,您可以通过启动自定义镜像,在容器中获取容器IP。 请求示例 curl -X POST \ http://{listen_ip}:8080/ \ -F images=@seven.jpg 图4 listen_ip获取示例 返回示例 {"mnist_result": 7} (可选)健康检查接口 如果在滚动升级时要求不中断业务,那么必须在config.json文件中配置健康检查的接口,供ModelArts调用,在config.json文件中配置。当业务可提供正常服务时,健康检查接口返回健康状态,否则返回异常状态。 如果要实现无损滚动升级,必须配置健康检查接口。 自定义镜像如果需要在“在线服务”模块使用OBS外部存储挂载功能,需要新建一个OBS挂载专属目录如“/obs-mount/”,避免选择存量目录覆盖已有文件。OBS挂载仅开放对挂载目录文件新增、查看、修改功能,如果需要删除文件请到OBS并行文件系统中手动删除。 健康检查接口示例如下。 URI GET /health 请求示例curl -X GET \ http://{listen_ip}:8080/health 响应示例 {"health": "true"} 状态码 表1 状态码 状态码 编码 状态码说明 200 OK 请求成功 日志文件输出 为保证日志内容可以正常显示,日志信息需要打印到标准输出。 镜像启动入口 如果需要部署批量服务,镜像的启动入口文件需要为“/home/run.sh”,采用CMD设置默认启动路径,例如Dockerfile配置如下: CMD ["sh", "/home/run.sh"] 镜像依赖组件 如果需要部署批量服务,镜像内需要集成python、jre/jdk、zip等组件包。 (可选)保持Http长链接,无损滚动升级 如果需要支持滚动升级的过程中不中断业务,那么需要将服务的Http的“keep-alive”参数设置为200s。以gunicorn服务框架为例,gunicorn缺省情形下不支持keep-alive,需要同时安装gevent并配置启动参数“--keep-alive 200 -k gevent”。不同服务框架参数设置有区别,请以实际情况为准。 (可选)处理SIGTERM信号,容器优雅退出 如果需要支持滚动升级的过程中不中断业务,那么需要在容器中捕获SIGTERM信号,并且在收到SIGTERM信号之后等待60秒再优雅退出容器。提前优雅退出容器可能会导致在滚动升级的过程中业务概率中断。要保证容器优雅退出,从收到SIGTERM信号开始,业务需要将收到的请求全部处理完毕再结束,这个处理时长最多不超过90秒。例如run.sh如下所示: #!/bin/bash gunicorn_pid="" handle_sigterm() { echo "Received SIGTERM, send SIGTERM to $gunicorn_pid" if [ $gunicorn_pid != "" ]; then sleep 60 kill -15 $gunicorn_pid # 传递 SIGTERM 给gunicorn进程 wait $gunicorn_pid # 等待gunicorn进程完全终止 fi } trap handle_sigterm TERM
  • 代码改造点 模型分发:DataParallel(model) 完整代码由于代码变动较少,此处进行简略介绍。 import torch class Net(torch.nn.Module): pass model = Net().cuda() ### DataParallel Begin ### model = torch.nn.DataParallel(Net().cuda()) ### DataParallel End ###
  • 方式一:通过服务管理页面修改服务信息 登录ModelArts管理控制台,在左侧菜单栏中选择“模型部署”,进入目标服务类型管理页面。 在服务列表中,单击目标服务操作列的“修改”,修改服务基本信息,然后根据提示提交修改任务。 当修改了服务的某些参数配置时,系统会自动重启服务使修改生效。在提交修改服务任务时,如果涉及重启,会有弹窗提醒。 在线服务参数说明请参见部署模型为在线服务。修改在线服务还需要配置“最大无效实例数”设置并行升级的最大节点数,升级阶段节点无效。
  • 约束限制 服务升级关系着业务实现,不当的升级操作会导致升级期间业务中断的情况,请谨慎操作。 ModelArts支持部分场景下在线服务进行无损滚动升级。按要求进行升级前准备,做好验证,即可实现业务不中断的无损升级。 表1 支持无损滚动升级的场景 创建AI应用的元模型来源 服务使用的是公共资源池 服务使用的是专属资源池 从训练中选择元模型 不支持 不支持 从容器镜像中选择元模型 不支持 支持,创建AI应用的自定义镜像需要满足创建AI应用的自定义镜像规范。 从OBS中选择元模型 不支持 不支持
  • 方式二:通过服务详情页面修改服务信息 登录ModelArts管理控制台,在左侧菜单栏中选择“模型部署”,进入目标服务类型管理页面。 单击目标服务名称,进入服务详情页面。 您可以通过单击页面右上角“修改”,修改服务基本信息,然后根据提示提交修改任务。 当修改了服务的某些参数配置时,系统会自动重启服务使修改生效。在提交修改服务任务时,如果涉及重启,会有弹窗提醒。 在线服务参数说明请参见部署模型为在线服务。修改在线服务还需要配置“最大无效实例数”设置并行升级的最大节点数,升级阶段节点无效。
  • 代码化参数插件的使用 代码参数化插件可以降低Notebook案例的复杂度,用户无需感知复杂的源码,按需调整参数快速进行案例复现、模型训练等。该插件可用于定制Notebook案例,适用于比赛、教学等场景。 仅对Code cell类型新增了Edit Form和Add Form功能,如果cell类型是Markdown或者Raw类型则不支持。如下图所示: 图16 查看Code cell 打开新的代码后,需先Add Form,再Edit Form。 图17 Code类型的cell右键选项 “Add Form”会将Code cell水平拆分为两种编辑区域,左侧为代码区域,右侧为表单区域。单击表单右侧的“Edit”可修改默认标题。 图18 两种编辑区域 “Edit Form”按钮有四个子选项,分别是“Add new form field”、“Hide code”、“Hide form”和“show all”四个按钮,下文介绍这四个选项的功能。 表5 “Edit Form”子选项介绍 “Edit Form”子选项 功能说明 Add new form field 支持新增“dropdown”、“input”和“slider”类型的表单。如图19所示。每新增一个字段,会分别在代码和表单区域中增加对应的变量,修改表单区域的值也会同时修改代码变量值。 说明: 创建dropdown类型的表单时,“ADD Item”至少创建2项。如图20所示。 表单字段类型为“dropdown”时,支持的变量类型为“raw”和“string”。 表单字段类型为“input”时,支持的变量类型有“boolean”、“date”、“integer”、“number” 、“raw”和“string”。 表单字段类型为“slider”时,支持输入滑动条的最小值、最大值和步长。 Hide code 隐藏代码区域。 Hide form 隐藏表单区域。 Show all 同时展示code和form区域。 图19 “dropdown”,“input”,“slider”的表单样式 图20 创建“dropdown”类型的表单 图21 删除表单
  • JupyterLab常用快捷键和插件栏 图13 JupyterLab常用快捷键和插件栏 表1 快捷键说明 快捷键 说明 快速打开Notebook、Terminal。或打开Launcher页面,可快速创建新的Notebook、Console或其他文件。 创建文件夹。 上传文件。 刷新文件目录。 Git插件,可连接此Notebook实例关联的Github代码库。 表2 插件栏常用插件说明 插件 说明 文件列表。单击此处,将展示此Notebook实例下的所有文件列表。 当前实例中正在运行的Terminal和Kernel。 Git插件,可以方便快捷的使用Github代码库。 属性检查器。 文档结构图。 图14 导航栏按钮 表3 导航栏按钮介绍 按钮 说明 File 新建、关闭、保存、重新加载、重命名、导出、打印Notebook等功能。 Edit 编辑ipynb文件中代码块的相关操作,包括撤销、重做、剪切、复制、粘贴、选择、移动、合并、清除、查找代码块等。 View 查看视图相关操作。 Run 运行代码块相关操作,例如:运行选中代码块、一键运行所有代码块等。 Kernel 中断、重启、关闭、改变Kernel相关操作。 Git Git插件相关操作,可以方便快捷的使用Github代码库。 Tabs 同时打开多个ipynb文件时,通过Tabs激活或选择文件。 Settings JupyterLab工具系统设置。 Help JupyterLab工具自带的帮助参考。 图15 ipynb文件菜单栏中的快捷键 表4 ipynb文件菜单栏中的快捷键 快捷键 说明 保存文件。 添加新代码块。 剪切选中的代码块。 复制选中的代码块。 粘贴选中的代码块。 执行选中的代码块。 终止kernel。 重启kernel。 重启kernel,然后重新运行当前Notebook的所有代码。 此处下拉框有4个选项,分别是: Code(写python代码),Markdown(写Markdown代码,通常用于注释),Raw(一个转换工具),-(不修改)。 查看代码历史版本。 git插件,图标显示灰色表示当前Region不支持。 当前的资源规格。 单击可以选择Kernel。 表示代码运行状态,变为实心圆时,表示代码在运行中。 分享到AI Gallery。
  • 新建文件并打开Console Console的本质为Python终端,输入一条语句就会给出相应的输出,类似于Python原生的IDE。 进入JupyterLab主页后,可在“Console”区域下,选择适用的AI引擎,单击后将新建一个对应框架的Notebook文件。 由于每个Notebook实例选择的工作环境不同,其支持的AI框架也不同,下图仅为示例,请根据实际显示界面选择AI框架。 图6 选择AI引擎并新建一个Console 文件创建成功后,将直接呈现Console页面。 图7 新建文件(Console)
  • Data 数据对象用于节点的输入,主要可分为以下三种类型: 真实的数据对象,在工作流构建时直接指定: Dataset:用于定义已有的数据集,常用于数据标注,模型训练等场景 LabelTask: 用于定义已有的标注任务,常用于数据标注,数据集版本发布等场景 OBSPath:用于定义指定的OBS路径,常用于模型训练,数据集导入,模型导入等场景 ServiceData:用于定义一个已有的服务,只用于服务更新的场景 SWRImage:用于定义已有的SWR路径,常用于模型注册场景 GalleryModel:用于定义从gallery订阅的模型,常用于模型注册场景 占位符式的数据对象,在工作流运行时指定: DatasetPlaceholder:用于定义在运行时需要确定的数据集,对应Dataset对象,常用于数据标注,模型训练等场景 LabelTaskPlaceholder:用于定义在运行时需要确定的标注任务,对应LabelTask对象,常用于数据标注,数据集版本发布等场景 OBSPlaceholder:用于定义在运行时需要确定的OBS路径,对应OBSPath对象,常用于模型训练,数据集导入,模型导入等场景 ServiceUpdatePlaceholder:用于定义在运行时需要确定的已有服务,对应ServiceData对象,只用于服务更新的场景 SWRImagePlaceholder:用于定义在运行时需要确定的SWR路径,对应SWRImage对象,常用于模型注册场景 ServiceInputPlaceholder:用于定义在运行时需要确定服务部署所需的模型相关信息,只用于服务部署及服务更新场景 DataSelector:支持多种数据类型的选择,当前仅支持在JobStep节点中使用(仅支持选择OBS或者数据集) 数据选择对象: DataConsumptionSelector:用于在多个依赖节点的输出中选择一个有效输出作为数据输入,常用于存在条件分支的场景中(在构建工作流时未能确定数据输入来源为哪个依赖节点的输出,需根据依赖节点的实际执行情况进行自动选择) 表4 Dataset 属性 描述 是否必填 数据类型 dataset_name 数据集名称 是 str version_name 数据集版本名称 否 str 示例: example = Dataset(dataset_name = "**", version_name = "**") # 通过ModelArts的数据集,获取对应的数据集名称及相应的版本名称。 当Dataset对象作为节点的输入时,需根据业务需要自行决定是否填写version_name字段(比如LabelingStep、ReleaseDatasetStep不需要填写,JobStep必须填写)。 表5 LabelTask 属性 描述 是否必填 数据类型 dataset_name 数据集名称 是 str task_name 标注任务名称 是 str 示例: example = LabelTask(dataset_name = "**", task_name = "**") # 通过ModelArts的新版数据集,获取对应的数据集名称及相应的标注任务名称 表6 OBSPath 属性 描述 是否必填 数据类型 obs_path OBS路径 是 str,Storage 示例: example = OBSPath(obs_path = "**") # 通过 对象存储服务 ,获取已存在的OBS路径值 表7 ServiceData 属性 描述 是否必填 数据类型 service_id 服务的ID 是 str 示例: example = ServiceData(service_id = "**") # 通过ModelArts的在线服务,获取对应服务的服务ID,描述指定的在线服务。用于服务更新的场景。 表8 SWRImage 属性 描述 是否必填 数据类型 swr_path 容器镜像的SWR路径 是 str 示例: example = SWRImage(swr_path = "**") # 容器镜像地址,用于模型注册节点的输入 表9 GalleryModel 属性 描述 是否必填 数据类型 subscription_id 订阅模型的订阅ID 是 str version_num 订阅模型的版本号 是 str 示例: example = GalleryModel(subscription_id="**", version_num="**") # 订阅的模型对象,用于模型注册节点的输入 表10 DatasetPlaceholder 属性 描述 是否必填 数据类型 name 名称 是 str data_type 数据类型 否 DataTypeEnum delay 标志数据对象是否在节点运行时配置,默认为False 否 bool default 数据对象的默认值 否 Dataset 示例: example = DatasetPlaceholder(name = "**", data_type = DataTypeEnum.IMAGE_CLASSIFICATION) # 数据集对象的占位符形式,可以通过指定data_type限制数据集的数据类型 表11 OBSPlaceholder 属性 描述 是否必填 数据类型 name 名称 是 str object_type 表示OBS对象类型,仅支持"file"或者"directory" 是 str delay 标志数据对象是否在节点运行时配置,默认为False 否 bool default 数据对象的默认值 否 OBSPath 示例: example = OBSPlaceholder(name = "**", object_type = "directory" ) # OBS对象的占位符形式,object_type只支持两种类型, "file" 以及 "directory" 表12 LabelTaskPlaceholder 属性 描述 是否必填 数据类型 name 名称 是 str task_type 表示标注任务的类型 否 LabelTaskTypeEnum delay 标志数据对象是否在节点运行时配置,默认为False 否 bool 示例: example = LabelTaskPlaceholder(name = "**") # LabelTask对象的占位符形式 表13 ServiceUpdatePlaceholder 属性 描述 是否必填 数据类型 name 名称 是 str delay 标志数据对象是否在节点运行时配置,默认为False 否 bool 示例: example = ServiceUpdatePlaceholder(name = "**") # ServiceData对象的占位符形式,用于服务更新节点的输入 表14 SWRImagePlaceholder 属性 描述 是否必填 数据类型 name 名称 是 str delay 标志数据对象是否在节点运行时配置,默认为False 否 bool 示例: example = SWRImagePlaceholder(name = "**" ) # SWRImage对象的占位符形式,用于模型注册节点的输入 表15 ServiceInputPlaceholder 属性 描述 是否必填 数据类型 name 名称 是 str model_name 模型名称 是 str或者Placeholder model_version 模型版本 否 str envs 环境变量 否 dict delay 服务部署相关信息是否在节点运行时配置,默认为True 否 bool 示例: example = ServiceInputPlaceholder(name = "**" , model_name = "model_name") # 用于服务部署或者服务更新节点的输入 表16 DataSelector 属性 描述 是否必填 数据类型 name 名称 是 str data_type_list 支持的数据类型列表,当前仅支持obs、dataset 是 list delay 标志数据对象是否在节点运行时配置,默认为False 否 bool 示例: example = DataSelector(name = "**" ,data_type_list=["obs", "dataset"]) # 用于作业类型节点的输入 表17 DataConsumptionSelector 属性 描述 是否必填 数据类型 data_list 依赖节点的输出数据对象列表 是 list 示例: example = DataConsumptionSelector(data_list=[step1.outputs["step1_output_name"].as_input(), step2.outputs["step2_output_name"].as_input()]) # 从step1以及step2中选择有效输出作为输入,当step1跳过无输出,step2执行有输出时,将step2的有效输出作为输入(需保证data_list中同时只有一个有效输出)
  • Workflow Workflow是一个有向无环图(Directed Acyclic Graph,DAG),由节点和节点之间的关系描述组成。 图1 Workflow介绍 节点与节点之间的依赖关系由单箭头的线段来表示,依赖关系决定了节点的执行顺序,示例中的工作流在启动后将从左往右顺序执行。DAG也支持多分支结构,用户可根据实际场景进行灵活设计,在多分支场景下,并行分支的节点支持并行运行,具体请参考配置多分支节点数据章节。 表1 Workflow 属性 描述 是否必填 数据类型 name 工作流的名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64位字符 是 str desc 工作流的描述信息 是 str steps 工作流包含的节点列表 是 list[Step] storages 统一存储对象列表 否 Storage或者list[Storage] policy 工作流的配置策略,主要用于部分运行场景 否 Policy
  • Step Step是组成Workflow的最小单元,体现在DAG中就是一个一个的节点,不同的Step类型承载了不同的服务能力,主要构成如下。 表2 Step 属性 描述 是否必填 数据类型 name 节点的名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符 是 str title 节点的标题信息,主要用于在DAG中的展示,如果该字段未填写,则默认使用name进行展示 否 str step_type 节点的类型,决定了节点的功能 是 enum inputs 节点的输入列表 否 AbstractInput或者list[AbstractInput] outputs 节点的输出列表 否 AbstractOutput或者list[AbstractOutput] properties 节点的属性信息 否 dict policy 节点的执行策略,主要包含节点调度运行的时间间隔、节点执行的超时时间、以及节点执行是否跳过的相关配置 否 StepPolicy depend_steps 依赖节点的列表,该字段决定了DAG的结构,也决定了节点执行的顺序 否 Step或者list[Step] 表3 StepPolicy 属性 描述 是否必填 数据类型 poll_interval_seconds 节点调度时间周期,默认为1秒 是 str max_execution_minutes 节点运行超时时间,默认为10080分钟,即7天 是 str skip_conditions 节点是否跳过的条件列表 否 Condition或者Condition列表 Step是节点的超类,主要用于概念上的承载,用户不直接使用。根据功能的不同,构建了不同类型的节点,主要包括CreateDatasetStep、LabelingStep、DatasetImportStep、ReleaseDatasetStep、JobStep、ModelStep、ServiceStep、ConditionStep等,详情请见创建Workflow节点。
  • ModelArts Standard中如何实现断点续训练 在ModelArts Standard训练中实现断点续训练或增量训练,建议使用“训练输出”功能。 在创建训练作业时,设置训练“输出”参数为“train_url”,在指定的训练输出的数据存储位置中保存Checkpoint,且“预下载至本地目录”选择“下载”。选择预下载至本地目录时,系统在训练作业启动前,自动将数据存储位置中的Checkpoint文件下载到训练容器的本地目录。 图1 训练输出设置 断点续训练建议和训练容错检查(即自动重启)功能同时使用。在创建训练作业页面,开启“自动重启”开关。训练环境预检测失败、或者训练容器硬件检测故障、或者训练作业失败时会自动重新下发并运行训练作业。
  • 什么是断点续训练 断点续训练是指因为某些原因(例如容错重启、资源抢占、作业卡死等)导致训练作业还未完成就被中断,下一次训练可以在上一次的训练基础上继续进行。这种方式对于需要长时间训练的模型而言比较友好。 断点续训练是通过checkpoint机制实现。 checkpoint的机制是:在模型训练的过程中,不断地保存训练结果(包括但不限于EPOCH、模型权重、优化器状态、调度器状态)。即便模型训练中断,也可以基于checkpoint接续训练。 当需要从训练中断的位置接续训练,只需要加载checkpoint,并用checkpoint信息初始化训练状态即可。用户需要在代码里加上reload ckpt的代码,使能读取前一次训练保存的预训练模型。
  • 数据准备使用流程 ModelArts是面向AI开发者的一站式开发平台,能够支撑开发者从数据到AI应用的全流程开发过程,包含数据处理、算法开发、模型训练、模型部署等操作。并且提供AI Gallery功能,能够在市场内与其他开发者分享数据、算法、模型等。为了能帮用户快速准备大量高质量的数据,ModelArts数据管理提供了全流程的数据准备、数据处理和数据标注能力。 图1 ModelArts数据准备全流程 ModelArts数据管理为用户准备高质量的AI数据提供了以下主要能力: 解决用户获取数据的问题。 用户可在AI Gallery上一键下载需要的数据资源到ModelArts数据管理。 提供多种数据接入方式,支持用户从OBS, MRS DLI 以及DWS等服务导入用户的数据。 提供18+数据增强算子,帮助用户扩增数据,增加训练用的数据量。 帮助用户提高数据的质量。 提供图像、文本、音频、视频等多种格式数据的预览,帮助用户识别数据质量。 提供对数据进行多维筛选的能力,用户可以根据样本属性、标注信息等进行样本筛选。 提供12+标注工具,方便用户进行精细化、场景化和专业化的数据标注。 提供基于样本和标注结果进行特征分析,帮助用户整体了解数据的质量。 提升用户数据准备的效率。 提供数据版本管理能力,帮助用户提升数据管理的效率。 提供数据校验、数据选择、数据清洗等多种数据处理算子,帮助用户快速处理数据。 提供交互式标注、智能标注等能力,提升用户数据标注的效率。 提供团队标注以及团队标注流程管理能力,帮助用户提升大批量数据标注的能力。 父主题: 数据准备与处理
  • 上传本地超大文件(50GB以上)至JupyterLab 不支持在Notebook的JupyterLab中直接上传大小超过50GB的文件。 50GB以上的文件需要先从本地上传到OBS中,再在Notebook中调用ModelArts的Moxing接口或者SDK接口读写OBS中的文件。 图12 在Notebook中上传下载大文件 具体操作如下: 从本地上传文件至OBS。具体操作请参见上传文件至OBS桶。 将OBS中的文件下载到Notebook,可以通过在Notebook中运行代码的方式完成数据下载,具体方式有2种,ModelArts的SDK接口或者调用MoXing接口。 方法一:使用ModelArts SDK接口将OBS中的文件下载到Notebook后进行操作。 示例代码: 1 2 3 from modelarts.session import Session session = Session() session.obs.copy("obs://bucket-name/obs_file.txt","/home/ma-user/work/") 方法二:使用Moxing操作OBS文件将OBS中的文件同步到Notebook后进行操作。 import moxing as mox #下载一个OBS文件夹sub_dir_0,从OBS下载至Notebook mox.file.copy_parallel('obs://bucket_name/sub_dir_0', '/home/ma-user/work/sub_dir_0') #下载一个OBS文件obs_file.txt,从OBS下载至Notebook mox.file.copy('obs://bucket_name/obs_file.txt', '/home/ma-user/work/obs_file.txt') 如果下载到Notebook中的是zip文件,在Terminal中执行下列命令,解压压缩包。 unzip xxx.zip #在xxx.zip压缩包所在路径直接解压 代码执行完成后,参考图13打开Terminal后执行ls /home/ma-user/work命令查看下载到Notebook中的文件。或者在JupyterLab左侧导航中显示下载的文件,如果没有显示,请刷新后查看,如图14所示。 图13 打开Terminal 图14 查看下载到Notebook中的文件
  • 上传本地大文件(100MB~50GB)至JupyterLab 对于大小超过100MB不超过50GB的文件可以使用OBS中转,系统先将文件上传至OBS(对象桶或并行文件系统),然后从OBS下载到Notebook。下载完成后,ModelArts会将文件自动从OBS中删除。 例如,对于下面这种情况,可以通过“OBS中转”上传。 图5 通过OBS中转上传大文件 如果使用OBS中转需要提供一个OBS中转路径,可以通过以下三种方式提供: 图6 通过OBS中转路径上传 仅第一次单击“OBS中转”需要提供OBS中转路径,以后默认使用该路径直接上传,可以通过上传文件窗口左下角的设置按钮更新OBS中转路径。如图10所示。 方式一:在输入框中直接输入有效的OBS中转路径,然后单击“确定”完成。 图7 输入有效的OBS中转路径 方式二:打开OBS File Browser选择一个OBS中转路径,然后单击“确定”完成。 图8 打开OBS File Browser 方式三:单击“使用默认路径”完成。 图9 使用默认路径上传文件 图10 设置本地文件OBS中转路径 完成OBS中转路径设置后,开始上传文件。 图11 上传文件 解压缩文件包 将文件以压缩包形式上传至Notebook JupyterLab后, 可在Terminal中解压缩文件包。 unzip xxx.zip #在xxx.zip压缩包所在路径直接解压 解压命令的更多使用说明可以在主流搜索引擎中查找Linux解压命令操作。
  • 上传文件要求 对于大小不超过100MB的文件直接上传,并展示文件大小、上传进度及速度等详细信息。 对于大小超过100MB不超过50GB的文件可以使用OBS中转,系统先将文件上传OBS(对象桶或并行文件系统),然后从OBS下载到Notebook,上传完成后,会将文件从OBS中删除。 50GB以上的文件上传通过调用ModelArts SDK或者Moxing完成。 对于Notebook当前目录下已经有同文件名称的文件,可以覆盖继续上传,也可以取消。 支持10个文件同时上传,其余文件显示“等待上传”。不支持上传文件夹,可以将文件夹压缩成压缩包上传至Notebook后, 在Terminal中解压压缩包。 unzip xxx.zip #在xxx.zip压缩包所在路径直接解压 解压命令的更多使用说明可以在主流搜索引擎中查找Linux解压命令操作。 多个文件同时上传时,JupyterLab窗口最下面会显示上传文件总数和已上传文件数。
  • 将一个不支持OBS路径的API改造成支持OBS路径的API pandas中对h5的文件读写to_hdf和read_hdf既不支持OBS路径,也不支持输入一个文件对象,考虑以下代码会出现错误。 1 2 3 4 import pandas as pd df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=['a', 'b', 'c']) df.to_hdf('obs://wolfros-net/hdftest.h5', key='df', mode='w') pd.read_hdf('obs://wolfros-net/hdftest.h5') 通过重写pandas源码API的方式,将该API改造成支持OBS路径的形式。 写h5到OBS = 写h5到本地缓存 + 上传本地缓存到OBS + 删除本地缓存 从OBS读h5 = 下载h5到本地缓存 + 读取本地缓存 + 删除本地缓存 即将以下代码写在运行脚本的最前面,就能使运行过程中的to_hdf和read_hdf支持OBS路径。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 import os import moxing as mox import pandas as pd from pandas.io import pytables from pandas.core.generic import NDFrame to_hdf_origin = getattr(NDFrame, 'to_hdf') read_hdf_origin = getattr(pytables, 'read_hdf') def to_hdf_override(self, path_or_buf, key, **kwargs): tmp_dir = '/cache/hdf_tmp' file_name = os.path.basename(path_or_buf) mox.file.make_dirs(tmp_dir) local_file = os.path.join(tmp_dir, file_name) to_hdf_origin(self, local_file, key, **kwargs) mox.file.copy(local_file, path_or_buf) mox.file.remove(local_file) def read_hdf_override(path_or_buf, key=None, mode='r', **kwargs): tmp_dir = '/cache/hdf_tmp' file_name = os.path.basename(path_or_buf) mox.file.make_dirs(tmp_dir) local_file = os.path.join(tmp_dir, file_name) mox.file.copy(path_or_buf, local_file) result = read_hdf_origin(local_file, key, mode, **kwargs) mox.file.remove(local_file) return result setattr(NDFrame, 'to_hdf', to_hdf_override) setattr(pytables, 'read_hdf', read_hdf_override) setattr(pd, 'read_hdf', read_hdf_override)
  • 利用MoXing使h5py.File支持OBS 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 import os import h5py import numpy as np import moxing as mox h5py_File_class = h5py.File class OBSFile(h5py_File_class): def __init__(self, name, *args, **kwargs): self._tmp_name = None self._target_name = name if name.startswith('obs://'): self._tmp_name = name.replace('/', '_') if mox.file.exists(name): mox.file.copy(name, os.path.join('cache', 'h5py_tmp', self._tmp_name)) name = self._tmp_name super(OBSFile, self).__init__(name, *args, **kwargs) def close(self): if self._tmp_name: mox.file.copy(self._tmp_name, self._target_name) super(OBSFile, self).close() setattr(h5py, 'File', OBSFile) arr = np.random.randn(1000) with h5py.File('obs://bucket/random.hdf5', 'r') as f: f.create_dataset("default", data=arr) with h5py.File('obs://bucket/random.hdf5', 'r') as f: print(f.require_dataset("default", dtype=np.float32, shape=(1000,)))
  • 读取完毕后将文件关闭 当读取OBS文件时,实际调用的是HTTP连接读去网络流,注意要记得在读取完毕后将文件关闭。为了防止忘记文件关闭操作,推荐使用with语句,在with语句退出时会自动调用mox.file.File对象的close()方法: 1 2 3 import moxing as mox with mox.file.File('obs://bucket_name/obs_file.txt', 'r') as f: data = f.readlines()
  • 利用文件对象读取图片 使用opencv打开一张图片时,无法传入一个OBS路径,需要利用文件对象读取,考虑以下代码是无法读取到该图片的。 1 2 import cv2 cv2.imread('obs://bucket_name/xxx.jpg', cv2.IMREAD_COLOR) 修改为如下代码: 1 2 3 4 import cv2 import numpy as np import moxing as mox img = cv2.imdecode(np.fromstring(mox.file.read('obs://bucket_name/xxx.jpg', binary=True), np.uint8), cv2.IMREAD_COLOR)
  • 利用pandas读或写一个OBS文件 利用pandas读一个OBS文件。 1 2 3 4 import pandas as pd import moxing as mox with mox.file.File("obs://bucket_name/b.txt", "r") as f: csv = pd.read_csv(f) 利用pandas写一个OBS文件。 1 2 3 4 5 import pandas as pd import moxing as mox df = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]}) with mox.file.File("obs://bucket_name/b.txt", "w") as f: df.to_csv(f)
  • 导出到AI Gallery 用户可以将自己的数据发布到AI Gallery,将个人的数据分享给他人使用。用户要发布数据集到AI Gallery,数据集需要有状态为“正常”的数据集版本。 选中待发布的数据集,单击“更多”,选择“发布资产”。 在资产发布弹窗中,选择数据集的版本并填写资产发布相关的信息。完成后单击“确定”即可进行发布。 表1 发布数据集到AI Galley参数说明 参数 说明 资产标题 在AI Gallery显示的资产名称。 来源 可选择“ModelArts”、“对象存储服务(OBS)”、“本地上传”。 ModelArts区域 选择当前控制台所在的区域。 OBS区域 选择与当前控制台一致的区域。 存储位置 用来存储发布的资产。 数据类型 当前数据集的数据类型。 选择数据集 选择需要发布的数据集。 许可证类型 根据业务需求和数据集类型选择合适的许可证类型。 单击许可证类型后面的感叹号可以查看许可证详情。 说明: 部分许可证网站说明地址是海外网站,用户可能会因网络限制无法访问。 谁可以看 设置此数据集的公开权限。可选值有: “公开”:表示所有使用AI Gallery的用户都可以查看且使用该资产。 “指定用户”:表示仅特定用户可以查看及使用该资产。 “仅自己可见”:表示只有当前账号可以查看并使用该资产。
  • 命令概览 $ ma-cli auto-completion -h Usage: ma-cli auto-completion [OPTIONS] [[Bash|Zsh|Fish]] Auto complete ma-cli command in terminal. Example: # print bash auto complete command to terminal ma-cli auto-completion Bash Options: -H, -h, --help Show this message and exit. # 默认显示Bash Shell自动补全命令 $ ma-cli auto-completion Tips: please paste following shell command to your terminal to activate auto complation. [ OK ] eval "$(_MA_CLI_COMPLETE=bash_source ma-cli)" # 执行上述命令,此时Terminal已经支持自动补全 $ eval "$(_MA_CLI_COMPLETE=bash_source ma-cli)" # 显示Fish Shell自动补全命令 $ ma-cli auto-completion Fish Tips: please paste following shell command to your terminal to activate auto complation. [ OK ] eval (env _MA_CLI_COMPLETE=fish_source ma-cli)
  • 命令示例 # 上传文件到OBS中 $ ma-cli obs-copy ./test.csv obs://${your_bucket}/test-copy/ [ OK ] local src path: [ /home/ma-user/work/test.csv ] [ OK ] obs dst path: [ obs://${your_bucket}/test-copy/ ] # 上传文件夹到OBS中,对应上传到OBS的目录为obs://${your_bucket}/test-copy/data/ $ ma-cli obs-copy /home/ma-user/work/data/ obs://${your_bucket}/test-copy/ [ OK ] local src path: [ /home/ma-user/work/data/ ] [ OK ] obs dst path: [ obs://${your_bucket}/test-copy/ ] # 上传文件夹到OBS中,并指定--drop-last-dir,对应上传到OBS的目录为obs://${your_bucket}/test-copy/ $ ma-cli obs-copy /home/ma-user/work/data/ obs://${your_bucket}/test-copy/ --drop-last-dir [ OK ] local src path: [ /home/ma-user/work/data ] [ OK ] obs dst path: [ obs://${your_bucket}/test-copy/ ] # 从OBS下载文件夹到本地磁盘中 $ ma-cli obs-copy obs://${your_bucket}/test-copy/ ~/work/test-data/ [ OK ] obs src path: [ obs://${your_bucket}/test-copy/ ] [ OK ] local dst path: [ /home/ma-user/work/test-data/ ]
  • 什么是动态挂载OBS并行文件系统 并行文件系统(Parallel File System)是对象存储服务(Object Storage Service,OBS)提供的一种经过优化的高性能文件系统,详细介绍可以参见并行文件系统。 在ModelArts运行态的Notebook容器中,采用动态挂载特性,将OBS对象存储模拟成本地文件系统。其本质是通过挂载工具,将对象协议转为POSIX文件协议。挂载后应用层可以在容器中正常操作OBS对象。
  • 查看训练日志 查看训练日志有2种方式,在OBS查看和在PyCharm ToolKit工具中查看。 在OBS查看训练日志 提交训练作业时,系统将自动在您配置的OBS Path中,使用作业名称创建一个新的文件夹,用于存储训练输出的模型、日志和代码。 例如“train-job-01”作业,提交作业时会在“test-modelarts2”桶下创建一个命名为“train-job-01”的文件夹,且此文件夹下分别新建了三个文件夹“output”、“log”、“code”,分别用于存储输出模型、日志和训练代码。“output”文件夹还会根据您的训练作业版本再创建子文件夹,结构示例如下。 test-modelarts2 |---train-job-01 |---output |---log |---code
  • 训练日志失败分析 在ModelArts Standard中训练作业遇到问题时,可首先查看日志,多数场景下的问题可以通过日志报错信息直接定位。 ModelArts Standard提供了训练作业失败定位与分析功能,如果训练作业运行失败,ModelArts会自动识别导致作业失败的原因,在训练日志界面上给出提示。提示包括三部分:失败的可能原因、推荐的解决方案以及对应的日志(底色标红部分)。 图1 训练故障识别 ModelArts Standard会对部分常见训练错误给出分析建议,目前还不能识别所有错误,提供的失败可能原因仅供参考。针对分布式作业,只会显示当前节点的一个分析结果,作业的失败需要综合各个节点的失败原因做一个综合判断。 常见训练问题定位思路如下: 根据日志界面提示中提供的分析建议解决。 参考案例解决:会提供当前故障对应的指导文档链接,请参照文档中的解决方案修复问题。 重建作业:建议重建作业进行重试,大概率能修复问题。 上一步不能解决问题时,可以尝试分析日志中提示的错误信息,定位并解决问题。 也可以前往ModelArts论坛中查看是否有同类问题。Ascend训练场景可以前往昇腾论坛查看或提问。 最后,如果以上均不能解决问题,可以提工单进行人工咨询。 父主题: 模型训练高可靠性
  • Horovod/MPI/MindSpore-GPU 使用Horovod/MPI/MindSpore-GPU预置框架来运行的启动文件,平台自动以mpirun命令启动之。使用ModelArts Standard训练相应预置引擎,用户仅需关心启动文件(即训练脚本)的编写;mpirun命令和训练作业集群的构建都由平台自动完成。平台不会为启动文件额外拼接参数。 具体示例请参见:Horovod-PyTorch代码示例pytorch_synthetic_benchmark.py。
  • 音频标注 在新版自动学习页面单击“实例详情”按钮,前往数据标注页面。单击任意一张图片,进入音频标注页面。 在“音频标注”页面单击“未标注”页签,此页面展示所有未标注的音频数据。依次单击选中待标注的音频,或勾选“选择当前页”选中该页面所有音频,在页面右侧进行标注。 图2 音频标注 添加标注。先对音频进行播放识别,然后选中音频文件,在右侧“标签”区域,输入“标签名”或从下拉列表中选择已添加的标签,同时可在下拉菜单中选择标签“快捷键”。单击“确定”,完成选中音频的标注操作。 当目录中所有音频都完成标注后,您可以在“已标注”页签下查看已完成标注的音频,或者通过右侧的“全部标签”列表,了解当前已完成的标签名称和标签数量。
共100000条