完成准备工作后,您可以通过控制台、Python SDK或命令行提交DLC任务。本文为您介绍提交DLC任务的具体操作步骤。
前提条件
已准备资源、镜像、数据集和代码集。详情请参见准备工作。
如果使用Python SDK提交训练任务,需要配置环境变量。详情请参见安装Credentials工具和在Linux、macOS和Windows系统配置环境变量。
通过控制台创建
步骤一:进入新建任务页面
登录PAI控制台。
在左侧导航栏单击工作空间列表,在工作空间列表页面中单击待操作的工作空间名称,进入对应工作空间内。
在工作空间页面的左侧导航栏选择 ,在分布式训练(DLC)页面中单击新建任务,进入新建任务页面。
步骤二:配置训练任务的参数
基本信息
在基本信息区域,配置任务名称和标签。
环境信息
在环境信息区域,完成以下关键参数的配置:
参数 | 描述 |
节点镜像 | 工作节点的镜像。当前支持选择使用不同类型的镜像:
|
挂载配置 | 指定任务运行过程中,任务数据的存储位置,以扩展训练任务所需的存储空间。 单击添加按钮,进行挂载配置,支持以下三种挂载类型:
三种挂载类型均需要配置挂载路径,表示将数据集挂载到DLC容器的指定路径,例如 重要
|
启动命令 | 本任务需要执行的命令。支持Shell命令。例如,使用 提交训练任务时,PAI会自动注入多个通用环境变量,您可以通过配置 说明
|
环境变量 | 提供额外的配置信息或参数。格式为 |
三方库配置 | 支持以下两种配置方式:
|
代码配置 | 支持以下两种配置方式:
|
资源信息
在资源信息区域,完成以下关键参数的配置:
参数 | 描述 |
资源类型 | 仅当工作空间同时支持使用灵骏智算资源和通用计算资源提交DLC任务时,才支持选择资源类型:
|
资源来源 | 您可以选择使用公共资源或资源配额(包括通用计算资源或灵骏智算资源)。 说明 目前公共资源支持运行的资源上限为GPU 2卡、CPU 8核。如果您在训练任务时使用的公共资源超出上限,请联系您的商务经理来提升资源上限。 |
资源配额 | 仅资源来源选择资源配额时,需要配置该参数。选择已准备好的资源配额,关于如何准备资源配额,请参见资源配额(Quota)功能介绍。 |
优先级 | 当资源来源选择资源配额时,支持配置该参数。 表示同时运行的任务执行的优先级,取值范围为[1,9],其中1表示优先级最低。 |
框架 | 支持使用以下几种深度学习训练框架和训练工具,它们提供了丰富的功能和接口,方便您进行构建、训练和优化深度学习模型。
说明
|
任务资源 | 根据您选择的框架,支持配置Worker节点、PS节点、Chief节点、Evaluator节点和GraphLearn节点。
|
框架高级配置 | 当框架为PyTorch类型的任务时,支持通过高级配置提高训练灵活性,或满足一些特定的训练场景。
|
闲时资源 | 使用预付费资源配额(Quota)提交DLC训练任务时,您可以合理利用并配置闲时资源。关于闲时资源的更多使用说明,请参见使用闲时资源。 |
最长运行时长 | 您可以设置任务运行的最长时长,在完成配置后,超过该时长的任务将停止运行。默认为30天。 |
保留时长 | 配置执行成功或失败的任务的保留时长。超过该时长的任务将被删除。 重要 DLC任务删除后无法恢复,请谨慎操作。 |
专有网络配置
当资源来源选择公共资源时,支持配置该参数。
不配置专有网络,将使用公网连接。由于公网连接的带宽有限,可能导致任务执行过程中出现卡顿或无法正常进行的情况。
配置专有网络,以确保充足的网络带宽和更稳定的性能。
选择当前地域可用的专有网络,并选择对应的交换机与安全组。配置完成后,任务运行的集群将能够直接访问此专有网络内的服务,并使用此处选择的安全组进行安全访问限制。
此外,您在配置专有网络时还可以配置公网访问网关,支持以下两种配置方法:
专有网关:独享带宽,您可以根据需求选择不同的带宽。选择该方式后,您需要为DLC任务关联的专有网络创建公网NAT网关、绑定EIP并配置SNAT条目。配置方法,请参考DSW通过专有公网网关访问公网。
公有网关:使用共享的公网带宽,在用户高并发时下载速度会比较慢。
当前运行DLC任务时,需保障任务资源组实例、数据集存储(OSS)在同一地域的VPC网络环境中,且与代码仓库的网络是连通状态。
如果数据集配置选择CPFS类型的数据集,需要配置专有网络,且选择的专有网络需要与CPFS一致。否则提交的DLC训练任务会运行异常,表现为已出队。
容错与诊断
在容错与诊断区域,完成以下关键参数的配置:
参数 | 描述 |
自动容错 | 打开自动容错开关并配置相应参数后,系统将提供作业检测和控制能力,能够及时检测训练任务算法层面的报错,并规避错误,从而提升GPU的利用率。更详细的配置说明,请参见AIMaster:弹性自动容错引擎。 |
健康检测 | 打开健康检测开关,健康检测会对参与训练的资源进行全面检测,自动隔离故障节点,并触发后台自动化运维流程,有效减少任务训练初期遇到问题的可能性,提升训练成功率。详情请参见SanityCheck:算力健康检测。 说明 仅基于灵骏智算资源提交的训练任务支持开启健康检测功能。 |
角色信息
在角色信息区域,配置实例RAM角色。关于该功能更详细的内容介绍,请参见配置DLC RAM角色。
实例RAM角色 | 描述 |
PAI默认角色 | 基于服务角色AliyunPAIDLCDefaultRole运作,它仅拥有访问ODPS、OSS的权限,且权限更加精细。基于PAI默认角色签发的临时访问凭证:
|
自定义角色 | 选择或填写一个自定义的RAM角色。在实例内基于STS临时凭证访问云产品时,拥有的权限将与该自定义角色的权限保持一致。 |
不关联角色 | 不为DLC任务关联RAM角色,默认选择该方式。 |
步骤三:提交训练任务
单击确定,创建训练任务。您可以在分布式训练任务列表中单击任务名称,进入任务详情页面以查看当前任务的执行状态。
通过SDK或命令行创建
使用Python SDK
步骤一:安装Python SDK
安装工作空间SDK。
pip install alibabacloud_aiworkspace20210204==3.0.1
安装DLC SDK。
pip install alibabacloud_pai_dlc20201203==1.4.0
步骤二:提交任务
如果您希望采用按量计费方式提交训练任务,可以使用公共资源。使用公共资源提交的训练任务可能会遇到排队延时,建议在任务量相对较少,对任务时效性要求不高的场景下使用。
如果您希望采用包年包月方式提交训练任务,可以使用专有资源(包括通用计算资源和灵骏智算资源)。在任务量相对较多时,通过专有资源来保障训练任务能正常执行。
使用公共资源提交任务
创建并提交任务的具体调用代码如下所示。
#!/usr/bin/env python3
from __future__ import print_function
import json
import time
from alibabacloud_tea_openapi.models import Config
from alibabacloud_credentials.client import Client as CredClient
from alibabacloud_pai_dlc20201203.client import Client as DLCClient
from alibabacloud_pai_dlc20201203.models import (
ListJobsRequest,
ListEcsSpecsRequest,
CreateJobRequest,
GetJobRequest,
)
from alibabacloud_aiworkspace20210204.client import Client as AIWorkspaceClient
from alibabacloud_aiworkspace20210204.models import (
ListWorkspacesRequest,
CreateDatasetRequest,
ListDatasetsRequest,
ListImagesRequest,
ListCodeSourcesRequest
)
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
def wait_for_job_to_terminate(client, job_id):
while True:
job = client.get_job(job_id, GetJobRequest()).body
print('job({}) is {}'.format(job_id, job.status))
if job.status in ('Succeeded', 'Failed', 'Stopped'):
return job.status
time.sleep(5)
return None
def main():
# 请确认您的主账号已授权DLC,且拥有足够的权限。
region_id = 'cn-hangzhou'
# 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
# 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
# 本示例通过Credentials SDK默认从环境变量中读取AccessKey,来实现身份验证为例。
cred = CredClient()
# 1. create client;
workspace_client = AIWorkspaceClient(
config=Config(
credential=cred,
region_id=region_id,
endpoint="aiworkspace.{}.aliyuncs.com".format(region_id),
)
)
dlc_client = DLCClient(
config=Config(
credential=cred,
region_id=region_id,
endpoint='pai-dlc.{}.aliyuncs.com'.format(region_id),
)
)
print('------- Workspaces -----------')
# 获取工作空间列表。您也可以在参数workspace_name中填入您创建的工作空间名。
workspaces = workspace_client.list_workspaces(ListWorkspacesRequest(
page_number=1, page_size=1, workspace_name='',
module_list='PAI'
))
for workspace in workspaces.body.workspaces:
print(workspace.workspace_name, workspace.workspace_id,
workspace.status, workspace.creator)
if len(workspaces.body.workspaces) == 0:
raise RuntimeError('found no workspaces')
workspace_id = workspaces.body.workspaces[0].workspace_id
print('------- Images ------------')
# 获取镜像列表。
images = workspace_client.list_images(ListImagesRequest(
labels=','.join(['system.supported.dlc=true',
'system.framework=Tensorflow 1.15',
'system.pythonVersion=3.6',
'system.chipType=CPU'])))
for image in images.body.images:
print(json.dumps(image.to_map(), indent=2))
image_uri = images.body.images[0].image_uri
print('------- Datasets ----------')
# 获取数据集。
datasets = workspace_client.list_datasets(ListDatasetsRequest(
workspace_id=workspace_id,
name='example-nas-data', 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='example-nas-data',
# Nas文件系统ID。
# 通用型NAS:31a8e4****。
# 极速型NAS:必须以extreme-开头,例如extreme-0015****。
# CPFS:必须以cpfs-开头,例如cpfs-125487****。
nas_id='***',
nas_path='/',
mount_path='/mnt/data/nas')
print('create dataset with id: {}'.format(dataset_id))
else:
dataset_id = datasets.body.datasets[0].dataset_id
print('------- Code Sources ----------')
# 获取代码集列表。
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)
print('-------- ECS SPECS ----------')
# 获取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)
print('-------- Create Job ----------')
# 创建DLC作业。
create_job_resp = dlc_client.create_job(CreateJobRequest().from_map({
'WorkspaceId': workspace_id,
'DisplayName': 'sample-dlc-job',
'JobType': 'TFJob',
'JobSpecs': [
{
"Type": "Worker",
"Image": image_uri,
"PodCount": 1,
"EcsSpec": ecs_specs.body.ecs_specs[0].instance_type,
"UseSpotInstance": False,
},
],
"UserCommand": "echo 'Hello World' && ls -R /mnt/data/ && sleep 30 && echo 'DONE'",
'DataSources': [
{
"DataSourceId": dataset_id,
},
],
}))
job_id = create_job_resp.body.job_id
wait_for_job_to_terminate(dlc_client, job_id)
print('-------- List Jobs ----------')
# 获取DLC的作业列表。
jobs = dlc_client.list_jobs(ListJobsRequest(
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)
pass
if __name__ == '__main__':
main()
使用预付费资源配额提交任务
登录PAI控制台。
按照下图操作指引,在工作空间列表页面查看您所在的工作空间ID。
按照下图操作指引,查看您的专有资源组的资源配额ID。
使用以下代码创建并提交任务。可使用的公共镜像列表,详情请参见步骤二:准备镜像。
from alibabacloud_pai_dlc20201203.client import Client from alibabacloud_credentials.client import Client as CredClient from alibabacloud_tea_openapi.models import Config from alibabacloud_pai_dlc20201203.models import ( CreateJobRequest, JobSpec, ResourceConfig, GetJobRequest ) # 初始化一个Client,用来访问DLC的API。 region = 'cn-hangzhou' # 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。 # 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。 # 本示例通过Credentials SDK默认从环境变量中读取AccessKey,来实现身份验证为例。 cred = CredClient() client = Client( config=Config( credential=cred, region_id=region, endpoint=f'pai-dlc.{region}.aliyuncs.com', ) ) # 声明任务的资源配置,关于镜像选择可以参考文档中公共镜像列表,也可以传入自己的镜像地址。 spec = JobSpec( type='Worker', image=f'registry-vpc.cn-hangzhou.aliyuncs.com/pai-dlc/tensorflow-training:1.15-cpu-py36-ubuntu18.04', pod_count=1, resource_config=ResourceConfig(cpu='1', memory='2Gi') ) # 声明任务的执行内容。 req = CreateJobRequest( resource_id='<替换成您自己的资源配额ID>', workspace_id='<替换成您自己的WorkspaceID>', display_name='sample-dlc-job', job_type='TFJob', job_specs=[spec], user_command='echo "Hello World"', ) # 提交任务。 response = client.create_job(req) # 获取任务ID。 job_id = response.body.job_id # 查询任务状态。 job = client.get_job(job_id, GetJobRequest()).body print('job status:', job.status) # 查看任务执行的命令。 job.user_command
使用命令行
步骤一:下载客户端并执行用户认证
根据您使用的操作系统下载Linux 64或Mac版本的客户端工具并完成用户认证,详情请参见准备工作。
步骤二:提交任务
登录PAI控制台。
按照下图操作指引,在工作空间列表页面查看您所在的工作空间ID(WorkspaceID)。
按照下图操作指引,查看您的资源配额ID。
参考以下文件内容准备参数文件
./tfjob.params
。关于命令行使用方式,详情请参见命令列表。name=test_cli_tfjob_001 workers=1 worker_cpu=4 worker_gpu=0 worker_memory=4Gi worker_shared_memory=4Gi worker_image=registry-vpc.cn-beijing.aliyuncs.com/pai-dlc/tensorflow-training:1.12.2PAI-cpu-py27-ubuntu16.04 command=echo good && sleep 120 resource_id=<您的资源配额ID> # 如果您使用公共资源组,该参数允许为空。 workspace_id=<您的WorkspaceID>
使用以下代码示例传入params_file参数提交任务,可以将DLC任务提交到指定的工作空间和资源组。
dlc submit tfjob --job_file ./tfjob.params
使用以下代码查看您提交的DLC任务。
dlc get job <jobID>
相关文档
提交训练任务后,您可以执行以下操作:
查看任务基本信息、资源视图和操作日志。详情请参见查看训练详情。
管理任务,包括克隆、停止和删除任务等。详情请参见管理训练任务。
通过Tensorboard查看结果分析报告。详情请参见Tensorboard。
设置DLC或资源配额的监控与报警。详情请参见监控与报警。
查看任务运行的账单明细。详情请参见账单明细。
您可以在工作空间中配置SLS日志转发功能,将当前工作空间中的DLC任务日志转发至指定的SLS日志库,实现自定义分析。详情请参见订阅任务日志。
您可以在PAI工作空间的事件中心中创建消息通知规则,以便跟踪和监控DLC任务的状态。详情请参见消息通知。
有关在执行DLC任务过程中可能出现的问题及其解决方法,请参考DLC常见问题。
关于DLC的使用案例,请参见DLC使用案例汇总。