Press "Enter" to skip to content

用MATLAB和Amazon SageMaker进行机器学习

此帖与MathWorks的Brad Duncan、Rachel Johnson和Richard Alcock合著。

MATLAB是一种广泛应用于数据处理、并行计算、自动化、模拟、机器学习和人工智能等各种应用领域的流行编程工具。它在汽车、航空航天、通信和制造等许多行业中得到广泛应用。近年来,MathWorks已将许多产品推向了云端,尤其是在Amazon Web Services (AWS)上。有关MathWorks云产品的详细信息,请参阅云中的MATLAB和Simulink发送电子邮件给MathWorks

在本文中,我们将MATLAB的机器学习能力引入到Amazon SageMaker中,它具有几个重要的优点:

  • 计算资源:使用SageMaker提供的高性能计算环境可以加速机器学习训练。
  • 协作:MATLAB和SageMaker共同提供了一个强大的平台,团队可以在其中进行有效的协作,构建、测试和部署机器学习模型。
  • 部署和可访问性:模型可以部署为SageMaker实时端点,使其可以方便地用于其他应用程序处理实时流数据。

我们将展示如何将MATLAB的机器学习模型训练作为SageMaker的训练作业,并将模型部署为SageMaker的实时端点,从而能够处理实时流数据。

为此,我们将使用一个预测性维护的示例,其中我们对流式传感器数据中的操作泵的故障进行分类。我们可以从一个包含三种可能的故障类型和各种可能组合(例如,一个健康状态和七个故障状态)的Simulink模拟生成的带标签数据的大型库中获取。由于我们有系统的模型,而且故障在实际操作中很罕见,我们可以利用模拟数据来训练我们的算法。可以使用MATLAB和Simulink中的参数估计技术来调整模型,以与我们真实泵的运行数据匹配。

用MATLAB和Amazon SageMaker进行机器学习 四海 第1张

我们的目标是通过这个故障分类示例展示MATLAB和Amazon SageMaker的综合能力。

我们首先在MATLAB的桌面上对分类器模型进行训练。首先,我们使用Diagnostic Feature Designer应用从完整数据集的子集中提取特征,然后在MATLAB中使用决策树模型进行本地模型训练。一旦我们满意参数设置,我们可以生成一个MATLAB函数,并将作业与数据集一起发送到SageMaker中。这样可以扩展训练过程以适应更大规模的数据集。在训练完模型后,我们将其部署为实时端点,可以将其集成到下游应用程序或仪表板中,例如MATLAB Web应用程序。

用MATLAB和Amazon SageMaker进行机器学习 四海 第2张

这个例子将总结每一步,为您提供如何利用MATLAB和Amazon SageMaker进行机器学习任务的实际理解。该示例的完整代码和描述可以在此存储库中找到。

先决条件

  1. MATLAB 2023a或更高版本的工作环境,具有MATLAB Compiler和Statistics and Machine Learning Toolbox,运行在Linux上。这里有一个关于如何在AWS上运行MATLAB的快速指南

  2. 在运行MATLAB的Amazon Elastic Compute Cloud (Amazon EC2)实例中设置Docker。可以使用UbuntuLinux

  3. 安装AWS命令行接口 (AWS CLI)AWS ConfigurePython3

    1. 如果按照步骤1的安装指南安装好了,AWS CLI应该已经安装好。
    2. 设置AWS Configure以与AWS资源进行交互。
    3. 通过在终端上运行python -Vpython --version命令来验证您的Python3安装。如果必要,请安装Python。
  4. 通过运行以下命令,将此存储库复制到Linux机器上的一个文件夹中:

    git clone https://github.com/mathworks/Machine-Learning-with-MATLAB-and-Amazon-Sagemaker-Demo.git
  5. 检查存储库文件夹的权限。如果没有写权限,运行以下shell命令:

    sudo chmod -R 777
  6. 构建MATLAB训练容器并将其推送到Amazon Elastic Container Registry (Amazon ECR)

    • 导航到文件夹docker

    • 使用AWS CLI创建一个Amazon ECR存储库(将REGION替换为您首选的AWS区域)

      aws ecr create-repository \ --repository-name sagemaker-matlab-training \ --image-scanning-configuration scanOnPush=true \ --region
    • 运行以下docker命令:

      docker build -t sagemaker-matlab-training-r2023a .  docker tag sagemaker-matlab-training-r2023a ACCOUNT.dkr.ecr.REGION.amazonaws.com/sagemaker-matlab-training-r2023a:latest  aws ecr get-login-password --region REGION | docker login --username AWS --password-stdin ACCOUNT.dkr.ecr.REGION.amazonaws.com  docker push ACCOUNT.dkr.ecr. REGION.amazonaws.com/sagemaker-matlab-training-r2023a:latest 
  7. 打开MATLAB,并在examples/PumpFaultClassification文件夹中打开

    第1部分: 数据准备和特征提取

    任何机器学习项目的第一步是准备数据。MATLAB提供了广泛的工具,用于导入、清洗和从数据中提取特征。:

    load SensorData.mat

    SensorData.mat数据集包含240个记录。每个记录都有两个时间表:flowpressure。目标列是faultcode,它是泵中三种可能故障组合的二进制表示。对于这些时间序列表,每个表有1,201行,模拟了1.2秒的泵流量和压力测量,每0.001秒增量。

    用MATLAB和Amazon SageMaker进行机器学习 四海 第3张

    接下来,诊断特征设计师应用程序允许您从数据中提取、可视化和排名各种特征。在这里,您使用自动特征,它可以快速从数据集中提取一组广泛的时间和频域特征,并对模型训练的前几个候选进行排名。然后,您可以导出一个MATLAB函数,用于从新的输入数据重新计算排名前15个特征。让我们将这个函数称为extractFeaturesTraining。此函数可以配置为批量接收数据或流式接收数据。

    用MATLAB和Amazon SageMaker进行机器学习 四海 第4张

    该函数生成带有相关故障代码的特征表,如下图所示:

    用MATLAB和Amazon SageMaker进行机器学习 四海 第5张

    第2部分: 为SageMaker组织数据

    接下来,您需要以SageMaker可以用于机器学习训练的方式组织数据。通常,这涉及将数据分为训练集和验证集,并将预测数据与目标响应数据分开。

    在这个阶段,可能需要进行更复杂的数据清理和过滤操作。在这个示例中,数据已经是干净的。如果数据处理非常复杂且耗时,可以使用SageMaker处理作业来运行这些作业,以便将其与SageMaker训练分开成两个步骤。

    trainPredictors = trainingData(:,2:end);

    trainResponse = trainingData(:,1);

    第3部分: 在MATLAB中训练和测试机器学习模型

    在转移到SageMaker之前,最好在MATLAB中本地构建和测试机器学习模型。这样可以快速迭代和调试模型。您可以设置并训练一个简单的决策树分类器。

    classifierModel = fitctree(... trainPredictors,... trainResponse,... OptimizeHyperparameters='auto');

    这里的训练作业应该在1分钟内完成,并生成一些图表来指示训练进度。训练完成后,会生成一个MATLAB机器学习模型。可以使用Classification Learner应用程序来尝试许多类型的分类模型并调优以获得最佳性能,然后生成所需的代码来替代上述模型训练代码。

    用MATLAB和Amazon SageMaker进行机器学习 四海 第6张

    在检查了本地训练模型的准确性度量之后,我们可以将训练转移到Amazon SageMaker中。

    第四部分:在Amazon SageMaker中训练模型

    当您对模型感到满意后,可以使用SageMaker进行规模化训练。要开始调用SageMaker SDK,您需要初始化SageMaker会话。

    session = sagemaker.Session();

    指定SageMaker执行IAM角色,该角色将用于训练作业和终端节点托管。

    role = "arn:aws:iam::ACCOUNT:role/service-role/AmazonSageMaker-ExecutionRole-XXXXXXXXXXXXXXX";

    从MATLAB中,将训练数据保存为.csv文件,并将其放置在Amazon Simple Storage Service (Amazon S3)存储桶中。

    writetable(trainingData,'pump_training_data.csv');

    trainingDataLocation = "s3:// "+session.DefaultBucket+ +"/cooling_system/input/pump_training";

    copyfile("pump_training_data.csv", trainingDataLocation);

    创建SageMaker估算器

    接下来,您需要创建一个SageMaker估算器,并传递所有必要的参数,例如训练的docker镜像、训练函数、环境变量、训练实例大小等等。训练镜像URI应该是您在先决步骤中创建的Amazon ECR URI,格式为ACCOUNT.dkr.ecr.us-east-1.amazonaws.com/sagemaker-matlab-training-r2023a:latest。训练函数应该在MATLAB实时脚本的底部提供。

    SageMaker Estimator Console

    trainingImage = "ACCOUNT.dkr.ecr.us-east-1.amazonaws.com/sagemaker-matlab-training-r2023a:latest";  est = sagemaker.MATLABEstimator(...     role, ...     Image=trainingImage, ...     Session=session, ...     BaseJobName="PumpDecisionTreeMatlab", ...     Environment = loadenv(fullfile(rootFolder, "training.env")), ...     TrainingFunction = @trainingFunction, ...     HyperParameters = struct(), ... % named args to train_decision_tree     InstanceType="ml.m5.large", ...     MaxRunTime=minutes(10), ...         MaxWaitTime=minutes(20), ...     UseSpotInstances=true); 

    提交SageMaker训练作业

    从估算器中调用fit方法将训练作业提交到SageMaker。

    est.fit(training=struct(Location=trainingDataLocation, ContentType="text/csv"))

    您还可以从SageMaker控制台检查训练作业的状态:

    SageMaker Training Job Console

    训练作业完成后,选择作业链接将带您到作业描述页面,在此页面中您可以看到保存在专用S3存储桶中的MATLAB模型:

    SageMaker Endpoint Output

    第五部分:将模型部署为实时的SageMaker端点

    在训练完成后,您可以将模型部署为实时的SageMaker端点,以便实时进行预测。要做到这一点,您需要从估算器中调用deploy方法。在这里,您可以根据工作负载设置所需的主机实例大小。

    predictor = est.deploy(role, "ClassificationTreeInferenceHandler", uint8(1), "ml.m5.large")

    在幕后,此步骤会构建一个推理docker镜像并将其推送到Amazon ECR存储库,用户无需构建推理容器。该镜像包含所有必要的信息来服务于推理请求,例如模型位置、MATLAB身份验证信息和算法。之后,Amazon SageMaker创建一个SageMaker端点配置,并最终部署实时端点。可以在SageMaker控制台中监视端点,并在不再使用时随时终止。

    SageMaker端点监视控制台

    第六部分:测试端点

    现在端点已经运行起来了,您可以通过提供一些记录进行测试,以预测输出结果。使用以下代码从训练数据中选择10条记录,并将其发送到端点进行预测。预测结果将从端点返回,并在下图中显示。

    input = trainPredictors(10:19,:) prediction = predictor.predict(input)

    预测结果

    第七部分:仪表盘集成

    SageMaker端点可以被许多原生的AWS服务调用。如果与一个AWS Lambda函数和API网关一起部署,它还可以被用作标准的REST API,可以与任何Web应用程序集成。针对这个特定的用例,您可以使用Amazon SageMaker功能存储和Apache Kafka,MSK等进行流式数据摄取,以实现基于机器学习的近实时决策。另一个可能的集成方式是使用Amazon Kinesis、SageMaker和Apache Flink的组合来构建一个管理型、可靠、可伸缩且高可用的应用程序,能够对数据流进行实时推理。

    在将算法部署到SageMaker端点之后,您可能希望使用仪表盘将其可视化,以实时显示流式预测。在接下来的自定义MATLAB Web应用程序中,您可以查看每个泵的压力和流量数据,以及来自部署模型的实时故障预测结果。

    此仪表盘包括一个剩余使用寿命(RUL)模型,用于预测每个泵的故障时间。要了解如何训练RUL算法,请参阅预测性维护工具箱

    泵健康状态仪表盘

    清理

    在运行此解决方案之后,请确保清理掉任何不需要的AWS资源,以避免意外产生的费用。您可以使用SageMaker Python SDK或AWS管理控制台来清理这些资源(包括SageMaker、Amazon ECR和Amazon S3)。通过删除这些资源,您可以避免为不再使用的资源产生进一步的费用。

    结论

    我们演示了如何将MATLAB应用于SageMaker中的泵预测性维护使用案例,包括整个机器学习生命周期。SageMaker提供了一个完全托管的环境,用于运行机器学习工作负载和部署模型,并提供了多种计算实例以满足各种需求。

    免责声明:本文中使用的代码归MathWorks所有并由其进行维护。请参阅GitHub存储库中的许可条款。如有代码问题或功能请求,请在存储库中开启GitHub问题。

    参考资料

Leave a Reply

Your email address will not be published. Required fields are marked *