Vertex AI 提供完全托管的训练服务,Vertex AI Training 提供了一组预构建算法,使您能够使用自定义训练创建 ML 模型。
ML 工程师负责训练 ML 模型。 在大多数情况下,训练可以成功完成,但有时确实会遇到失败。当失败发生时,工程师通常需要联系客户支持以帮助解决问题。然而,事实证明 ML 工程师可以自己处理大量的 ML 培训支持案例。本篇文章涵盖了 ML 模型训练失败的7个常见原因,以及一些可节省时间的技巧,包括有关如何避免它们与修复它们。
技巧 1:为您的架构使用正确的软件包
TensorFlow 支持 CPU、GPU 和 TPU 架构。CPU 架构非常适合训练结构化表数据,而 GPU 架构则更适合神经网络,神经网络通常用于计算机视觉和自然语言处理。TensorFlow 在 GPU 上执行卷积、池化、归一化、层激活和其他功能需要特定的驱动程序和库,例如 cuDNN。为您的架构使用正确的 TensorFlow 包非常重要,尤其是在您使用自定义容器运行自定义训练作业的时候。
技巧 2:检查训练策略
当仅使用单个 CPU 或 GPU 单元时,在大型数据集上训练复杂模型可能需要大量时间。您可以通过将培训分布在多个单元中来减少训练时间。TensorFlow 分布式训练策略使您能够在多个 GPU、多台机器或 TPU 之间分发数据,而无需进行重大的代码更改。策略的选择取决于您对于用例、数据、模型和 API 的选择。
MirroredStrategy 支持在一台机器的多个 GPU 上进行同步分布式训练。 MultiWorkerMirroredStrategy 与 MirroredStrategy 类似,不同之处在于它支持跨多台机器的分发,每台机器都可能具有多个 GPU。这两种策略都会在所有机器上的每个设备(即 GPU)上创建模型中所有变量的副本。
为避免出现问题,请确保您的训练策略与您的训练 API 兼容。例如,Estimator API 仅部分支持上述两种策略。 此外,确保您的代码在没有分布式训练策略的情况下可以成功在本地运行。
技巧 3:授予必要的权限
在训练期间,Vertex AI 从云存储中读取数据,您已授予对 Vertex AI 训练项目的访问权限。在以下场景中使用Cloud Storage 将会是个好主意:
暂存您的训练应用程序和自定义依赖项
存储您的训练输入数据,例如表格或图像数据
存储您的训练输出数据
您可以创建新存储桶或使用现有存储桶。 只要存储桶是您用于运行 Vertex AI 训练的项目的一部分,您就不需要明确授予对 Vertex AI 服务帐户的存储桶访问权限。
如果您选择使用自定义服务帐户来实现细粒度的访问控制,请确保向您的帐户授予存储桶访问权限。
技巧 4:检查安全设置更改
VPC Service Controls 可以帮助您降低 Vertex AI 训练作业中数据泄露的风险。 当您从服务边界内的项目运行训练作业时,VPC Service Controls 会确保您的数据不会离开边界。 这包括您的作业访问的训练数据及其生成的输出。
在您创建服务边界并将您的 Google Cloud 项目添加到其中后15分钟,您无需任何额外配置即可运行训练作业。 如果您过早地运行训练作业,则可能会引发 VPC Service Controls 错误并且会立即在您的审计日志中呈现。
技巧 5:注意批处理大小限制
批处理大小是一个超参数,它定义了用于计算模型可训练参数(即权重w和偏差b)的每次更新的数据样本数量。 批处理大小对训练时间和训练模型的最终准确性有重要影响。
批处理越大,在前向传播中通过模型传播的样本就越多。 由于批处理大小的增加将需要更多的 GPU 内存,因此 GPU 内存不足可能会阻止您增加批处理的大小。
技巧 6:避免 NaN 错误
梯度下降是 ML 中最常用的算法之一。 使用该算法,模型训练会生成误差梯度来更新模型参数(即网络权重)。 计算的任何部分中的单个 NaN 都可以快速传播到整个模型。
大误差梯度的累积会导致模型训练变得不稳定,从而使权重值过高以致溢出并导致 NaN 值。 某些损失函数的简单实现会以惊人的低值溢出。
如何修复:
• 使用较小的 initial_learning_rate 值或较大的 warmup_steps 值,这样您就可以减少大初始梯度的影响
• 使用对梯度幅度不太敏感的优化器(更喜欢 Adam 而不是 SGD)
• 验证损失函数没有返回NaN。 内置的损失函数是可靠的,自定义的损失函数可能不是
• 考虑使用梯度裁剪人为地限制(裁剪)梯度的最大值
技巧 7:简化容量规划
弹性工作负载需要重新分配资源。预留在这种情况下可以提供帮助。预留是一种容量保证服务,它可以保护现有资源并为您获得业务关键型工作负载的容量提供高度保证。
您可以在 GCP 项目级别分配预留。 但是,您很难在项目级别预测容量需求并预测每个项目所需的确切预留数量。
通过共享预留,您可以在 GCP 组织中的多个项目之间共享 Compute Engine 预留,从而简化容量规划预留并减少相关的浪费与支出。
结论
如果您在模型训练中遇到问题,请使用此处介绍的技巧和指南来快速的解决。 更有意义的是,通过主动应用该指南来寻找避免出现问题的机会。如果您浏览了此列表但仍未解决您在训练时所遇到问题,请务必查看已知问题和功能请求或报告您的问题。
文章信息
相关推荐
