news 2026/9/23 4:56:23

NNI 结合阿里云 PAI-DLC 训练服务:配置、原理与实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
NNI 结合阿里云 PAI-DLC 训练服务:配置、原理与实战
  • 人工智能
  • AutoML
  • 机器学习
  • 深度学习
  • 模型压缩
  • 特征工程

【免费下载链接】nni

An open source AutoML toolkit for automate machine learning lifecycle, including feature engineering, neural architecture search, model compression and hyper-parameter tuning.

项目地址:https://gitcode.com/gh_mirrors/nn/nni
点击查看免费下载

导读

本文基于 NNI 官方文档《PAI-DLC Training Service》,系统讲解如何让 NNI 实验在阿里云 PAI-DSW 上运行、并将 Trial 提交到基于 ACK 的 PAI-DLC 深度学习容器集群执行。读完本文,你将掌握 DLC 训练服务的前置环境搭建、完整配置 YAML 的每个字段含义与取值约束、启动与监控实验的实操流程,以及 NNI 底层如何通过 Python SDK 完成 DLC 任务提交与状态轮询。

一、架构定位:PAI-DSW 负责提交,PAI-DLC 负责训练

NNI 的 DLC 训练服务采用"控制面与执行面分离"的设计:

  • PAI-DSW(Data Science Workshop)扮演 NNI 实验的承载服务器,负责运行 NNI 进程、调度 Trial、收集结果,同时承担向 PAI-DLC 提交训练作业的角色;
  • PAI-DLC(Deep Learning Containers)是基于阿里云 ACK(容器服务)的深度学习容器平台,Trial 训练作业真正运行的地方。

由于实际计算全部发生在 DLC 集群,PAI-DSW 服务器本身的资源占用很小,官方文档明确指出:你只需要一台 CPU 配置的 DSW 服务器即可。

从源码可以印证这一分工:NNI Manager 侧的实现位于 ts/nni_manager/training_service/reusable/dlc/dlcClient.ts,DlcClient通过 PythonShell 启动dlcUtil.py脚本与阿里云 PAI-DLC SDK 交互,提交 DLC 任务并获取 job_id;而 DSW 与 DLC 之间的文件共享则依赖两者挂载同一块 NAS 磁盘(详见下文localStorageMountPoint/containerStorageMountPoint两个关键配置)。

二、前置条件:四步完成环境准备

Step 1. 安装 NNI

在 PAI-DSW 服务器上安装 NNI,请按项目安装指南操作,确保nnictl命令可用。

Step 2. 创建 PAI-DSW 服务器

参考阿里云官方文档创建 PAI-DSW 实例。由于训练实际在 DLC 上执行,DSW 不承担计算压力,CPU 实例即可满足需求,无需 GPU。

Step 3. 配置 PAI-DLC 数据集并挂载 NAS

在 PAI-DLC 控制台的数据集配置页面,选择与 DSW 服务器相同的 Region,并挂载与 DSW 服务器相同的 NAS 磁盘。

注意:目前 NNI 的 DLC 训练服务仅支持DLC 公共集群(public-cluster)

这一步是整个方案能够运转的关键:DSW 与 DLC 必须共享同一块 NAS,NNI 才能在 DSW 侧写入训练代码与配置、在 DLC 容器内读取并执行(见后文"共享存储挂载"一节)。

Step 4. 在 DSW 上安装 PAI-DLC Python SDK

打开 DSW 的命令行,下载并安装 PAI-DLC 的 Python SDK(若已安装可跳过):

wget https://sdk-portal-cluster-prod.oss-cn-zhangjiakou.aliyuncs.com/downloads/u-3536038a-3de7-4f2e-9379-0cb309d29355-python-pai-dlc.zip unzip u-3536038a-3de7-4f2e-9379-0cb309d29355-python-pai-dlc.zip pip install ./pai-dlc-20201203 # pai-dlc-20201203 为解压后的 SDK 目录名,请按实际情况替换

三、配置详解:DLC 模式下的 NNI 配置文件

NNI 官方以examples/trials/mnist-pytorch为例演示 DLC 用法,仓库中对应的完整配置为 examples/trials/mnist-pytorch/config_dlc.yml:

# working directory on DSW, please provide FULL path searchSpaceFile: search_space.json # the command on trial runner (or, DLC container), be aware of data_dir trialCommand: python mnist.py --data_dir /root/data/{your_data_dir} trialConcurrency: 1 # NOTE: please provide number <= 3 due to DLC system limit. maxTrialNumber: 10 tuner: name: TPE classArgs: optimize_mode: maximize trainingService: platform: dlc type: Worker image: registry-vpc.cn-beijing.aliyuncs.com/pai-dlc/pytorch-training:1.6.0-gpu-py37-cu101-ubuntu18.04 jobType: PyTorchJob # choices: [TFJob, PyTorchJob] podCount: 1 ecsSpec: ecs.c6.large region: cn-hangzhou workspaceId: ${your_workspace_id} accessKeyId: ${your_ak_id} accessKeySecret: ${your_ak_key} nasDataSourceId: ${your_nas_data_source_id} # NAS datasource ID, e.g., datat56by9n1xt0a ossDataSourceId: ${your_oss_data_source_id} # OSS datasource ID, in case your data is on oss localStorageMountPoint: /home/admin/workspace/ # default NAS path on DSW containerStorageMountPoint: /root/data/ # default NAS path on DLC container, change it according your setting

3.1 顶层配置字段

字段取值/说明
searchSpaceFile搜索空间 JSON 文件,内容与本地模式一致
trialCommand在 DLC 容器(Trial 运行端)内执行的命令。注意容器内数据集统一位于/root/data/挂载点下,因此示例中通过--data_dir /root/data/{your_data_dir}指定数据目录
trialConcurrency并发 Trial 数。由于 DLC 系统限制,请务必设为 ≤ 3
maxTrialNumber最大 Trial 数,示例为 10
tuner调参算法,示例使用 TPE 并以maximize模式优化

3.2 trainingService 关键字段

与本地训练服务相比,DLC 模式在trainingService下额外引入了以下配置项:

字段说明
platform必须设置为dlc,NNI 据此选择 DLC 训练服务。这是启动 DLC 模式实验的前提
typeDLC JobSpec 类型,示例为Worker
imageDLC 训练容器的 Docker 镜像地址,示例使用北京 VPC 内的 PyTorch 1.6 GPU 镜像
jobType作业类型,可选TFJobPyTorchJob
podCount每个作业的 Pod 数量,示例为 1
ecsSpec训练使用的 ECS 实例规格,示例为ecs.c6.large
regionDLC 所在地域,必须与 DSW 及 NAS 所在 Region 一致
workspaceIdPAI 工作空间 ID
accessKeyId/accessKeySecret阿里云访问密钥,用于调用 PAI-DLC API
nasDataSourceIdNAS 数据源 ID(如datat56by9n1xt0a),在 DLC "数据集配置"页面创建 NAS 数据源后复制其DataSet ConfigurationID
ossDataSourceIdOSS 数据源 ID,可选;当训练数据存放在 OSS 时使用

3.3 共享存储挂载:两个容易被忽略的关键配置

DLC 模式要求 DSW 与 DLC 挂载同一块 NAS 磁盘以共享实验信息,因此额外引入了两个路径配置:

  • localStorageMountPoint:NAS 在DSW 服务器上的默认挂载路径(示例为/home/admin/workspace/),必须填写完整路径;
  • containerStorageMountPoint:同一块 NAS 在DLC 容器内的挂载路径(示例为/root/data/),可依据你的实际挂载设置调整。

从源码看,这两个路径直接决定了 NNI 实验目录的读写位置。在 ts/nni_manager/training_service/reusable/environments/dlcEnvironmentService.ts 的构造函数中,NNI 使用MountedStorageService(挂载式存储服务)以localStorageMountPoint为根目录构建实验目录nni-experiments/{experimentId};在startEnvironment中,本地工作目录与容器内运行目录分别由两者拼接而成:

const environmentRoot = path.join(this.config.containerStorageMountPoint, `/nni-experiments/${this.experimentId}`); const localRoot = path.join(this.config.localStorageMountPoint, `/nni-experiments/${this.experimentId}`);

随后 DLC 容器内执行命令会被改写为cd ${environmentRoot} && <原始命令>,并把标准输出/错误重定向到容器内 NAS 目录下的日志文件。这意味着只要两块 NAS 挂载一致,DSW 侧就能直接读取 DLC 容器产生的训练产物与日志。

四、启动实验与监控作业

4.1 拉取示例并启动

在 PAI-DSW 命令行中执行:

git clone -b ${NNI_VERSION} https://github.com/microsoft/nni cd nni/examples/trials/mnist-pytorch # 按实际情况修改 config_dlc.yml 中的占位符 ... nnictl create --config config_dlc.yml

其中${NNI_VERSION}替换为已发布的版本名或分支名,例如v2.3。启动前务必在config_dlc.yml中填写真实的workspaceIdaccessKeyIdaccessKeySecretnasDataSourceId等占位符,并把镜像、Region、ECS 规格调整为你账号实际可用的资源。

4.2 在 DLC 控制台监控作业

NNI 实验启动后,DLC 作业的状态需要前往PAI-DLC 控制台的任务列表页面查看,可以按实验名nni_exp_${experimentId}_env_${environmentId}找到对应作业并观察其运行状态、日志与资源使用情况。

五、源码级原理解读:NNI 如何提交与管理 DLC 作业

5.1 配置结构:DlcConfig

在 NNI Manager 中,DLC 训练服务的配置接口定义于 ts/nni_manager/common/experimentConfig.ts 的DlcConfig,它继承了通用TrainingServiceConfig,并声明了localStorageMountPointcontainerStorageMountPointnasDataSourceId等字段,与 YAML 中的键一一对应。运行时配置最终会落在 ts/nni_manager/training_service/reusable/dlc/dlcConfig.ts 的DlcClusterConfig/DlcTrialConfig中,分别承载集群级参数与 Trial 级参数(镜像、命令、代码目录)。

5.2 任务提交:PythonShell + dlcUtil.py

DlcClient.submit()(dlcClient.ts)通过 PythonShell 以python3 -u启动./config/dlc/dlcUtil.py,一次性传入type/image/job_type/pod_count/ecs_spec/region/workspace_id/nas_data_source_id/oss_data_source_id/access_key_id/access_key_secret/experiment_name/user_command/log_dir等参数,随后解析脚本回传的job_id消息并 resolve 出作业 ID。getTrackingUrl()用于获取 DLC 控制台的跟踪链接;stop()向脚本发送stop指令实现作业终止。

5.3 底层 SDK 调用:dlcUtil.py

提交脚本本体位于 ts/nni_manager/config/dlc/dlcUtil.py,它基于阿里云alibabacloud_pai_dlc20201203Python SDK 实现:

  • 根据region构造 DLC Client(支持share这一特殊共享地域,使用pai-dlc-share.aliyuncs.com端点);
  • 将 NAS、OSS 数据源封装为DataSourceItem挂载到作业;
  • 组装CreateJobRequest/JobSpec提交 DLC 作业,作业名称格式为nni_exp_${experiment_id}_env_${environment_id}
  • 将异常写入log_dir下的dlc_exception.log,便于 DSW 侧排查提交失败原因。

5.4 状态轮询与失败处理

DlcEnvironmentService.refreshEnvironmentsStatus()(dlcEnvironmentService.ts)周期性向 DLC 查询作业状态,并做如下映射:

DLC 原始状态NNI 环境状态
CREATING/CREATED/WAITING/QUEUEDWAITING
RUNNINGRUNNING
COMPLETED/SUCCEEDEDSUCCEEDED
FAILEDFAILED(并等待 60 秒再创建新作业,避免连续失败风暴)
STOPPED/STOPPINGUSER_CANCELED

此外,DlcEnvironmentService通过FileCommandChannel建立 NNI 与 Trial 之间的命令通道,命令与日志文件均落在共享 NAS 上(DSW 侧写入、DLC 容器内读取),这正是"DSW 与 DLC 必须挂载同一 NAS"这一前置条件的根本原因。

六、常见注意事项

  1. Region 一致性:DSW、DLC、NAS 三者必须位于同一地域,否则无法挂载数据源或提交作业。
  2. 并发上限trialConcurrency受 DLC 系统限制,官方建议不超过 3。
  3. 仅支持公共集群:目前 NNI 的 DLC 训练服务只支持 DLC 公共集群,私有集群暂不可用。
  4. 完整路径localStorageMountPointtrialCommand中的路径需填写完整路径(FULL path),占位符如{your_working_dir}{your_data_dir}必须替换为实际目录。
  5. 镜像与资源规格:请使用你账号在对应 Region 内可访问的镜像地址与 ECS 规格,GPU 任务需选择带 GPU 的ecsSpec与 GPU 镜像。
  6. 密钥安全accessKeyId/accessKeySecret是阿里云 API 调用凭证,请妥善保管,避免提交到公开仓库。
  • 人工智能
  • AutoML
  • 机器学习
  • 深度学习
  • 模型压缩
  • 特征工程

【免费下载链接】nni

An open source AutoML toolkit for automate machine learning lifecycle, including feature engineering, neural architecture search, model compression and hyper-parameter tuning.

项目地址:https://gitcode.com/gh_mirrors/nn/nni
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/23 4:56:18

手写实现配对小游戏:3招搞定DOM事件流与状态同步

手写实现配对小游戏:3招搞定DOM事件流与状态同步 还在为版本升级后 API 全变了而头疼?React 的 Hooks 变了,Vue 的 Composition API 又更新了,甚至浏览器原生的 EventTarget 行为都在悄悄调整。别慌,今天咱们不依赖任何框架,直接 手写实现 一个经典的…

作者头像 李华
网站建设 2026/9/23 4:56:18

虚拟拍照3个性能坑让首屏慢5秒最佳实践

虚拟拍照3个性能坑让首屏慢5秒最佳实践 报错一堆看不懂 StackTrace,盯着满屏红色警告怀疑人生?别急,这往往是资源加载或计算阻塞导致的“假死”。在虚拟拍照这类重交互、高并发场景下,盲目堆配置只会让情况更糟。今天拆解 3 个高频性能瓶颈,用代码对比说话,帮你把首屏时间从 5 秒砍到 1…

作者头像 李华
网站建设 2026/9/23 4:56:03

2026最新dnf剑魂完美换装实战:告别手残,代码化实现零失误

2026最新dnf剑魂完美换装实战:告别手残,代码化实现零失误 还在为每次进图换装手忙脚乱、属性没切对而懊恼吗?很多老玩家都卡在这个瓶颈: 学会了按键宏,却不知怎么搭建一套稳定、低延迟的自动化换装系统…

作者头像 李华
网站建设 2026/9/23 4:55:58

3个坑让校内人人网变慢?实战项目性能优化全解

3个坑让校内人人网变慢?实战项目性能优化全解 面试被问“为什么列表加载慢”,你答不上来?别慌。 很多在校招或社招中,候选人死就死在 实战项目 的细节上。 特别是像【校内人人网】这种典型的B/S架构项目,性能瓶颈往往藏在不起眼的地方。 今天不聊虚的,直接拆解一个真实的 实战项目 场景。…

作者头像 李华
网站建设 2026/9/23 4:55:55

3个坑解决苹果手机不显示充电实战项目

3个坑解决苹果手机不显示充电实战项目 刚学完Python语法,对着屏幕敲了几天Hello World,结果一打开iPhone,发现插上充电器屏幕右上角那个电池图标里的小闪电标志死活不亮。屏幕不亮、手机没反应,你心里咯噔一下:坏了,这代码是不是写错了?别慌,这不是你代码的问题,这是硬件和软件交互的“实…

作者头像 李华