相关文章推荐
踢足球的茄子  ·  shell ...·  1 年前    · 
创建训练任务

创建训练任务

完成准备工作后,您可以通过控制台、Python SDK 或命令行提交 DLC 任务。本文为您介绍提交 DLC 任务的具体操作步骤。

前提条件

通过控制台创建

  1. 进入 新建任务 页面。

    1. 登录 PAI 控制台 ,在页面上方选择目标地域,并在右侧选择目标工作空间,然后单击 进入 DLC

    2. 在分布式训练(DLC)页面,单击 新建任务

  2. 分别在以下几个区域,配置训练任务相关参数。

    • 基本信息

      配置 任务名称 标签

    • 环境信息

      参数

      描述

      节点镜像

      工作节点的镜像。当前支持选择如下类型的镜像:

      • 官方镜像 :由阿里云 PAI 产品提供的多种官方镜像,支持不同的 Python 版本及深度学习框架(包括 TensorFlow、PyTorch、Ray、XGBoost 等)。镜像列表及详情,请参见 准备工作

      • 自定义镜像 :可选择使用您添加到 PAI 的自定义镜像。如何准备自定义镜像,请参见 自定义镜像

        说明
        • 当资源配额选择灵骏智算资源并使用自定义镜像时,为了充分利用灵骏智算资源的高性能 RDMA 网络,需手动安装 RDMA。操作详情请参见 RDMA:使用高性能网络进行分布式训练

        • 目前,您需要将镜像仓库设置为公开拉取状态,或选择将镜像存储在阿里云 ACR(容器镜像服务)中,以便能够直接使用。

      • 镜像地址 :支持配置您的自定义镜像或官方镜像地址。您需要在配置框中配置公网环境下可访问的 Docker Registry Image URL。

        如果您配置的是私有镜像地址,需要单击 输入账号密码 ,并配置 镜像仓库用户名 密码 ,为私有镜像仓库授权。

        您也可以使用加速镜像,来提升模型训练速度。详情请参见 镜像加速

      数据集

      支持挂载以下两种类型数据集:

      • 自定义数据集 :需配置为前期已准备好的数据集。如果数据集存在多个版本,您可以在目标数据集 操作 列下的 版本列表 中进行选择。关于如何准备数据集,请参见 准备工作

      • 公共数据集 :配置为 PAI 预置的公共数据集,只支持只读挂载模式。

      两种类型数据集均需配置 挂载路径 ,表示将数据集挂载到 DLC 容器的指定路径,例如 /mnt/data 。运行代码时,DLC 会按照该路径检索所需文件。关于挂载配置更详细的内容介绍,请参见 DLC 训练任务中使用云存储

      重要
      • 如果添加 OSS NAS 类型的数据集,则需要授权 PAI 访问相关云产品 OSS NAS 的权限,否则读取或写入数据失败。详情请参见 PAI 访问云产品授权:OSS NAS

      • 如果配置了 CPFS 类型的数据集,则需要配置专有网络,且选择的专有网络需要与 CPFS 一致。否则,提交的 DLC 训练任务可能长时间处于环境准备中状态。

      直接挂载

      支持将数据源 OSS 通用型 NAS 极速型 NAS BMCPFS 直接挂载到 DLC 容器中。单击相应数据源,然后配置数据源信息和挂载路径即可。

      说明

      仅灵骏智算资源的任务可以使用 BMCPFS 数据源。

      启动命令

      本任务需要执行的命令。支持 Shell 命令,例如,使用 python -c "print('Hello World')" 运行 Python。

      提交训练任务时,PAI 会自动注入多个通用环境变量,您可以通过配置 $环境变量名 ,来获取指定环境变量的值。关于 DLC 默认提供的环境变量列表,请参见 通用环境变量列表

      说明

      如果配置了数据集,您可以通过设置相应的命令,将训练结果导出至数据集挂载目录,方便您在数据集中查看训练结果。

      环境变量

      提供额外的配置信息或参数。格式为 Key:Value 。最多支持配置 20 个环境变量。

      三方库配置

      支持以下两种配置方式:

      • 三方库列表 :直接在下方文本框中输入三方库名称。

      • requirements.txt 文件目录 :将第三方库写入 requirements.txt 文件中。您需要通过代码配置、数据集或直接挂载方式将该文件上传到 DLC 容器中,然后在下方文本框中指定该文件在 DLC 容器中的路径。

      代码配置

      将训练所需代码文件上传到 DLC 容器中。支持以下两种配置方式:

      • 在线配置

        指定代码文件的存储位置(代码仓库信息)。此处需配置为此前已准备好的代码集。关于如何准备代码集,请参见 步骤四:准备代码集

        说明

        由于 DLC 会将代码下载至指定工作路径,所以您需要有代码仓库的访问权限。

      • 本地上传

        单击 image.png 按钮后,按照界面操作指引上传代码文件。上传成功后,将 挂载路径 配置为容器内部的指定路径,例如 /mnt/data

    • 资源信息

      参数

      描述

      资源类型

      仅当工作空间同时支持使用灵骏智算资源和通用计算资源提交 DLC 任务时,才支持选择资源类型,取值如下:

      • 灵骏智算

        说明

        仅华北 6(乌兰察布)和新加坡地域支持使用灵骏智算资源。

      • 通用计算

      资源来源

      您可以选择使用 公共资源 资源配额 (包括通用计算资源或灵骏智算资源)或 竞价资源

      说明
      • 目前公共资源支持运行的资源上限为 GPU 2 卡、CPU 8 核。如果您在训练任务时使用的公共资源超出上限,请联系您的商务经理来提升资源上限。

      • 关于竞价资源的使用限制和详情介绍,请参见 使用竞价任务

      资源配额

      资源来源 选择 资源配额 时,需要配置该参数。选择已准备好的资源配额,关于如何准备资源配额,请参见 资源配额(Quota)功能介绍

      优先级

      资源来源 选择 资源配额 时,支持配置该参数。

      表示同时运行的任务执行的优先级,取值范围为[1,9],其中 1 表示优先级最低。

      框架

      支持使用以下几种深度学习训练框架和训练工具,它们提供了丰富的功能和接口,方便您进行构建、训练和优化深度学习模型。

      • Tensorflow

      • PyTorch

      • ElasticBatch

      • XGBoost

      • OneFlow

      • MPIJob

      • Slurm

      • Ray

      说明

      资源配额 选择灵骏智算资源时,仅支持提交 Tensorflow、PyTorch、ElasticBatch、MPIJob 、Slurm Ray 类型的任务。

      任务资源

      根据您选择的框架,支持配置 Worker、PS、Chief、Evaluator GraphLearn 节点的资源。

      • 使用公共资源

        支持配置以下参数:

        • 节点数量 :运行 DLC 任务的节点数量。

        • 资源规格 :单击 image.png 按钮选择资源规格,控制台界面将显示相应规格的价格。如需了解更多计费详情,请参见 分布式训练(DLC)计费说明

      • 使用资源配额

        各类节点支持配置的参数项一致,均包含 节点数量 CPU(核数) GPU(卡数) 内存(GiB) 共享内存(GiB) 配置项。

      • 使用竞价资源

        支持配置以下参数,关于竞价资源的更多详细信息,请参见 使用竞价任务

        • 节点数量 :运行 DLC 任务的节点数量。

        • 资源规格 :单击 image.png 按钮选择资源规格。

        • 出价 :通过设置最高出价来申请使用竞价资源。您可以单击 image 按钮,选择出价方式:

          • 按折扣 :最高价是基于资源规格的市场价格,从 1 折到 9 折的离散选项,表示参与竞价的上限。当竞价资源的最高出价≥市场价格且库存充足时,可申请到竞价资源。

          • 按价格 :最高价的出价范围为市场价格区间。

      指定节点调度

      打开开关,在 调度指定节点 页面,选择要用于任务调度的节点。

      说明

      仅使用资源配额提交任务时,支持配置该参数。

      框架高级配置

      框架 PyTorch 类型时,支持通过高级配置提高训练灵活性,或满足一些特定的训练场景。

      • 配置要求:

        • 需配置为使用半角逗号(,)分隔的一组字符串形式,其中每个字符串都符合 key=value 的形式。

        • 其中 key 为当前支持的高级参数,value 需配置为对应参数的取值。

        • 当前支持的高级参数列表和取值说明请参见 附录:高级参数列表

          重要

          由于灵骏智算资源未提供自定义端口能力,因此当使用灵骏智算资源提交 DLC 任务时,不支持配置 customPortNumPerWorker 参数。

      • 典型场景与配置示例:

        • 典型场景:

          通过使用高级配置参数,可以实现 Worker 之间的网络互通,从而实现更灵活的训练方法。例如,可以利用额外开放的端口,在 DLC 容器中启动像 Ray 这样的框架,并与 PyTorch 配合进行更高级的分布式训练。

        • 配置示例:

          createSvcForAllWorkers=true,customPortNumPerWorker=100

          后续,您可以在 启动命令 中,通过配置 $JOB_NAME $CUSTOM_PORTS 环境变量获取到域名和可用端口号,即可拉起并连接到像 Ray 之类的框架。

      闲时资源

      使用资源配额提交 DLC 训练任务时,您可以合理利用并配置闲时资源。关于闲时资源的更多使用说明,请参见 使用闲时资源

      CPU 亲和性

      启用 CPU 亲和性,能够将容器或 Pod 中的进程绑定到特定的 CPU 核心上执行。通过这种方式,可以减少 CPU 缓存未命中、上下文切换等现象,从而提高 CPU 使用率,提升应用性能,适用于对性能敏感和实时性要求高的场景。

      最长运行时长

      您可以设置任务运行的最长时长,在完成配置后,超过该时长的任务将停止运行。默认为 30 小时。

      保留时长

      配置执行成功或失败的任务的保留时长,开启任务保留会一直占用资源。超过该时长的任务将被删除。

      重要

      DLC 任务删除后无法恢复,请谨慎操作。

    • 专有网络

      • 不配置专有网络,将使用公网连接。由于公网连接的带宽有限,可能导致任务执行过程中出现卡顿或无法正常进行的情况。

      • 配置专有网络,以确保充足的网络带宽和更稳定的性能。

        选择当前地域可用的专有网络,并选择对应的交换机与安全组。配置完成后,任务运行的集群将能够直接访问此专有网络内的服务,并使用此处选择的安全组进行安全访问限制。

        此外,您在配置专有网络时还可以配置 公网访问网关 ,支持以下两种配置方法:

        • 专有网关 :您可以使用不同的带宽来独享网络资源。选择该方式后,您需要为 DLC 任务关联的专有网络创建公网 NAT 网关、绑定 EIP 并配置 SNAT 条目。配置方法,请参考 DSW 通过专有公网网关访问公网

        • 公有网关 :使用共享的公网带宽,在用户高并发时下载速度会比较慢。

      重要
      • 当前运行 DLC 任务时,需保障任务资源组实例、数据集存储(OSS)在同一地域的 VPC 网络环境中,且与代码仓库的网络是连通状态。

      • 如果数据集配置选择 CPFS 类型的数据集,需要配置专有网络,且选择的专有网络需要与 CPFS 一致。否则,提交的 DLC 训练任务可能长时间处于环境准备中状态。

      • 当使用灵骏智算竞价资源提交 DLC 任务时,需要配置专有网络。

    • 容错与诊断

      参数

      描述

      自动容错

      打开 自动容错 开关并配置相应参数后,系统将提供作业检测和控制能力,能够及时检测训练任务算法层面的报错,并规避错误,从而提升 GPU 的利用率。更详细的配置说明,请参见 AIMaster:弹性自动容错引擎

      说明

      启用自动容错功能后,系统将启动一个 AIMaster 实例与任务实例一起运行,这会占用一定的计算资源。关于 AIMaster 实例资源使用详情如下:

      • 资源配额:1 CPU 核和 1 GiB 内存。

      • 公共资源:使用 ecs.c6.large 规格。

      健康检测

      打开 健康检测 开关,健康检测会对参与训练的资源进行全面检测,自动隔离故障节点,并触发后台自动化运维流程,有效减少任务训练初期遇到问题的可能性,提升训练成功率。详情请参见 SanityCheck:算力健康检测

      说明

      仅基于灵骏智算资源配额提交的 Pytorch 类型的训练任务且 GPU(卡数)大于 0 时,支持开启健康检测功能。

    • 角色与权限

      实例 RAM 角色配置说明如下。关于该功能更详细的内容介绍,请参见 配置 DLC RAM 角色

      实例 RAM 角色

      描述

      PAI 默认角色

      基于服务角色 AliyunPAIDLCDefaultRole 运作,它仅拥有访问 ODPS、OSS 的权限,且权限更加精细。基于 PAI 默认角色签发的临时访问凭证:

      • 在访问 MaxCompute 表时,将拥有等同于 DLC 实例所有者 的权限。

      • 在访问 OSS 时,仅能访问当前工作空间配置的默认 OSS 存储空间(Bucket)。

      自定义角色

      选择或填写一个自定义的 RAM 角色。在实例内基于 STS 临时凭证访问云产品时,拥有的权限将与该自定义角色的权限保持一致。

      不关联角色

      不为 DLC 任务关联 RAM 角色,默认选择该方式。

  3. 参数配置完成后,单击 确定

通过 SDK 或命令行创建

Python SDK

步骤一:安装 Python SDK

  • 安装工作空间 SDK。

    pip install alibabacloud_aiworkspace20210204==3.0.1
  • 安装 DLC SDK。

    pip install alibabacloud_pai_dlc20201203==1.4.17

步骤二:提交任务

  • 如果您希望采用按量计费方式提交训练任务,可以使用公共资源。使用公共资源提交的训练任务可能会遇到排队延时,建议在任务量相对较少,对任务时效性要求不高的场景下使用。

  • 如果您希望采用包年包月方式提交训练任务,可以使用 AI 计算资源(包括通用计算资源和灵骏智算资源)。在任务量相对较多时,通过 AI 计算资源来保障训练任务能正常执行。

  • 如果您希望降低任务运行所需的资源成本,可以使用竞价资源。竞价资源通常有一定幅度的折扣,但不是稳定承诺可用的计算资源,有可能会出现无法立即抢占或被回收的情况。关于竞价资源的使用限制和详情介绍,请参见 使用竞价任务

使用公共资源提交任务

创建并提交任务的具体调用代码如下所示。

#!/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,
        "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)
if __name__ == '__main__':
    main()

使用预付费资源配额提交任务

  1. 登录 PAI 控制台

  2. 按照下图操作指引,在工作空间列表页面查看您所在的工作空间 ID。 image.png

  3. 按照下图操作指引,查看您的专有资源组的资源配额 ID。 image

  4. 使用以下代码创建并提交任务。可使用的公共镜像列表,详情请参见 步骤二:准备镜像

    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,用来访问DLCAPI。
    region = 'cn-hangzhou'
    # 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
    # 强烈建议不要把AccessKey IDAccessKey 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

使用竞价资源提交任务

  • SpotDiscountLimit(Spot 折扣)

    #!/usr/bin/env python3
    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 CreateJobRequest
    region_id = '<region-id>'  # DLC任务所在地域ID,例如华东1(杭州)为cn-hangzhou。
    cred = CredClient()
    workspace_id = '12****'  # DLC任务所在工作空间ID。
    dlc_client = DLCClient(
        Config(credential=cred,
               region_id=region_id,
               endpoint='pai-dlc.{}.aliyuncs.com'.format(region_id),
               protocol='http'))
    create_job_resp = dlc_client.create_job(CreateJobRequest().from_map({
        'WorkspaceId': workspace_id,
        'DisplayName': 'sample-spot-job',
        'JobType': 'PyTorchJob',
        'JobSpecs': [
                "Type": "Worker",
                "Image": "dsw-registry-vpc.<region-id>.cr.aliyuncs.com/pai/pytorch-training:1.12-cpu-py39-ubuntu20.04",
                "PodCount": 1,
                "EcsSpec": 'ecs.g7.xlarge',
                "SpotSpec": {
                    "SpotStrategy": "SpotWithPriceLimit",
                    "SpotDiscountLimit": 0.4,
        'UserVpc': {
            "VpcId": "vpc-0jlq8l7qech3m2ta2****",
            "SwitchId": "vsw-0jlc46eg4k3pivwpz8****",
            "SecurityGroupId": "sg-0jl4bd9wwh5auei9****",
        "UserCommand": "echo 'Hello World' && ls -R /mnt/data/ && sleep 30 && echo 'DONE'",
    job_id = create_job_resp.body.job_id
    print(f'jobId is {job_id}')
    
  • SpotPriceLimit(Spot 价格)

    #!/usr/bin/env python3
    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 CreateJobRequest
    region_id = '<region-id>'
    cred = CredClient()
    workspace_id = '12****'
    dlc_client = DLCClient(
        Config(credential=cred,
               region_id=region_id,
               endpoint='pai-dlc.{}.aliyuncs.com'.format(region_id),
               protocol='http'))
    create_job_resp = dlc_client.create_job(CreateJobRequest().from_map({
        'WorkspaceId': workspace_id,
        'DisplayName': 'sample-spot-job',
        'JobType': 'PyTorchJob',
        'JobSpecs': [
                "Type": "Worker",
                "Image": "dsw-registry-vpc.<region-id>.cr.aliyuncs.com/pai/pytorch-training:1.12-cpu-py39-ubuntu20.04",
                "PodCount": 1,
                "EcsSpec": 'ecs.g7.xlarge',
                "SpotSpec": {
                    "SpotStrategy": "SpotWithPriceLimit",
                    "SpotPriceLimit": 0.011,
        'UserVpc': {
            "VpcId": "vpc-0jlq8l7qech3m2ta2****",
            "SwitchId": "vsw-0jlc46eg4k3pivwpz8****",
            "SecurityGroupId": "sg-0jl4bd9wwh5auei9****",
        "UserCommand": "echo 'Hello World' && ls -R /mnt/data/ && sleep 30 && echo 'DONE'",
    job_id = create_job_resp.body.job_id
    print(f'jobId is {job_id}')
    

其中关键配置说明如下:

参数

描述

SpotStrategy

竞价策略。仅该参数设置为 SpotWithPriceLimit 时,出价类型才能生效。

SpotDiscountLimit

出价类型为 Spot 折扣。

说明
  • SpotDiscountLimit SpotPriceLimit 不能同时设置。

  • 灵骏竞价资源出价类型仅支持 SpotDiscountLimit

SpotPriceLimit

出价类型为 Spot 价格。

UserVpc

使用灵骏竞价资源提交任务时,该参数必填。配置任务所在地域的专有网络、交换机和安全组 ID。

命令行

步骤一:下载客户端并执行用户认证

根据您使用的操作系统下载 Linux 64 Mac 版本的客户端工具并完成用户认证,详情请参见 准备工作

步骤二:提交任务

  1. 登录 PAI 控制台

  2. 按照下图操作指引,在工作空间列表页面查看您所在的工作空间 ID(WorkspaceID)。

    image.png

  3. 按照下图操作指引,查看您的资源配额 ID。

    image

  4. 参考以下文件内容准备参数文件 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>
  5. 使用以下代码示例传入 params_file 参数提交任务,可以将 DLC 任务提交到指定的工作空间和资源配额。

    ./dlc submit tfjob --job_file  ./tfjob.params
  6. 使用以下代码查看您提交的 DLC 任务。

    ./dlc get job <jobID>

相关文档

提交训练任务后,您可以执行以下操作:

  • 查看任务基本信息、资源视图和操作日志。详情请参见 查看训练详情

  • 管理任务,包括克隆、停止和删除任务等。详情请参见 管理训练任务

  • 通过 Tensorboard 查看结果分析报告。详情请参见 Tensorboard

  • 设置任务的监控与报警。详情请参见 训练监控与报警

  • 查看任务运行的账单明细。详情请参见 账单明细

  • 在工作空间中配置 SLS 日志转发功能,将当前工作空间中的 DLC 任务日志转发至指定的 SLS 日志库,实现自定义分析。详情请参见 订阅任务日志

  • PAI 工作空间的事件中心中创建消息通知规则,以便跟踪和监控 DLC 任务的状态。详情请参见 消息通知

  • 有关在执行 DLC 任务过程中可能出现的问题及其解决方法,请参考 DLC 常见问题

  • 关于 DLC 的使用案例,请参见 DLC 使用案例汇总

附录:高级参数列表

参数(key)

参数说明

参数取值(value)

createSvcForAllWorkers

是否允许 worker 间网络互通。

  • 若为 true ,则允许所有 PyTorch worker 之间网络互通。

  • 若为 false 或未配置,则默认仅有 master 可以被访问。

打开后,每个 worker 的域名即为 worker 名,如 dlcxxxxx-master-0 ,后续会通过环境变量 JOB_NAME 将作业名称( dlcxxxxx )传到 worker 内部,之后您即可得出需要访问的具体 worker 的域名。

true false

customPortList

允许用户定义每个 worker 上开放的网络端口,可与 createSvcForAllWorkers 配合使用实现 worker 间的网络互通。

若未配置,则默认仅有 master 上开放 23456 号端口。因此也请注意在该自定义端口列表中避开 23456 号端口。

重要

该参数与 customPortNumPerWorker 互斥,请不要同时设置。

分号分隔的一组字符串,其中每个字符串为一个端口号,或由短横线连接的一个端口范围,如 10000;10001-10010 (将会转化为从 10000 10010 连续的 11 个端口号)

customPortNumPerWorker

允许用户请求为每个 worker 开放若干个网络端口,可与 createSvcForAllWorkers 配合使用实现 worker 间的网络互通。

若未配置,则默认仅在 master 上开放 23456 号端口。 DLC 会根据参数定义的端口数目,为 worker 随机分配端口,具体分配的端口号会通过环境变量 CUSTOM_PORTS 传到 worker 内部供您查询,格式为分号分隔的一组端口号。

重要
  • 该参数与 customPortList 互斥,请不要同时设置。

  • 由于灵骏智算资源未提供自定义端口能力,因此当使用灵骏智算资源提交 DLC 任务时,不支持配置 customPortNumPerWorker 参数。

整数(最大为 65536)