在python中使用SageMaker Debugger进行机器学习模型的开发调试(二)

简介: 在python中使用SageMaker Debugger进行机器学习模型的开发调试

机器学习调试涉及到哪些操作?

一个好的机器学习调试工具或方法应该具备的主要功能如下:

  1. 捕获(capture)

能够捕获模型和优化器的有关参数和指标数据。开发人员能够指定数据采集频率,并对调试数据进行后处理操作。

  1. 反应(react)

能够监视捕获数据中的变更并作出反应。开发人员能够指定模型在满足条件(如:梯度消失、过拟合)时停止训练。

  1. 分析(analyze)

能够允许使用者在模型训练期间实时分析捕获的数据。开发人员能够对捕获的数据进行脱机分析。

使用 Amazon SageMaker Debugger 进行机器学习模型的开发调试

Amazon SageMaker Debugger 使得开发人员能够监测模型训练情况,实现针对训练阶段的模型参数的监测、记录、分析。可以通过以下两种途径使用 Amazon SageMaker Debugger:

  1. Amazon SageMaker managed training 方式

当使用 Amazon Sagemaker 训练模型时,将自动启用 Amazon SageMaker Debugger。并且不需要对训练脚本进行任何更改,只需指定要监视的问题,它就会自动运行监视,可以捕获梯度消失、过拟合等问题。还可以在训练期间记录张量,并将其保存在 Amazon S3中,以便进行实时或离线分析。

  1. smdebug 开源库方式

可以在 TensorFlow、Keras、PyTorch、MXNet或XGBoost 等编写的训练代码中加入 smdebug 开源库相关代码,以进行调试。

具体地,Amazon SageMaker debugger 的 capture、react、analyze 使用方法如下:

通过 debugger hooks 获得调试数据

机器学习训练中的大部分代码都是为了实现对于模型参数的优化。通过优化算法,对比预测值和真实值、计算梯度、更新权重。通常涉及到百万数量级的权重参数和偏差参数。

640.png

为了在训练阶段捕获重要信息,Amazon SageMaker Debugger 自动将 Hooks 添加到 TensorFlow、Keras、PyTorch、MXNet或XGBoost代码中。当指定SageMaker Debugger Hook 时,可以针对性地保存重要数据和信息。Amazon SageMaker Debugger 提供一个预定义的张量列表,可以通过这个列表保存权重、偏差、梯度、损失、优化器变量等参数。也可以通过声明 regex 字符串指定需要捕获的模型特定层中的特定张量。

在 Amazon SageMaker 使用 Hooks

如果使用Amazon SageMaker 进行模型训练,则会自动配置Amazon SageMaker Debugger,无需更改训练代码主体。只需要声明如下内容:

from sagemaker.debugger import Rule, DebuggerHookConfig
debugger_hook_config = DebuggerHookConfig(
                         hook_parameters={"save_interval": '100'},
                               collection_configs=[
                               CollectionConfig("losses"),
                               CollectionConfig("weights"),
                               CollectionConfig("gradients"),
                               CollectionConfig("biases")]
                            )

通过上述代码,Hook 将间隔100步自动存储 losses、weights、gradients、biases等参数。当然,也可以指定采样起止步数。

当调用SageMaker TensorFlow estimator 时,通过 Amazon SageMaker Python SDK将 Hook 传递给 debugger_Hook_config参数。代码如下:

tf_estimator = TensorFlow(entry_point = 'tf-training-script.py',
                        ...
                        ...
                 debugger_hook_config = debugger_hook_config)

本地环境下通过 smdebug 开源库使用 Hooks

当在个人电脑中进行模型训练或者 Amazon SageMaker 未能够自动配置 Hooks 时,可以使用smdebug库手动配置。以 Keras 和 PyTorch 为例:

在 Keras 代码中使用 Hook
import smdebug.tensorflow as smd
job_name = 'tf-debug-job'
hook = smd.KerasHook(out_dir=f'./smd_outputs/{job_name}',
                   tensorboard_dir=f'./tb_logs/{job_name}',
                   save_config=smd.SaveConfig(save_interval=1),
                   include_collections=['gradients', 'biases'])
opt = tf.keras.optimizers.SGD(learning_rate=0.01, momentum=0.9, name='SGD')
opt = hook.wrap_optimizer(opt)

通过上述代码,首先导入smdebug包,然后实例化 KerasHook。通过 KerasHook 保存梯度和偏差张量至 out_dir,保存 TensorBoard 日志到tensorboard_dir

在 PyTorch 代码中使用 Hook
import smdebug.pytorch as smd
net = get_network()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
job_name = 'pytorch-debug-job'
hook = smd.Hook(out_dir=f'./smd_outputs/{job_name}',
              save_config=smd.SaveConfig(save_interval=10),
              include_collections=['gradients', 'biases'])
hook.register_module(net)
hook.register_loss(criterion)

通过上述代码,首先导入smdebug包,然后实例化 Hook,最后将 hook 添加到神经网络中。除了对优化函数使用 hook,也可以对损失函数使用 hook。

此外,可以通过 hook.record_tensor_value来记录指定的张量数据。

for epoch in range(10):
   running_loss = 0.0
   for i, data in enumerate(trainloader, 0):
       inputs, labels = data[0].to(device), data[1].to(device)
       optimizer.zero_grad()
       outputs = net(inputs)
       loss = criterion(outputs, labels)
       # Use hook to record tensors
       hook.record_tensor_value(tensor_name="loss", tensor_value=loss)
       loss.backward()
       optimizer.step()

使用 debugger rules 对调试数据变更做出反应

如果只是单纯的对数据进行采样记录,并不能很好的实现调试工作。真正意义上实现调试,要求在训练阶段能够实时的做出反应。因此引入 debugger rules,对代码运行过程中的某一条件进行监测,当条件发生改变时做出停止训练、发生通知等操作。

Amazon SageMaker Debugger 内置了部分常用的条件判断函数:死亡节点(dead relu)、张量爆炸(exploding tensor)、权重初始化不良(poor weight initialization)、激活函数饱和(saturated activation)、梯度消失(vanishing gradient)、分类不平衡(calss imbalance)、过拟合等。如果想要自定义条件,可以通过smdebug库函数进一步编写。

如果使用Amazon SageMaker 进行模型训练,则会自动运行 debugger rules。当然也可以使用smdebug库在本地环境运行相关函数。

在 Amazon SageMaker 中使用 debugger rules

640.png

具体代码如下:

debug_rules = [
   Rule.sagemaker(rule_configs.overtraining()),
   Rule.sagemaker(rule_configs.overfit()),
   Rule.custom(name='MyCustomRule',
               image_uri='840043622174.dkr.ecr.us-east-2.amazonaws.com/sagemaker-debugger-rule-evaluator:latest',
               instance_type='ml.t3.medium',
               source='rules/my_custom_rule.py',
               rule_to_invoke='CustomGradientRule',
               volume_size_in_gb=30,
               rule_parameters={"threshold": "20.0"})
          ]

通过上述代码,添加了两个内置条件(overtraining,overfitting)和一个自定义条件(customGradientRule)。

编写自定义条件,需要声明需要调用的 SageMaker 资源(本例中为 t3.medium)。

在SageMaker framework estimator 函数(例如下面的TensorFlow estimator)中,可以将规则配置作为其中的 rules 参数。这将指示Amazon SageMaker不仅启动一个训练进程,还启动 rules 进程。

640.png

在本地环境中使用 debugger rules

下面的代码将演示如何定义一个名为CustomGradientRule的规则。通过该规则检查梯度的绝对平均值是否大于某个阈值,如果没有指定阈值,则阈值为10。

from smdebug.rules import Rule
class CustomGradientRule(Rule):
   def __init__(self, base_trial, threshold=10.0):
       super().__init__(base_trial)
       self.threshold = float(threshold)
   def invoke_at_step(self, step):
       for tname in self.base_trial.tensor_names(collection="gradients"):
           t = self.base_trial.tensor(tname)
           abs_mean = t.reduction_value(step, "mean", abs=True)
           if abs_mean > self.threshold:
               return True
       return False

为了调用该规则,需要创建一个rule_object:

from smdebug.rules import invoke_rule
from smdebug.trials import create_trial
trial = create_trial(path=’./smd_outputs/<JOB_NAME>)
rule_obj = CustomVanishingGradientRule(trial, threshold=0.0001)
invoke_rule(rule_obj, start_step=0, end_step=None)

使用 Amazon SageMaker Debugger 分析调试数据

使用hook可以在训练期间导出数据,如权重、梯度和其他数据;而 rule 允许在训练阶段监测模型条件是否改变,以便采取行动。在某些情况下,开发者只想分析原始数据并将其绘制出来,以找到尚不了解的问题。具体的可视化方法如下:

  1. 通过 Amazon SageMaker Studio 进行可视化

Amazon SageMaker Studio 建立在 Jupyter Notebook 之上,它集成了跟踪实验、在训练期间可视化性能曲线以及在实验中比较不同试验结果的功能。还可以通过选择 debugger hook 保存的数据值来调出自定义图表。

640.png

  1. 本地环境下使用 smdebug 库进行可视化

以如下代码为例:

hook = smd.Hook(out_dir=f'./smd_outputs/{job_name}',
              save_config=smd.SaveConfig(save_interval=10),
              include_collections=['gradients', 'biases'])

首先通过 Hook 存储 梯度和偏差。

import smdebug.pytorch as smd
trial = smd.create_trial(path=PATH_TO_S3_OR_LOCAL_DIR')

然后建立一个 trial,以便实时分析。

trial.tensor_names()

通过 tensor_names() 查询保存的张量:

[2020-03-30 06:02:17.108 ip-172-31-28-67:31414 INFO local_trial.py:35] Loading trial pytorch-exp03-30-05-53-52 at path ./smd_outputs/pytorch-exp03-30-05-53-52
[8]:
['CrossEntropyLoss_output_0',
'Net_conv1.bias',
'Net_conv2.bias',
'Net_fc1.bias',
'Net_fc2.bias',
'Net_fc3.bias',
'gradient/Net_conv1.bias',
'gradient/Net_conv1.weight',
'gradient/Net_conv2.bias',
'gradient/Net_conv2.weight',
'gradient/Net_fc1.bias',
'gradient/Net_fc1.weight',
'gradient/Net_fc2.bias',
'gradient/Net_fc2.weight',
'gradient/Net_fc3.bias',
'gradient/Net_fc3.weight',
'loss_output_0']

通过 trail.tensor().values() 查询所有数据:

640.png

注意到梯度每10步保存一次,这是我们在 hook 中预先指定的。通过在循环中运行上述命令来查询最近的值,可以在训练期间检索张量。这样,可以绘制性能曲线,或在训练过程中可视化权重的变化。

640.png

Amazon SageMaker Debugger 工作流程

640.png

  1. 使用SageMaker Python SDK和各框架(TensorFlow、PyTorch等)开始Amazon SageMaker 上的深度学习训练任务。
  2. Amazon SageMaker在指定数量的CPU或GPU上启动训练进程。同时SageMaker启动 rule 进程以监控训练过程。
  3. 使用debug Hook config,Amazon SageMaker把权重、偏差和其他张量保存到指定的S3位置。
  4. 在 Hook 采集数据的基础上, rule 进程执行指定的条件监控。
  5. 当指定的条件发生状态变化,采取停止训练、发生通知等行动。
  6. 可以使用smdebug库来创建 trial 对象。trail对象可用于查询张量,以便于执行实时或脱机分析及可视化。

总结

调试是一项具有挑战性的工作,本文中讨论了机器学习开发调试和普通软件开发调试的差异,并且给出了通过 Amazon SageMaker Debugger 进行调试的办法。

而使用Amazon SageMaker Debugger的三种途径如下:

  1. 通过在 Amazon SageMaker 全托管服务平台使用,将免去手动配置等操作。
  2. 通过 smdebug开源库在个人电脑等本地环境使用,需要进行一定的手动配置。
  3. 可以通过 Amazon SageMaker 进行模型训练,通过本地环境执行 rules 对调试数据进行可视化分析。
目录
相关文章
|
1天前
|
机器学习/深度学习 数据挖掘 定位技术
多元线性回归:机器学习中的经典模型探讨
多元线性回归是统计学和机器学习中广泛应用的回归分析方法,通过分析多个自变量与因变量之间的关系,帮助理解和预测数据行为。本文深入探讨其理论背景、数学原理、模型构建及实际应用,涵盖房价预测、销售预测和医疗研究等领域。文章还讨论了多重共线性、过拟合等挑战,并展望了未来发展方向,如模型压缩与高效推理、跨模态学习和自监督学习。通过理解这些内容,读者可以更好地运用多元线性回归解决实际问题。
|
13天前
|
机器学习/深度学习 人工智能 自然语言处理
PAI Model Gallery 支持云上一键部署 DeepSeek-V3、DeepSeek-R1 系列模型
DeepSeek 系列模型以其卓越性能在全球范围内备受瞩目,多次评测中表现优异,性能接近甚至超越国际顶尖闭源模型(如OpenAI的GPT-4、Claude-3.5-Sonnet等)。企业用户和开发者可使用 PAI 平台一键部署 DeepSeek 系列模型,实现 DeepSeek 系列模型与现有业务的高效融合。
|
1月前
如何看PAI产品下训练(train)模型任务的费用细节
PAI产品下训练(train)模型任务的费用细节
85 6
|
1月前
|
机器学习/深度学习 安全 PyTorch
FastAPI + ONNX 部署机器学习模型最佳实践
本文介绍了如何结合FastAPI和ONNX实现机器学习模型的高效部署。面对模型兼容性、性能瓶颈、服务稳定性和安全性等挑战,FastAPI与ONNX提供了高性能、易于开发维护、跨框架支持和活跃社区的优势。通过将模型转换为ONNX格式、构建FastAPI应用、进行性能优化及考虑安全性,可以简化部署流程,提升推理性能,确保服务的可靠性与安全性。最后,以手写数字识别模型为例,展示了完整的部署过程,帮助读者更好地理解和应用这些技术。
97 20
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
云上一键部署 DeepSeek-V3 模型,阿里云 PAI-Model Gallery 最佳实践
本文介绍了如何在阿里云 PAI 平台上一键部署 DeepSeek-V3 模型,通过这一过程,用户能够轻松地利用 DeepSeek-V3 模型进行实时交互和 API 推理,从而加速 AI 应用的开发和部署。
|
1月前
|
机器学习/深度学习 存储 设计模式
特征时序化建模:基于特征缓慢变化维度历史追踪的机器学习模型性能优化方法
本文探讨了数据基础设施设计中常见的一个问题:数据仓库或数据湖仓中的表格缺乏构建高性能机器学习模型所需的历史记录,导致模型性能受限。为解决这一问题,文章介绍了缓慢变化维度(SCD)技术,特别是Type II类型的应用。通过SCD,可以有效追踪维度表的历史变更,确保模型训练数据包含完整的时序信息,从而提升预测准确性。文章还从数据工程师、数据科学家和产品经理的不同视角提供了实施建议,强调历史数据追踪对提升模型性能和业务洞察的重要性,并建议采用渐进式策略逐步引入SCD设计模式。
103 8
特征时序化建模:基于特征缓慢变化维度历史追踪的机器学习模型性能优化方法
|
1月前
|
机器学习/深度学习 人工智能 算法
机器学习算法的优化与改进:提升模型性能的策略与方法
机器学习算法的优化与改进:提升模型性能的策略与方法
276 13
机器学习算法的优化与改进:提升模型性能的策略与方法
|
2月前
|
编解码 机器人 测试技术
技术实践 | 使用 PAI+LLaMA Factory 微调 Qwen2-VL 模型快速搭建专业领域知识问答机器人
Qwen2-VL是一款具备高级图像和视频理解能力的多模态模型,支持多种语言,适用于多模态应用开发。通过PAI和LLaMA Factory框架,用户可以轻松微调Qwen2-VL模型,快速构建文旅领域的知识问答机器人。本教程详细介绍了从模型部署、微调到对话测试的全过程,帮助开发者高效实现定制化多模态应用。
|
2月前
|
机器学习/深度学习 人工智能 算法
人工智能浪潮下的编程实践:构建你的第一个机器学习模型
在人工智能的巨浪中,每个人都有机会成为弄潮儿。本文将带你一探究竟,从零基础开始,用最易懂的语言和步骤,教你如何构建属于自己的第一个机器学习模型。不需要复杂的数学公式,也不必担心编程难题,只需跟随我们的步伐,一起探索这个充满魔力的AI世界。
74 12
|
3月前
|
人工智能 JSON 算法
Qwen2.5-Coder 系列模型在 PAI-QuickStart 的训练、评测、压缩及部署实践
阿里云的人工智能平台 PAI,作为一站式、 AI Native 的大模型与 AIGC 工程平台,为开发者和企业客户提供了 Qwen2.5-Coder 系列模型的全链路最佳实践。本文以Qwen2.5-Coder-32B为例,详细介绍在 PAI-QuickStart 完成 Qwen2.5-Coder 的训练、评测和快速部署。
Qwen2.5-Coder 系列模型在 PAI-QuickStart 的训练、评测、压缩及部署实践

推荐镜像

更多