创建DSW实例
交互式建模(DSW)是PAI产品的云端机器学习开发IDE,为您提供交互式编程环境。在使用DSW前,您需要创建DSW实例。DSW支持通过控制台和Python SDK两种方式创建实例。本文为您介绍如何创建DSW实例。
背景信息
DSW支持通过控制台或Python SDK的方式创建实例,二者分别适用于不同的用户:
通过控制台创建实例
适用于普通开发者,您可以通过控制台管理实例,例如,在DSW中进行模型开发的开发者。
通过Python SDK创建实例
适用于需要对实例整体生命周期进行管理的开发者。例如,您需要将DSW系统中的资源整合到其他系统中,可以通过DSW的OpenAPI SDK实现。
前提条件
权限开通
使用主账号开通PAI并创建工作空间。登录PAI控制台,左上角选择开通区域,然后一键授权和开通产品,详情见开通PAI并创建工作空间。
操作账号授权。当使用主账号操作DSW实例时,可跳过此步。当使用RAM账号操作时,需要进行操作账号授权。
【可选】准备专有资源组
在完成步骤1后,系统将为您准备好公共资源组。当您需要使用专有资源组时,需要购买专有资源并分配资源配额,具体操作可参见下面教程。
使用通用计算资源专有资源组。请参见新建资源组并购买通用计算资源和通用计算资源配额。
使用灵骏智算资源。请参见新建资源组并购买灵骏智算资源和灵骏智算资源配额。
【可选】准备数据集
公共资源组和专有资源组默认数据存储空间有限,且无法持久化存储,因此,当您需要扩展实例的存储空间或持久化存储数据时,可通过挂载NAS、OSS类型数据集或OSS路径的方式实现。新建数据集,请参见创建及管理数据集。
重要公共资源组的DSW实例,数据存储在空间有限的免费云盘中,在删除实例或停机超过15天后,云盘数据将被清空。
专有资源组的DSW实例,数据存储在实例的系统盘中,在停止或删除实例后,临时存储将被清空。
【可选】自定义镜像
DSW预置了多种类型的官方镜像,例如PyTorch、TensorFlow、ModelScope等。如果您需要自定义镜像来满足特定场景下的开发需求,请参见自定义镜像。
使用限制
由于每个阿里云账号(主账号)在每个Region有2卡GPU的限制,当资源使用量超出限额时可能会出现报错。如果您需要提升限额,请提交工单联系我们。
创建实例
当您使用公共资源创建实例后,将开始按照实例的服务时长计费,当停止或删除实例后计费才会停止,详细计费规则,请参见交互式建模(DSW)计费说明。
通过控制台创建实例
进入DSW页面。
登录PAI控制台。
在概览页面选择目标地域。
在左侧导航栏单击工作空间列表,在工作空间列表页面中单击待操作的工作空间名称,进入对应工作空间内。
在工作空间页面的左侧导航栏选择 ,进入DSW页面。
单击新建实例。
在配置实例向导页面,配置以下关键参数。
公共资源组,目前仅支持按量付费模式,无法转为包年包月。
通用训练资源专有资源组。如果没有可选的专有资源组,您可以单击关联资源配额。
灵骏智算资源。如果没有可选的灵骏智算资源,您可以单击关联资源配额。
优先级: 优先级范围为1~9 ,数值越大,优先级越高。
CPU亲和性:启用CPU亲和性,能够将容器或Pod中的进程绑定到特定的CPU核心上执行。通过这种方式,可以减少CPU缓存未命中、上下文切换等现象,从而提高CPU利用率,提升应用性能,适用于对性能敏感和实时性要求高的场景。当前仅华北2(北京)、华南1(深圳)地域支持配置该参数。
当资源配额选择公共资源组时,根据实际需求选择资源规格,规格信息,请参见实例规格族。
当资源组选择专有资源组时,根据实际需求设置GPU、CPU、GiB和优先级。
当资源配额选择公共资源组时:
每个实例会免费赠送100 GiB云盘作为系统盘,用于持久化存储。如果实例停机超过15天,云盘的内容将被清空。云盘支持扩容,具体扩容价格以控制台界面为准。
扩容后不支持缩容,请按需操作扩容。
扩容后整块系统盘(免费+付费)后,不再受到停机15天释放的限制,但会持续产生费用。
实例删除系统盘同步销毁,删除前请确保必要数据备份。
当资源配额选择专有资源组时:
使用实例自带的系统盘,并作为数据的临时存储,在停止或删除实例后,存储将被清空。
多个数据集挂载的路径不能重复。
如果配置了CPFS类型的数据集,则需要设置网络配置,且选择的专有网络需要与CPFS一致。否则,DSW实例可能会创建失败。
当资源组选择专有资源组时,第一个数据集必须选择NAS类型数据集,且会被同时挂载到您指定的路径和DSW默认工作目录/mnt/workspace/下。
公有网关:集群中的DSW实例使用共享的公网带宽,在用户高并发时下载速度会比较慢。
专有网关:独享带宽,您可以根据需求选择不同的带宽。选择该方式后,您需要为DSW实例关联的专有网络创建公网NAT网关、绑定EIP并配置SNAT条目。具体配置方法,请参见DSW通过专有公网网关访问公网。
启用所有选项:默认为关闭,系统会禁用与CPFS类型的数据集不通的专有网络。
隐藏禁用选项:选中复选框,系统会隐藏与CPFS类型的数据集不通的专有网络。
VPC内访问:默认支持该访问方式。您可以从VPC内的其他终端(例如ECS),通过SSH远程连接DSW实例。
公网访问:选中该项,可以增加公网访问方式。后续,您可以通过本地命令行或其他终端使用SSH远程连接DSW实例。
NAT网关:选择为专有网络创建的公网NAT网关。
弹性公网IP:选择在公网NAT网关中已创建的弹性公网IP。
PAI默认角色:拥有访问PAI内部产品、MaxCompute和OSS的权限。基于PAI默认角色签发的临时访问凭证,在访问PAI内部产品、MaxCompute表时,将拥有等同于DSW实例所有者的权限;在访问OSS时,仅能访问当前工作空间配置的默认存储路径Bucket。
自定义角色:当您想要定制或者更精细的权限管理,可以配置自定义角色。
不关联角色:当您想直接通过AccessKey访问其它云产品时,可以选择不关联角色。
确认所选配置无问题后,单击确定。
参数 | 描述 | |
基础信息 | 实例名称 | 参考界面提示信息配置DSW实例名称。 |
资源信息 | 资源配额 | 支持选择: 说明 当选择通用训练资源专有资源组或灵骏智算资源组创建DSW实例时,还需要设置以下参数: |
资源规格 | ||
环境信息 | 镜像 | 支持选择以下镜像: |
系统盘 | 警告 如果您需要永久性存储,可以配置数据集,或在挂载配置中添加OSS路径。 | |
数据集 | 单击添加,可挂载已创建的自定义数据集,其中,OSS类型的自定义数据集支持多种挂载模式和自定义配置,公共数据集只支持只读挂载模式。 说明 | |
挂载配置 | 单击添加,可直接挂载OSS路径,OSS支持多种挂载模式和自定义配置。 | |
工作目录 | 工作目录是Notebook、WebIDE的启动路径,挂载至 | |
网络信息 | 专有网络配置 | 仅当资源配额选择公共资源时,支持配置该参数。 当您想要在专有网络内使用DSW实例时,可配置此参数,同时配置交换机和安全组。不同场景的配置策略详情,请参见DSW网络配置。 |
公网访问网关 | 公网访问网关支持以下配置方法: 仅当挂载配置选择CPFS类型的数据集时,支持配置以下参数: 说明 如果挂载配置选择了CPFS类型的数据集,则需要配置专有网络,且选择的专有网络需要与CPFS一致。 | |
访问配置 | 启用SSH | 选择专有网络后可配置SSH。 启用后您可基于已选专有网络,使用SSH原生方式直连登录DSW实例。 若您配置了自定义镜像,请确认自定义镜像安装了sshd。 |
SSH公钥 | 打开SSH配置开关后可配置该参数。 说明 如果您需要同时支持VPC内登录和公网登录方式,您需要同时添加多个客户端的公钥。请按照回车换行的方式逐个添加公钥,最多支持添加10个公钥。 | |
SSH访问方式 | 打开SSH配置开关后可配置该参数。 | |
自定义服务 | 将实例中启动的自定义服务提供对外访问能力。具体配置,请参见自定义服务访问配置。 | |
高级信息 | 可见范围 | 可选择仅实例所有者可见或工作空间内公开可见。 |
实例所有者 | 仅工作空间管理员可修改实例所有者。 | |
实例RAM角色 | 当在DSW实例内访问其他云资源时,可以为实例关联RAM角色,该方式基于STS临时凭证访问其他云资源,无需配置长期AccessKey,有效降低密钥泄露的风险。 实例RAM角色可配置为: 更多关于实例RAM角色的配置说明,请参见配置DSW实例RAM角色。 |
通过Python SDK创建实例
安装阿里云的Credentials工具。当您通过阿里云SDK调用OpenAPI进行资源操作时,必须安装Credentials工具配置凭证信息。要求:
Python版本 >= 3.7。
使用V2.0代系的阿里云SDK。
pip install alibabacloud_credentials
获取账号AccessKey。本示例使用AK信息配置访问凭证,为防止账号信息泄漏,建议您将AccessKey配置为环境变量,id和secret环境变量名分别为ALIBABA_CLOUD_ACCESS_KEY_ID,ALIBABA_CLOUD_ACCESS_KEY_SECRET。
获取AccessKey信息,请参见创建AccessKey。
如何设置环境变量,请参见配置环境变量。
其它Credentials凭证配置方式,请参见安装Credentials工具。
安装PAI相关Python SDK。
# 工作空间SDK安装。
pip install alibabacloud-aiworkspace20210204 -U -q
# DSW SDK安装。
pip install alibabacloud_pai_dsw20220101 -U -q
# OpenAPI依赖。
pip install alibabacloud_tea_openapi -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
创建一个DSW实例。
创建实例的代码示例如下所示。
import os
from alibabacloud_credentials.client import Client
from alibabacloud_credentials.models import Config
from alibabacloud_aiworkspace20210204.client import Client as AIWorkspaceClient
from alibabacloud_aiworkspace20210204.models import (ListWorkspacesRequest,
ListImagesRequest,
ListDatasetsRequest,
ListResourcesRequest)
from alibabacloud_pai_dsw20220101.client import Client as DSWClient
from alibabacloud_pai_dsw20220101.models import (GetInstanceRequest,
ListInstancesRequest,
ListEcsSpecsRequest,
CreateInstanceRequest,
StopInstanceRequest,
CreateInstanceShutdownTimerRequest,
CreateInstanceRequestRequestedResource,
CreateInstanceSnapshotRequest,
ListInstanceSnapshotRequest,
GetInstanceMetricsRequest,
CreateIdleInstanceCullerRequest)
from alibabacloud_tea_openapi.models import Config as AliyunConfig
from alibabacloud_tea_openapi.client import TeaException
# 配置访问凭证
# 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
# 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码中,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
# 本示例通过Credentials SDK默认从环境变量中读取AccessKey进行身份验证。
region_id = 'cn-beijing' # Region,可以是cn-hangzhou、cn-shanghai、cn-shenzhen等。
config = Config(
type='access_key',
access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
)
cred = Client(config)
# client config。
workspace_client = AIWorkspaceClient(
config=AliyunConfig(
credential=cred,
region_id=region_id,
endpoint="aiworkspace.{}.aliyuncs.com".format(region_id),
)
)
dsw_client = DSWClient(
config=AliyunConfig(
credential=cred,
region_id=region_id,
endpoint='pai-dsw.{}.aliyuncs.com'.format(region_id),
)
)
# 定义一个用来显示DSW实例信息的Helper函数。
def show_instance(instance_id):
instance = dsw_client.get_instance(instance_id=instance_id, request=GetInstanceRequest()).body
print(instance.status, instance.instance_name, instance.ecs_spec, instance.accumulated_running_time_in_ms)
# 查询一个已经存在的工作空间(Workspace)的属性和ID。
workspace_name = '已有的AI工作空间名称'
# 获取工作空间列表。
workspaces = workspace_client.list_workspaces(ListWorkspacesRequest(
page_number=1,
page_size=10,
workspace_name=workspace_name, # 模糊匹配,如果未指定名称,则返回所有workspace。
))
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
# 获取镜像列表,可以使用labels进行过滤。
images = workspace_client.list_images(ListImagesRequest(
page_size=100,
#workspace_id=workspace_id, #不指定workspace_id则意味着查询所有PAI平台内置的镜像
labels=','.join(['system.supported.dsw=true',
#'system.framework=tensorflow', #指定pytorch或者tensorflow
'system.pythonVersion=3.6',
]),
verbose=True # verbose=True会列出更加详细的信息,包括labels
))
# 可以查看所有可用的镜像。
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)
# 获取DSW的节点规格列表。
try:
resp = dsw_client.list_ecs_specs(ListEcsSpecsRequest(accelerator_type='CPU', # CPU 或者 GPU
)).body
except TeaException as t:
print("List ECS Specs failed:", t.message)
else:
for spec in resp.ecs_specs:
print(spec.instance_type + ", CPU: " + str(spec.cpu) + ", Memory: " + str(spec.memory))
# 获得用于提交任务的节点规格。
ecs_spec = resp.ecs_specs[0].instance_type
print('Selected ecs_spec:', ecs_spec)
# 创建DSW实例。
request = CreateInstanceRequest(instance_name="Test_From_SDK_1",
ecs_spec=ecs_spec,
workspace_id=workspace_id,
#image_id='', #可以指定工作空间中的镜像的ID,但是与image_url只能指定一个参数
image_url=image_uri)
try:
ins_resp = dsw_client.create_instance(request)
except TeaException as t:
print('创建实例失败,错误消息:' + t.message)
else:
instance_id = ins_resp.body.instance_id
print("Created Instance ID:", instance_id)
show_instance(instance_id)
关于更多接口的说明,请参见API概览。