华为云用户手册

  • 使用ma-cli dli-job stop命令停止 DLI Spark作业 执行ma-cli dli-job stop命令停止DLI Spark作业。 $ ma-cli dli-job stop -h Usage: ma-cli dli-job stop [OPTIONS] Stop DLI spark job by job id. Example: Stop training job by job id ma-cli dli-job stop --job-id ${job_id} Options: -i, --job-id TEXT Get DLI spark job event by job id. [required] -y, --yes Confirm stop operation. -C, --config-file TEXT Configure file path for authorization. -D, --debug Debug Mode. Shows full stack trace when error occurs. -P, --profile TEXT CLI connection profile to use. The default profile is "DEFAULT". -H, -h, --help Show this message and exit. 表8 参数说明 参数名 参数类型 是否必选 参数说明 -i / --job-id String 是 DLI Spark作业ID。 -y / --yes Bool 否 强制关闭指定DLI Spark作业。 示例 ma-cli dli-job stop -i ${your_job_id}
  • 使用ma-cli dli-job get-log命令查询DLI Spark运行日志 执行ma-cli dli-job get-log命令查询DLI Spark作业后台的日志。 $ ma-cli dli-job get-log -h Usage: ma-cli dli-job get-log [OPTIONS] Get DLI spark job log details. Example: # Get job log by job id ma-cli dli-job get-log --job-id ${job_id} Options: -i, --job-id TEXT Get DLI spark job details by job id. [required] -C, --config-file TEXT Configure file path for authorization. -D, --debug Debug Mode. Shows full stack trace when error occurs. -P, --profile TEXT CLI connection profile to use. The default profile is "DEFAULT". -H, -h, --help Show this message and exit. 表4 参数说明 参数名 参数类型 是否必选 参数说明 -i / --job-id String 是 查询指定DLI Spark作业ID的任务日志。 示例:查询指定作业ID的DLI Spark作业运行日志。 ma-cli dli-job get-log --job-id ${your_job_id}
  • 使用ma-cli dli-job get-resource命令查询DLI分组资源 执行ma-cli dli-job get-resource命令获取DLI资源详细信息,如资源名称,资源类型等。 $ ma-cli dli-job get-resource -h Usage: ma-cli dli-job get-resource [OPTIONS] Get DLI resource info. Example: # Get DLI resource details by resource name ma-cli dli-job get-resource --resource-name ${resource_name} Options: -n, --resource-name TEXT Get DLI resource details by resource name. -k, --kind [jar|pyFile|file|modelFile] DLI resources type. -g, --group TEXT Get DLI resources by group. -tags, --tags TEXT Get DLI resources by tags. -C, --config-file TEXT Configure file path for authorization. -D, --debug Debug Mode. Shows full stack trace when error occurs. -P, --profile TEXT CLI connection profile to use. The default profile is "DEFAULT". -H, -h, --help Show this message and exit. 表6 参数说明 参数名 参数类型 是否必选 参数说明 -n / --resource-name String 否 按DLI分组资源名称查询DLI资源详细信息。 -k / --kind String 否 按DLI分组资源类型查询DLI资源详细信息,支持jar、pyFile、file和modelFile。 -g / --group String 否 按DLI分组资源组名查询DLI资源组详细信息。 -tags / --tags String 否 通过DLI分组资源tags获取DLI资源详细信息。 示例:查询所有DLI分组资源信息。 ma-cli dli-job get-resource
  • 步骤二:打通VPC(可选) 通过打通VPC,可以方便用户跨VPC使用资源,提升资源利用率。 在“网络”页签,单击网络列表中某个网络操作列的“打通VPC”。 图3 打通VPC 在打通VPC弹框中,打开“打通VPC”开关,在下拉框中选择可用的VPC和子网。 需要打通的对端网络不能和当前网段重叠。 图4 打通VPC参数选择 如果没有VPC可选,可以单击右侧的“创建虚拟私有云”,跳转到网络控制台,申请创建虚拟私有云。 如果没有子网可选,可以单击右侧的“创建子网”,跳转到网络控制台,创建可用的子网。 支持1个VPC下多个子网的打通,如果VPC下有多个子网,会显示“+”,单击“+”即可添加子网(上限10个)。 如果需要使用打通VPC的方式实现专属资源池访问公网,由于要访问的公网地址不确定,一般是建议用户在VPC中创建SNAT。此场景下,在打通VPC后,专属资源池中作业访问公网地址,默认不能转发到用户VPC的SNAT,需要提交工单联系技术支持在专属资源池VPC的路由中添加指向对等连接的缺省路由。当您开启默认路由后,在打通VPC时,会将ModelArts网络0.0.0.0/0路由作为默认路由,此时无需提交工单添加缺省路由即可完成网络配置。
  • 常见问题 创建专属资源池时,能选到规格但最终创建时发生报错,提示无可用资源? 由于专属资源的可选规格是动态监测的,因此在极少数情况下会出现,规格在购买界面可以被选择,但由于没有及时支付和创建资源池,导致该规格售罄创建失败。 建议您在创建界面更换规格重新创建资源池。 为什么无法使用资源池节点上的全部CPU资源? 由于资源池节点上会安装系统、插件等内容,因此不能完全使用所有资源。例如:资源池节点是8U,节点分配给系统组件部分CPU,可用的资源会小于8U。 建议您在启动任务前,在该资源池的详情页中,单击“节点”页签,查看实际可用的CPU资源。
  • 使用案例 主要包含七种场景的用例: 使用订阅自AI Gallery的算法 使用算法管理中的算法 使用自定义算法(代码目录+启动文件+官方镜像) 使用自定义算法(代码目录+脚本命令+ 自定义镜像 ) 基于数据集版本发布节点构建作业类型节点 作业类型节点结合可视化能力 输入使用DataSelector对象,支持选择OBS或者数据集 使用订阅自AI Gallery的算法 from modelarts import workflow as wf # 构建一个OutputStorage对象,对训练输出目录做统一管理 storage = wf.data.OutputStorage(name="storage_name", title="title_info", description="description_info") # name字段必填,title, description可选填 # 定义输入的数据集对象 dataset = wf.data.DatasetPlaceholder(name="input_dataset") # 通过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=[ wf.AlgorithmParameters( name="parameter_name", value=wf.Placeholder(name="parameter_name", placeholder_type=wf.PlaceholderType.STR, default="fake_value",description="description_info") ) # 算法超参的值使用Placeholder对象来表示,支持int, bool, float, str四种类型 ] ), # 训练使用的算法对象,示例中使用AIGallery订阅的算法;部分算法超参的值如果无需修改,则在parameters字段中可以不填写,系统自动填充相关超参值 inputs=wf.steps.JobInput(name="data_url", data=dataset), # JobStep的输入在运行时配置;data字段也可使用wf.data.Dataset(dataset_name="fake_dataset_name", version_name="fake_version_name")表示 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="训练资源规格") ) )# 训练资源规格信息 ) workflow = wf.Workflow( name="job-step-demo", desc="this is a demo workflow", steps=[job_step], storages=[storage] ) 使用算法管理中的算法 from modelarts import workflow as wf # 构建一个OutputStorage对象,对训练输出目录做统一管理 storage = wf.data.OutputStorage(name="storage_name", title="title_info", description="description_info") # name字段必填,title, description可选填 # 定义输入的数据集对象 dataset = wf.data.DatasetPlaceholder(name="input_dataset") # 通过JobStep来定义一个训练节点,输入使用数据集,并将训练结果输出到OBS job_step = wf.steps.JobStep( name="training_job", # 训练节点的名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符),一个Workflow里的两个step名称不能重复 title="图像分类训练", # 标题信息,不填默认使用name algorithm=wf.Algorithm( algorithm_id="algorithm_id", # 算法ID parameters=[ wf.AlgorithmParameters( name="parameter_name", value=wf.Placeholder(name="parameter_name", placeholder_type=wf.PlaceholderType.STR, default="fake_value",description="description_info") ) # 算法超参的值使用Placeholder对象来表示,支持int, bool, float, str四种类型 ] ), # 训练使用的算法对象,示例中的算法来源于算法管理;部分算法超参的值如果无需修改,则在parameters字段中可以不填写,系统自动填充相关超参值 inputs=wf.steps.JobInput(name="data_url", data=dataset), # JobStep的输入在运行时配置;data字段也可使用wf.data.Dataset(dataset_name="fake_dataset_name", version_name="fake_version_name")表示 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="训练资源规格") ) )# 训练资源规格信息 ) workflow = wf.Workflow( name="job-step-demo", desc="this is a demo workflow", steps=[job_step], storages=[storage] ) 使用自定义算法(代码目录+启动文件+官方镜像) from modelarts import workflow as wf # 构建一个OutputStorage对象,对训练输出目录做统一管理 storage = wf.data.OutputStorage(name="storage_name", title="title_info", description="description_info") # name字段必填,title, description可选填 # 定义输入的数据集对象 dataset = wf.data.DatasetPlaceholder(name="input_dataset") # 通过JobStep来定义一个训练节点,输入使用数据集,并将训练结果输出到OBS job_step = wf.steps.JobStep( name="training_job", # 训练节点的名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符),一个Workflow里的两个step名称不能重复 title="图像分类训练", # 标题信息,不填默认使用name algorithm=wf.BaseAlgorithm( code_dir="fake_code_dir", # 代码目录存储的路径 boot_file="fake_boot_file", # 启动文件存储路径,需要在代码目录下 engine=wf.steps.JobEngine(engine_name="fake_engine_name", engine_version="fake_engine_version"), # 官方镜像的名称以及版本信息 parameters=[ wf.AlgorithmParameters( name="parameter_name", value=wf.Placeholder(name="parameter_name", placeholder_type=wf.PlaceholderType.STR, default="fake_value",description="description_info") ) # 算法超参的值使用Placeholder对象来表示,支持int, bool, float, str四种类型 ] ), # 自定义算法使用代码目录+启动文件+官方镜像的方式实现 inputs=wf.steps.JobInput(name="data_url", data=dataset), # JobStep的输入在运行时配置;data字段也可使用wf.data.Dataset(dataset_name="fake_dataset_name", version_name="fake_version_name")表示 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="训练资源规格") ) )# 训练资源规格信息 ) workflow = wf.Workflow( name="job-step-demo", desc="this is a demo workflow", steps=[job_step], storages=[storage] ) 使用自定义算法(代码目录+脚本命令+自定义镜像) from modelarts import workflow as wf # 构建一个OutputStorage对象,对训练输出目录做统一管理 storage = wf.data.OutputStorage(name="storage_name", title="title_info", description="description_info") # name字段必填,title, description可选填 # 定义输入的数据集对象 dataset = wf.data.DatasetPlaceholder(name="input_dataset") # 通过JobStep来定义一个训练节点,输入使用数据集,并将训练结果输出到OBS job_step = wf.steps.JobStep( name="training_job", # 训练节点的名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符),一个Workflow里的两个step名称不能重复 title="图像分类训练", # 标题信息,不填默认使用name algorithm=wf.BaseAlgorithm( code_dir="fake_code_dir", # 代码目录存储的路径 command="fake_command", # 执行的脚本命令 engine=wf.steps.JobEngine(image_url="fake_image_url"), # 自定义镜像的url,格式为:组织名/镜像名称:版本号,不需要携带相应的 域名 地址;如果image_url需要设置为运行态可配置,则使用如下方式:image_url=wf.Placeholder(name="image_url", placeholder_type=wf.PlaceholderType.STR, placeholder_format="swr", description="自定义镜像") parameters=[ wf.AlgorithmParameters( name="parameter_name", value=wf.Placeholder(name="parameter_name", placeholder_type=wf.PlaceholderType.STR, default="fake_value",description="description_info") ) # 算法超参的值使用Placeholder对象来表示,支持int, bool, float, str四种类型 ] ), 自定义算法使用代码目录+脚本命令+自定义镜像的方式实现 inputs=wf.steps.JobInput(name="data_url", data=dataset), # JobStep的输入在运行时配置;data字段也可使用wf.data.Dataset(dataset_name="fake_dataset_name", version_name="fake_version_name")表示 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="训练资源规格") ) )# 训练资源规格信息 ) workflow = wf.Workflow( name="job-step-demo", desc="this is a demo workflow", steps=[job_step], storages=[storage] ) 上述四种方式使用数据集对象作为输入,如果您需要使用OBS路径作为输入时,只需将JobInput中的data数据替换为data=wf.data.OBSPlaceholder(name="obs_placeholder_name", object_type="directory")或者data=wf.data.OBSPath(obs_path="fake_obs_path")即可。 此外,在构建工作流时就指定好数据集对象或者OBS路径的方式可以减少配置操作,方便您在开发态进行调试。但是对于发布到运行态或者gallery的工作流,更推荐的方式是采用数据占位符的方式进行编写,您可以在工作流启动之前对参数进行配置,自由度更高。 基于数据集版本发布节点构建作业类型节点 使用场景:数据集版本发布节点的输出作为作业类型节点的输入。 from modelarts import workflow as wf # 定义数据集对象 dataset = wf.data.DatasetPlaceholder(name="input_dataset") # 定义训练验证切分比参数 train_ration = wf.Placeholder(name="placeholder_name", placeholder_type=wf.PlaceholderType.STR, default="0.8") release_version_step = wf.steps.ReleaseDatasetStep( name="release_dataset", # 数据集发布节点的名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符),一个Workflow里的两个step名称不能重复 title="数据集版本发布", # 标题信息,不填默认使用name值 inputs=wf.steps.ReleaseDatasetInput(name="input_name", data=dataset), # ReleaseDatasetStep的输入,数据集对象在运行时配置;data字段也可使用wf.data.Dataset(dataset_name="dataset_name")表示 outputs=wf.steps.ReleaseDatasetOutput( name="output_name", dataset_version_config=wf.data.DatasetVersionConfig( label_task_type=wf.data.LabelTaskTypeEnum.IMAGE_CLASSIFICATION, # 数据集发布版本时需要指定标注任务的类型 train_evaluate_sample_ratio=train_ration # 数据集的训练验证切分比 ) ) # ReleaseDatasetStep的输出 ) # 构建一个OutputStorage对象,对训练输出目录做统一管理 storage = wf.data.OutputStorage(name="storage_name", title="title_info", description="description_info") # name字段必填,title, description可选填 # 通过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=[ wf.AlgorithmParameters( name="parameter_name", value=wf.Placeholder(name="parameter_name", placeholder_type=wf.PlaceholderType.STR, default="fake_value",description="description_info") ) # 算法超参的值使用Placeholder对象来表示,支持int, bool, float, str四种类型 ] ), # 训练使用的算法对象,示例中使用AI Gallery订阅的算法;部分算法超参的值如果无需修改,则在parameters字段中可以不填写,系统自动填充相关超参值 inputs=wf.steps.JobInput(name="data_url", data=release_version_step.outputs["output_name"].as_input()), # 使用数据集版本发布节点的输出作为JobStep的输入 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=release_version_step # 依赖的数据集版本发布节点对象 ) # release_version_step是wf.steps.ReleaseDatasetStep的实例对象,output_name是wf.steps.ReleaseDatasetOutput的name字段值 workflow = wf.Workflow( name="job-step-demo", desc="this is a demo workflow", steps=[release_version_step, job_step], storages=[storage] ) 作业类型节点结合可视化能力 节点可视化特性将用户在使用Workflow时产生的一些衡量指标进行一个可视化的展示,支持数据的实时可视化,并且允许独立呈现可视化外挂节点。形态上基于作业类型节点原有的使用方式,新增一个针对metrics信息展示的输出,通过MetricsConfig对象进行配置。 表16 MetricsConfig 属性 描述 是否必填 数据类型 metric_files metrics输出文件列表 是 list,列表内元素支持(str、Placeholder、Storage) realtime_visualization 输出的metrics信息是否需要实时展示 否 bool,默认为False visualization 是否呈现独立的可视化节点 否 bool,默认为True 对于输出的metrics文件,数据内容必须为标准的json数据,大小限制为1M,并且与当前支持的几种数据格式保持一致: 键值对类型的数据 [ { "key": "loss", "title": "loss", "type": "float", "data": { "value": 1.2 } }, { "key": "accuracy", "title": "accuracy", "type": "float", "data": { "value": 1.6 } } ] 折线图数据(type是line chart) [ { "key": "metric", "title": "metric", "type": "line chart", "data": { "x_axis": [ { "title": "step/epoch", "value": [ 1, 2, 3 ] } ], "y_axis": [ { "title": "value", "value": [ 0.5, 0.4, 0.3 ] } ] } } ] 柱状图数据(type是histogram) [ { "key": "metric", "title": "metric", "type": "histogram", "data": { "x_axis": [ { "title": "step/epoch", "value": [ 1, 2, 3 ] } ], "y_axis": [ { "title": "value", "value": [ 0.5, 0.4, 0.3 ] } ] } } ] 混淆矩阵 [ { "key": "confusion_matrix", "title": "confusion_matrix", "type": "table", "data": { "cell_value": [ [ 1, 2 ], [ 2, 3 ] ], "col_labels": { "title": "labels", "value": [ "daisy", "dandelion" ] }, "row_labels": { "title": "predictions", "value": [ "daisy", "dandelion" ] } } } ] 一维表格 [ { "key": "Application Evaluation Results", "title": "Application Evaluation Results", "type": "one-dimensional-table", "data": { "cell_value": [ [ 10, 2, 0.5 ] ], "labels": [ "samples", "maxResTine", "p99" ] } } ] 使用案例: from modelarts import workflow as wf # 构建一个Storage对象,对训练输出目录做统一管理 storage = wf.data.Storage(name="storage_name", title="title_info", description="description_info", with_execution_id=True, create_dir=True) # name字段必填,title, description可选填 # 定义输入的数据集对象 dataset = wf.data.DatasetPlaceholder(name="input_dataset") # 通过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=[ wf.AlgorithmParameters( name="parameter_name", value=wf.Placeholder(name="parameter_name", placeholder_type=wf.PlaceholderType.STR, default="fake_value",description="description_info") ) # 算法超参的值使用Placeholder对象来表示,支持int, bool, float, str四种类型 ] ), # 训练使用的算法对象,示例中使用AI Gallery订阅的算法;部分算法超参的值如果无需修改,则在parameters字段中可以不填写,系统自动填充相关超参值 inputs=wf.steps.JobInput(name="data_url", data=dataset), # JobStep的输入在运行时配置;data字段也可使用wf.data.Dataset(dataset_name="fake_dataset_name", version_name="fake_version_name")表示 outputs=[ wf.steps.JobOutput(name="train_url", obs_config=wf.data.OBSOutputConfig(obs_path=storage.join("directory_path"))),# JobStep的输出 wf.steps.JobOutput(name="metrics_output", metrics_config=wf.data.MetricsConfig(metric_files=storage.join("directory_path/metrics.json", create_dir=False))) # 相关metrics信息由作业的脚本代码自行输出到配置的路径下 ], spec=wf.steps.JobSpec( resource=wf.steps.JobResource( flavor=wf.Placeholder(name="train_flavor", placeholder_type=wf.PlaceholderType.JSON, description="训练资源规格") ) )# 训练资源规格信息 ) workflow = wf.Workflow( name="job-step-demo", desc="this is a demo workflow", steps=[job_step], storages=[storage] ) Workflow不会自动获取训练输出的指标信息,要求用户自行在算法代码中获取指标信息并且按照指定的数据格式构造出metrics.json文件,自行上传到MetricsConfig中配置的OBS路径下,Workflow只进行数据的读取以及渲染展示。 输入使用DataSelector对象,支持选择OBS或者数据集 该方式主要用于输入支持可选择的场景,使用DataSelector对象作为输入时,用户在页面配置时可自由选择数据集对象或者OBS对象作为训练的输入,代码示例如下: from modelarts import workflow as wf # 构建一个OutputStorage对象,对训练输出目录做统一管理 storage = wf.data.OutputStorage(name="storage_name", title="title_info", description="description_info") # name字段必填,title, description可选填 # 定义DataSelector对象 data_selector = wf.data.DataSelector(name="input_data", data_type_list=["dataset", "obs"]) # 通过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=[ wf.AlgorithmParameters( name="parameter_name", value=wf.Placeholder(name="parameter_name", placeholder_type=wf.PlaceholderType.STR, default="fake_value",description="description_info") ) # 算法超参的值使用Placeholder对象来表示,支持int, bool, float, str四种类型 ] ), # 训练使用的算法对象,示例中使用AIGallery订阅的算法;部分算法超参的值如果无需修改,则在parameters字段中可以不填写,系统自动填充相关超参值 inputs=wf.steps.JobInput(name="data_url", data=data_selector), # JobStep的输入在运行时配置,可自由选择OBS或者数据集作为输入 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="训练资源规格") ) )# 训练资源规格信息 ) workflow = wf.Workflow( name="job-step-demo", desc="this is a demo workflow", steps=[job_step], storages=[storage] ) 使用DataSelector作为输入时,需要用户自行保证算法的输入同时支持数据集或者OBS。
  • 资源规格查询 您在创建作业类型节点之前可以通过以下操作来获取该账号所支持的训练资源规格列表以及引擎规格列表: 导包 from modelarts.session import Session from modelarts.estimatorV2 import TrainingJob from modelarts.workflow.client.job_client import JobClient session初始化 # 如果您在本地IDEA环境中开发工作流,则Session初始化使用如下方式 # 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; # 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 __AK = os.environ["HUAWEICLOUD_SDK_AK"] __SK = os.environ["HUAWEICLOUD_SDK_SK"] # 如果进行了加密还需要进行解密操作 session = Session( access_key=__AK, # 账号的AK信息 secret_key=__SK, # 账号的SK信息 region_name="***", # 账号所属的region project_id="***" ,# 账号的项目ID ) # 如果您在Notebook环境中开发工作流,则Session初始化使用如下方式 session = Session() 公共池查询 # 公共资源池规格列表查询 spec_list = TrainingJob(session).get_train_instance_types(session) # 返回的类型为list,可按需打印查看 print(spec_list) 专属池查询 # 运行中的专属资源池列表查询 pool_list = JobClient(session).get_pool_list() # 返回专属资源池的详情列表 pool_id_list = JobClient(session).get_pool_id_list() # 返回专属资源池ID列表 专属资源池规格ID列表如下,根据所选资源池的实际规格自行选择: 1. modelarts.pool.visual.xlarge 对应1卡 2. modelarts.pool.visual.2xlarge 对应2卡 3. modelarts.pool.visual.4xlarge 对应4卡 4. modelarts.pool.visual.8xlarge 对应8卡 引擎规格查询 # 引擎规格查询 engine_dict = TrainingJob(session).get_engine_list(session) # 返回的类型为dict,可按需打印查看 print(engine_dict)
  • 属性总览 您可以使用JobStep来构建作业类型节点,JobStep结构如下 表1 JobStep 属性 描述 是否必填 数据类型 name 作业节点的名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符),一个Workflow里的两个step名称不能重复 是 str algorithm 算法对象 是 BaseAlgorithm Algorithm AIGalleryAlgorithm spec 作业使用的资源规格相关配置 是 JobSpec inputs 作业节点的输入列表 是 JobInput或者JobInput的列表 outputs 作业节点的输出列表 是 JobOutput或者JobOutput的列表 title title信息,主要用于前端的名称展示 否 str description 作业节点的描述信息 否 str policy 节点执行的policy 否 StepPolicy depend_steps 依赖的节点列表 否 Step或者Step的列表 表2 JobInput 属性 描述 是否必填 数据类型 name 作业类型节点的输入名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符)。同一个Step的输入名称不能重复 是 str data 作业类型节点的输入数据对象 是 数据集或OBS相关对象,当前仅支持Dataset、DatasetPlaceholder、DatasetConsumption、OBSPath、OBSConsumption、OBSPlaceholder、DataConsumptionSelector 表3 JobOutput 属性 描述 是否必填 数据类型 name 作业类型节点的输出名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符)。同一个Step的输出名称不能重复 是 str obs_config 输出的OBS相关配置 否 OBSOutputConfig model_config 输出的模型相关配置 否 ModelConfig metrics_config metrics相关配置 否 MetricsConfig 表4 OBSOutputConfig 属性 描述 是否必填 数据类型 obs_path 已存在的OBS目录 是 str、Placeholder、Storage metric_file 存储metric信息的文件名称 否 str、Placeholder 表5 BaseAlgorithm 属性 描述 是否必填 数据类型 id 算法管理的算法ID 否 str subscription_id 订阅算法的订阅ID 否 str item_version_id 订阅算法的版本号 否 str code_dir 代码目录 否 str、Placeholder、Storage boot_file 启动文件 否 str、Placeholder、Storage command 启动命令 否 str、Placeholder parameters 算法超参 否 AlgorithmParameters的列表 engine 作业使用的镜像信息 否 JobEngine environments 环境变量 否 dict 表6 Algorithm 属性 描述 是否必填 数据类型 algorithm_id 算法管理的算法ID 是 str parameters 算法超参 否 Algorithm Parameters的列表 表7 AIGalleryAlgorithm 属性 描述 是否必填 数据类型 subscription_id 订阅算法的订阅ID 是 str item_version_id 订阅算法的版本号 是 str parameters 算法超参 否 Algorithm Parameters的列表 表8 AlgorithmParameters 属性 描述 是否必填 数据类型 name 算法超参的名称 是 str value 算法超参的值 是 int、bool、float、str、Placeholder、Storage 表9 JobEngine 属性 描述 是否必填 数据类型 engine_id 镜像ID 否 str、Placeholder engine_name 镜像名称 否 str、Placeholder engine_version 镜像版本 否 str、Placeholder image_url 镜像url 否 str、Placeholder 表10 JobSpec 属性 描述 是否必填 数据类型 resource 资源信息 是 JobResource log_export_path 日志输出路径 否 LogExportPath schedule_policy 作业调度配置策略 否 SchedulePolicy volumes 作业挂载的文件系统信息 否 list[Volume] 表11 JobResource 属性 描述 是否必填 数据类型 flavor 资源规格 是 Placeholder node_count 节点个数,默认为1,多节点表示支持分布式 否 int、Placeholder 表12 SchedulePolicy 属性 描述 是否必填 数据类型 priority 作业调度的优先级,仅支持配置为1、2、3,分别对应低、中、高三种优先级 是 int、Placeholder 表13 Volume 属性 描述 是否必填 数据类型 nfs NFS文件系统对象,在一个Volume对象中,nfs、pacific、pfs同时只能配置一个 否 NFS pacific pacific文件系统对象,在一个Volume对象中,nfs、pacific、pfs同时只能配置一个 否 Placeholder pfs OBS并行文件系统对象,在一个Volume对象中,nfs、pacific、pfs同时只能配置一个 否 PFS、Placeholder 表14 NFS 属性 描述 是否必填 数据类型 nfs_server_path NFS文件系统的服务地址 是 str、Placeholder local_path 挂载到容器里面的路径 是 str、Placeholder read_only 是否只读的方式挂载 否 bool、Placeholder 表15 PFS 属性 描述 是否必填 数据类型 pfs_path 并行文件系统的路径 是 str、Placeholder local_path 挂载到容器里面的路径 是 str、Placeholder
  • 机器学习类型的模型配置文件示例 以下代码以XGBoost为例。 模型输入: { "req_data": [ { "sepal_length": 5, "sepal_width": 3.3, "petal_length": 1.4, "petal_width": 0.2 }, { "sepal_length": 5, "sepal_width": 2, "petal_length": 3.5, "petal_width": 1 }, { "sepal_length": 6, "sepal_width": 2.2, "petal_length": 5, "petal_width": 1.5 } ] } 模型输出: { "resp_data": [ { "predict_result": "Iris-setosa" }, { "predict_result": "Iris-versicolor" } ] } 配置文件: { "model_type": "XGBoost", "model_algorithm": "xgboost_iris_test", "runtime": "python2.7", "metrics": { "f1": 0.345294, "accuracy": 0.462963, "precision": 0.338977, "recall": 0.351852 }, "apis": [ { "url": "/", "method": "post", "request": { "Content-type": "application/json", "data": { "type": "object", "properties": { "req_data": { "items": [ { "type": "object", "properties": {} } ], "type": "array" } } } }, "response": { "Content-type": "applicaton/json", "data": { "type": "object", "properties": { "resp_data": { "type": "array", "items": [ { "type": "object", "properties": { "predict_result": {} } } ] } } } } } ] }
  • 使用自定义依赖包的模型配置文件示例 如下示例中,定义了1.16.4版本的numpy的依赖环境。 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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 { "model_algorithm": "image_classification", "model_type": "TensorFlow", "runtime": "python3.6", "apis": [ { "url": "/", "method": "post", "request": { "Content-type": "multipart/form-data", "data": { "type": "object", "properties": { "images": { "type": "file" } } } }, "response": { "Content-type": "applicaton/json", "data": { "type": "object", "properties": { "mnist_result": { "type": "array", "item": [ { "type": "string" } ] } } } } } ], "metrics": { "f1": 0.124555, "recall": 0.171875, "precision": 0.00234938928519385, "accuracy": 0.00746268656716417 }, "dependencies": [ { "installer": "pip", "packages": [ { "restraint": "EXACT", "package_version": "1.16.4", "package_name": "numpy" } ] } ] }
  • 图像分类模型配置文件示例 如下代码以TensorFlow引擎为例,您可以根据实际使用的引擎类型修改model_type参数后使用。 模型输入 key:images value:图片文件 模型输出 1 2 3 4 5 6 7 { "predicted_label": "flower", "scores": [ ["rose", 0.99], ["begonia", 0.01] ] } 配置文件 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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 { "model_type": "TensorFlow", "model_algorithm": "image_classification", "metrics": { "f1": 0.345294, "accuracy": 0.462963, "precision": 0.338977, "recall": 0.351852 }, "apis": [{ "url": "/", "method": "post", "request": { "Content-type": "multipart/form-data", "data": { "type": "object", "properties": { "images": { "type": "file" } } } }, "response": { "Content-type": "application/json", "data": { "type": "object", "properties": { "predicted_label": { "type": "string" }, "scores": { "type": "array", "items": [{ "type": "array", "minItems": 2, "maxItems": 2, "items": [ { "type": "string" }, { "type": "number" } ] }] } } } } }], "dependencies": [{ "installer": "pip", "packages": [{ "restraint": "ATLEAST", "package_version": "1.15.0", "package_name": "numpy" }, { "restraint": "", "package_version": "", "package_name": "Pillow" } ] }] } 如下代码以MindSpore引擎为例,您可以根据实际使用的引擎类型修改model_type参数后使用。 模型输入 key:images value:图片文件 模型输出 1 "[[-2.404526 -3.0476532 -1.9888215 0.45013925 -1.7018927 0.40332815\n -7.1861157 11.290332 -1.5861531 5.7887416 ]]" 配置文件 { "model_algorithm": "image_classification", "model_type": "MindSpore", "metrics": { "f1": 0.124555, "recall": 0.171875, "precision": 0.0023493892851938493, "accuracy": 0.00746268656716417 }, "apis": [{ "url": "/", "method": "post", "request": { "Content-type": "multipart/form-data", "data": { "type": "object", "properties": { "images": { "type": "file" } } } }, "response": { "Content-type": "applicaton/json", "data": { "type": "object", "properties": { "mnist_result": { "type": "array", "item": [{ "type": "string" }] } } } } } ], "dependencies": [] }
  • 预测分析模型配置文件示例 如下代码以TensorFlow引擎为例,您可以根据实际使用的引擎类型修改model_type参数后使用。 模型输入 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 { "data": { "req_data": [ { "buying_price": "high", "maint_price": "high", "doors": "2", "persons": "2", "lug_boot": "small", "safety": "low", "acceptability": "acc" }, { "buying_price": "high", "maint_price": "high", "doors": "2", "persons": "2", "lug_boot": "small", "safety": "low", "acceptability": "acc" } ] } } 模型输出 1 2 3 4 5 6 7 8 9 10 11 12 { "data": { "resp_data": [ { "predict_result": "unacc" }, { "predict_result": "unacc" } ] } } 配置文件 代码中request结构和response结构中的data参数是json schema数据结构。data/properties里面的内容对应“模型输入”和“模型输出”。 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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 { "model_type": "TensorFlow", "model_algorithm": "predict_analysis", "metrics": { "f1": 0.345294, "accuracy": 0.462963, "precision": 0.338977, "recall": 0.351852 }, "apis": [ { "url": "/", "method": "post", "request": { "Content-type": "application/json", "data": { "type": "object", "properties": { "data": { "type": "object", "properties": { "req_data": { "items": [ { "type": "object", "properties": {} } ], "type": "array" } } } } } }, "response": { "Content-type": "application/json", "data": { "type": "object", "properties": { "data": { "type": "object", "properties": { "resp_data": { "type": "array", "items": [ { "type": "object", "properties": {} } ] } } } } } } } ], "dependencies": [ { "installer": "pip", "packages": [ { "restraint": "EXACT", "package_version": "1.15.0", "package_name": "numpy" }, { "restraint": "EXACT", "package_version": "5.2.0", "package_name": "Pillow" } ] } ] }
  • 自定义镜像类型的模型配置文件示例 模型输入和输出与目标检测模型配置文件示例类似。 模型预测输入为图片类型时,request请求示例如下: 该示例表示模型预测接收一个参数名为images、参数类型为file的预测请求,在推理界面会显示文件上传按钮,以文件形式进行预测。 1 2 3 4 5 6 7 8 9 10 11 { "Content-type": "multipart/form-data", "data": { "type": "object", "properties": { "images": { "type": "file" } } } } 模型预测输入为json数据类型时,request请求示例如下: 该示例表示模型预测接收json请求体,只有一个参数名为input、参数类型为string的预测请求,在推理界面会显示文本输入框,用于填写预测请求。 1 2 3 4 5 6 7 8 9 10 11 { "Content-type": "application/json", "data": { "type": "object", "properties": { "input": { "type": "string" } } } } 完整请求示例如下: 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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 { "model_algorithm": "image_classification", "model_type": "Image", "metrics": { "f1": 0.345294, "accuracy": 0.462963, "precision": 0.338977, "recall": 0.351852 }, "apis": [{ "url": "/", "method": "post", "request": { "Content-type": "multipart/form-data", "data": { "type": "object", "properties": { "images": { "type": "file" } } } }, "response": { "Content-type": "application/json", "data": { "type": "object", "required": [ "predicted_label", "scores" ], "properties": { "predicted_label": { "type": "string" }, "scores": { "type": "array", "items": [{ "type": "array", "minItems": 2, "maxItems": 2, "items": [{ "type": "string" }, { "type": "number" } ] }] } } } } }] }
  • apis参数代码示例 [{ "url": "/", "method": "post", "request": { "Content-type": "multipart/form-data", "data": { "type": "object", "properties": { "images": { "type": "file" } } } }, "response": { "Content-type": "applicaton/json", "data": { "type": "object", "properties": { "mnist_result": { "type": "array", "item": [ { "type": "string" } ] } } } } }]
  • 目标检测模型配置文件示例 如下代码以TensorFlow引擎为例,您可以根据实际使用的引擎类型修改model_type参数后使用。 模型输入 key:images value:图片文件 模型输出 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 { "detection_classes": [ "face", "arm" ], "detection_boxes": [ [ 33.6, 42.6, 104.5, 203.4 ], [ 103.1, 92.8, 765.6, 945.7 ] ], "detection_scores": [0.99, 0.73] } 配置文件 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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 { "model_type": "TensorFlow", "model_algorithm": "object_detection", "metrics": { "f1": 0.345294, "accuracy": 0.462963, "precision": 0.338977, "recall": 0.351852 }, "apis": [{ "url": "/", "method": "post", "request": { "Content-type": "multipart/form-data", "data": { "type": "object", "properties": { "images": { "type": "file" } } } }, "response": { "Content-type": "application/json", "data": { "type": "object", "properties": { "detection_classes": { "type": "array", "items": [{ "type": "string" }] }, "detection_boxes": { "type": "array", "items": [{ "type": "array", "minItems": 4, "maxItems": 4, "items": [{ "type": "number" }] }] }, "detection_scores": { "type": "array", "items": [{ "type": "number" }] } } } } }], "dependencies": [{ "installer": "pip", "packages": [{ "restraint": "EXACT", "package_version": "1.15.0", "package_name": "numpy" }, { "restraint": "EXACT", "package_version": "5.2.0", "package_name": "Pillow" } ] }] }
  • 关于数据集版本 针对刚创建的数据集(未发布前),无数据集版本信息,必须执行发布操作后,才能应用于模型开发或训练。 数据集版本,默认按V001、V002递增规则进行命名,您也可以在发布时自定义设置。 您可以将任意一个版本设置为当前目录,即表示数据集列表中进入的数据集详情,为此版本的数据集标注信息。 针对每一个数据集版本,您可以通过“存储路径”参数,获得此版本对应的Manifest文件格式的数据集。可用于导入数据或难例筛选操作。 表格数据集暂不支持切换版本。
  • 数据集版本文件目录结构 由于数据集是基于OBS目录管理的,发布为新版本后,对应的数据集输出位置,也将基于新版本生成目录。 以图像分类为例,数据集发布后,对应OBS路径下生成,其相关文件的目录如下所示。 |-- user-specified-output-path |-- DatasetName-datasetId |-- annotation |-- VersionMame1 |-- VersionMame1.manifest |-- VersionMame2 ... |-- ... 以物体检测为例,如果数据集导入的是Manifest文件,在数据集发布后,其相关文件的目录结构如下。 |-- user-specified-output-path |-- DatasetName-datasetId |-- annotation |-- VersionMame1 |-- VersionMame1.manifest |-- annotation |-- file1.xml |-- VersionMame2 ... |-- ... 以视频标注为例,在数据集发布后,标注结果将标注结果文件(XML)存放在数据集输出目录下。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |-- user-specified-output-path |-- DatasetName-datasetId |-- annotation |-- VersionMame1 |-- VersionMame1.manifest |-- annotations |-- images |-- videoName1 |-- videoName1.timestamp.xml |-- videoName2 |-- videoName2.timestamp.xml |-- VersionMame2 ... |-- ... 视频标注的关键帧存在数据集的输入目录下。 |-- user-specified-input-path |-- images |-- videoName1 |-- videoName1.timestamp.jpg |-- videoName2 |-- videoName2.timestamp.jpg
  • 字符串数据类型 表1 字符串数据类型 MySQL数据库 GaussDB数据库 差异 CHAR(M) 支持,存在差异 输入格式:输入二进制或十六进制字符串时, GaussDB 输出为十六进制,MySQL中根据ASCII码表转义,无法转义的输出为空。 VARCHAR(M) 支持,存在差异 输入格式: GaussDB的自定义函数参数和返回值不支持长度校验,存储过程参数不支持长度校验,MySQL支持。 GaussDB的自定义函数和存储过程中的临时变量支持长度校验以及严格宽松模式下的报错和截断告警,MySQL不支持。 输入二进制或十六进制字符串时,GaussDB输出为十六进制,MySQL中根据ASCII码表转义,无法转义的输出为空。 TINYTEXT 支持,存在差异 输入格式: 默认值:创建表列时语法上允许设置默认值,MySQL不允许设置默认值。 输入二进制或十六进制字符串时,GaussDB输出为十六进制,MySQL中根据ASCII码表转义,无法转义的输出为空。 主键:MySQL中TINYTEXT类型不支持主键,GaussDB支持。 索引:MySQL中TINYTEXT类型不支持除前缀索引外其他索引方法,GaussDB支持。 外键:MySQL中TINYTEXT类型不支持作为外键的参考列/被参考列,GaussDB支持。 TEXT 支持,存在差异 输入格式: 默认值:创建表列时语法上允许设置默认值,MySQL不允许设置默认值。 输入二进制或十六进制字符串时,GaussDB输出为十六进制,MySQL中根据ASCII码表转义,无法转义的输出为空。 主键:MySQL中TEXT类型不支持主键,GaussDB支持。 索引:MySQL中TEXT类型不支持除前缀索引外其他索引方法,GaussDB支持。 外键:MySQL中TINYTEXT类型不支持作为外键的参考列/被参考列,GaussDB支持。 MEDIUMTEXT 支持,存在差异 输入格式: 默认值:创建表列时语法上允许设置默认值,MySQL不允许设置默认值。 输入二进制或十六进制字符串时,GaussDB输出为十六进制,MySQL中根据ASCII码表转义,无法转义的输出为空。 主键:MySQL中MEDIUMTEXT类型不支持主键,GaussDB支持。 索引:MySQL中MEDIUMTEXT类型不支持除前缀索引外其他索引方法,GaussDB支持。 外键:MySQL中TINYTEXT类型不支持作为外键的参考列/被参考列,GaussDB支持。 LONGTEXT 支持,存在差异 输入格式: GaussDB只支持不超过1G字节长度,MySQL支持4G-1字节长度。 默认值:创建表列时语法上允许设置默认值,MySQL不允许设置默认值。 输入二进制或十六进制字符串时,GaussDB输出为十六进制,MySQL中根据ASCII码表转义,无法转义的输出为空。 主键:MySQL中LONGTEXT类型不支持主键,GaussDB支持。 索引:MySQL中LONGTEXT类型不支持除前缀索引外其他索引方法,GaussDB支持。 外键:MySQL中TINYTEXT类型不支持作为外键的参考列/被参考列,GaussDB支持。 父主题: 数据类型
  • 数据类型 GaussDB数据库的数据类型大部分功能场景与MySQL一致,但存在部分差异。 除特别说明外,MySQL兼容性M-Compatibility模式中的数据类型精度、标度、位数大小等默认不支持用浮点型数值定义,建议使用合法的整型数值定义。 数值数据类型 日期与时间数据类型 字符串数据类型 二进制数据类型 数据类型支持的属性 数据类型转换 父主题: MySQL兼容性M-Compatibility模式
  • 排序规则 GaussDB数据库支持指定模式、表或列的排序规则,支持的范围如下。 排序规则差异说明: 当前仅有字符串类型、部分二进制类型支持指定排序规则,其他类型不支持指定排序规则,可以通过查询pg_type系统表中类型的typcollation属性不为0来判断该类型支持字符序。MySQL中所有类型可以指定字符序,但除字符串、二进制类型其他排序规则无实际意义。 当前排序规则(除binary外)仅支持在其对应字符集与库级字符集一致时可以指定,GaussDB数据库中,字符集必须与数据库的字符集一致,且不支持表内多种字符集混合使用。 utf8mb4字符集下默认字符序为utf8mb4_general_ci,与MySQL 5.7保持一致。 使用latin1字符序需要设置兼容性参数m_format_dev_version = 's2'。 表1 排序规则列表 MySQL数据库 GaussDB数据库 utf8mb4_general_ci 支持 utf8mb4_unicode_ci 支持 utf8mb4_bin 支持 gbk_chinese_ci 支持 gbk_bin 支持 gb18030_chinese_ci 支持 gb18030_bin 支持 binary 支持 utf8mb4_0900_ai_ci 支持 utf8_general_ci 支持 utf8_bin 支持 utf8_unicode_ci 支持 latin1_swedish_ci 支持 latin1_bin 支持 父主题: MySQL兼容性M-Compatibility模式
  • 获取结果集中的数据 ResultSet对象提供了丰富的方法,以获取结果集中的数据。获取数据常用的方法如表1所示,其他方法请参考JDK官方文档。 表1 ResultSet对象的常用方法 方法 描述 差异 int getInt(int columnIndex) 按列标获取int型数据。 - int getInt(String columnLabel) 按列名获取int型数据。 - String getString(int columnIndex) 按列标获取String型数据。 字段类型为整型且带有ZEROFILL属性时,GaussDB按照ZEROFILL属性要求的宽度信息用0进行补位后输出结果,MySQL直接输出结果。 String getString(String columnLabel) 按列名获取String型数据。 字段类型为整型且带有ZEROFILL属性时,GaussDB按照ZEROFILL属性要求的宽度信息用0进行补位后输出结果,MySQL直接输出结果。 Date getDate(int columnIndex) 按列标获取Date型数据。 - Date getDate(String columnLabel) 按列名获取Date型数据。 -
  • 产品优势 高安全 GaussDB拥有TOP级的商业数据库安全特性,如下所示,能够满足政企和金融级客户的核心安全诉求。 数据动态脱敏,行级访问控制,密态计算。 健全的工具与服务化能力 GaussDB已经拥有华为云,商用服务化部署能力,同时支持DAS、DRS等生态工具。有效保障用户开发、运维、优化、监控、迁移等日常工作需要。 全栈自研 GaussDB基于鲲鹏生态,是当前国内唯一能够做到全栈自主可控的国产品牌。同时GaussDB能够基于硬件优势在底层不断进行优化,提升产品综合性能。 开源生态 GaussDB已经支持开源社区,并提供集中式版本下载。
  • 字符串数据类型 表1 字符串数据类型 MySQL数据库 GaussDB数据库 差异 CHAR(M) 支持,存在差异 输入格式:输入二进制或十六进制字符串时,GaussDB输出为十六进制,MySQL中根据ASCII码表转义,无法转义的输出为空。 VARCHAR(M) 支持,存在差异 输入格式: GaussDB的自定义函数参数和返回值不支持长度校验,存储过程参数不支持长度校验,MySQL支持。 GaussDB的自定义函数和存储过程中的临时变量支持长度校验以及严格宽松模式下的报错和截断告警,MySQL不支持。 输入二进制或十六进制字符串时,GaussDB输出为十六进制,MySQL中根据ASCII码表转义,无法转义的输出为空。 TINYTEXT 支持,存在差异 输入格式: 默认值:创建表列时语法上允许设置默认值,MySQL不允许设置默认值。 输入二进制或十六进制字符串时,GaussDB输出为十六进制,MySQL中根据ASCII码表转义,无法转义的输出为空。 主键:MySQL中TINYTEXT类型不支持主键,GaussDB支持。 索引:MySQL中TINYTEXT类型不支持除前缀索引外其他索引方法,GaussDB支持。 外键:MySQL中TINYTEXT类型不支持作为外键的参考列/被参考列,GaussDB支持。 TEXT 支持,存在差异 输入格式: 默认值:创建表列时语法上允许设置默认值,MySQL不允许设置默认值。 输入二进制或十六进制字符串时,GaussDB输出为十六进制,MySQL中根据ASCII码表转义,无法转义的输出为空。 主键:MySQL中TEXT类型不支持主键,GaussDB支持。 索引:MySQL中TEXT类型不支持除前缀索引外其他索引方法,GaussDB支持。 外键:MySQL中TINYTEXT类型不支持作为外键的参考列/被参考列,GaussDB支持。 MEDIUMTEXT 支持,存在差异 输入格式: 默认值:创建表列时语法上允许设置默认值,MySQL不允许设置默认值。 输入二进制或十六进制字符串时,GaussDB输出为十六进制,MySQL中根据ASCII码表转义,无法转义的输出为空。 主键:MySQL中MEDIUMTEXT类型不支持主键,GaussDB支持。 索引:MySQL中MEDIUMTEXT类型不支持除前缀索引外其他索引方法,GaussDB支持。 外键:MySQL中TINYTEXT类型不支持作为外键的参考列/被参考列,GaussDB支持。 LONGTEXT 支持,存在差异 输入格式: GaussDB只支持不超过1G字节长度,MySQL支持4G-1字节长度。 默认值:创建表列时语法上允许设置默认值,MySQL不允许设置默认值。 输入二进制或十六进制字符串时,GaussDB输出为十六进制,MySQL中根据ASCII码表转义,无法转义的输出为空。 主键:MySQL中LONGTEXT类型不支持主键,GaussDB支持。 索引:MySQL中LONGTEXT类型不支持除前缀索引外其他索引方法,GaussDB支持。 外键:MySQL中TINYTEXT类型不支持作为外键的参考列/被参考列,GaussDB支持。 父主题: 数据类型
  • 流量控制函数 表1 流量控制函数列表 MySQL数据库 GaussDB数据库 差异 IF() 支持,存在差异 expr1入参仅支持bool类型。非bool类型入参若不能转换为bool类型则报错。 若expr2、expr3两个入参类型不同且两类型间不存在隐式转换函数则报错。 两个入参类型相同时,返回该入参类型。 若expr2、expr3两个入参类型分别为NUMERIC、STRING或TIME其中一个时,GaussDB输出为TEXT类型,MySQL输出为VARCHAR类型。 IFNULL() 支持,存在差异 若expr1、expr2两个入参类型不同且两类型间不存在隐式转换函数则报错。 两个入参类型相同时,返回该入参类型。 若expr1、expr2两个入参类型范畴分别为NUMEIRC、STRING或TIME其中一个时,GaussDB输出为TEXT类型,MySQL输出为VARCHAR类型。 两个入参类型其中一个为FLOAT4类型另一个为numeric范畴中任一类型,返回值为DOUBLE类型。MySQL其中一入参为FLOAT4,另一入参为TINYINT、UNSIGNED TINYINT、SMALLINT、UNSIGNED SMALLINT、MEDIUMINT、UNSIGNED MEDIUMINT、BOOL任一类型时,返回FLOAT4类型,第一个入参为FLOAT4,第二个入参为BIGINT或UNSIGNED BIGINT时,返回FLOAT类型。 NULLIF() 支持,存在差异 GaussDB中NULLIF()类型推导遵从以下逻辑: 如果两个参数的数据类型不同,且两个入参类型存在等值比较操作符,则返回对应等值操作符对应的左值类型,否则会对两个入参类型进行强制类型兼容。 若强制类型兼容后,存在等值比较操作符,则返回强制类型兼容后对应等值操作符的左值类型。 若强制类型兼容后,仍找不到对应等值操作符,则报错。 --两个入参类型存在等值比较操作符 gaussdb=# SELECT pg_typeof(nullif(1::int2, 2::int8)); pg_typeof ----------- smallint (1 row) --两个入参类型不存在等值比较操作符,但在强制类型兼容后可以找到等值比较操作符 gaussdb=# SELECT pg_typeof(nullif(1::int1, 2::int2)); pg_typeof ----------- bigint (1 row) --两个入参类型不存在等值比较操作符,且强制类型兼容后也不存在等值比较操作符 gaussdb=# SELECT nullif(1::bit, '1'::MONEY); ERROR: operator does not exist: bit = money LINE 1: SELECT nullif(1::bit, '1'::MONEY); ^ HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. CONTEXT: referenced column: nullif MySQL输出类型仅与第一个入参类型有关: 第一个入参为tinyint、smallint、mediumint、int、bool时,输出为int类型。 第一个入参为bigint时,输出为bigint类型。 第一个入参为unsigned tinyint、unsigned smallint、unsigned mediumint、unsigned int、bit时,输出为unsigned int类型。 第一个入参为unsigned bigint时,输出为unsigned bigint。 第一个入参为浮点型即float、double、real时,输出为double类型。 第一个入参类型为decimal或numeric类型时,输出为decimal类型。 第一个入参类型为时间类型或字符串类型即date、time、date、datetime、timestamp、char、varchar以及tinytext、enum、set时,输出为varchar类型。 第一个入参类型为text、mediumtext、longtext时,输出为longtext类型。 第一个入参类型为tinyblob时,输出为varbinary类型。 第一个入参类型为mediumblob或longblob时,输出为longblob类型。 第一个入参为blob时,输出为blob类型。 ISNULL() 支持,存在差异 GaussDB中返回值为BOOLEAN类型的t或f,MySQL中返回值为INT类型的1或0。 父主题: 系统函数
  • 聚合函数 表1 聚合函数列表 MySQL数据库 GaussDB数据库 差异 GROUP_CONCAT() 支持,存在差异 当group_concat参数中同时有DISTINCT和ORDER BY语法时,所有ORDER BY后的表达式必须也在DISTINCT的表达式之中。 group_concat(... order by 数字)不代表按照第几个参数的顺序,数字只是一个常量表达式,相当于不排序。 无论入参的数据类型是什么,group_concat返回值的数据类型始终为text;MySQL的group_concat在含有二进制类型参数时,返回值为二进制类型,其他情况返回值为字符串类型,并且返回值长度大于512时,其数据类型为字符串大对象或二进制大对象。 GUC参数group_concat_max_len有效范围是0-1073741823,最大值比MySQL小。 DEFAULT() 支持,存在差异 字段默认值为数组形式,GaussDB返回数组形式,MySQL不支持数组类型。 GaussDB字段是隐藏列(比如xmin、cmin),default函数返回空值。 GaussDB支持分区表、临时表、多表连接查询默认值。 GaussDB支持查询列名包含字符串值节点(表示名称)和A_Star节点(表示出现“*”),如default(tt.t4.id)和default(tt.t4.*)。不合法的查询列名和A_Star节点,GaussDB和MySQL报错信息有差异。 GaussDB创建字段默认值,没有检验字段类型的范围,使用default函数可能报错。 字段的默认值是函数表达式时,GaussDB的default函数返回建表时字段的default表达式的计算值。MySQL的default函数返回NULL。 父主题: 系统函数
  • UNION,CASE和相关构造差异点 POLYGON + NULL、POINT + NULL、POLYGON + POINT组合在MySQL中均返回GEOMETRY类型,GaussDB中未涉及,暂时当做报错处理。 SET和ENUM两种类型暂未支持,暂时当做报错处理。 常量类型和其他类型做类型聚合的时候,输出类型的精度为其他类型的精度。如“SELECT "helloworld" UNION SELECT p FROM t;”的结果的精度为属性p的精度。 定点常量和不带精度约束的类型(非字符串类型如int、bool、year等,聚合结果类型为定点类型)聚合时,精度约束会按照定点数默认精度31输出。 merge rule差异: MySQL 5.7中YEAR和TINYINT、INT、MEDIUMINT、BIGINT、BOOL聚合的结果类型为带UNSIGNED的类型,GaussDB的结果类型为不带UNSIGNED的类型;MySQL中BIT和INT、NUMERIC、FLOAT、DOUBLE等数值类型的聚合类型为VARBINARY类型,GaussDB中BIT和INT|NUMERIC聚合为NUMERIC类型,和FLOAT或者DOUBLE类型聚合时,结果为DOUBLE类型,和无符号整型聚合时为UINT8类型。 MySQL中BINARY和CHAR填充字符不相同,BINARY填充'\0',CHAR填充空格,GaussDB中BINARY和CHAR都是填充空格。
  • 双冒号转换差异点 GaussDB中使用双冒号将函数入参转换为期望类型可能导致结果超出预期,且MySQL中无双冒号功能。 示例: m_db=# SELECT POW("12"::VARBINARY,"12"::VARBINARY); ERROR: value out of range: overflow CONTEXT: referenced column: pow varbinary col m_db=# CREATE TABLE test_varbinary ( A VARBINARY(10) ); m_db=# INSERT INTO test_varbinary VALUES ('12'); m_db=# SELECT POW(A, A) FROM test_varbinary; pow --------------- 8916100448256 (1 row)
  • 双冒号转换差异点 GaussDB中使用双冒号将函数入参转换为期望类型可能导致结果超出预期;MySQL中无双冒号功能。 示例: m_db=# SELECT POW("12"::VARBINARY,"12"::VARBINARY); ERROR: value out of range: overflow CONTEXT: referenced column: pow varbinary col m_db=# CREATE TABLE test_varbinary ( A VARBINARY(10) ); m_db=# INSERT INTO test_varbinary VALUES ('12'); m_db=# SELECT POW(A, A) FROM test_varbinary; pow --------------- 8916100448256 (1 row)
  • 加密函数 表1 加密函数列表 MySQL数据库 GaussDB数据库 差异 AES_DECRYPT() 支持,存在差异 ecb为不安全加密模式,GaussDB不支持,默认为cbc模式。 GaussDB中,当指定数据库使用的字符编码是SQL_ASCII时,服务器把字节值0~127根据ASCII标准解释,而字节值128~255则当作无法解析的字符;如果该函数的输入输出包含了任何非ASCII数据,数据库将无法帮助用户转换或者校验非ASCII字符。 MySQL的返回值类型为BINARY、VARBINARY、BLOB、MEDIUMBLOB、LONGBLOB,GaussDB返回值类型固定为LONGBLOB。 GUC参数 :block_encryption_mode不支持设置数字。 AES_ENCRYPT() 支持,存在差异 PASSWORD() 支持,存在差异 MySQL中可以通过GUC参数old_passwords控制生成密码的哈希方式: old_passwords的默认值为0。 old_passwords为0:表示使用MySQL 4.1 native hashing加密。 old_passwords为2:表示使用SHA-256 hashing加密。 GaussDB中没有实现GUC参数old_passwords,password函数的行为只与默认(即old_passwords为0)的行为保持一致。 当BINARY类型插入字符串长度小于目标长度时,GaussDB填充符和MySQL不同;因此入参为BINARY类型时,函数结果和MySQL不一致。 父主题: 系统函数
  • 聚合函数 表1 聚合函数列表 MySQL数据库 GaussDB数据库 差异 GROUP_CONCAT() 支持,存在差异 当group_concat参数中同时有DISTINCT和ORDER BY语法时,所有ORDER BY后的表达式必须也在DISTINCT的表达式之中。 group_concat(... order by 数字)不代表按照第几个参数的顺序,数字只是一个常量表达式,相当于不排序。 无论入参的数据类型是什么,group_concat返回值的数据类型始终为text;MySQL的group_concat在含有二进制类型参数时,返回值为二进制类型,其他情况返回值为字符串类型,并且返回值长度大于512时,其数据类型为字符串大对象或二进制大对象。 GUC参数group_concat_max_len有效范围是0-1073741823,最大值比MySQL小。 DEFAULT() 支持,存在差异 字段默认值为数组形式,GaussDB返回数组形式,MySQL不支持数组类型。 GaussDB字段是隐藏列(比如xmin、cmin),default函数返回空值。 GaussDB支持分区表、临时表、多表连接查询默认值。 GaussDB支持查询列名包含字符串值节点(表示名称)和A_Star节点(表示出现“*”),如default(tt.t4.id)和default(tt.t4.*)。不合法的查询列名和A_Star节点,GaussDB和MySQL报错信息有差异。 GaussDB创建字段默认值,没有检验字段类型的范围,使用default函数可能报错。 字段的默认值是函数表达式时,GaussDB的default函数返回建表时字段的default表达式的计算值。MySQL的default函数返回NULL。 父主题: 系统函数
共100000条