在 AWS Graviton 上使用 Anaconda Distribution 实现完整的机器学习生命周期
Anaconda 团队
作者:Vishal Manan 和 Valerio Maggio
简介
在本博客中,我们将逐步介绍如何在基于 AWS Graviton 的 Amazon EC2 实例 (从现在起简称为 AWS Graviton) 上为现实世界的欺诈检测数据集用例实现完整的机器学习 (ML) 生命周期。这是一个示例,您可以将 Anaconda Distribution 用于 AWS Graviton 来处理各种类型的 ML 用例。阅读本博客后的主要收获如下
- AWS Graviton 可用于对经典 ML 工作负载进行训练和推断,以及对深度学习工作负载进行推断。 通常,CPU 在易用性方面表现出色,调试方便,无需学习新知识。在 arm64 处理器上运行 ML 工作负载的所有细节都被抽象化。 此外,Graviton 通常可以提供比同类基于 x86 的 Amazon EC2 实例更好的 性能。我们将使用现实世界的欺诈数据集来说明这一点,使用决策树和随机森林作为分类器。
- Anaconda Distribution 提供对所有软件包的即时访问,以执行和重现完整的 ML 工作负载,并为基于 arm64 的 AWS Graviton 提供必要的软件包支持。
所有主要的机器学习框架,如 PyTorch、TensorFlow、XGBoost、scikit-learn 等,都支持 AWS Graviton,通常比同类基于 x86 的实例提供 40% 的价格性能优势和 20% 的性能优势。此外,Graviton 通常比同类基于 x86 的实例节能约 60%,因此具有可持续性优势。
Anaconda Distribution
Anaconda Distribution 是 ML 生态系统中的领先平台,也是世界上最受信赖的 Python 发行版。Anaconda 为从 AI 解决方案到交互式可视化的所有内容提供支持,是数值和科学计算的首选发行版,提供对数据科学和机器学习所需的大量软件包和框架的访问,包括 NumPy、pandas、scikit-learn、PyTorch 和 TensorFlow。Anaconda Distribution 还与 conda 配合使用,提供简化的软件包和环境管理。Conda 环境保证了 Python 生态系统在多个平台和硬件架构之间完全可重复。Anaconda Distribution 对 AWS Graviton 的支持始于 2021 年,AWS Graviton 已经实现了对 Anaconda 上软件包的全面 支持。
AWS Graviton 上的 ML 生命周期
我们将展示如何在 AWS Graviton 上为信用卡欺诈检测的 ML 业务用例执行完整的 ML 生命周期。我们将演示对软件包的支持以及在 AWS Graviton 上的易用性,与用于 ML 工作负载的基于 x86 的实例类似。下图 2 展示了 ML 生命周期管道的各个阶段。我们将重点关注以下 ML 生命周期的“数据准备”、“训练与调整”和观察模型性能部分。为基于 arm64 的 AWS Graviton 对底层 ML 框架进行性能调优的繁重工作(例如:PyTorch 2.0 的一些优化,如“优化细节”中所列)由 AWS 完成,并与您的代码隔离。如您所见,ML 生命周期包含许多阶段,是创建和部署 ML 模型的端到端方式。可以使用常用的 ML 框架和 Anaconda Distribution 在 AWS Graviton 上实现完整的 ML 软件栈。
在 AWS Graviton 上使用 Anaconda Distribution 进行信用卡欺诈检测用例
场景
我们将使用 Kaggle 的 信用卡欺诈检测数据集 来查看现实世界的场景。我们将训练一个模型,使用 scikit-learn 中的决策树软件包来检测欺诈。虽然该数据集是一个欺诈检测数据集,但讨论的大多数技术都具有广泛的适用性。
选择此数据集是因为它代表了现实世界数据挑战的良好候选,它可以实现完整且广泛的数据科学和机器学习管道的实现。
与欺诈检测通常一样,手头的问题可以被认为是“异常检测”问题。换句话说,我们应该期望处理一个数据集,该数据集将高度偏向于非欺诈用例。事实上,我们的数据集就是这样,其中 99.8% 的交易是非欺诈性的,而数据集中仅 0.17% 的交易反映了欺诈。
设置
我们将使用 Anaconda Distribution for AWS Graviton,按照官方 文档 中的说明进行操作。Anaconda Distribution 提供了在多个架构之间完全可重复(在软件包和版本方面)的自动保证。这对于本文的最后一部分至关重要,我们将比较基于 AWS Graviton 的实例性能与基于 x86 的实例。根据 ML 模型部署,您可以在 AWS 上使用 SageMaker 部署您的模型,也可以使用自管理 ML。我们将展示 Graviton 上的自管理 ML。还有另一篇博客文章讨论了使用 SageMaker for Graviton。
本博客中介绍并在所有实验中使用的所有软件包都已包含在 Anaconda Distribution 中。为了与基于 x86 的实例进行性能比较,我们还将利用通过 Anaconda 创建的 conda 环境。conda 环境提供的关键优势是在所有 AWS 实例之间完全移植软件包和 Python 解释器。这使我们能够在三个 Amazon EC2 (c6i.8xlarge) 和基于 AWS Graviton (c7g.8xlarge、c6g.8xlarge) 的实例上重现我们的环境。我们将使用三个运行 Amazon Linux 2 (AL2) 的 AWS EC2 实例进行比较。这对于性能比较非常有效,可以确保 ML 软件栈在多个 AWS EC2 实例上的多个基准测试运行中保持一致。
数据准备
常用的数据准备技术和库,如 NumPy、pandas 和 scikit-learn,通过 Anaconda Distribution 在 AWS Graviton 上得到支持。您不需要学习任何针对 arm64 的新库或技术。让我们从可视化数据集开始,以了解数据的性质。
信用卡欺诈数据集包含 30 个特征。除了“时间”和“金额”特征外,所有其他特征名称都被匿名化,以保护隐私。数据集中共有 284,817 笔交易 (行)。数据集非常干净,没有“空”值等,数据的描述表明,所有匿名化的“Vx”特征都是数值,这是主成分分析 (PCA) 变换的结果。“时间”和“金额”特征没有根据数据集的描述进行变换。“类别”特征是响应变量,在欺诈情况下取值为 1,否则取值为 0。根据数据集的描述,一些特征,如“时间”和“金额”没有进行缩放,因此我们使用RobustScaler 技术对它们进行了缩放,该技术可以最小化异常值。
我们将使用常用的 Python 软件包,如 Matplotlib 和 Seaborn(它们对数据探索特别有用)来可视化数据。
数据分布和类别不平衡
我们可以在数据集中看到,“无欺诈”类别 (284,315 笔交易) 占主导地位,数据高度倾斜,只有 0.17% (492 笔交易) 是“欺诈”。减少这种倾斜很重要,这样就不会过度拟合,并可以观察类别和特征之间的真实相关性。
不平衡数据集:不平衡分类涉及在具有严重类别不平衡的分类数据集中开发预测模型。处理不平衡数据集的挑战在于,大多数机器学习技术会忽略少数类,从而在少数类上的性能较差,尽管通常来说,少数类的性能是最重要的。不平衡数据集有很多例子,例如设备故障率、成功公司的客户流失率、癌症预测等等。
数据探索
让我们可视化数据和各种特征的分布。我们将使用SelectKBestScores对特征进行评分,帮助我们了解哪些特征对哪些交易是欺诈的具有重大影响,并帮助我们了解各种参数与“欺诈”或“非欺诈”的相关性。
我们可以看到,特征v11、v13、v15、v17和v18是导致“欺诈”交易的前五大特征。其他技术,如相关矩阵,将产生类似的结果。
一旦我们确定了最重要的特征,我们就可以深入研究每个特征,并识别出极端异常值。我们使用一种叫做四分位距的方法来识别落在四分位距范围之外的极端异常值。
缓解类别不平衡
随机欠采样可以通过选择所有“非欺诈”案例(492笔交易)并与相同数量(492)的随机选择的“欺诈”案例连接起来,创建一个新的子样本,使数据更平衡。现在,这两个类别具有相同的分布。这种方法的缺点是,由于只选择了284,315笔“非欺诈”交易中的492笔,它会导致信息丢失的问题,这在准确性方面并不理想。
请注意,还有另一种称为NearMiss的欠采样技术,它有几种变体。NearMiss-3涉及为每个最接近的少数类示例选择给定数量的多数类示例。
解决不平衡数据集的另一种方法是对少数类进行过采样。最简单的方法是复制少数类中的示例,尽管这些示例不会向模型添加任何新信息。相反,可以从现有示例中合成新示例。这是一种数据增强,用于少数类,被称为合成少数过采样技术,简称SMOTE。Imbalanced-learn(imblearn)是Anaconda Distribution的一部分,专门设计用于处理不平衡数据集。特别是,imbalanced-learn提供了用于测试数据集数据增强的 方法。对于不平衡数据集,准确性并不那么重要,因为大部分数据都属于一个类别。重要的是F1分数,因为它同时考虑了精确率和召回率。
SMOTE技术有一些缺点,特别是对于高维数据。当维度很高时,它会增加噪声,影响方差,并增加相关性。但在我们的案例中,由于数据集中特征的数量很少(大约30个),它运作良好。
根据数据集,你可以应用更多的数据准备技术,如降维等;我们只关注了一些常用的技术,但你应该能够在基于AWS-Graviton的实例上使用Anaconda Distribution应用其他技术,而不会遇到任何问题。
本文使用的完整代码可以在这里找到。
训练和调优
数据准备完成后,数据就可以用于训练和调优了。
对于上述数据集,我们将主要使用ML scikit-learn框架,使用决策树和随机森林分类器,原因如下。还有其他分类器,如LogisticRegression、KNN等,你可以尝试,但我们将重点关注决策树和随机森林。尝试不同的分类器来查看哪一个最适合你的数据集是一个好主意。DecisionTree是一种经典的ML算法,在CPU上运行良好。
决策树是广泛应用于监督机器学习的算法。它们因其易于解释和在银行(欺诈检测、贷款审批等)、医疗保健、电子商务等领域的广泛应用而受到欢迎。它们适用于回归和分类问题。
决策树具有更高的可解释性,当决策过程需要向客户解释或出于合规性原因时,这一点很重要。CPU非常适合运行决策树,尤其是当数据集较小时。CPU可用于训练和推断,因为它们在本质上更容易使用,并且通常比GPU成本更低。
我们使用GridSeacrhCV来调整DecisionTree()和RandomForest()的超参数。
以下代码展示了如何使用SMOTE过采样策略实例化评估管道。类似地,可以使用NearMiss创建管道。
创建上述管道后,我们对它进行训练,并对保留的测试数据进行预测。
指标
如前所述,对于不平衡数据集,准确性并不那么重要,因为大部分数据都属于一个类别。重要的是F1分数(越高越好),因为它同时考虑了精确率和召回率,以及ROC曲线下面积(AUC)。所以让我们来看看这些。我们可以看到,SMOTE的F1分数往往优于NearMiss。
正如我们在上图中看到的,SMOTE技术确实比NearMiss技术做得更好,无论使用决策树还是随机森林作为分类器。此外,在AUC方面,随机森林略好于决策树。
F1分数(越高越好) | DecisionTree(scikit-learn)分类器 | RandomForest(scikit-learn)分类器 |
NearMiss欠采样技术 | 0.75 | 0.77 |
SMOTE技术 | 0.61 | 0.82 |
可解释性——决策树可视化
下面是通过graphviz软件包(通过Anaconda Distribution提供)生成的决策树的一个子部分,它展示了决策树如何根据信用卡欺诈数据集的输入做出决策的过程。
在下面的代码中,我们利用scikit-learn提供的export_graphviz实用函数,以Graphviz Dot格式绘制树模型。你需要安装graphviz和python-graphviz来运行这段代码,这两个软件包都可以通过Anaconda Distribution中的conda install安装。
conda install graphviz python-graphviz
在下图中,我们可以看到,如果特征v13的值小于或等于-2.208,则路径会指向特征v15,该特征依次查看阈值-2.826,以此类推,直到我们到达叶节点。这就是我们如何确定性地知道交易是如何被分类为“欺诈”或“非欺诈”的。
部署和监控
对于部署,Anaconda提供了几个有用的软件包。ML容器通常用于部署ML模型。Anaconda Distribution支持Docker、conda-pack、mamba等。可以构建多架构ML软件包,用于部署到x86和基于AWS-Graviton的实例。将你的模型从基于x86的实例迁移(或新部署)到Graviton实例非常简单,因为AWS提供容器来托管使用PyTorch、TensorFlow、scikit-learn和XGBoost的模型,并且模型与架构无关。你可以在这里了解更多关于构建多架构容器的信息。
Anaconda有助于监控和维护已部署的ML模型。有一些库可以用于监控模型性能、跟踪数据漂移和根据需要重新训练模型。此外,Anaconda提供版本控制集成,Anaconda的软件包管理功能可以轻松更新和修复ML库的bug,以确保模型保持最新。
在ML生命周期中,模型训练、测试、部署和推断是持续进行的活动。持续监控这些活动并使用指标是一个好习惯。
模型训练时间指标
下图显示了我们的模型在基于Graviton的实例和基于x86的实例上的训练时间的比较。为了比较,我们使用了3种不同的AWS实例类型
- c7g.8xlarge(AWS Graviton3)
- c6g.8xlarge(AWS Graviton2)
- c6i.8xlarge(第三代英特尔至强可扩展处理器)
在下图中,我们衡量了训练成本。我们进一步将每次训练结果的成本归一化为c6i.8xlarge实例,在图表纵轴上显示为1。你可以看到,使用scikit-learn框架的决策树和随机森林分类器,c7g.8xlarge(AWS Graviton3)的每次训练成本大约是c6i.8xlarge的20%。
正如你在下图中看到的,基于AWS-Graviton3的实例(c7g.8xlarge)优于基于x86的Amazon EC2实例(c6i.8xlarge)。
有关使用AWS Graviton进行各种ML框架推断的价格和性能优势(推断延迟)的更多详细信息,请在这里查看。
结论
Anaconda Distribution支持所有可以在AWS Graviton上运行的arm64主要Python软件包,最终可以在AWS Graviton上完成自管理ML生命周期。在这篇文章中,我们考虑了信用卡欺诈检测的实际用例,以及如何使用AWS Graviton来实现完整的ML生命周期。我们证明了,通常在基于x86的AWS EC2实例上提供的功能,也可以在AWS Graviton上运行ML工作负载。Anaconda Distribution使此过程成为可能,以确保Python ML堆栈在不同架构上的完全可移植性。在本文中,我们还分析了AWS Graviton的性能,它在可调试性和可解释性方面易于使用,正如我们在决策树中看到的那样,由于合规性和其他要求,一些ML工作负载需要这种特性。AWS Graviton可用于进行一些常见的经典ML工作负载的训练和推断。AWS Graviton提供价格和性价比优势,并且受大多数AI/ML框架的支持。
资源和进一步阅读
- AWS Graviton快速入门计划:https://aws.amazon.com/ec2/graviton/fast-start/
- Amazon EC2 Graviton 可突发实例
- AWS Graviton 技术指南
- 使用AWS Graviton处理器优化PyTorch 2.0推理 | AWS机器学习博客(Amazon.com):https://aws.amazon.com/blogs/machine-learning/optimized-pytorch-2-0-inference-with-aws-graviton-processors/
- 使用Amazon SageMaker在基于AWS-Graviton的实例上运行机器学习推断工作负载 | AWS机器学习博客:https://aws.amazon.com/blogs/machine-learning/run-machine-learning-inference-workloads-on-aws-graviton-based-instances-with-amazon-sagemaker/
- 使用 AWS Graviton 降低 Amazon SageMaker 推理成本 | AWS 机器学习博客: https://aws.amazon.com/blogs/machine-learning/reduce-amazon-sagemaker-inference-cost-with-aws-graviton/
- 使用 SageMaker 的 ML 生命周期:https://aws.amazon.com/blogs/machine-learning/architect-and-build-the-full-machine-learning-lifecycle-with-amazon-sagemaker/
- Anaconda | 宣布 Anaconda 支持 AWS Graviton2: https://anaconda.cloud/install-arm64-on-aws-graviton2
- 使用基于 AWS EC2 Graviton2 的实例与 Anaconda: