直接使用
请打开介绍如何使用SDK提交DLC训练任务,并点击右上角 “ 在DSW中打开” 。
概述
PAI-DLC(Deep Learning Containers)是基于阿里巴巴容器服务ACK(Alibaba Cloud Container Service for Kubernetes)的深度学习训练平台,为您提供灵活、稳定、易用和极致性能的深度学习训练环境。
除了可以在PAI的控制台使用界面提交任务,PAI平台还提供了完善的SDK和OpenAPI,实现基于代码提交任务,使得PAI-DLC更灵活的应用到您的日常生产。
本文将介绍如何使用PAI-DLC提供的SDK,实现训练任务的提交。
如果您需要通过界面提交PAI-DLC公共资源组或专有资源组任务,请参见提交任务(通过Training页面)。
前提条件
- 开通PAI-DLC,并完成授权,详情请参见云产品依赖与授权:DLC。
- 为运行训练任务,准备资源组集群(本文使用公共DLC资源组进行演示)
- 已获取阿里云账户的AccessKey ID和AccessKey Secret,详情请参见获取AccessKey。
步骤一:安装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)