华为云用户手册

  • 前提条件 若已有需要导入导出数据的目标对象,可直接执行导入导出操作。 若没有目标对象,需要先创建一个对象,再创建自定义字段,配置“允许API批量访问”后,再执行导入导出操作。 新建一个简单的对象Class,对象创建过程请参见创建自定义数据对象。 在对象Class中创建一个自定义数字类型字段number,自定义字段创建过程请参见定义自定义对象的字段(Fields)。 在对象Class的“基本信息”页签中,勾选“允许API批量访问”,如图1所示。 图1 自定义对象Class
  • 前提条件 给用户组授权之前,请您了解用户组可以添加的使用ModelArts及依赖服务的权限,并结合实际需求进行选择,ModelArts支持的系统权限,请参见表1。 表1 服务授权列表 待授权的服务 授权说明 IAM 权限设置 是否必选 ModelArts 授予子用户使用ModelArts服务的权限。 ModelArts CommonOperations没有任何专属资源池的创建、更新、删除权限,只有使用权限。推荐给子用户配置此权限。 ModelArts CommonOperations 必选 如果需要给子用户开通专属资源池的创建、更新、删除权限,此处要勾选ModelArts FullAccess,请谨慎配置。 ModelArts FullAccess 可选 ModelArts FullAccess权限和ModelArts CommonOperations权限只能二选一,不能同时选。 OBS 对象存储服务 授予子用户使用OBS服务的权限。ModelArts的数据集、开发环境、训练作业、模型推理部署均需要通过OBS进行数据中转。 OBS OperateAccess 必选 SWR容器镜像 仓库 授予子用户使用SWR服务权限。ModelArts的 自定义镜像 功能依赖 镜像服务 SWR FullAccess权限。 SWR OperateAccess 必选 密钥管理服务 当子用户使用ModelArts Notebook的SSH远程功能时,需要配置子用户密钥管理服务的使用权限。 KMS CMKFullAccess 可选 IEF智能边缘平台 授予子用户智能边缘平台使用权限,ModelArts的边缘服务依赖智能边缘平台,要求配置Tenant Administrator权限。 Tenant Administrator 可选 CES 云监控 授予子用户使用CES 云监控服务 的权限。通过CES 云监控 可以查看ModelArts的在线服务和对应模型负载运行状态的整体情况,并设置监控告警。 CES FullAccess 可选 SMN 消息服务 授予子用户使用SMN消息服务的权限。SMN 消息通知 服务配合CES监控告警功能一起使用。 SMN FullAccess 可选 VPC虚拟私有云 子用户在创建ModelArts的专属资源池过程中,如果需要开启自定义网络配置,需要配置VPC权限。 VPC FullAccess 可选 SFS弹性文件服务 授予子用户使用SFS服务的权限,ModelArts的专属资源池中可以挂载SFS系统作为开发环境或训练的存储。 SFS Turbo FullAccess SFS FullAccess 可选
  • ModelArts开发环境使用权限的自定义策略样例 { "Version": "1.1", "Statement": [ { "Effect": "Allow", "Action": [ "modelarts:notebook:list", "modelarts:notebook:create" , "modelarts:notebook:get" , "modelarts:notebook:update" , "modelarts:notebook:delete" , "modelarts:notebook:action" , "modelarts:notebook:access" ] } ] }
  • ModelArts依赖的OBS权限自定义策略样例 如下示例为ModelArts依赖OBS服务的最小化权限项,包含OBS桶和OBS对象的权限。授予示例中的权限您可以通过ModelArts正常访问OBS不受限制。 { "Version": "1.1", "Statement": [ { "Action": [ "obs:bucket:ListAllMybuckets", "obs:bucket:HeadBucket", "obs:bucket:ListBucket", "obs:bucket:GetBucketLocation", "obs:object:GetObject", "obs:object:GetObjectVersion", "obs:object:PutObject", "obs:object:DeleteObject", "obs:object:DeleteObjectVersion", "obs:object:ListMultipartUploadParts", "obs:object:AbortMultipartUpload", "obs:object:GetObjectAcl", "obs:object:GetObjectVersionAcl", "obs:bucket:PutBucketAcl", "obs:object:PutObjectAcl" ], "Effect": "Allow" } ] }
  • Step3 在TMS中根据资源类型查询ModelArts资源使用情况 登录TMS控制台,在资源标签页面根据资源类型和资源标签查询指定区域的资源任务。 区域:使用华为云的具体Region,区域概念请参见什么是区域、可用区?。 资源类型:ModelArts支持查询的资源类型如表1所示。 资源标签:不填写标签时,表示查询所有资源,无论此资源是否有配置标签。选择相应标签查询资源,用户可以通过多个标签组合查询资源使用情况。 表1 ModelArts的资源类型 资源类型 说明 ModelArts-Notebook ModelArts的开发环境Notebook对应的资源类型。 ModelArts-TrainingJob ModelArts的训练作业对应的资源类型。 ModelArts-RealtimeService ModelArts的推理在线服务对应的资源类型。 ModelArts-ResourcePool ModelArts的专属资源池对应的资源类型。 如您的组织已经设定ModelArts的相关标签策略,则需按照标签策略规则为资源添加标签。标签如果不符合标签策略的规则,则可能会导致资源创建失败,请联系组织管理员了解标签策略详情。
  • Step2 在ModelArts任务中添加标签 在ModelArts中创建Notebook、创建训练作业、创建推理在线服务时,对这些任务配置标签。 在ModelArts的Notebook中添加标签。 可以在创建Notebook页面添加标签,也可以在已经创建完成的Notebook详情页面的“标签”页签中添加标签。 在ModelArts的训练作业中添加标签。 可以在创建训练作业页面添加标签,也可以在已经创建完成的训练作业详情页面的“标签”页签中添加标签。 在ModelArts的在线服务中添加标签。 可以在创建在线服务页面添加标签,也可以在已经创建完成的在线服务详情页面的“标签”页签中添加标签。 在ModelArts的专属资源池中添加标签。 可以在创建ModelArts Standard专属资源池页面添加标签,也可以在已经创建的Standard专属资源池详情页面的“标签”页签中添加标签。 图1 添加标签 用户也可以在ModelArts任务中添加标签时,创建新的标签,直接输入标签键和标签值即可。此处创建的标签仅当前的项目Project可见。不同的项目中查看不到。
  • 创建Dashboards查看指标 打开“DashBoards”,单击“New”,选择“New Dashboards”。 在New Dashboards界面,单击“Add a new panel”。 在New dashboard /Edit Panel界面,填写如下参数。 Data source:已配置Grafana数据源; Metric:指标名称,可参考表1、表2、表3获取想要查询的指标; Labels:填写过滤该指标的标签,请参考表4。 图10 创建Dashboards查看指标
  • 准备工作 ModelArts提供了集群视图、节点视图、用户视图、任务视图和任务详细视图这5个模板,这些模板在Grafana官方文档可以搜索下载,您导入模板配置Dashboards时,可直接使用。 表1 模板下载地址 模板名称 下载地址 集群视图 https://cnnorth4-modelarts-sdk.obs.cn-north-4.myhuaweicloud.com/metrics/grafana/dashboards/ModelArts-Cluster-View.json 节点视图 https://cnnorth4-modelarts-sdk.obs.cn-north-4.myhuaweicloud.com/metrics/grafana/dashboards/ModelArts-Node-View.json 用户视图 https://cnnorth4-modelarts-sdk.obs.cn-north-4.myhuaweicloud.com/metrics/grafana/dashboards/ModelArts-User-View.json 任务视图 https://cnnorth4-modelarts-sdk.obs.cn-north-4.myhuaweicloud.com/metrics/grafana/dashboards/ModelArts-Task-View.json 任务详细视图 https://cnnorth4-modelarts-sdk.obs.cn-north-4.myhuaweicloud.com/metrics/grafana/dashboards/ModelArts-Task-Detail-View.json
  • 操作步骤 下载Grafana安装包。 进入下载链接,单击Download the installer,等待下载成功即可。 安装Grafana。 双击安装包,按照指示流程安装完成即可。 在Windows的“服务”中,找到Grafana,将其开启,如果已经开启,则直接进入4。 登录Grafana。 Grafana默认在本地的3000端口启动,打开链接http://localhost:3000,出现Grafana的登录界面。首次登录用户名和密码为admin,登录成功后请根据提示修改密码。
  • 操作步骤 登录 云审计 服务管理控制台。 在管理控制台左上角单击图标,选择区域。 在左侧导航栏中,单击“事件列表”,进入“事件列表”页面。 事件列表支持通过筛选来查询对应的操作事件。当前事件列表支持四个维度的组合查询,详细信息如下: 事件来源、资源类型和筛选类型。 在下拉框中选择查询条件。 其中筛选类型选择事件名称时,还需选择某个具体的事件名称。 选择资源ID时,还需输入某个具体的资源ID。 选择资源名称时,还需选择或手动输入某个具体的资源名称。 操作用户:在下拉框中选择某一具体的操作用户,此操作用户指用户级别,而非租户级别。 事件级别:可选项为“所有事件级别”、“normal”、“warning”、“incident”,只可选择其中一项。 时间范围:可选择查询最近七天内任意时间段的操作事件。 在需要查看的事件左侧,单击展开该事件的详细信息。 单击需要查看的事件“操作”列的“查看事件”,可以在弹窗中查看该操作事件结构的详细信息。 更多关于云审计服务事件结构的信息,请参见《云审计服务用户指南》。
  • 训练作业支持审计的关键操作列表 表3 训练作业支持审计的关键操作列表 操作名称 资源类型 事件名称 创建训练作业 ModelArtsTrainJob createModelArtsTrainJob 创建训练作业版本 ModelArtsTrainJob createModelArtsTrainVersion 停止训练作业 ModelArtsTrainJob stopModelArtsTrainVersion 更新训练作业描述 ModelArtsTrainJob updateModelArtsTrainDesc 删除训练作业版本 ModelArtsTrainJob deleteModelArtsTrainVersion 删除训练作业 ModelArtsTrainJob deleteModelArtsTrainJob 创建训练作业参数 ModelArtsTrainConfig createModelArtsTrainConfig 更新训练作业参数 ModelArtsTrainConfig updateModelArtsTrainConfig 删除训练作业参数 ModelArtsTrainConfig deleteModelArtsTrainConfig 创建可视化作业 ModelArtsTensorboardJob createModelArtsTensorboardJob 删除可视化作业 ModelArtsTensorboardJob deleteModelArtsTensorboardJob 更新可视化作业描述 ModelArtsTensorboardJob updateModelArtsTensorboardDesc 停止可视化作业 ModelArtsTensorboardJob stopModelArtsTensorboardJob 重启可视化作业 ModelArtsTensorboardJob restartModelArtsgTensorboardJob
  • 服务管理支持审计的关键操作列表 表5 服务管理支持审计的关键操作列表 操作名称 资源类型 事件名称 部署服务 service addService 删除服务 service deleteService 更新服务 service updateService 启停服务 service startOrStopService 启停边缘服务节点 service startOrStopNodesService 添加用户访问密钥 service addAkSk 删除用户访问密钥 service deleteAkSk 创建专属资源池 cluster createCluster 删除专属资源池 cluster deleteCluster 添加专属资源池节点 cluster addClusterNode 删除专属资源池节点 cluster deleteClusterNode 获取专属资源池创建结果 cluster createClusterResult
  • 资源管理支持审计的关键操作列表 表7 资源管理支持审计的关键操作列表 操作名称 资源类型 事件名称 创建资源池 PoolV2 CreatePoolV2 删除资源池 PoolV2 DeletePoolV2 更新资源池 PoolV2 UpdatePoolV2 创建网络 NetworksV1 CreateNetworksV1 删除网络 NetworksV1 DeleteNetworksV1 更新网络 NetworksV1 UpdateNetworksV1
  • 开发环境支持审计的关键操作列表 表2 开发环境支持审计的关键操作列表 操作名称 资源类型 事件名称 创建Notebook Notebook createNotebook 删除Notebook Notebook deleteNotebook 打开Notebook Notebook openNotebook 启动Notebook Notebook startNotebook 停止Notebook Notebook stopNotebook 更新Notebook Notebook updateNotebook 删除NotebookApp NotebookApp deleteNotebookApp 切换CodeLab规格 NotebookApp updateNotebookApp
  • AI Gallery支持审计的关键操作列表 表6 AI Gallery支持审计的关键操作列表 操作名称 资源类型 事件名称 发布资产 ModelArts_Market create_content 修改资产信息 ModelArts_Market modify_content 发布资产新版本 ModelArts_Market add_version 订阅资产 ModelArts_Market subscription_content 收藏资产 ModelArts_Market star_content 取消收藏资产 ModelArts_Market cancel_star_content 点赞资产 ModelArts_Market like_content 取消点赞资产 ModelArts_Market cancel_like_content 发布实践 ModelArts_Market publish_activity 报名实践 ModelArts_Market regist_activity 修改个人资料 ModelArts_Market update_user
  • 数据管理支持审计的关键操作列表 表1 数据管理支持审计的关键操作列表 操作名称 资源类型 事件名称 创建数据集 dataset createDataset 删除数据集 dataset deleteDataset 更新数据集 dataset updateDataset 发布数据集版本 dataset publishDatasetVersion 删除数据集版本 dataset deleteDatasetVersion 同步数据源 dataset syncDataSource 导出数据集 dataset exportDataFromDataset 创建自动标注任务 dataset createAutoLabelingTask 创建自动分组任务 dataset createAutoGroupingTask 创建自动部署任务 dataset createAutoDeployTask 导入样本到数据集 dataset importSamplesToDataset 创建数据集标签 dataset createLabel 更新数据集标签 dataset updateLabel 删除数据集标签 dataset deleteLabel 删除数据集标签和对应的样本 dataset deleteLabelWithSamples 添加样本 dataset uploadSamples 删除样本 dataset deleteSamples 停止自动标注任务 dataset stopTask 创建团队标注任务 dataset createWorkforceTask 删除团队标注任务 dataset deleteWorkforceTask 启动团队标注验收的任务 dataset startWorkforceSamplingTask 通过/驳回/取消验收任务 dataset updateWorkforceSamplingTask 提交验收任务的样本评审意见 dataset acceptSamples 给样本添加标签 dataset updateSamples 发送邮件给团队标注任务的成员 dataset sendEmails 接口人启动团队标注任务 dataset startWorkforceTask 更新团队标注任务 dataset updateWorkforceTask 给团队标注样本添加标签 dataset updateWorkforceTaskSamples 团队标注审核 dataset reviewSamples 创建标注成员 workforce createWorker 更新标注成员 workforce updateWorker 删除标注成员 workforce deleteWorker 批量删除标注成员 workforce batchDeleteWorker 创建标注团队 workforce createWorkforce 更新标注团队 workforce updateWorkforce 删除标注团队 workforce deleteWorkforce 自动创建IAM委托 IAM createAgency 标注成员登录labelConsole标注平台 labelConsoleWorker workerLoginLabelConsole 标注成员登出labelConsole标注平台 labelConsoleWorker workerLogOutLabelConsole 标注成员修改labelConsole平台密码 labelConsoleWorker workerChangePassword 标注成员忘记labelConsole平台密码 labelConsoleWorker workerForgetPassword 标注成员通过url重置labelConsole标注密码 labelConsoleWorker workerResetPassword
  • 场景介绍 当专属资源池中的节点含有GPU/Ascend资源时,用户基于自己的业务,可能会有自定义GPU/Ascend驱动的需求,ModelArts面向此类客户提供了自助升级专属资源池GPU/Ascend驱动的能力。 驱动升级有两种升级方式:安全升级、强制升级。 安全升级:不影响正在运行的业务,开始升级后会先将节点进行隔离(不能再下发新的作业),待节点上的存量作业运行完成后再进行升级,因需要等待作业完成,故升级周期可能比较长。 强制升级:忽略资源池中正在运行的作业,直接进行驱动升级,可能会导致运行中作业失败,需谨慎选择。
  • 场景介绍 ModelArts含有许多“作业”类型(作业为统称,并非单指训练作业),其中有一部分是可以运行在Standard专属资源池上的,包括“训练”、“推理”服务及“Notebook”开发环境。 专属资源池提供了动态设置作业类型的功能,您可以在创建资源池时、创建完成后,对资源池支持的作业类型进行编辑(新增或减少)。当前支持的“作业类型”有“训练作业”、“推理服务”和“开发环境”,用户可按需自行选择。 设置某一作业类型后,即可在此专属资源池中下发此种类型的作业,没有设置的作业类型不能下发。 为了支持不同的作业类型,后台需要在专属资源池上进行不同的初始化操作,例如安装插件、设置网络环境等。其中部分操作需要占据资源池的资源,导致用户实际可用资源减少。因此建议用户按需设置,避免不必要的资源浪费。
  • 场景介绍 当专属资源池创建完成,使用一段时间后,由于用户AI开发业务的变化,对于资源池资源量的需求可能会产生变化,面对这种场景,ModelArts Standard专属资源池提供了扩缩容功能,用户可以根据自己的需求动态调整。 使用扩容功能时,可以增加资源池已有规格的实例数量。 使用缩容功能时,可以减少资源池已有规格的实例数量。 缩容操作可能影响到正在运行的业务,建议用户在业务空窗期进行缩容,或进入资源池详情页面,在指定空闲的节点上进行删除来实现缩容。
  • 查看资源池事件 在资源池详情页,切换到“事件”页签。您可以查看资源从创建到添加节点的各个阶段的事件。产生事件的原因主要有“资源池状态变化”和“资源节点状态变化”。 在事件列表中,可单击“事件类型”列的筛选查看。 当资源池开始创建或者出现异常时,因资源池状态变化,会将此变化信息记录到事件中。 当节点的可用、异常、创建中、删除中的数量发生变化时,因资源池节点状态变化,会将此变化信息记录到事件中。 图1 查看资源池事件
  • ModelArts Standard资源池说明 在使用ModelArts进行AI开发时,您可以选择使用如下两种资源池: 专属资源池:专属资源池不与其他用户共享,资源更可控。在使用专属资源池之前,您需要先创建一个专属资源池,然后在AI开发过程中选择此专属资源池。 公共资源池:公共资源池提供公共的大规模计算集群,根据用户作业参数分配使用,资源按作业隔离。 用户下发训练作业、部署模型、使用开发环境实例等,均可以使用ModelArts提供的公共资源池完成,按照使用量计费,方便快捷。 专属资源池和公共资源池的能力主要差异如下: 专属资源池为用户提供独立的计算集群、网络,不同用户间的专属资源池物理隔离,公共资源池仅提供逻辑隔离,专属资源池的隔离性、安全性要高于公共资源池。 专属资源池用户资源独享,在资源充足的情况下,作业是不会排队的;而公共资源池使用共享资源,在任何时候都有可能排队。 专属资源池支持打通用户的网络,在该专属资源池中运行的作业可以访问打通网络中的存储和资源。例如,在创建训练作业时选择打通了网络的专属资源池,训练作业创建成功后,支持在训练时访问SFS中的数据。 专属资源池支持自定义物理节点运行环境相关的能力,例如GPU/Ascend驱动的自助升级,而公共资源池暂不支持。
  • 专属资源池使用说明 如果您是初次使用专属资源池,建议您可从本章节开始,了解ModelArts提供的资源池详细说明。 在对专属资源池有一定了解后,如果您需要创建一个自己的专属资源池,您可参考创建Standard专属资源池来进行创建。 专属资源池创建成功后,可在查看Standard专属资源池详情中查看专属资源池的详细信息。 如果专属资源池的规格与您的业务不符,可通过扩缩容Standard专属资源池来调整专属资源池的规格。 每个用户对集群的驱动要求不同,在专属资源池列表页中,可自行选择加速卡驱动,并根据业务需要进行立即变更或平滑升级。ModelArts提供了自助升级专属资源池GPU/Ascend驱动的能力,可参考升级Standard专属资源池驱动进行升级。 专属资源池提供了故障节点修复的功能,可参考修复Standard专属资源池故障节点修复故障节点。 专属资源池提供了动态设置作业类型的功能,可参考修改Standard专属资源池支持的作业类型更新作业类型。 专属资源池提供了工作空间功能,管理员可以根据工作空间,隔离不同子用户操作工作空间内资源的权限,您可通过迁移Standard专属资源池和网络至其他工作空间将资源池移动到对应的工作空间下。 专属资源池可通过标签来进行管理,具体可参见使用TMS标签实现资源分组管理管理专属资源池标签。 当不再需要使用专属资源池时,您可参考释放Standard专属资源池和删除网络删除专属资源池。
  • 在Workflow中指定仅运行部分节点 Workflow通过支持预置场景的方式来实现部分运行的能力,在开发工作流时按照场景的不同对DAG进行划分,之后在运行态可选择任意场景单独运行。具体代码示例如下所示: workflow =wf.Workflow( name="image_cls", desc="this is a demo workflow", steps=[label_step, release_data_step, training_step, model_step, service_step], policy=wf.policy.Policy( scenes=[ wf.policy.Scene( scene_name="模型训练", scene_steps=[label_step, release_data_step, training_step] ), wf.policy.Scene( scene_name="服务部署", scene_steps=[model_step, service_step] ), ] ) ) 该示例中Workflow包含了五个节点(节点相关定义已省略),在policy中定义了两个预置场景:模型训练和服务部署,工作流发布至运行态后,部分运行的开关默认关闭,节点全部运行。用户可在权限管理页面打开开关,选择指定的场景进行运行。 部分运行能力支持同一个节点被定义在不同的运行场景中,但是需要用户自行保证节点之间数据依赖的正确性。另外,部分运行能力仅支持在运行态进行配置运行,不支持在开发态进行调试。 父主题: Workflow高阶能力
  • 发布Workflow至运行态 工作流编写完成后,可以进行固化保存,调用Workflow对象的release()方法发布到运行态进行配置执行(在管理控制台Workflow页面配置)。 执行如下命令: workflow.release() 上述命令执行完成后,如果日志打印显示发布成功,则可前往ModelArts的Workflow页面中查看新发布的工作流,进入Workflow详情,单击“配置”进行参数配置。工作流相关的配置执行操作可参考如何使用Workflow。 基于release()方法,提供了release_and_run()方法,支持用户在开发态发布并运行工作流,节省了前往console配置执行的操作。 使用该方法时需要注意以下几个事项: Workflow中所有出现占位符相关的配置对象时,均需要设置默认值,或者直接使用固定的数据对象 方法的执行依赖于Workflow对象的名称:当该名称的工作流不存在时,则创建新工作流并创建新执行;当该名称的工作流已存在时,则更新存在的工作流并基于新的工作流结构创建新的执行 workflow.release_and_run()
  • 发布Workflow至运行态并运行 该方式支持用户直接在SDK侧发布并运行工作流,节省了前往控制台进行配置运行的操作,对Workflow代码改造如下。 from modelarts import workflow as wf # 定义统一存储对象管理输出目录 output_storage = wf.data.OutputStorage(name="output_storage", description="输出目录统一配置", default="**") # 数据集对象 dataset = wf.data.DatasetPlaceholder(name="input_data", default=wf.data.Dataset(dataset_name="**", version_name="**")) # 创建训练作业 job_step = wf.steps.JobStep( name="training_job", title="图像分类训练", algorithm=wf.AIGalleryAlgorithm( subscription_id="**", # 图像分类算法的订阅ID,自行前往算法管理页面进行查看,可选参数,此处以订阅算法举例 item_version_id="10.0.0", # 订阅算法的版本号,可选参数,此处以订阅算法举例 parameters=[ wf.AlgorithmParameters(name="task_type", value="image_classification_v2"), wf.AlgorithmParameters(name="model_name", value="resnet_v1_50"), wf.AlgorithmParameters(name="do_train", value="True"), wf.AlgorithmParameters(name="do_eval_along_train", value="True"), wf.AlgorithmParameters(name="variable_update", value="horovod"), wf.AlgorithmParameters(name="learning_rate_strategy", value=wf.Placeholder(name="learning_rate_strategy", placeholder_type=wf.PlaceholderType.STR, default="0.002", description="训练的学习率策略(10:0.001,20:0.0001代表0-10个epoch学习率0.001,10-20epoch学习率0.0001),如果不指定epoch, 会根据验证精度情况自动调整学习率,并当精度没有明显提升时,训练停止")), wf.AlgorithmParameters(name="batch_size", value=wf.Placeholder(name="batch_size", placeholder_type=wf.PlaceholderType.INT, default=64, description="每步训练的图片数量(单卡)")), wf.AlgorithmParameters(name="eval_batch_size", value=wf.Placeholder(name="eval_batch_size", placeholder_type=wf.PlaceholderType.INT, default=64, description="每步验证的图片数量(单卡)")), wf.AlgorithmParameters(name="evaluate_every_n_epochs", value=wf.Placeholder(name="evaluate_every_n_epochs", placeholder_type=wf.PlaceholderType.FLOAT, default=1.0, description="每训练n个epoch做一次验证")), wf.AlgorithmParameters(name="save_model_secs", value=wf.Placeholder(name="save_model_secs", placeholder_type=wf.PlaceholderType.INT, default=60, description="保存模型的频率(单位:s)")), wf.AlgorithmParameters(name="save_summary_steps", value=wf.Placeholder(name="save_summary_steps", placeholder_type=wf.PlaceholderType.INT, default=10, description="保存summary的频率(单位:步)")), wf.AlgorithmParameters(name="log_every_n_steps", value=wf.Placeholder(name="log_every_n_steps", placeholder_type=wf.PlaceholderType.INT, default=10, description="打印日志的频率(单位:步)")), wf.AlgorithmParameters(name="do_data_cleaning", value=wf.Placeholder(name="do_data_cleaning", placeholder_type=wf.PlaceholderType.STR, default="True", description="是否进行数据清洗, 数据格式异常会导致训练失败,建议开启,保证训练稳定性。数据量过大时,数据清洗可能耗时较久,可自行线下清洗(支持BMP.JPEG,PNG格式, RGB三通道)。建议用JPEG格式数据")), wf.AlgorithmParameters(name="use_fp16", value=wf.Placeholder(name="use_fp16", placeholder_type=wf.PlaceholderType.STR, default="True", description="是否使用混合精度, 混合精度可以加速训练,但是可能会造成一点精度损失,如果对精度无极严格的要求,建议开启")), wf.AlgorithmParameters(name="xla_compile", value=wf.Placeholder(name="xla_compile", placeholder_type=wf.PlaceholderType.STR, default="True", description="是否开启xla编译,加速训练,默认启用")), wf.AlgorithmParameters(name="data_format", value=wf.Placeholder(name="data_format", placeholder_type=wf.PlaceholderType.ENUM, default="NCHW", enum_list=["NCHW", "NHWC"], description="输入数据类型,NHWC表示channel在最后,NCHW表channel在最前,默认值NCHW(速度有提升)")), wf.AlgorithmParameters(name="best_model", value=wf.Placeholder(name="best_model", placeholder_type=wf.PlaceholderType.STR, default="True", description="是否在训练过程中保存并使用精度最高的模型,而不是最新的模型。默认值True,保存最优模型。在一定误差范围内,最优模型会保存最新的高精度模型")), wf.AlgorithmParameters(name="jpeg_preprocess", value=wf.Placeholder(name="jpeg_preprocess", placeholder_type=wf.PlaceholderType.STR, default="True", description="是否使用jpeg预处理加速算子(仅支持jpeg格式数据),可加速数据读取,提升性能,默认启用。如果数据格式不是jpeg格式,开启数据清洗功能即可使用")) ] ), inputs=[wf.steps.JobInput(name="data_url", data=dataset)], outputs=[wf.steps.JobOutput(name="train_url", obs_config=wf.data.OBSOutputConfig(obs_path=output_storage.join("/train_output/")))], spec=wf.steps.JobSpec( resource=wf.steps.JobResource( flavor=wf.Placeholder( name="training_flavor", placeholder_type=wf.PlaceholderType.JSON, description="训练资源规格", default={"flavor_id": "**"} ) ) ) ) # 构建工作流对象 workflow = wf.Workflow( name="image-classification-ResNeSt", desc="this is a image classification workflow", steps=[job_step], storages=[output_storage] ) 用户需要完成上述代码中**部分的配置,主要涉及以下三项。 统一存储:output_storage对象的default值,需填写一个已存在的OBS路径,路径格式为:/OBS桶名称/文件夹路径/。 数据集对象:使用准备数据集章节下载的数据集即可,填写相应的数据集名称以及版本号。 训练资源规格:配置计算资源。由于举例的算法只能跑GPU,此处必须配置GPU类型的资源,可使用免费规格(modelarts.p3.large.public.free)。 配置项修改完成后执行如下代码。 workflow.release_and_run() 执行完成后可前往ModelArts管理控制台,在总览页中选择Workflow,查看工作流的运行情况。
  • 编写工作流代码示例 以图像分类为例,阐述机器学习端到端场景的完整开发过程,主要包括数据标注、模型训练、服务部署等过程。您需要准备如下算法和数据集。 准备一个图像分类算法(或者可以直接从AI Gallery搜索订阅一个“图像分类-ResNet_v1_50”算法)。 准备一个图片类型的数据集,请参考准备数据集。可从AI Gallery直接下载(例如:8类常见生活垃圾图片数据集)。 from modelarts import workflow as wf # 定义统一存储对象管理输出目录 output_storage = wf.data.OutputStorage(name="output_storage", description="输出目录统一配置") # 创建标注任务 data = wf.data.DatasetPlaceholder(name="input_data") label_step = wf.steps.LabelingStep( name="labeling", title="数据标注", properties=wf.steps.LabelTaskProperties( task_type=wf.data.LabelTaskTypeEnum.IMAGE_CLASSIFICATION, task_name=wf.Placeholder(name="task_name", placeholder_type=wf.PlaceholderType.STR, description="请输入一个只包含大小写字母、数字、下划线、中划线或者中文字符的名称。填写已有标注任务名称,则直接使用该标注任务;填写新标注任务名称,则自动创建新的标注任务") ), inputs=wf.steps.LabelingInput(name="labeling_input", data=data), outputs=wf.steps.LabelingOutput(name="labeling_output"), ) # 对标注任务进行发布 release_step = wf.steps.ReleaseDatasetStep( name="release", title="数据集版本发布", inputs=wf.steps.ReleaseDatasetInput(name="input_data", data=label_step.outputs["labeling_output"].as_input()), outputs=wf.steps.ReleaseDatasetOutput(name="labeling_output", dataset_version_config=wf.data.DatasetVersionConfig(train_evaluate_sample_ratio="0.8")), depend_steps=[label_step] ) # 创建训练作业 job_step = wf.steps.JobStep( name="training_job", title="图像分类训练", algorithm=wf.AIGalleryAlgorithm( subscription_id="***", # 订阅算法的ID,自行补充 item_version_id="10.0.0", # 订阅算法的版本ID parameters=[ wf.AlgorithmParameters(name="task_type", value="image_classification_v2"), wf.AlgorithmParameters(name="model_name", value="resnet_v1_50"), wf.AlgorithmParameters(name="do_train", value="True"), wf.AlgorithmParameters(name="do_eval_along_train", value="True"), wf.AlgorithmParameters(name="variable_update", value="horovod"), wf.AlgorithmParameters(name="learning_rate_strategy", value=wf.Placeholder(name="learning_rate_strategy", placeholder_type=wf.PlaceholderType.STR, default="0.002", description="训练的学习率策略(10:0.001,20:0.0001代表0-10个epoch学习率0.001,10-20epoch学习率0.0001),如果不指定epoch, 会根据验证精度情况自动调整学习率,并当精度没有明显提升时,训练停止")), wf.AlgorithmParameters(name="batch_size", value=wf.Placeholder(name="batch_size", placeholder_type=wf.PlaceholderType.INT, default=64, description="每步训练的图片数量(单卡)")), wf.AlgorithmParameters(name="eval_batch_size", value=wf.Placeholder(name="eval_batch_size", placeholder_type=wf.PlaceholderType.INT, default=64, description="每步验证的图片数量(单卡)")), wf.AlgorithmParameters(name="evaluate_every_n_epochs", value=wf.Placeholder(name="evaluate_every_n_epochs", placeholder_type=wf.PlaceholderType.FLOAT, default=1.0, description="每训练n个epoch做一次验证")), wf.AlgorithmParameters(name="save_model_secs", value=wf.Placeholder(name="save_model_secs", placeholder_type=wf.PlaceholderType.INT, default=60, description="保存模型的频率(单位:s)")), wf.AlgorithmParameters(name="save_summary_steps", value=wf.Placeholder(name="save_summary_steps", placeholder_type=wf.PlaceholderType.INT, default=10, description="保存summary的频率(单位:步)")), wf.AlgorithmParameters(name="log_every_n_steps", value=wf.Placeholder(name="log_every_n_steps", placeholder_type=wf.PlaceholderType.INT, default=10, description="打印日志的频率(单位:步)")), wf.AlgorithmParameters(name="do_data_cleaning", value=wf.Placeholder(name="do_data_cleaning", placeholder_type=wf.PlaceholderType.STR, default="True", description="是否进行数据清洗, 数据格式异常会导致训练失败,建议开启,保证训练稳定性。数据量过大时,数据清洗可能耗时较久,可自行线下清洗(支持BMP.JPEG,PNG格式, RGB三通道)。建议用JPEG格式数据")), wf.AlgorithmParameters(name="use_fp16", value=wf.Placeholder(name="use_fp16", placeholder_type=wf.PlaceholderType.STR, default="True", description="是否使用混合精度, 混合精度可以加速训练,但是可能会造成一点精度损失,如果对精度无极严格的要求,建议开启")), wf.AlgorithmParameters(name="xla_compile", value=wf.Placeholder(name="xla_compile", placeholder_type=wf.PlaceholderType.STR, default="True", description="是否开启xla编译,加速训练,默认启用")), wf.AlgorithmParameters(name="data_format", value=wf.Placeholder(name="data_format", placeholder_type=wf.PlaceholderType.ENUM, default="NCHW", enum_list=["NCHW", "NHWC"], description="输入数据类型,NHWC表示channel在最后,NCHW表channel在最前,默认值NCHW(速度有提升)")), wf.AlgorithmParameters(name="best_model", value=wf.Placeholder(name="best_model", placeholder_type=wf.PlaceholderType.STR, default="True", description="是否在训练过程中保存并使用精度最高的模型,而不是最新的模型。默认值True,保存最优模型。在一定误差范围内,最优模型会保存最新的高精度模型")), wf.AlgorithmParameters(name="jpeg_preprocess", value=wf.Placeholder(name="jpeg_preprocess", placeholder_type=wf.PlaceholderType.STR, default="True", description="是否使用jpeg预处理加速算子(仅支持jpeg格式数据),可加速数据读取,提升性能,默认启用。如果数据格式不是jpeg格式,开启数据清洗功能即可使用")) ] ), inputs=[wf.steps.JobInput(name="data_url", data=release_step.outputs["labeling_output"].as_input())], outputs=[wf.steps.JobOutput(name="train_url", obs_config=wf.data.OBSOutputConfig(obs_path=output_storage.join("/train_output/")))], spec=wf.steps.JobSpec( resource=wf.steps.JobResource( flavor=wf.Placeholder(name="training_flavor", placeholder_type=wf.PlaceholderType.JSON, description="训练资源规格" ) ) ), depend_steps=[release_step] ) model_name = wf.Placeholder(name="model_name", placeholder_type=wf.PlaceholderType.STR, description="请输入一个1至64位且只包含大小写字母、中文、数字、中划线或者下划线的名称。工作流第一次运行建议填写新的模型名称,后续运行会自动在该模型上新增版本") # 模型注册 model_step = wf.steps.ModelStep( name="model_step", title="模型注册", inputs=[wf.steps.ModelInput(name="model_input", data=job_step.outputs["train_url"].as_input())], outputs=[wf.steps.ModelOutput(name="model_output", model_config=wf.steps.ModelConfig(model_name=model_name, model_type="TensorFlow"))], depend_steps=[job_step] ) # 服务部署 service_step = wf.steps.ServiceStep( name="service_step", title="服务部署", inputs=[wf.steps.ServiceInput(name="service_input", data=wf.data.ServiceInputPlaceholder(name="service_model", model_name=model_name))], outputs=[wf.steps.ServiceOutput(name="service_output")], depend_steps=[model_step] ) # 构建工作流对象 workflow = wf.Workflow(name="image-classification-ResNeSt", desc="this is a image classification workflow", steps=[label_step, release_step, job_step, model_step, service_step], storages=[output_storage] ) 在工作流编写完成后可自行进行发布等操作。
  • 导入Workflow Data包 在编写Workflow过程中,相关对象都通过Workflow包进行导入,梳理如下: from modelarts import workflow as wf Data包相关内容导入: wf.data.DatasetTypeEnum wf.data.Dataset wf.data.DatasetVersionConfig wf.data.DatasetPlaceholder wf.data.ServiceInputPlaceholder wf.data.ServiceData wf.data.ServiceUpdatePlaceholder wf.data.DataTypeEnum wf.data.ModelData wf.data.GalleryModel wf.data.OBSPath wf.data.OBSOutputConfig wf.data.OBSPlaceholder wf.data.SWRImage wf.data.SWRImagePlaceholder wf.data.Storage wf.data.InputStorage wf.data.OutputStorage wf.data.LabelTask wf.data.LabelTaskPlaceholder wf.data.LabelTaskConfig wf.data.LabelTaskTypeEnum wf.data.MetricsConfig wf.data.TripartiteServiceConfig wf.data.DataConsumptionSelector policy包相关内容导入: wf.policy.Policy wf.policy.Scene steps包相关内容导入: wf.steps.MetricInfo wf.steps.Condition wf.steps.ConditionTypeEnum wf.steps.ConditionStep wf.steps.LabelingStep wf.steps.LabelingInput wf.steps.LabelingOutput wf.steps.LabelTaskProperties wf.steps.ImportDataInfo wf.steps.DataOriginTypeEnum wf.steps.DatasetImportStep wf.steps.DatasetImportInput wf.steps.DatasetImportOutput wf.steps.AnnotationFormatConfig wf.steps.AnnotationFormatParameters wf.steps.AnnotationFormatEnum wf.steps.Label wf.steps.ImportTypeEnum wf.steps.LabelFormat wf.steps.LabelTypeEnum wf.steps.ReleaseDatasetStep wf.steps.ReleaseDatasetInput wf.steps.ReleaseDatasetOutput wf.steps.CreateDatasetStep wf.steps.CreateDatasetInput wf.steps.CreateDatasetOutput wf.steps.DatasetProperties wf.steps.SchemaField wf.steps.ImportConfig wf.steps.JobStep wf.steps.JobMetadata wf.steps.JobSpec wf.steps.JobResource wf.steps.JobTypeEnum wf.steps.JobEngine wf.steps.JobInput wf.steps.JobOutput wf.steps.LogExportPath wf.steps.MrsJobStep wf.steps.MrsJobInput wf.steps.MrsJobOutput wf.steps.MrsJobAlgorithm wf.steps.ModelStep wf.steps.ModelInput wf.steps.ModelOutput wf.steps.ModelConfig wf.steps.Template wf.steps.TemplateInputs wf.steps.ServiceStep wf.steps.ServiceInput wf.steps.ServiceOutput wf.steps.ServiceConfig wf.steps.StepPolicy Workflow包相关内容导入: wf.workflow wf.Subgraph wf.Placeholder wf.PlaceholderType wf.AlgorithmParameters wf.BaseAlgorithm wf.Algorithm wf.AIGalleryAlgorithm wf.resource wf.SystemEnv wf.add_whitelist_users wf.delete_whitelist_users
  • 使用案例 from modelarts import workflow as wf condition_equal = wf.steps.Condition(condition_type=wf.steps.ConditionTypeEnum.EQ, left=wf.Placeholder(name="is_true", placeholder_type=wf.PlaceholderType.BOOL), right=True) condition_step = wf.steps.ConditionStep( name="condition_step", conditions=[condition_equal], if_then_steps=["training_job_1"], else_then_steps=["training_job_2"], ) # 构建一个OutputStorage对象,对训练输出目录做统一管理 storage = wf.data.OutputStorage(name="storage_name", title="title_info", description="description_info") # name字段必填,title, description可选填 # 定义输入的OBS对象 obs_data = wf.data.OBSPlaceholder(name="obs_placeholder_name", object_type="directory") # 通过JobStep来定义一个训练节点,并将训练结果输出到OBS job_step_1 = wf.steps.JobStep( name="training_job_1", # 训练节点的名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符),一个Workflow里的两个step名称不能重复 title="图像分类训练", # 标题信息,不填默认使用name algorithm=wf.AIGalleryAlgorithm( subscription_id="subscription_id", # 算法订阅ID item_version_id="item_version_id", # 算法订阅版本ID,也可直接填写版本号 parameters=[] ), # 训练使用的算法对象,示例中使用AIGallery订阅的算法;部分算法超参的值如果无需修改,则在parameters字段中可以不填写,系统自动填充相关超参值 inputs=wf.steps.JobInput(name="data_url", data=obs_data), # JobStep的输入在运行时配置;data字段也可使用data=wf.data.OBSPath(obs_path="fake_obs_path")表示 outputs=wf.steps.JobOutput(name="train_url", obs_config=wf.data.OBSOutputConfig(obs_path=storage.join("directory_path"))), # JobStep的输出 spec=wf.steps.JobSpec( resource=wf.steps.JobResource( flavor=wf.Placeholder(name="train_flavor", placeholder_type=wf.PlaceholderType.JSON, description="训练资源规格") ) ), # 训练资源规格信息 depend_steps=[condition_step] ) # 通过JobStep来定义一个训练节点,并将训练结果输出到OBS job_step_2 = wf.steps.JobStep( name="training_job_2", # 训练节点的名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符),一个Workflow里的两个step名称不能重复 title="图像分类训练", # 标题信息,不填默认使用name algorithm=wf.AIGalleryAlgorithm( subscription_id="subscription_id", # 算法订阅ID item_version_id="item_version_id", # 算法订阅版本ID,也可直接填写版本号 parameters=[] ), # 训练使用的算法对象,示例中使用AIGallery订阅的算法;部分算法超参的值如果无需修改,则在parameters字段中可以不填写,系统自动填充相关超参值 inputs=wf.steps.JobInput(name="data_url", data=obs_data), # JobStep的输入在运行时配置;data字段也可使用data=wf.data.OBSPath(obs_path="fake_obs_path")表示 outputs=wf.steps.JobOutput(name="train_url", obs_config=wf.data.OBSOutputConfig(obs_path=storage.join("directory_path"))), # JobStep的输出 spec=wf.steps.JobSpec( resource=wf.steps.JobResource( flavor=wf.Placeholder(name="train_flavor", placeholder_type=wf.PlaceholderType.JSON, description="训练资源规格") ) ), # 训练资源规格信息 depend_steps=[condition_step] ) # 定义模型名称参数 model_name = wf.Placeholder(name="placeholder_name", placeholder_type=wf.PlaceholderType.STR) model_step = wf.steps.ModelStep( name="model_registration", # 模型注册节点的名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符),一个Workflow里的两个step名称不能重复 title="模型注册", # 标题信息 inputs=wf.steps.ModelInput(name='model_input', data=wf.data.DataConsumptionSelector(data_list=[job_step_1.outputs["train_url"].as_input(), job_step_2.outputs["train_url"].as_input()])), # 选择job_step_1或者job_step_2的输出作为输入 outputs=wf.steps.ModelOutput(name='model_output', model_config=wf.steps.ModelConfig(model_name=model_name, model_type="TensorFlow")), # ModelStep的输出 depend_steps=[job_step_1, job_step_2] # 依赖的作业类型节点对象 )# job_step是wf.steps.JobStep的 实例对象,train_url是wf.steps.JobOutput的name字段值 workflow = wf.Workflow(name="data-select-demo", desc="this is a test workflow", steps=[condition_step, job_step_1, job_step_2, model_step], storages=storage ) 案例中的Workflow存在两个并行分支,并且同时只有一条分支会执行,由condition_step的相关配置决定。model_step的输入来源为job_step_1或者job_step_2的输出,当job_step_1节点所在分支执行,job_step_2节点所在分支跳过时,model_step节点执行时自动获取job_step_1的输出作为输入,反之自动获取job_step_2的输出作为输入。
  • Workflow多分支运行介绍 当前支持两种方式实现多分支的能力,条件节点只支持双分支的选择执行,局限性较大,推荐使用配置节点参数控制分支执行的方式,可以在不添加新节点的情况下完全覆盖ConditionStep的能力,使用上更灵活。 构建条件节点控制分支执行主要用于执行流程的条件分支选择,可以简单的进行数值比较来控制执行流程,也可以根据节点输出的metric相关信息决定后续的执行流程。 配置节点参数控制分支执行与ConditionStep的使用场景类似,但功能更加强大。主要用于存在多分支选择执行的复杂场景,在每次启动执行后需要根据相关配置信息决定哪些分支需要执行,哪些分支需要跳过,达到分支部分执行的目的。 父主题: 构建Workflow多分支运行场景
  • 简单示例 通过参数配置实现 import modelarts.workflow as wf left_value = wf.Placeholder(name="left_value", placeholder_type=wf.PlaceholderType.BOOL, default=True) # 条件对象 condition = wf.steps.Condition(condition_type=wf.steps.ConditionTypeEnum.EQ, left=left_value, right=True) # 条件对象,包含类型以及左右值 # 条件节点 condition_step = wf.steps.ConditionStep( name="condition_step_test", # 条件节点的名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符),一个Workflow里的两个step名称不能重复 conditions=condition, # 条件对象,允许多个条件,条件之间的关系为&& if_then_steps="job_step_1", # 当condition结果为true时,名称为job_step_1的节点允许执行,名称为job_step_2的节点跳过不执行 else_then_steps="job_step_2" # 当condition结果为false时,名称为job_step_2的节点允许执行,名称为job_step_1的节点跳过不执行 ) # 该节点仅作为示例使用,其他字段需自行补充 job_step_1 = wf.steps.JobStep( name="job_step_1", depend_steps=condition_step ) # 该节点仅作为示例使用,其他字段需自行补充 model_step_1 = wf.steps.ModelStep( name="model_step_1", depend_steps=job_step_1 ) # 该节点仅作为示例使用,其他字段需自行补充 job_step_2 = wf.steps.JobStep( name="job_step_2", depend_steps=condition_step ) # 该节点仅作为示例使用,其他字段需自行补充 model_step_2 = wf.steps.ModelStep( name="model_step_2", depend_steps=job_step_2 ) workflow = wf.Workflow( name="condition-demo", desc="this is a demo workflow", steps=[condition_step, job_step_1, job_step_2, model_step_1, model_step_2] ) 场景说明:job_step_1和job_step_2表示两个训练节点,并且均直接依赖于condition_step。condition_step通过参数配置决定后继节点的执行行为。 执行情况分析: 参数left_value默认值为True,则condition逻辑表达式计算结果为True:job_step_1执行,job_step_2跳过,并且以job_step_2为唯一根节点的分支所包含的所有节点也将跳过,即model_step_2会跳过,因此最终执行的节点有condition_step、job_step_1、model_step_1。 如果设置left_value的值为Fasle,则condition逻辑表达式计算结果为False:job_step_2执行,job_step_1跳过,并且以job_step_1为唯一根节点的分支所包含的所有节点也将跳过,即model_step_1会跳过,因此最终执行的节点有condition_step、job_step_2、model_step_2。 通过获取JobStep输出的相关metric指标信息实现 from modelarts import workflow as wf # 构建一个OutputStorage对象,对训练输出目录做统一管理 storage = wf.data.Storage(name="storage_name", title="title_info", with_execution_id=True, create_dir=True, description="description_info") # name字段必填,title, description可选填 # 定义输入的OBS对象 obs_data = wf.data.OBSPlaceholder(name="obs_placeholder_name", object_type="directory") # 通过JobStep来定义一个训练节点,并将训练结果输出到OBS job_step = wf.steps.JobStep( name="training_job", # 训练节点的名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符),一个Workflow里的两个step名称不能重复 title="图像分类训练", # 标题信息,不填默认使用name algorithm=wf.AIGalleryAlgorithm( subscription_id="subscription_id", # 算法订阅ID item_version_id="item_version_id", # 算法订阅版本ID,也可直接填写版本号 parameters=[] ), # 训练使用的算法对象,示例中使用AIGallery订阅的算法;部分算法超参的值如果无需修改,则在parameters字段中可以不填写,系统自动填充相关超参值 inputs=wf.steps.JobInput(name="data_url", data=obs_data), outputs=[ wf.steps.JobOutput(name="train_url",obs_config=wf.data.OBSOutputConfig(obs_path=storage.join("directory_path"))), wf.steps.JobOutput(name="metrics", metrics_config=wf.data.MetricsConfig(metric_files=storage.join("directory_path/metrics.json", create_dir=False))) # 指定metric的输出路径,相关指标信息由作业脚本代码根据指定的数据格式自行输出(示例中需要将metric信息输出到训练输出目录下的metrics.json文件中) ], spec=wf.steps.JobSpec( resource=wf.steps.JobResource( flavor=wf.Placeholder(name="train_flavor", placeholder_type=wf.PlaceholderType.JSON, description="训练资源规格") ) ) # 训练资源规格信息 ) # 定义条件对象 condition_lt = wf.steps.Condition( condition_type=wf.steps.ConditionTypeEnum.LT, left=wf.steps.MetricInfo(job_step.outputs["metrics"].as_input(), "accuracy"), right=0.5 ) condition_step = wf.steps.ConditionStep( name="condition_step_test", # 条件节点的名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符),一个Workflow里的两个step名称不能重复 conditions=condition_lt, # 条件对象,允许多个条件,条件之间的关系为&& if_then_steps="training_job_retrain", # 当condition结果为true时,名称为training_job_retrain的节点允许执行,名称为model_registration的节点跳过不执行 else_then_steps="model_registration", # 当condition结果为false时,名称为model_registration的节点允许执行,名称为training_job_retrain的节点跳过不执行 depend_steps=job_step ) # 通过JobStep来定义一个训练节点,并将训练结果输出到OBS job_step_retrain = wf.steps.JobStep( name="training_job_retrain", # 训练节点的名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符),一个Workflow里的两个step名称不能重复 title="图像分类重新训练训练", # 标题信息,不填默认使用name algorithm=wf.AIGalleryAlgorithm( subscription_id="subscription_id", # 算法订阅ID item_version_id="item_version_id", # 算法订阅版本ID,也可直接填写版本号 parameters=[] ), # 训练使用的算法对象,示例中使用AIGallery订阅的算法;部分算法超参的值如果无需修改,则在parameters字段中可以不填写,系统自动填充相关超参值 inputs=wf.steps.JobInput(name="data_url", data=obs_data), outputs=[ wf.steps.JobOutput(name="train_url",obs_config=wf.data.OBSOutputConfig(obs_path=storage.join("directory_path_retrain"))), wf.steps.JobOutput(name="metrics", metrics_config=wf.data.MetricsConfig(metric_files=storage.join("directory_path_retrain/metrics.json", create_dir=False))) # 指定metric的输出路径,相关指标信息由作业脚本代码根据指定的数据格式自行输出(示例中需要将metric信息输出到训练输出目录下的metrics.json文件中) ], spec=wf.steps.JobSpec( resource=wf.steps.JobResource( flavor=wf.Placeholder(name="train_flavor_retrain", placeholder_type=wf.PlaceholderType.JSON, description="训练资源规格") ) ), # 训练资源规格信息 depend_steps=condition_step ) # 定义模型名称参数 model_name = wf.Placeholder(name="placeholder_name", placeholder_type=wf.PlaceholderType.STR) model_step = wf.steps.ModelStep( name="model_registration", # 模型注册节点的名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符),一个Workflow里的两个step名称不能重复 title="模型注册", # 标题信息 inputs=wf.steps.ModelInput(name='model_input', data=job_step.outputs["train_url"].as_input()), # job_step的输出作为输入 outputs=wf.steps.ModelOutput(name='model_output', model_config=wf.steps.ModelConfig(model_name=model_name, model_type="TensorFlow")), # ModelStep的输出 depend_steps=condition_step, ) workflow = wf.Workflow( name="condition-demo", desc="this is a demo workflow", steps=[job_step, condition_step, job_step_retrain, model_step], storages=storage ) 案例中ConditionStep节点通过获取job_step输出的accuracy指标信息与预置的值进行比较,决定重新训练还是模型注册。当job_step输出的accuracy指标数据小于阈值0.5时,condition_lt的计算结果为True,此时job_step_retrain运行,model_step跳过;反之job_step_retrain跳过,model_step执行。 job_step输出的metric文件格式要求可参考创建Workflow训练作业节点部分,并且在Condition中只支持使用type为float类型的指标数据作为输入。 此案例中metrics.json的内容示例如下: [ { "key": "loss", "title": "loss", "type": "float", "data": { "value": 1.2 } }, { "key": "accuracy", "title": "accuracy", "type": "float", "data": { "value": 0.8 } } ]
共100000条