华为云用户手册

  • 功能介绍 通过对ModelArts数据集能力进行封装,实现数据集的数据导入功能。数据集导入节点主要用于将指定路径下的数据导入到数据集或者标注任务中,主要应用场景如下: 适用于数据不断迭代的场景,可以将一些新增的原始数据或者已标注数据导入到标注任务中,并通过后续的数据集标注节点进行标注。 对于一些已标注好的原始数据,可以直接导入到数据集或者标注任务中,并通过后续的数据集版本发布节点获取带有版本信息的数据集对象。
  • Workflow数据集标注节点代码样例 主要包含三种场景的用例: 场景一:基于用户指定的数据集创建标注任务,并等待用户标注完成。 使用场景: 用户只创建了一个未标注完成的数据集,需要在工作流运行时对数据进行人工标注。 可以放在数据集导入节点之后,对导入的新数据进行人工标注。 数据准备:提前在ModelArts管理控制台创建一个数据集。 from modelarts import workflow as wf # 通过LabelingStep给输入的数据集对象创建新的标注任务,并等待用户标注完成 # 定义输入的数据集对象 dataset = wf.data.DatasetPlaceholder(name="input_dataset") # 定义标注任务的名称参数 task_name = wf.Placeholder(name="placeholder_name", placeholder_type=wf.PlaceholderType.STR) labeling = wf.steps.LabelingStep( name="labeling", # 数据集标注节点的名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符),一个Workflow里的两个step名称不能重复 title="数据集标注", # 标题信息,不填默认使用name值 properties=wf.steps.LabelTaskProperties( task_type=wf.data.LabelTaskTypeEnum.IMAGE_CLASSIFICATION, # 标注任务的类型,以图像分类为例 task_name=task_name # 该名称对应的标注任务如果不存在则创建,如果存在则直接使用该任务 ), inputs=wf.steps.LabelingInput(name="input_name", data=dataset), # LabelingStep的输入,数据集对象在运行时配置;data字段也可使用wf.data.Dataset(dataset_name="fake_dataset_name")表示 outputs=wf.steps.LabelingOutput(name="output_name"), # LabelingStep的输出 ) workflow = wf.Workflow( name="labeling-step-demo", desc="this is a demo workflow", steps=[labeling] ) 场景二:基于指定的标注任务进行标注。 使用场景: 用户基于数据集自主创建了一个标注任务,需要在工作流运行时对数据进行人工标注。 可以放在数据集导入节点之后,对导入的新数据进行人工标注。 数据准备:提前在ModelArts管理控制台,基于使用的数据集创建一个标注任务。 from modelarts import workflow as wf # 用户输入标注任务,等待用户标注完成 # 定义数据集的标注任务对象 label_task = wf.data.LabelTaskPlaceholder(name="label_task_placeholder_name") labeling = wf.steps.LabelingStep( name="labeling", # 数据集标注节点的名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符),一个Workflow里的两个step名称不能重复 title="数据集标注", # 标题信息,不填默认使用name值 inputs=wf.steps.LabelingInput(name="input_name", data=label_task), # LabelingStep的输入,标注任务对象在运行时配置;data字段也可使用wf.data.LabelTask(dataset_name="dataset_name", task_name="label_task_name")来表示 outputs=wf.steps.LabelingOutput(name="output_name"), # LabelingStep的输出 ) workflow = wf.Workflow( name="labeling-step-demo", desc="this is a demo workflow", steps=[labeling] ) 场景三:基于数据集创建节点的输出创建标注任务。 使用场景:数据集创建节点的输出作为数据集数据标注节点的输入。 from modelarts import workflow as wf # 定义数据集输出路径参数 dataset_output_path = wf.Placeholder(name="dataset_output_path", placeholder_type=wf.PlaceholderType.STR, placeholder_format="obs") # 定义数据集名称参数 dataset_name = wf.Placeholder(name="dataset_name", placeholder_type=wf.PlaceholderType.STR) create_dataset = wf.steps.CreateDatasetStep( name="create_dataset",# 数据集创建节点的名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符),一个Workflow里的两个step名称不能重复 title="数据集创建", # 标题信息,不填默认使用name值 inputs=wf.steps.CreateDatasetInput(name="input_name", data=wf.data.OBSPlaceholder(name="obs_placeholder_name", object_type="directory")),# CreateDatasetStep的输入,数据在运行时进行配置;data字段也可使用wf.data.OBSPath(obs_path="fake_obs_path")对象表示 outputs=wf.steps.CreateDatasetOutput(name="create_dataset_output", config=wf.data.OBSOutputConfig(obs_path=dataset_output_path)),# CreateDatasetStep的输出 properties=wf.steps.DatasetProperties( dataset_name=dataset_name, # 该名称对应的数据集如果不存在,则创建新的数据集;如果已存在,则直接使用该名称对应的数据集 data_type=wf.data.DataTypeEnum.IMAGE, # 数据集对应的数据类型, 示例为图像 ) ) # 定义标注任务的名称参数 task_name = wf.Placeholder(name="placeholder_name", placeholder_type=wf.PlaceholderType.STR) labeling = wf.steps.LabelingStep( name="labeling", # 数据集标注节点的名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符),一个Workflow里的两个step名称不能重复 title="数据集标注", # 标题信息,不填默认使用name值 properties=wf.steps.LabelTaskProperties( task_type=wf.data.LabelTaskTypeEnum.IMAGE_CLASSIFICATION, # 标注任务的类型,以图像分类为例 task_name=task_name # 该名称对应的标注任务如果不存在则创建,如果存在则直接使用该任务 ), inputs=wf.steps.LabelingInput(name="input_name", data=create_dataset.outputs["create_dataset_output"].as_input()), # LabelingStep的输入,data数据来源为数据集创建节点的输出 outputs=wf.steps.LabelingOutput(name="output_name"), # LabelingStep的输出 depend_steps=create_dataset # 依赖的数据集创建节点对象 ) # create_dataset是 wf.steps.CreateDatasetStep的一个实例,create_dataset_output是wf.steps.CreateDatasetOutput的name字段值 workflow = wf.Workflow( name="labeling-step-demo", desc="this is a demo workflow", steps=[create_dataset, labeling] )
  • 使用案例 主要包含两种场景的用例。 基于未标注数据创建数据集 基于已标注的数据创建数据集,并自动导入标注信息 基于未标注数据创建数据集 数据准备:存储在OBS文件夹中的未标注的数据。 from modelarts import workflow as wf # 通过CreateDatasetStep将存储在OBS中的数据创建成一个新版数据集 # 定义数据集输出路径参数 dataset_output_path = wf.Placeholder(name="dataset_output_path", placeholder_type=wf.PlaceholderType.STR, placeholder_format="obs") # 定义数据集名称参数 dataset_name = wf.Placeholder(name="dataset_name", placeholder_type=wf.PlaceholderType.STR) create_dataset = wf.steps.CreateDatasetStep( name="create_dataset",# 数据集创建节点的名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符),一个Workflow里的两个step名称不能重复 title="数据集创建", # 标题信息,不填默认使用name值 inputs=wf.steps.CreateDatasetInput(name="input_name", data=wf.data.OBSPlaceholder(name="obs_placeholder_name", object_type="directory")),# CreateDatasetStep的输入,数据在运行时进行配置;data字段也可使用wf.data.OBSPath(obs_path="fake_obs_path")对象表示 outputs=wf.steps.CreateDatasetOutput(name="output_name", config=wf.data.OBSOutputConfig(obs_path=dataset_output_path)),# CreateDatasetStep的输出 properties=wf.steps.DatasetProperties( dataset_name=dataset_name, # 该名称对应的数据集如果不存在,则创建新的数据集;如果已存在,则直接使用该名称对应的数据集 data_type=wf.data.DataTypeEnum.IMAGE, # 数据集对应的数据类型, 示例为图像 ) ) # 注意dataset_name这个参数配置的数据集名称需要用户自行确认在该账号下未被他人使用,否则会导致期望的数据集未被创建,而后续节点错误使用了他人创建的数据集 workflow = wf.Workflow( name="create-dataset-demo", desc="this is a demo workflow", steps=[create_dataset] ) 基于已标注数据创建数据集,并导入标注信息 数据准备:存储在OBS文件夹中的已标注数据。 OBS目录导入已标注数据的规范:可参见OBS目录导入数据规范说明。 from modelarts import workflow as wf # 通过CreateDatasetStep将存储在OBS中的数据创建成一个新版数据集 # 定义数据集输出路径参数 dataset_output_path = wf.Placeholder(name="dataset_placeholder_name", placeholder_type=wf.PlaceholderType.STR, placeholder_format="obs") # 定义数据集名称参数 dataset_name = wf.Placeholder(name="dataset_placeholder_name", placeholder_type=wf.PlaceholderType.STR) create_dataset = wf.steps.CreateDatasetStep( name="create_dataset",# 数据集创建节点的名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符),一个Workflow里的两个step名称不能重复 title="数据集创建", # 标题信息,不填默认使用name值 inputs=wf.steps.CreateDatasetInput(name="input_name", data=wf.data.OBSPlaceholder(name="obs_placeholder_name", object_type="directory")),# CreateDatasetStep的输入,数据在运行时进行配置;data字段也可使用wf.data.OBSPath(obs_path="fake_obs_path")对象表示 outputs=wf.steps.CreateDatasetOutput(name="output_name", config=wf.data.OBSOutputConfig(obs_path=dataset_output_path)),# CreateDatasetStep的输出 properties=wf.steps.DatasetProperties( dataset_name=dataset_name, # 该名称对应的数据集如果不存在,则创建新的数据集;如果已存在,则直接使用该名称对应的数据集 data_type=wf.data.DataTypeEnum.IMAGE, # 数据集对应的数据类型, 示例为图像 import_config=wf.steps.ImportConfig( annotation_format_config=[ wf.steps.AnnotationFormatConfig( format_name=wf.steps.AnnotationFormatEnum.MA_IMAGE_CLASSIFICATION_V1, # 已标注数据的标注格式 scene=wf.data.LabelTaskTypeEnum.IMAGE_CLASSIFICATION) # 标注的场景类型 ] ) ) ) # 注意dataset_name这个参数配置的数据集名称需要用户自行确认在该账号下未被他人使用,否则会导致期望的数据集未被创建,而后续节点错误使用了他人创建的数据集 workflow = wf.Workflow( name="create-dataset-demo", desc="this is a demo workflow", steps=[create_dataset] )
  • 属性总览 您可以使用CreateDatasetStep来构建数据集创建节点,CreateDatasetStep及相关对象结构如下。 表1 CreateDatasetStep 属性 描述 是否必填 数据类型 name 数据集创建节点的名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符),一个Workflow里的两个step名称不能重复。 是 str inputs 数据集创建节点的输入列表。 是 CreateDatasetInput或者CreateDatasetInput的列表 outputs 数据集创建节点的输出列表。 是 CreateDatasetOutput或者CreateDatasetOutput的列表 properties 数据集创建相关的配置信息。 是 DatasetProperties title title信息,主要用于前端的名称展示。 否 str description 数据集创建节点的描述信息。 否 str policy 节点执行的policy。 否 StepPolicy depend_steps 依赖的节点列表。 否 Step或者Step的列表 表2 CreateDatasetInput 属性 描述 是否必填 数据类型 name 数据集创建节点的输入名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符)。同一个Step的输入名称不能重复。 是 str data 数据集创建节点的输入数据对象。 是 OBS相关对象,当前仅支持OBSPath、OBSConsumption、OBSPlaceholder、DataConsumptionSelector 表3 CreateDatasetOutput 属性 描述 是否必填 数据类型 name 数据集创建节点的输出名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符)。同一个Step的输出名称不能重复。 是 str config 数据集创建节点的输出相关配置。 是 当前仅支持OBSOutputConfig 表4 DatasetProperties 属性 描述 是否必填 数据类型 dataset_name 数据集的名称,只能是中文、字母、数字、下划线或中划线组成的合法字符串,长度为1-100位。 是 str、Placeholder dataset_format 数据集格式,默认为0,表示文件类型。 否 0:文件类型 1:表格类型 data_type 数据类型,默认为FREE_FORMAT。 否 DataTypeEnum description 描述信息。 否 str import_data 是否要导入数据,当前只支持表格数据,默认为False。 否 bool work_path_type 数据集输出路径类型,当前仅支持OBS,默认为0。 否 int import_config 标签导入的相关配置,默认为None,当基于已标注的数据创建数据集时,可指定该字段导入相关标注信息。 否 ImportConfig 表5 Importconfig 属性 描述 是否必填 数据类型 import_annotations 是否自动导入输入目录下的标注信息,支持检测/图像分类/文本分类。可选值如下: true:导入输入目录下的标注信息(默认值) false:不导入输入目录下的标注信息 否 str、Placeholder import_type 导入方式。可选值如下: dir:目录导入 manifest:按manifest文件导入 否 0:文件类型ImportTypeEnum annotation_format_config 导入的标注格式的配置参数。 否 DAnnotationFormaTypeEtConumfig的列表 表6 AnnotationFormatConfig 属性 描述 是否必填 数据类型 format_name 标注格式的名称。 否 AnnotationFormatEnum scene 标注场景,可选参数。 否 LabelTaskTypeEnum 枚举类型 枚举值 ImportTypeEnum DIR MANIFEST DataTypeEnum IMAGE TEXT AUDIO TABULAR VIDEO FREE_FORMAT AnnotationFormatEnum MA_IMAGE_CLASSIFICATION_V1 MA_IMAGENET_V1 MA_PASCAL_VOC_V1 YOLO MA_IMAGE_SEGMENTATION_V1 MA_TEXT_CLASSIFICATION_COMBINE_V1 MA_TEXT_CLASSIFICATION_V1 MA_AUDIO_CLASSIFICATION_DIR_V1
  • 使用案例 统一存储主要用于JobStep中,下面代码示例全部以单训练节点为例。 from modelarts import workflow as wf # 构建一个InputStorage对象, 并且假设配置的根目录为"/root/input-data/" input_storage = wf.data.InputStorage(name="input_storage_name", title="title_info", description="description_info") # name字段必填,title, description可选填 # 构建一个OutputStorage对象, 并且假设配置的根目录为"/root/output/" output_storage = wf.data.OutputStorage(name="output_storage_name", title="title_info", description="description_info") # name字段必填,title, description可选填 # 通过JobStep来定义一个训练节点,输入数据来源为OBS,并将训练结果输出到OBS中 job_step = wf.steps.JobStep( name="training_job", # 训练节点的名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符),一个Workflow里的两个step名称不能重复 title="图像分类训练", # 标题信息,不填默认使用name algorithm=wf.AIGalleryAlgorithm(subscription_id="subscription_ID", item_version_id="item_version_ID"), # 训练使用的算法对象,示例中使用AIGallery订阅的算法 inputs=[ wf.steps.JobInput(name="data_url_1", data=wf.data.OBSPath(obs_path = input_storage.join("/dataset1/new.manifest"))), # 获得的路径为:/root/input-data/dataset1/new.manifest wf.steps.JobInput(name="data_url_2", data=wf.data.OBSPath(obs_path = input_storage.join("/dataset2/new.manifest"))) # 获得的路径为:/root/input-data/dataset2/new.manifest ], outputs=wf.steps.JobOutput(name="train_url", obs_config=wf.data.OBSOutputConfig(obs_path=output_storage.join("/model/"))), # 训练输出的路径为:/root/output/执行ID/model/ spec=wf.steps.JobSpec( resource=wf.steps.JobResource( flavor=wf.Placeholder(name="train_flavor", placeholder_type=wf.PlaceholderType.JSON, description="训练资源规格") ), log_export_path=wf.steps.job_step.LogExportPath(obs_url=output_storage.join("/logs/")) # 日志输出的路径为:/root/output/执行ID/logs/ )# 训练资源规格信息 ) # 定义一个只包含job_step的工作流 workflow = wf.Workflow( name="test-workflow", desc="this is a test workflow", steps=[job_step], storages=[input_storage, output_storage] # 注意在整个工作流中使用到的Storage对象需要在这里添加 )
  • 功能介绍 统一存储主要用于工作流的目录管理,帮助用户统一管理一个工作流中的所有存储路径,主要分为以下两个功能: 输入目录管理:开发者在编辑开发工作流时可以对所有数据的存储路径做统一管理,规定用户按照自己的目录规划来存放数据,而存储的根目录可以根据用户自己的需求自行配置。该方式只做目录的编排,不会自动创建新的目录。 输出目录管理:开发者在编辑开发工作流时可以对所有的输出路径做统一管理,用户无需手动创建输出目录,只需要在工作流运行前配置存储根路径,并且可以根据开发者的目录编排规则在指定目录下查看输出的数据信息。此外同一个工作流的多次运行支持输出到不同的目录下,对不同的执行做了很好的数据隔离。
  • 常用方式 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
  • 使用案例 int类型参数 from modelarts import workflow as wf wf.Placeholder(name="placeholder_int", placeholder_type=wf.PlaceholderType.INT, default=1, description="这是一个int类型的参数") str类型参数 from modelarts import workflow as wf wf.Placeholder(name="placeholder_str", placeholder_type=wf.PlaceholderType.STR, default="default_value", description="这是一个str类型的参数") bool类型参数 from modelarts import workflow as wf wf.Placeholder(name="placeholder_bool", placeholder_type=wf.PlaceholderType.BOOL, default=True, description="这是一个bool类型的参数") float类型参数 from modelarts import workflow as wf wf.Placeholder(name="placeholder_float", placeholder_type=wf.PlaceholderType.FLOAT, default=0.1, description="这是一个float类型的参数") Enum类型参数 from modelarts import workflow as wf wf.Placeholder(name="placeholder_enum", placeholder_type=wf.PlaceholderType.ENUM, default="a", enum_list=["a", "b"], description="这是一个enum类型的参数") dict类型参数 from modelarts import workflow as wf wf.Placeholder(name="placeholder_dict", placeholder_type=wf.PlaceholderType.JSON, default={"key": "value"}, description="这是一个dict类型的参数") list类型参数 from modelarts import workflow as wf wf.Placeholder(name="placeholder_list", placeholder_type=wf.PlaceholderType.LIST, default=[1, 2], placeholder_format="int", description="这是一个list类型的参数,并且value类型为int")
  • 步骤四:发布Workflow至运行态 发布Workflow至运行态完成后需要进行配置,详细参考2。更多发布方式请参考发布Workflow。 Workflow开发完成后,执行如下代码发布Workflow至运行态。日志打印显示发布成功,则可前往ModelArts的Workflow页面中查看新发布的工作流。 workflow.release() 图3 发布成功 前往ModelArts控制台去查看新发布的Workflow,进入Workflow详情,单击“配置”进行参数配置。工作流相关的配置执行操作可参考如何使用Workflow。 图4 发布工作流
  • 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节点。
  • 重试/停止/继续运行Workflow节点 重试 当单个节点运行失败时,用户可以通过重试按钮重新执行当前节点,无需重新启动工作流。在当前节点的运行状况页面,单击“重试”。在重试之前您也可以前往权限管理页面修改配置,节点重试启动后新修改的配置信息可以在当前执行中立即生效。 停止 单击指定节点查看详情,可以对运行中的节点进行停止操作。 继续运行 对于单个节点中设置了需要运行中配置的参数时,节点运行会处于“等待操作”状态,用户完成相关数据的配置后,可单击“继续运行”按钮并确认继续执行当前节点。
  • 部分运行Workflow节点 针对大型、复杂的Workflow,为节省重复运行消耗的时间,在运行业务场景时,用户可以选择其中的部分节点作为业务场景运行,工作流在执行时将会按顺序执行部分运行节点。 部分运行Workflow节点,首先在新开发Workflow时,需要预先定义好部分运行场景。具体流程如下: 通过SDK创建工作流时,预先定义好部分运行场景,具体可参考在Workflow中指定仅运行部分节点。 在配置工作流时,打开“部分运行”开关,选择需要执行的部分运行场景,并填写完善相关节点的参数。 图1 部分运行 保存上一步的配置后,单击“启动”按钮即可启动部分运行场景。
  • 查看Workflow工作流运行记录 运行记录是展示某条工作流所有运行状态数据的地方。 在Workflow列表页,单击某条工作流的名称,进入该工作流的详情页面。 在工作流的详情页,左侧区域即为该条工作流的所有运行记录。 图1 查看运行记录 您可以对当前工作流的所有运行记录,进行删除、编辑以及重新运行的操作。 删除:如果该条运行记录不再需要,您可以单击“删除”,在弹出的确认框中单击“确定”即可完成运行记录的删除。 编辑:如果您想对您当前的工作流下的所有运行记录进行区分,您可以单击“编辑”,对每一条运行记录添加相应的标签予以区分。 重新运行:可以单击“重新运行”直接在某条记录上运行该工作流。 您可以对该条工作流的所有运行记录进行筛选和对比。 筛选:该功能支持您对所有运行记录按照“运行状态”和“运行标签”进行筛选。 图2 筛选 对比:针对某条工作流的所有运行记录,按照状态、运行记录、启动时间、运行时长、参数等进行对比。 图3 对比 当单击“启动”运行工作流时,运行记录列表会自动刷新,并更新至最新一条的执行记录数据,且与DAG图和总览数据面板双向联动更新数据。每次启动后都会新增一条运行记录。 用户可以单击Workflow详情页中任一节点查询节点运行状况。包括节点的属性(节点的运行状态、启动时间以及运行时长)、输入位置与输出位置以及参数(数据集的标注任务名称)。 图4 查看节点运行情况 父主题: 管理Workflow
  • MLOps简介 在介绍Workflow之前,先了解MLOps的概念。 MLOps(Machine Learning Operation)是“机器学习”(Machine Learning)和“DevOps”(Development and Operations)的组合实践。机器学习开发流程主要可以定义为四个步骤:项目设计、数据工程、模型构建、部署落地。AI开发并不是一个单向的流水线作业,在开发的过程中,会根据数据和模型结果进行多轮的实验迭代。算法工程师会根据数据特征以及数据的标签做多样化的数据处理以及多种模型优化,以获得在已有的数据集上更好的模型效果。传统的模型交付会直接在实验迭代结束后以输出的模型为终点。当应用上线后,随着时间的推移,会出现模型漂移的问题。新的数据和新的特征在已有的模型上表现会越来越差。在MLOps中,实验迭代的产物将会是一条固化下来的流水线,这条流水线将会包含数据工程、模型算法、训练配置等。用户将会使用这条流水线在持续产生的数据中持续迭代训练,确保这条流水线生产出来的模型始终维持在一个较好的状态。 图1 MLOps MLOps的整条链路需要有一个工具去承载,MLOps打通了算法开发到交付运维的全流程。和以往的开发交付不同,以往的开发与交付过程是分离的,算法工程师开发完的模型,一般都需要交付给下游系统工程师。MLOps和以往的开发交付不同,在这个过程中,算法工程师参与度还是非常高的。企业内部一般都是有一个交付配合的机制。从项目管理角度上需要增加一个AI项目的工作流程机制管理,流程管理不是一个简单的流水线构建管理,它是一个任务管理体系。 这个工具需要具备以下的能力: 流程分析:沉淀行业样例流水线,帮助用户能快速进行AI项目的参考设计,启动快速的AI项目流程设计。 流程定义与重定义:以流水线作为承载项,用户能快速定义AI项目,实现训练+推理上线的工作流设计。 资源分配:支持账号管理机制给流水线中的参与人员(包含开发者和运维人员)分配相应的资源配额与权限,并查看相应的资源使用情况等。 时间安排:围绕子流水线配置相应的子任务安排,并加以通知机制,实现流程执行过程之间配合的运转高效管理。 流程质量与效率测评:提供流水线的任务执行过程视图,增加不同的检查点,如数据评估、模型评估、性能评估等,让AI项目管理者能很方便的查看流水线执行过程的质量与效率。 流程优化:围绕流水线每一次迭代,用户可以自定义输出相关的核心指标,并获取相应的问题数据与原因等,从而基于这些指标,快速决定下一轮迭代的执行优化。
  • 开发态-开发工作流 开发者结合实际业务的需求,通过Workflow提供的Python SDK,将ModelArts的能力封装成流水线中的一个个步骤。对于AI开发者来说是非常熟悉的开发模式,而且灵活度极高。Python SDK主要提供以下能力。 开发构建:使用python代码灵活编排构建工作流。 调测:支持debug以及run两种模式,其中run模式支持节点部分运行、全部运行。 发布:支持将调试后的工作流进行固化,发布至运行态,支持配置运行。 实验记录:实验的持久化及管理。 共享:支持将工作流作为资产发布至,分享给其他用户使用。 如何开发一条工作流请您参考入门教程开发第一条Workflow。
  • 运行态-运行工作流 Workflow提供了可视化的工作流运行方式。使用者不需要了解工作流的内部细节,只需要关注一些简单的参数配置即可启动运行工作流。运行态的工作流来源主要为:通过开发态发布或者从gallery订阅。 运行态工作流的来源为:通过开发态发布,或者通过订阅。 运行态主要提供以下能力。 统一配置管理:管理工作流需要配置的参数及使用的资源等。 操作工作流:启动、停止、重试、复制、删除工作流。 查看运行记录:查看工作流历史运行的参数以及状态记录。
  • Workflow介绍 Workflow(也称工作流,下文中均可使用工作流进行描述)本质是开发者基于实际业务场景开发用于部署模型或应用的流水线工具。在机器学习的场景中,流水线可能会覆盖数据标注、数据处理、模型开发/训练、模型评估、应用开发、应用评估等步骤。 图2 Workflow 区别于传统的机器学习模型构建,开发者可以使用Workflow开发生产流水线。基于MLOps的概念,Workflow会提供运行记录、监控、持续运行等功能。根据角色的分工与概念,产品上将工作流的开发和持续迭代分开。 一条流水线由多个节点组成,Workflow SDK提供了流水线需要覆盖的功能以及功能需要的参数描述。用户在开发流水线的时候,使用SDK对节点以及节点之间串联的关系进行描述。对流水线的开发操作在Workflow中统称为Workflow的开发态。当确定好整条流水线后,开发者可以将流水线固化下来,提供给其他人使用。使用者无需关注流水线中包含什么算法,也不需要关注流水线是如何实现的。使用者只需要关注流水线生产出来的模型或者应用是否符合上线要求,如果不符合,是否需要调整数据和参数重新迭代。这种使用固化下来的流水线的状态,在Workflow中统称为运行态。 总的来说,Workflow有两种形态。 开发态:使用Workflow的Python SDK开发和调测流水线。 运行态:可视化配置运行生产好的流水线。 Workflow基于对当前ModelArts已有能力的编排,基于DevOps原则和实践,应用于AI开发过程中,提升了模型开发与落地效率,更快地进行模型实验和开发,并更快地将模型部署到生产环境。 工作流的开发态和运行态分别实现了不同的功能。
  • 检测规则 卡死检测主要是通过监控作业进程的状态和资源利用率来判定作业是否卡死,会启动一个协程来周期性地监控上述两个指标的变化情况。卡死检测有单实例和全实例两种检测规则,是同时生效的。 单实例检测 进程状态:只要训练作业单实例中的进程IO存在变化,就进入下一个检测周期。如果在多个检测周期内,所有进程IO都没有变化,则进入资源利用率检测阶段。 资源利用率:在作业单实例进程IO没有变化的情况下,采集一定时间段内的GPU利用率或NPU利用率,并根据这段时间内的GPU利用率或NPU利用率的方差和中位数来判断资源使用率是否有变化。如果没有变化,则判定作业卡死。 全实例检测 资源利用率:当作业在一段时间内所有实例的GPU利用率或者NPU利用率都没有变化,则判定作业卡死。 系统预置了卡死检测的环境变量“MA_HANG_DETECT_TIME=30”,表示检测到指标异常并持续30分钟则判定作业卡死。如果需要修改卡死检测时间,则可以修改环境变量“MA_HANG_DETECT_TIME”的值,具体操作指导请参见管理训练容器环境变量。 由于检测规则的局限性,当前卡死检测存在一定的误检率。如果是作业代码本身逻辑(如长时间sleep)导致的卡死,请忽略。 如果对于误检有疑问或者卡死问题无法自行解决,您可以前往ModelArts开发者论坛进行提问或者搜索问题。
  • 触发容错环境检测达到的效果 容错检查正常通过时,会打印检测项目的日志,表示具体涉及的检查项目成功。您可以通过在日志中搜索“item”关键字查看。当容错检查正常通过时,可以减少运行故障上报问题。 容错检查失败时,会打印检查失败的日志。您可以通过在日志中搜索“item”关键字查看失败信息。 如果作业重启次数没有达到设定的次数,则会自动做重新下发作业。您可以通过搜索“error,exiting”关键字查找作业重启失败结束的日志。
  • 开启容错检查 用户可以在创建训练作业时通过设置自动重启的方式开启容错检查。 使用ModelArts Standard控制台的创建训练作业页面设置自动重启: 用户可以在控制台页面通过开关的方式开启自动重启。“自动重启”开关默认不开启,表示不做重新下发作业,也不会启用环境检测。打开开关后,允许设置重启次数为1~128次。 图5 自动重启设置 使用API接口设置容错检查: 用户可以通过API接口的方式开启自动重启。创建训练作业时,在“metadata”字段的“annotations”中传入“fault-tolerance/job-retry-num”字段。 添加“fault-tolerance/job-retry-num”字段,视为开启自动重启,value的范围可以设置为1~128的整数。value值表示最大允许重新下发作业的次数。如果不传入则默认为0,表示不做重新下发作业,也不会启用环境检测。 图6 设置API
  • 异常处理 Clone仓库失败。可能是网络原因问题。可以在JupyterLab的Terminal中通过执行git clone https://github.com/jupyterlab/extension-examples.git测试网络连通情况。 图6 Clone仓库失败 如果克隆时遇到Notebook当前目录下已有该仓库,系统给出提示仓库名称重复,此时可以单击“覆盖”继续克隆仓库,也可以单击取消。
  • 上传本地超大文件(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的文件直接上传,并展示文件大小、上传进度及速度等详细信息。 对于大小超过100MB不超过50GB的文件可以使用OBS中转,系统先将文件上传OBS(对象桶或并行文件系统),然后从OBS下载到Notebook,上传完成后,会将文件从OBS中删除。 50GB以上的文件上传通过调用ModelArts SDK或者Moxing完成。 对于Notebook当前目录下已经有同文件名称的文件,可以覆盖继续上传,也可以取消。 支持10个文件同时上传,其余文件显示“等待上传”。不支持上传文件夹,可以将文件夹压缩成压缩包上传至Notebook后, 在Terminal中解压压缩包。 unzip xxx.zip #在xxx.zip压缩包所在路径直接解压 解压命令的更多使用说明可以在主流搜索引擎中查找Linux解压命令操作。 多个文件同时上传时,JupyterLab窗口最下面会显示上传文件总数和已上传文件数。
  • 上传本地大文件(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解压命令操作。
  • 动态扩容EVS有什么限制 Notebook实例的存储配置采用的是云硬盘EVS。 图1 创建Notebook实例时选择云硬盘EVS存储 单次最大可以扩容100GB,扩容后的总容量不超过4096GB。 云硬盘EVS存储容量最大支持4096GB,达到4096GB时,不允许再扩容。 实例停止后,扩容后的容量仍然有效。计费也是按照扩容后的云硬盘EVS容量进行计费。 云硬盘EVS只要使用就会计费,请在停止Notebook实例后,确认不使用就及时删除数据,释放资源,避免产生费用。
  • 修改标注信息 当数据完成标注后,您还可以进入已标注页签,对已标注的数据进行修改。 在数据标注详情页面,单击“已标注”页签,然后在图片列表中选中待修改的图片,单击图片跳转到标注页面,在右侧标签信息区域中单击此图片已添加的标注信息。 修改标签:“标注”区域中,单击编辑图标,在弹出框中输入正确的标签名或标签颜色,然后单击完成修改。也可以单击标签,在图片标注区域,调整标注框的位置和大小,完成调整后,单击其他标签即可保存修改。 修改图片标注信息:在图片展示区,显示物体边缘,可单击蓝色圆点,将标注框调整至物体边缘。 删除标签:在“标注”区域中,单击删除图标即可删除此图片中的标签。图片的标签全部删除后,该图片会重新回到“未标注”页签。 标注信息修改后,单击页面左上角的“返回数据标注预览”离开标注页面,在弹出对话框中单击“确定”保存修改。 图6 编辑标注信息
  • 删除数据 通过数据删除操作,可将需要丢弃的数据快速删除。 在“全部”、“未标注”或“已标注”页面中,依次选中需要删除的内容,或者选择“选择当前页”选中该页面所有内容,然后单击“删除”。在弹出的对话框中,根据实际情况选择是否勾选“同时删除OBS源文件”,确认信息无误后,单击“确定”完成删除操作。 图10 删除图片 其中,被选中的内容,其左上角将显示为勾选状态。如果当前页面无选中内容时,“删除”按钮为灰色,无法执行删除操作。 如果勾选了“同时删除OBS源文件”,删除图片操作将删除对应OBS目录下存储的图片,此操作可能会影响已使用此源文件的其他数据集或数据集版本,有可能导致展示异常或训练/推理异常。删除后,数据将无法恢复,请谨慎操作。
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全