借助 Vertex AI Neural Architecture Search,您可以根据准确率、延迟时间、内存,这些指标的组合或自定义指标来搜索最佳神经架构。
确定 Vertex AI 神经架构搜索是否是最佳工具
- Vertex AI 神经架构搜索是一种高端优化工具,它用于根据延迟时间、内存或自定义指标等限制条件(也可能没有限制条件),查找就准确率而言的最佳神经架构。可能的神经架构选择的搜索空间最大可达 10^20。它所基于的技术在过去几年中成功产生了多个先进的计算机视觉模型,包括 Nasnet、MNasnet、EfficientNet、NAS-FPN 和 SpineNet。
- 如果您期望输入数据并且无需实验即可获得良好的结果,那么神经架构搜索并不是这样的解决方案。它是一种实验工具。
- 神经架构搜索不用于超参数调节,例如调节学习速率或优化器设置。它仅用于架构搜索。您不应将超参数调节与神经架构搜索结合使用。
- 如果训练数据有限,或者数据集高度不平衡(其中某些类非常少),则不建议使用神经架构搜索。如果您已经由于缺少数据而对基准训练使用大量增强,也不建议使用神经架构搜索。
- 您应该先尝试其他传统和常规的机器学习方法和技术,例如超参数调节。当这些传统方法无法产生进一步提升时,再使用神经架构搜索。
- 您应该有一个负责模型调整的内部团队,该团队对要修改和尝试的架构参数有基本了解。这些架构参数可能包括内核大小、通道或连接数量,或许多其他参数。如果您有一个打算要探索的搜索空间,那么神经架构搜索非常有价值,在探索大型搜索空间时它至少可以减少约六个月的工程时间:架构选项多达 10^20。
- 神经架构搜索适合愿意在实验上花费数千美元的企业客户。
- 神经架构搜索不局限于视觉用例。目前,我们仅提供基于视觉的预构建搜索空间和预构建训练程序,但客户也可以自带非视觉搜索空间和训练程序。
- 神经架构搜索不使用超网络(单样本 NAS 或基于权重共享的 NAS)方法,这种方法只会导入您自己的数据并将其用作解决方案。自定义超网络并非易事,需要花费数个月的时间。与超网络不同,神经架构搜索具有高度可自定义性,可定义自定义搜索空间和奖励。自定义可以在一到两天内完成。
- 全球有 8 个区域支持神经架构搜索。查看您所在区域的功能可用性。
在使用神经架构搜索之前,您还应阅读以下关于预期费用、结果提升和 GPU 配额要求的部分。
预期费用、结果提升和 GPU 配额要求
上图展示了典型的神经架构搜索曲线。Y-axis
显示试验奖励,X-axis
显示启动的试验次数。随着试验次数的增加,控制器会开始寻找更好的模型。因此,奖励会开始增大,之后奖励方差和奖励增长会开始减小并显示收敛。收敛时的试验次数可能因搜索空间大小而异,但大约为 2,000 次试验。每个试验都是一个缩小版的完整训练,称为代理任务,代理任务在两个 Nvidia V100 GPU 上运行约一到两个小时。客户可以随时手动停止搜索,并且可能在收敛点出现之前就找到比基准模型奖励更高的模型。但最好等到收敛点出现后再选择更好的结果。搜索后,下一个阶段是选择前 10 个试验(模型),并对其运行完整训练。
(可选)试运行预构建的 MNasNet 搜索空间和训练程序
在此模式中,观察搜索曲线或少量试验(大约 25 次),并使用预构建的 MNasNet 搜索空间和训练程序进行试运行。
上图显示,一开始在试验 1 处,最佳第 1 阶段奖励为约 0.30,随后在试验 17 处提高到 0.37。由于采样随机性,您的实际运行看起来可能会略有不同,但您应该会看到最佳奖励的微小提高。请注意,这仍然是试运行,并不代表任何概念验证或公共基准验证。
此次运行的费用详情如下:
- 第 1 阶段:
- 试验数量:25
- 每个试验的 GPU 数量:2
- GPU 类型:TESLA_T4
- 每个试验的 CPU 数量:1
- CPU 类型:n1-highmem-16
- 平均单个试验训练时间:3 小时
- 并行试验数量:6
- 使用的 GPU 配额(每个试验的 GPU 数量 * 并行试验数量)= 12 个 GPU。 在试运行中使用 us-central1 区域,并在相同区域托管训练数据。不需要额外的配额。
- 运行时间:(试验总数 * 每个试验的运行时间)/(并行试验数量)= 12 小时
- GPU 小时数(试验总数 * 每个试验的训练时间 * 每个试验的 GPU 数量)= 150 个 T4 GPU 小时
- CPU 小时数(试验总数 * 每个试验的训练时间 * 每个试验的 CPU 数量)= 75 个 n1-highmem-16 小时
- 费用:约 $185。您可以提前停止作业以降低费用。请参阅价格页面来计算确切价格。
由于这是试运行,因此不需要为第 1 阶段中的模型运行完整的第 2 阶段训练。如需详细了解如何运行第 2 阶段,请参阅教程 3。
此运行使用 MnasNet 笔记本。
(可选)预构建 MNasNet 搜索空间和训练程序的概念验证 (POC) 运行
如果您有兴趣几乎复制已发布的 MNasnet 结果,可以使用此模式。根据论文,MnasNet 在 Pixel 手机上实现了 75.2% 的最高准确率和 78 毫秒的延迟时间。速度是 MobileNetV2 的 1.8 倍,准确度高 0.5%;速度是 NASNet 的 2.3 倍,准确率高 1.2%。但是,此示例使用 GPU(而不是 TPU)进行训练,并使用云 CPU (n1-highmem-8) 来评估延迟时间。在本例中,MNasNet 上的预期第 2 阶段最高准确率为 75.2%,云 CPU (n1-highmem-8) 的延迟时间为 50 毫秒。
此次运行的费用详情如下:
第 1 阶段搜索:
- 试验数量:2,000
- 每个试验的 GPU 数量:2
- GPU 类型:TESLA_T4
- 平均单个试验训练时间:3 小时
- 并行试验数量:10
- 使用的 GPU 配额(每个试验的 GPU 数量 * 并行试验数量)= 20 个 T4 GPU。 由于此数字高于默认配额,请通过您的项目界面创建配额申请。如需了解详情,请参阅 setting_up_path。
- 运行时间:(试验总数 * 每个试验的运行时间)/(并行试验数量)/24 = 25 天。注意:作业会在 14 天后终止。之后,您可以使用一个命令轻松恢复搜索作业,使其再运行 14 天。如果您的 GPU 配额较高,则运行时间会按比例减少。
- GPU 小时数(试验总数 * 每个试验的训练时间 * 每个试验的 GPU 数量)= 12,000 个 T4 GPU 小时。
- 费用:约 $15,000
使用前 10 个模型进行第 2 阶段完整训练:
- 试验数量:10
- 每个试验的 GPU 数量:4
- GPU 类型:TESLA_T4
- 平均单个试验训练时间:约 9 天
- 并行试验数量:10
- 使用的 GPU 配额(每个试验的 GPU 数量 * 并行试验数量)= 40 个 T4 GPU。 由于此数字高于默认配额,请通过您的项目界面创建配额申请。如需了解详情,请参阅 setting_up_path。 您还可以使用 20 个 T4 GPU 运行此作业,具体方法,每次使用五个模型运行作业,共运行两次,而不是并行运行所有 10 个模型。
- 运行时间:(试验总数 * 每个试验的运行时间)/(并行试验数量)/24 = 约 9 天
- GPU 小时数(试验总数 * 每个试验的训练时间 * 每个试验的 GPU 数量)= 8,960 个 T4 GPU 小时。
- 费用:约 $8,000
总费用:约 $23,000。请参阅价格页面来计算确切价格。注意:此示例不是普通的常规训练作业。完整的训练会在四个 TESLA_T4 GPU 上运行大约 9 天。
此运行使用 MnasNet 笔记本。
使用您的搜索空间和训练程序
我们提供普通自定义用户的大致费用。您的需求可能因训练任务和使用的 GPU 和 CPU 而异。您至少需要 20 个 GPU 配额才能进行此处所述的端到端运行。注意:性能提升完全取决于您的任务。我们只能提供 MNasnet 等示例作为性能提升的参考示例。
此假设自定义运行的费用详情如下:
第 1 阶段搜索:
- 试验数量:2,000
- 每个试验的 GPU 数量:2
- GPU 类型:TESLA_T4
- 平均单个试验训练时间:1.5 小时
- 并行试验数量:10
- 使用的 GPU 配额(每个试验的 GPU 数量 * 并行试验数量)= 20 个 T4 GPU。 由于此数字高于默认配额,您需要通过项目界面创建配额申请。如需了解详情,请参阅为项目申请额外的设备配额。
- 运行时间:(试验总数 * 每个试验的运行时间)/(并行试验数量)/24 = 12.5 天
- GPU 小时数(试验总数 * 每个试验的训练时间 * 每个试验的 GPU 数量)= 6,000 个 T4 GPU 小时。
- 费用:约 $7,400
使用前 10 个模型进行的第 2 阶段完整训练:
- 试验数量:10
- 每个试验的 GPU 数量:2
- GPU 类型:TESLA_T4
- 平均单次试验训练时间:约 4 天
- 并行试验数量:10
- 使用的 GPU 配额(每个试验的 GPU 数量 * 并行试验数量)= 20 个 T4 GPU。 **由于此数字高于默认配额,您需要通过项目界面创建配额申请。如需了解详情,请参阅为项目申请额外的设备配额。对于自定义配额需求,请参阅相同的文档。
- 运行时间:(试验总数 * 每个试验的运行时间)/(并行试验数量)/24 = 约 4 天
- GPU 小时数(试验总数 * 每个试验的训练时间 * 每个试验的 GPU 数量)= 1,920 个 T4 GPU 小时。
- 费用:约 $2,400
如需详细了解代理任务设计费用,请参阅代理任务设计。费用相当于训练 12 个模型的费用(图中的第 2 阶段使用 10 个模型):
- 使用的 GPU 配额:与图中的第 2 阶段运行相同。
- 费用:(12/10) * 使用 10 个模型的第 2 阶段费用 = 约 $2,880
总费用:约 $12,680。请参阅价格页面来计算确切价格。
这些第 1 阶段搜索费用用于达到收敛点之前的搜索,并旨在获得最大的性能提升。但是,不要等到搜索收敛。如果搜索奖励曲线开始增长,您可以使用目前为止的最佳模型运行第 2 阶段完整训练,从而以较低的搜成本获得较小的性能提升。例如,对于上文显示的搜索图表,不要等待 2,000 次试验以达到收敛。您可能在 700 或 1,200 次试验时就找到更好的模型,并且可以为这些模型运行第 2 阶段完整训练。您可以随时提前停止搜索,以降低费用。您也可以在搜索运行时同步进行第 2 阶段完整训练,但请确保您的 GPU 配额能够支持额外的并行作业。
性能和费用摘要
下表汇总了不同用例的数据点以及相关的性能和费用。
用例和功能
神经架构搜索功能灵活且易于使用。新手用户无需进一步设置,即可使用预构建的搜索空间、预构建训练程序和笔记本开始探索 Vertex AI 神经架构搜索以获取其数据集。同时,专家用户可以将神经架构搜索与其自定义训练程序、自定义搜索空间和自定义推断设备搭配使用,甚至可以扩展非视觉用例的架构搜索。
神经架构搜索可为以下用例提供在 GPU 上运行的预构建训练程序和搜索空间:
- Tensorflow 训练程序,基于公共数据集的结果发布在笔记本中
- PyTorch 训练程序仅用作教程示例
- PyTorch 3D 医学图像分割搜索空间示例
- 基于 PyTorch 的 MNasNet 分类
- 针对目标设备的延迟时间和内存受限搜索
- 其他基于 TensorFlow 的预构建先进搜索空间(内含代码)
- 模型扩缩
- 数据增强
神经架构搜索提供的全套功能还可以轻松用于自定义架构和用例:
- 神经架构搜索语言,用于通过可能的神经架构定义自定义搜索空间,并将此搜索空间与自定义训练程序代码集成。
- 即时可用且先进的预构建搜索空间(内含代码)。
- 即时可用的预构建训练程序(内含代码),在 GPU 上运行。
- 用于架构搜索的代管式服务,包括:
- 可对搜索空间进行采样以找到最佳架构的神经架构搜索控制器。
- 预构建的 docker/库(内含代码),用于根据自定义硬件计算延迟时间/FLOPs/内存。
- NAS 用法教程。
- 一套用于设计代理任务的工具。
- 使用 Vertex AI 进行高效 PyTorch 训练的指南和示例。
- 针对自定义指标报告和分析的库支持。
- 用于监控和管理作业的 Google Cloud Console 界面。
- 简单易用的笔记本,可启动搜索。
- 针对按项目或作业级层粒度对 GPU/CPU 资源使用情况进行管理提供的库支持。
- 基于 Python 的 NAS 客户端构建 Docker、启动 NAS 作业并恢复之前的搜索作业。
- 基于 Google Cloud 控制台界面的客户服务。
背景
神经架构搜索 是一种自动化神经网络设计的技术。在过去几年中,它成功生成了几种先进的计算机视觉模型,包括:
这些生成的模型在以下三类关键计算机视觉问题方面一直处于领先地位:图片分类、对象检测和分割。
利用神经架构搜索,工程师可以在同一试验中针对准确率、延迟时间和内存方面优化模型,从而缩短部署模型所需的时间。神经架构搜索探索了许多不同类型的模型:控制器提出机器学习模型,然后训练和评估模型,并迭代 1000 多次,从而找到针对目标设备的延迟时间和/或内存限制的最佳解决方案。下图展示了架构搜索框架的关键组件:
- 模型:包含操作和连接的神经架构。
- 搜索空间:可以设计和优化的可能模型(操作和连接)的空间。
- 训练程序 docker:用户可自定义的训练程序代码,用于训练和评估模型并计算模型的准确率。
- 推断设备:根据其计算模型延迟时间和内存用量的硬件设备,例如 CPU/GPU。
- 奖励:模型指标组合(例如准确率、延迟时间、内存等),用于将模型评为较好或较差的模型。
- 神经架构搜索控制器:编排算法,(a) 从搜索空间对模型采样,(b) 接收模型奖励,以及 (c) 提供下一组模型建议进行评估,以找到最佳模型。
用户设置任务
神经架构搜索提供与预建搜索空间集成的预建训练程序,无需任何进一步设置即可轻松与提供的笔记本结合使用。
但是,大多数用户需要使用其自定义训练程序、自定义搜索空间、自定义指标(例如内存、延迟时间和训练时间)和自定义奖励(诸如准确率和延迟时间等因素的组合)。为此,您需要执行以下操作:
- 使用提供的神经架构搜索语言定义自定义搜索空间。
- 将搜索空间定义集成到训练程序代码中。
- 为训练程序代码添加自定义指标报告。
- 为训练程序代码添加自定义奖励。
- 构建训练容器并使用它来启动神经架构搜索作业。
下图对此进行了演示:
运行中的神经架构搜索服务
将训练容器设置为使用后,神经架构搜索服务随后会在多个 GPU 设备上并行启动多个训练容器。您可以控制要并行用于训练的试验次数以及要启动的试验总数。每个训练容器都会从搜索空间提供建议架构。训练容器构建建议的模型,执行训练/评估,然后将奖励报告回神经架构搜索服务。随着此过程的推进,神经架构搜索服务会使用奖励反馈来寻找越来越好的模型架构。搜索后,您可以访问报告的指标以进行进一步分析。
神经架构搜索用户体验历程概览
执行神经架构搜索实验的简要步骤如下:
设置和定义:
- 识别已加标签的数据集并指定任务类型(例如检测或细分)。
- 自定义训练程序代码:
- 使用预构建搜索空间或使用神经架构搜索语言定义自定义搜索空间。
- 将搜索空间定义集成到训练程序代码中。
- 为训练程序代码添加自定义指标报告。
- 为训练程序代码添加自定义奖励。
- 构建训练程序容器。
- 为部分训练(代理任务)设置搜索试验参数。理想情况下,搜索训练应快速完成(例如 30-60 分钟),以部分训练模型:
- 采样模型收集奖励所需的最小周期数(最小周期数不需要确保模型收敛)。
- 超参数(例如学习速率)。
在本地运行搜索,以确保搜索空间集成的容器可以正常运行。
通过五次测试试验启动 Google Cloud Search (stage-1) 作业,并验证搜索试验是否符合运行时和准确率目标。
通过 1000 多次试验启动 Google Cloud search (stage-1) 作业。
作为搜索的一部分,还要设置固定间隔来训练 (stage-2) 前 N 个模型:
- 超参数和用于超参数搜索的算法。stage-2 通常使用与第 1 阶段类似的配置,但某些参数(例如训练步数/周期数和渠道数)的设置更高。
- 停止条件(周期数)。
分析报告的指标和/或直观呈现架构以获取数据分析。
架构搜索实验可以后跟扩缩搜索实验,也可后跟增强搜索实验。
文档阅读顺序
- (必读)设置您的环境
- (必读)教程
- (仅 PyTorch 客户必读)使用云数据实现 PyTorch 高效训练
- (必读)最佳实践和建议的工作流程
- (必读)代理任务设计
- (仅在使用预构建训练程序时必读)如何使用预构建的搜索空间和预构建的训练程序
引用
- 使用机器学习探索神经网络架构
- MnasNet:面向自动化移动机器学习模型的设计
- EfficientNet:通过 AutoML 和模型扩缩来提高准确率和效率
- NAS-FPN:学习用于对象检测的可扩缩特征金字塔架构
- SpineNet:学习用于识别和本地化的 Scale-Permuted 骨干网
- RandAugment