全部產品
Search
文件中心

Platform For AI:建立訓練任務

更新時間:Aug 14, 2024

完成準備工作後,您可以通過控制台、Python SDK或命令列提交DLC任務。本文為您介紹提交DLC任務的具體操作步驟。

前提條件

通過控制台建立

步驟一:進入建立任務頁面

  1. 登入PAI控制台

  2. 在左側導覽列單擊工作空間列表,在工作空間列表頁面中單擊待操作的工作空間名稱,進入對應工作空間內。

  3. 在工作空間頁面的左側導覽列選擇模型開發與訓練 > 分布式訓練(DLC),在分布式訓練(DLC)頁面中單擊建立任務,進入建立任務頁面。

步驟二:配置訓練任務的參數

基本資料

基本資料地區,配置任務名稱標籤

環境資訊

環境資訊地區,完成以下關鍵參數的配置:

參數

描述

節點鏡像

工作節點的鏡像。當前支援選擇使用不同類型的鏡像:

  • 官方鏡像:由阿里雲PAI產品提供的多種官方鏡像,支援不同的Python版本及深度學習架構(包括TensorFlow、PyTorch等)。鏡像列表及詳情,請參見準備工作

  • 自訂鏡像:可選擇使用您添加到PAI的自訂鏡像,選擇前,您需要先將自訂鏡像添加到PAI中,操作詳情請參見自訂鏡像

    說明

    當資源配額選擇靈駿智算資源時,為了充分利用靈駿智算資源的高效能RDMA網路,當使用自訂鏡像時,需手動安裝RDMA,操作詳情請參見RDMA:使用高效能網路進行分布式訓練

  • 鏡像地址:支援配置您的自訂鏡像或官方鏡像地址。您需要在配置框中配置公網環境下可訪問的Docker Registry Image URL。

    如果您配置的是私人鏡像地址,您需要單擊輸入,並配置鏡像倉庫使用者名稱鏡像倉庫密碼,為私人鏡像倉庫授權。

    您也可以使用加速鏡像,來提升模型訓練速度。詳情請參見鏡像加速

掛載配置

指定任務運行過程中,任務資料的儲存位置,以擴充訓練任務所需的儲存空間。

單擊添加按鈕,進行掛載配置,支援以下三種掛載類型:

  • 自訂資料集:需配置為前期已準備好的資料集。關於如何準備資料集,請參見準備工作

  • 公用資料集:配置為PAI預置的公用資料集,只支援唯讀掛載模式。

  • Object Storage Service:支援直接掛載OSS路徑。

三種掛載類型均需要配置掛載路徑,表示將資料集掛載到DLC容器的指定路徑,例如/mnt/data。運行代碼時,DLC會按照該路徑檢索所需檔案。

重要
  • 如果添加OSS或NAS類型的資料集,則需要授權PAI訪問相關雲產品OSS或NAS的許可權,否則讀取或寫入資料失敗。詳情請參見PAI訪問雲產品授權:OSS與NAS

  • 如果配置了CPFS類型的資料集,則需要配置專用網路,且選擇的專用網路需要與CPFS一致。否則,提交的DLC訓練任務會運行異常,表現為已出隊。

啟動命令

本任務需要執行的命令。支援Shell命令。例如,使用python -c "print('Hello World')"運行Python。

提交訓練任務時,PAI會自動注入多個通用環境變數,您可以通過配置$環境變數名,來擷取指定環境變數的值。關於DLC預設提供的環境變數列表,請參見通用環境變數列表

說明
  • 如果配置了資料集,則訓練結果可以輸出到資料集掛載目錄。

  • 如果您在執行命令時通過配置啟動參數來指定了輸出路徑,則訓練結果將會輸出到指定的路徑中。

環境變數

提供額外的配置資訊或參數。格式為Key:Value。最多支援配置20個環境變數。

三方庫配置

支援以下兩種配置方式:

  • 三方庫列表:直接在下方文字框中輸入三方庫。

  • requirements.txt檔案目錄:將第三方庫寫入requirements.txt檔案中,在下方文字框中指定該requirements.txt檔案的路徑。

代碼配置

支援以下兩種配置方式:

  • 線上配置

    指定任務代碼檔案的儲存位置(代碼倉庫資訊)。此處需配置為此前已準備好的代碼配置。關於如何準備代碼集,請參見步驟四:準備代碼集

    說明

    由於DLC會將代碼下載至指定工作路徑,所以您需要有代碼倉庫的存取權限。

  • 本地上傳

    單擊image.png按鈕後,按照介面操作指引上傳代碼配置。上傳成功後,將掛載路徑配置為容器內部的指定路徑,例如/mnt/data

資源資訊

資源資訊地區,完成以下關鍵參數的配置:

參數

描述

資源類型

僅當工作空間同時支援使用靈駿智算資源和通用計算資源提交DLC任務時,才支援選擇資源類型:

  • 靈駿智算

    說明

    僅華北6(烏蘭察布)和新加坡地區支援使用靈駿智算資源。

  • 通用計算

資源來源

您可以選擇使用公用資源資源配額(包括通用計算資源或靈駿智算資源)。

說明

目前公用資源支援啟動並執行資源上限為GPU 2卡、CPU 8核。如果您在訓練任務時使用的公用資源超出上限,請聯絡您的商務經理來提升資源上限。

資源配額

資源來源選擇資源配額時,需要配置該參數。選擇已準備好的資源配額,關於如何準備資源配額,請參見資源配額(Quota)功能介紹

優先順序

資源來源選擇資源配額時,支援配置該參數。

表示同時啟動並執行任務執行的優先順序,取值範圍為[1,9],其中1表示優先順序最低。

架構

支援使用以下幾種深度學習訓練架構和訓練工具,它們提供了豐富的功能和介面,方便您進行構建、訓練和最佳化深度學習模型。

  • Tensorflow

  • PyTorch

  • ElasticBatch

  • XGBoost

  • OneFlow

  • MPIJob

說明
  • 資源配額選擇靈駿智算資源時,僅支援提交Tensorflow、PyTorch、ElasticBatch、MPIJob類型的任務。

任務資源

根據您選擇的架構,支援配置Worker節點、PS節點、Chief節點、Evaluator節點和GraphLearn節點。

  • 使用公用資源

    支援配置以下參數:

    • 節點數量:運行DLC任務的節點數量。

    • 資源規格:您可以單擊image.png按鈕來選擇資源規格。關於資源規格的費用詳情,請參見分布式訓練(DLC)計費說明

  • 使用通用計算資源或靈駿智算資源

    各類節點支援配置的參數項一致,均包含節點數量CPU(核心數)GPU(卡數)記憶體(GiB)共用記憶體(GiB)等配置項。

最長運行時間長度

您可以設定任務啟動並執行最長時間長度,在完成配置後,超過該時間長度的任務將停止運行。預設為30天。

保留時間長度

配置執行成功或失敗的任務的保留時間長度。超過該時間長度的任務將被刪除。

重要

DLC任務刪除後無法恢複,請謹慎操作。

專用網路配置

資源來源選擇公用資源時,支援配置該參數。

  • 不配置專用網路,將使用公網串連。由於公網串連的頻寬有限,可能導致任務執行過程中出現卡頓或無法正常進行的情況。

  • 配置專用網路,以確保充足的網路頻寬和更穩定的效能。

    選擇當前地區可用的專用網路,並選擇對應的交換器與安全性群組。配置完成後,任務啟動並執行叢集將能夠直接存取此專用網路內的服務,並使用此處選擇的安全性群組進行安全訪問限制。

    此外,您在配置專用網路時還可以配置公網訪問網關,支援以下兩種配置方法:

    • 專有網關:獨享頻寬,您可以根據需求選擇不同的頻寬。選擇該方式後,您需要為DLC任務關聯的專用網路建立公網NAT Gateway、綁定EIP並配置SNAT條目。配置方法,請參考DSW通過專有公網網關訪問公網

    • 公有網關:使用共用的公網頻寬,在使用者高並發時下載速度會比較慢。

重要
  • 當前運行DLC任務時,需保障任務資源群組執行個體、資料集儲存(OSS)在同一地區的VPC網路環境中,且與代碼倉庫的網路是連通狀態。

  • 如果資料集配置選擇CPFS類型的資料集,需要配置專用網路,且選擇的專用網路需要與CPFS一致。否則提交的DLC訓練任務會運行異常,表現為已出隊。

容錯與診斷

容錯與診斷地區,完成以下關鍵參數的配置:

參數

描述

自動容錯

開啟自動容錯開關並配置相應參數後,系統將提供作業檢測和控制能力,能夠及時檢測訓練任務演算法層面的報錯,並規避錯誤,從而提升GPU的利用率。更詳細的配置說明,請參見AIMaster:彈性自動容錯引擎

健康檢測

開啟健康檢測開關,健康檢測會對參與訓練的資源進行全面檢測,自動隔離故障節點,並觸發後台自動化營運流程,有效減少任務訓練初期遇到問題的可能性,提升訓練成功率。詳情請參見SanityCheck:算力健康檢測

說明

僅基於靈駿智算資源提交的訓練任務支援開啟健康檢測功能。

角色資訊

角色資訊地區,配置執行個體RAM角色。關於該功能更詳細的內容介紹,請參見配置DLC RAM角色

執行個體RAM角色

描述

PAI預設角色

基於服務角色AliyunPAIDLCDefaultRole運作,它僅擁有訪問ODPS、OSS的許可權,且許可權更加精細。基於PAI預設角色簽發的臨時訪問憑證:

  • 在訪問MaxCompute表時,將擁有等同於DLC執行個體所有者的許可權。

  • 在訪問OSS時,僅能訪問當前工作空間配置的預設OSS儲存空間(Bucket)。

自訂角色

選擇或填寫一個自訂的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()

使用預付費資源配額提交任務

  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,用來訪問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版本的用戶端工具並完成使用者認證,詳情請參見準備工作

步驟二:提交任務

  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使用案例匯總