此帖与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的综合能力。
我们首先在MATLAB的桌面上对分类器模型进行训练。首先,我们使用Diagnostic Feature Designer应用从完整数据集的子集中提取特征,然后在MATLAB中使用决策树模型进行本地模型训练。一旦我们满意参数设置,我们可以生成一个MATLAB函数,并将作业与数据集一起发送到SageMaker中。这样可以扩展训练过程以适应更大规模的数据集。在训练完模型后,我们将其部署为实时端点,可以将其集成到下游应用程序或仪表板中,例如MATLAB Web应用程序。
这个例子将总结每一步,为您提供如何利用MATLAB和Amazon SageMaker进行机器学习任务的实际理解。该示例的完整代码和描述可以在此存储库中找到。
先决条件
-
MATLAB 2023a或更高版本的工作环境,具有MATLAB Compiler和Statistics and Machine Learning Toolbox,运行在Linux上。这里有一个关于如何在AWS上运行MATLAB的快速指南。
-
在运行MATLAB的Amazon Elastic Compute Cloud (Amazon EC2)实例中设置Docker。可以使用Ubuntu或Linux。
-
安装AWS命令行接口 (AWS CLI),AWS Configure和Python3。
- 如果按照步骤1的安装指南安装好了,AWS CLI应该已经安装好。
- 设置AWS Configure以与AWS资源进行交互。
- 通过在终端上运行
python -V
或python --version
命令来验证您的Python3安装。如果必要,请安装Python。
-
通过运行以下命令,将此存储库复制到Linux机器上的一个文件夹中:
git clone https://github.com/mathworks/Machine-Learning-with-MATLAB-and-Amazon-Sagemaker-Demo.git
-
检查存储库文件夹的权限。如果没有写权限,运行以下shell命令:
sudo chmod -R 777
-
构建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
-
-
打开MATLAB,并在
examples/PumpFaultClassification
文件夹中打开第1部分: 数据准备和特征提取
任何机器学习项目的第一步是准备数据。MATLAB提供了广泛的工具,用于导入、清洗和从数据中提取特征。:
load SensorData.mat
SensorData.mat
数据集包含240个记录。每个记录都有两个时间表:flow
和pressure
。目标列是faultcode
,它是泵中三种可能故障组合的二进制表示。对于这些时间序列表,每个表有1,201行,模拟了1.2秒的泵流量和压力测量,每0.001秒增量。接下来,诊断特征设计师应用程序允许您从数据中提取、可视化和排名各种特征。在这里,您使用自动特征,它可以快速从数据集中提取一组广泛的时间和频域特征,并对模型训练的前几个候选进行排名。然后,您可以导出一个MATLAB函数,用于从新的输入数据重新计算排名前15个特征。让我们将这个函数称为
extractFeaturesTraining
。此函数可以配置为批量接收数据或流式接收数据。该函数生成带有相关故障代码的特征表,如下图所示:
第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应用程序来尝试许多类型的分类模型并调优以获得最佳性能,然后生成所需的代码来替代上述模型训练代码。
在检查了本地训练模型的准确性度量之后,我们可以将训练转移到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实时脚本的底部提供。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控制台检查训练作业的状态:
训练作业完成后,选择作业链接将带您到作业描述页面,在此页面中您可以看到保存在专用S3存储桶中的MATLAB模型:
第五部分:将模型部署为实时的SageMaker端点
在训练完成后,您可以将模型部署为实时的SageMaker端点,以便实时进行预测。要做到这一点,您需要从估算器中调用deploy方法。在这里,您可以根据工作负载设置所需的主机实例大小。
predictor = est.deploy(role, "ClassificationTreeInferenceHandler", uint8(1), "ml.m5.large")
在幕后,此步骤会构建一个推理docker镜像并将其推送到Amazon ECR存储库,用户无需构建推理容器。该镜像包含所有必要的信息来服务于推理请求,例如模型位置、MATLAB身份验证信息和算法。之后,Amazon 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问题。
参考资料
- https://github.com/mathworks/Machine-Learning-with-MATLAB-and-Amazon-Sagemaker-Demo
- https://aws.amazon.com/blogs/machine-learning/use-streaming-ingestion-with-amazon-sagemaker-feature-store-and-amazon-msk-to-make-ml-backed-decisions-in-near-real-time/
- https://aws.amazon.com/blogs/architecture/realtime-in-stream-inference-kinesis-sagemaker-flink/
- https://github.com/mathworks-ref-arch/matlab-on-aws
- https://www.mathworks.com/products/matlab.html
- https://www.mathworks.com/solutions/cloud.html
- https://docs.docker.com/engine/install/ubuntu/
- https://docs.docker.com/engine/install/linux-postinstall/