【DSW Gallery】介绍如何使用SDK提交DLC训练任务

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
交互式建模 PAI-DSW,每月250计算时 3个月
模型训练 PAI-DLC,100CU*H 3个月
简介: 您可以通过Python SDK的方式提交PAI-DLC任务,本文介绍如何通过Python SDK提交使用公共DLC资源组或专有DLC资源组的训练任务,核心步骤包括下载Python SDK、安装Python SDK及创建并提交任务。

直接使用

请打开介绍如何使用SDK提交DLC训练任务,并点击右上角 “ 在DSW中打开” 。

image.png


概述

PAI-DLC(Deep Learning Containers)是基于阿里巴巴容器服务ACK(Alibaba Cloud Container Service for Kubernetes)的深度学习训练平台,为您提供灵活、稳定、易用和极致性能的深度学习训练环境。

除了可以在PAI的控制台使用界面提交任务,PAI平台还提供了完善的SDK和OpenAPI,实现基于代码提交任务,使得PAI-DLC更灵活的应用到您的日常生产。

本文将介绍如何使用PAI-DLC提供的SDK,实现训练任务的提交。

如果您需要通过界面提交PAI-DLC公共资源组或专有资源组任务,请参见提交任务(通过Training页面)

前提条件

步骤一:安装Python SDK

  • 安装AI工作空间SDK
  • 安装PAI-DLC的SDK
  • 安装预付费资源组管理的SDK(可选)
!pip install alibabacloud-aiworkspace20210204 -U -q
!pip install alibabacloud-pai-dlc20201203 -U -q
# 查询预付费资源组所需SDK
!pip install https://sdk-portal-us-prod.oss-accelerate.aliyuncs.com/downloads/u-b8602de7-c468-436c-8a02-2eca4a30d376-python-paistudio.zip -U -q

步骤二:任务提交前准备工作

PAI-DLC在进行训练任务时,可以使用到PAI平台的各个AI资产模块(包括:数据集、镜像、代码集等)的资源,便于开发物料的复用。同时,还需要用户预先准备一个AI工作空间,用来整合相关的工作流。

from __future__ import print_function
import json
import time
from alibabacloud_tea_openapi.models import Config
from alibabacloud_pai_dlc20201203.client import Client as DLCClient
from alibabacloud_pai_dlc20201203.models import (
    ListJobsRequest,
    ListEcsSpecsRequest,
    CreateJobRequest,
    UpdateJobRequest,
    JobSpec
)
from alibabacloud_aiworkspace20210204.client import Client as AIWorkspaceClient
from alibabacloud_aiworkspace20210204.models import (
    ListWorkspacesRequest,
    CreateDatasetRequest,
    ListDatasetsRequest,
    ListImagesRequest,
    ListCodeSourcesRequest,
    ListResourcesRequest
)
from alibabacloud_paistudio20220112.models import (ListResourceGroupMachineGroupsRequest)
from alibabacloud_paistudio20220112.client import Client as StudioClient
# client config
region_id = 'cn-beijing'  # Region,可以是cn-hangzhou,cn-shanghai,cn-shenzhen等
access_key_id = '**你的access_key_id**'
access_key_secret = '**你的access_key_secret**'
# 从文件中读取AK信息
import os.path
config_path="/mnt/data/pai.config"
if os.path.isfile(config_path):
    with open(config_path) as f:
        access_key_id = f.readline().strip('\n')
        access_key_secret = f.readline().strip('\n')
workspace_client = AIWorkspaceClient(
    Config(access_key_id=access_key_id,
           access_key_secret=access_key_secret,
           region_id=region_id,
           endpoint='aiworkspace.{}.aliyuncs.com'.format(region_id)))
dlc_client = DLCClient(
    Config(access_key_id=access_key_id,
           access_key_secret=access_key_secret,
           region_id=region_id,
           endpoint='pai-dlc.{}.aliyuncs.com'.format(region_id)))
# 只有预付费资源组才需要Studio Client
studio_client = StudioClient(Config(access_key_id=access_key_id,
                                    access_key_secret=access_key_secret,
                                    region_id = region_id))

准备AI工作空间(必须)

工作空间是PAI的顶层概念,为团队提供统一的计算资源管理及人员权限管理能力,目的就是为AI开发者提供支持团队协作的全流程开发工具及AI资产管理能力。

PAI平台在开通时,会自动给用户 创建默认的工作空间

workspace_name = '**已有的AI工作空间名称**'
# 获取工作空间列表。
workspaces = workspace_client.list_workspaces(ListWorkspacesRequest(
    page_number=1, 
    page_size=10,
    workspace_name=workspace_name,
))
if len(workspaces.body.workspaces) == 0:
    raise RuntimeError('请指定正确的workspace_name')
for workspace in workspaces.body.workspaces:
    print(workspace.workspace_name, workspace.workspace_id,
          workspace.status, workspace.creator)
# 获得用于提交任务的工作空间ID
workspace_id = workspaces.body.workspaces[0].workspace_id

准备镜像(必须)

进行训练任务,需要明确指定计算节点所使用的镜像。PAI-DLC支持选择使用不同类型的镜像:

  • 社区镜像:由社区提供的标准镜像,不同的镜像的详情请参见社区镜像版本详情
  • PAI平台镜像:由阿里云PAI产品提供的多种官方镜像,支持不同的资源类型、Python版本及深度学习框架TensorFlow和PyTorch,镜像列表请参见公共镜像列表
  • 用户自定义镜像:可选择使用您添加到PAI的自定义的镜像,选择前,您需要先将自定义镜像添加到PAI中,操作详情请参见查看并添加镜像
  • 镜像地址:可选择使用您自定义的镜像,选择镜像地址后,您需要在配置框中配置公网环境下可访问的Docker Registry Image URL。
# 获取镜像列表,可以用labels来做过滤
images = workspace_client.list_images(ListImagesRequest(
    labels=','.join(['system.supported.dlc=true',
                     'system.framework=Tensorflow 1.15',
                     'system.pythonVersion=3.6',
                     'system.chipType=CPU']), verbose=True))
# 可以查看所有可用的镜像
for image in images.body.images:
    print(image.image_id, image.image_uri)
# 获得用于提交任务所使用的镜像,这里去取第一个作为示例
image_uri = images.body.images[0].image_uri
print('image_uri', image_uri)

准备节点规格(针对按量付费是必须的操作)

为训练任务,准备计算节点的规格,详细的规格列表和费用请参见PAI-DLC计费说明

# 获取DLC的节点规格列表。
ecs_specs = dlc_client.list_ecs_specs(ListEcsSpecsRequest(page_size=100, sort_by='Memory', order='asc'))
# for spec in ecs_specs.body.ecs_specs:
#     print(spec.instance_type, spec.cpu, spec.memory, spec.memory, spec.gpu_type)
# 获得用于提交任务的节点规格
ecs_spec = ecs_specs.body.ecs_specs[0].instance_type
print('ecs_spec', ecs_spec)

准备数据集(可选)

高质量的数据集是高精度模型的基础,是数据准备的核心目标。PAI平台提供了数据集管理模块,支持将各类数据(本地数据、阿里云存储中的数据等)注册为数据集,也支持扫描OSS文件夹生成索引数据集,为模型训练做准备。

dataset_name = 'example-nas-data'
nas_id = '**已创建的nas的id'
def create_nas_dataset(client, region, workspace_id, name,
                       nas_id, nas_path, mount_path):
    '''创建NAS的数据集。
    '''
    response = client.create_dataset(CreateDatasetRequest(
        workspace_id=workspace_id,
        name=name,
        data_type='COMMON',
        data_source_type='NAS',
        property='DIRECTORY',
        uri=f'nas://{nas_id}.{region}{nas_path}',
        accessibility='PRIVATE',
        source_type='USER',
        options=json.dumps({
            'mountPath': mount_path
        })
    ))
    return response.body.dataset_id
def create_oss_dataset(client, region, workspace_id, name,
                       oss_bucket, oss_endpoint, oss_path, mount_path):
    '''创建OSS数据集。
    '''
    response = client.create_dataset(CreateDatasetRequest(
        workspace_id=workspace_id,
        name=name,
        data_type='COMMON',
        data_source_type='OSS',
        property='DIRECTORY',
        uri=f'oss://{oss_bucket}.{oss_endpoint}{oss_path}',
        accessibility='PRIVATE',
        source_type='USER',
        options=json.dumps({
            'mountPath': mount_path
        })
    ))
    return response.body.dataset_id
# 获取数据集
# --------如果需要使用数据集,来为DLC任务绑定外部存储,可以取消以下代码的注释--------
# datasets = workspace_client.list_datasets(ListDatasetsRequest(
#     workspace_id=workspace_id,
#     name=dataset_name, properties='DIRECTORY'))
# for dataset in datasets.body.datasets:
#     print(dataset.name, dataset.dataset_id, dataset.uri, dataset.options)
# if len(datasets.body.datasets) == 0:
#     # 当前数据集不存在时,创建数据集。
#     dataset_id = create_nas_dataset(
#         client=workspace_client,
#         region=region_id,
#         workspace_id=workspace_id,
#         name=dataset_name,
#         nas_id=nas_id,
#         nas_path='/',
#         mount_path='/mnt/data/example-nas')
#     print('create dataset with id: {}'.format(dataset_id))
# else:
#     dataset_id = datasets.body.datasets[0].dataset_id
# print('dataset_id', dataset_id)

准备代码源(可选)

进行模型训练任务提交等操作时,通常您需要提供自己的训练代码。PAI为您提供代码配置功能,便于您将需要使用的代码仓库创建为AI资产,方便在多个任务中引用。

# 获取代码集列表。
# --------如果需要使用代码集,可以取消以下代码的注释--------
# code_sources = workspace_client.list_code_sources(ListCodeSourcesRequest(
#     workspace_id=workspace_id))
# for code_source in code_sources.body.code_sources:
#     print(code_source.display_name, code_source.code_source_id, code_source.code_repo)

步骤三:提交训练任务

以上准备好了训练需要的资源和配置,接下来会进行任务的提交。关于接口的更多说明,请参见API参考

创建后付费(按量付费)作业

# 创建DLC作业。
job_spec = JobSpec(
    type='Worker',
    image=image_uri,
    pod_count=1,
    ecs_spec=ecs_spec,
)
create_job_resp = dlc_client.create_job(CreateJobRequest(
    workspace_id=workspace_id,
    display_name='sample-dlc-job-1',
    job_type='TFJob',
    job_specs=[job_spec,],
    user_command='echo 1 && sleep 30 && echo Done',
    # 'DataSources': [
    #     {
    #         "DataSourceId": dataset_id,
    #     },
    # ],
))
job_id = create_job_resp.body.job_id
print("The created job's ID is ", job_id)

创建独占资源组作业(预付费)

独占资源组(也称为预付费资源组)是PAI推出的新功能,正在邀测阶段,如有需要,可以联系PAI团队。在预付费资源组中的资源为用户独占,用户可以提交DLC任务或者DSW实例,并且指定任务或者实例的资源量。当提交的任务超过资源组中的总量时,会自动排队,同时用户可以修改排队中的任务优先级来影响任务被执行的先后顺序。

值得注意的是,提交到资源组中的作业会遵循All-Or-Nothing(也叫Gang Scheduling)的原则,也即只有作业要求的所有worker都能得到资源保障的请求下,才会被调度执行;避免部分worker提交到集群,造成资源浪费。

# 获取工作空间中的云原生独占资源组,用于DLC或者DSW
resp = workspace_client.list_resources(ListResourcesRequest(
        page_number=1,
        page_size=10,
        workspace_id=workspace_id,
        product_types='DLC' # 这里'DLC'代表“云原生资源组”
    ))
# 提交DLC或者DSW到预付费资源组,需要获取资源组ID;资源组ID存于工作空间的资源Spec中的resourceGroupId字段
resource_group_id = None
for resource in resp.body.resources:
    cluster_type = resource.spec['clusterType']
    if cluster_type == 'private': # 'private'代表 专有云资源组, 'share'代表公共资源组(后付费)
        resource_group_id = resource.spec['resourceGroupId']
        resource_group_name = resource.spec['resourceGroupName']
        mgs = studio_client.list_resource_group_machine_groups(resource_group_id=resource_group_id,
                                                      request=ListResourceGroupMachineGroupsRequest()).body
        print("resource group:", resource_group_id, resource_group_name)
        for g in mgs.machine_groups:
            print(g.ecs_count, g.ecs_spec)
# 定义提到预付费资源组的任务所需要的资源,使用resource_config来指定所需要的cpu/memoy/gpu
from alibabacloud_pai_dlc20201203.models import ResourceConfig
requested_job_resource = ResourceConfig(cpu='2',
                                        memory='4Gi',
                                        #gpu='1'
                                       )
job_spec = JobSpec(type='Worker',
                   image=image_uri,
                   pod_count=2,
                   resource_config=requested_job_resource
                  )
create_job_resp = dlc_client.create_job(CreateJobRequest(
    workspace_id=workspace_id,
    display_name="pre_paid_job_1",
    job_type='TFJob',
    resource_id=resource_group_id,
    job_specs=[job_spec],
    user_command='echo "hello prepaid job1"; sleep 10',
    priority=3)) # priority取值1~9;9代表最高优先级
job_prepaid_id = create_job_resp.body.job_id
# 更新任务优先级
dlc_client.update_job(job_prepaid_id,
                      UpdateJobRequest(priority=1)) # priority取值1~9;9代表最高优先级"
print('job_prepaid_id', job_prepaid_id)            

步骤四:查看训练任务

当完成以上的PAI-DLC任务提交之后,可通过以下代码,实时查看任务运行的状态。

# 轮询提交的任务状态
def wait_for_job_to_terminate(client, job_id):
    while True:
        job = client.get_job(job_id).body
        print('job is {}'.format(job.status))
        if job.status in ('Succeeded', 'Failed', 'Stopped'):
            return job.status
        time.sleep(5)
    return None
wait_for_job_to_terminate(dlc_client, job_id)
# 或者查看预付费资源组的任务
# wait_for_job_to_terminate(dlc_client, job_prepaid_id)

查看任务状态并获取日志:

from alibabacloud_pai_dlc20201203.models import GetPodLogsRequest
# 如果需要获取预付费任务的日志,取消下面这一行的注释
#job_id = job_prepaid_id
job = dlc_client.get_job(job_id=job_id)
print("Status:", job.body.status)
print("============== Logs: ===========")
print("\n".join(dlc_client.get_pod_logs(job_id=job_id, 
                              pod_id=job.body.pods[0].pod_id,
                              request=GetPodLogsRequest()).body.logs))

也可以通过调用PAI-DLC的SDK,来查看指定AI工作空间下的所有任务:

# 获取DLC的作业列表。
jobs = dlc_client.list_jobs(ListJobsRequest(
    # workspace_name=workspace_name,
    workspace_id=workspace_id,
    page_number=1,
    page_size=10,
))
for job in jobs.body.jobs:
    print(job.display_name, job.job_id,
          # job.workspace_name,
          job.status, job.job_type)
相关实践学习
使用PAI-EAS一键部署ChatGLM及LangChain应用
本场景中主要介绍如何使用模型在线服务(PAI-EAS)部署ChatGLM的AI-Web应用以及启动WebUI进行模型推理,并通过LangChain集成自己的业务数据。
机器学习概览及常见算法
机器学习(Machine Learning, ML)是人工智能的核心,专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能,它是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域。 本课程将带你入门机器学习,掌握机器学习的概念和常用的算法。
相关文章
|
6月前
|
DataWorks 安全 API
DataWorks产品使用合集之有api或者是sdk可以获取到 dataworks 的任务运行的结果吗
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
42 1
|
机器学习/深度学习 分布式计算 开发工具
Azure 机器学习 - 使用Python SDK训练模型
Azure 机器学习 - 使用Python SDK训练模型
82 0
|
Java Shell 开发工具
RK3128 Android 7 BOX SDK 修改为MID界面-近期任务
RK3128 Android 7 BOX SDK 修改为MID界面-近期任务
409 0
RK3128 Android 7 BOX SDK 修改为MID界面-近期任务
|
API TensorFlow 开发工具
【DSW Gallery】使用EAS Python SDK完成模型部署
针对在线推理场景,PAI平台提供了在线预测服务PAI-EAS(Elastic Algorithm Service),支持基于异构硬件(CPU和GPU)的模型加载和数据请求的实时响应。通过PAI-EAS,您可以将模型快速部署为RESTful API,再通过HTTP请求的方式调用该服务。您可以使用EAS提供的Python SDK,来管理PAI-EAS服务。
【DSW Gallery】使用EAS Python SDK完成模型部署
|
机器学习/深度学习 人工智能 IDE
【DSW Gallery】使用Python SDK管理DSW实例
PAI DSW提供Python SDK来封装DSW的OpenAPI,使得用户可以用Python代码来管理DSW实例,包括创建、停止、保存、删除、列举等功能。本文也会介绍如何在独占资源组中创建实例。
【DSW Gallery】使用Python SDK管理DSW实例
|
分布式计算 Java 大数据
使用MaxCompute Java SDK 执行任务卡住了,怎么办?
场景一 用户A A: “亲,用 MaxCompute Java SDK 跑作业,为什么卡住不动了?” me: “有 Logview 吗?发来看下” A: “没有,我用的是SDK,没Logview” 场景二 用户B B :“亲,用 MaxCompute Java SDK 访问 Table,为什么卡住半天没反应?” me:“卡在哪一行了?” B:"就 RestClient retry 然后卡住了" 去繁就简 用户 A 的问题在于没有 instance 的 logview,导致无法追踪 instance 的运行过程。
2417 0
|
4月前
|
JavaScript 前端开发 Java
[Android][Framework]系统jar包,sdk的制作及引用
[Android][Framework]系统jar包,sdk的制作及引用
121 0
|
1月前
|
Java Linux API
Android SDK
【10月更文挑战第21天】
85 1
|
2月前
|
程序员 开发工具 Android开发
Android|使用阿里云推流 SDK 实现双路推流不同画面
本文记录了一种使用没有原生支持多路推流的阿里云推流 Android SDK,实现同时推送两路不同画面的流的方法。
68 7
|
4月前
|
开发工具 Android开发
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
194 4
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file