将工业冷却风扇异常检测算法部署为微服务
本示例详细说明了将 Industrial Cooling Fan Anomaly Detection Algorithm Development for Deployment to a Microservice Docker Image (Predictive Maintenance Toolbox) 转换为 Docker® 微服务的过程。主要目标是提供一个用于访问算法的 HTTP/HTTPS 端点,这对于集成到预测性维护框架中至关重要。
首先,将使用 Predictive Maintenance Toolbox™ 在 MATLAB® 中开发的基于支持向量机的异常检测算法打包成可部署的存档文件。该存档包含经过训练的模型,该模型能够识别工业冷却风扇的负载、风扇机械和功耗异常。随后,将创建一个 Docker イメージ,其中包含可部署存档以及一个最小的 MATLAB Runtime 软件包。
一旦 Docker 映像准备就绪,即可部署到 Docker 环境中。您可以使用 MATLAB Production Server™ 客户端 API 调用微服务。
示例文件列表
anomalyDetectionModelSVM.matdetectCoolingFanAnomaly.mdiagnosticFeatures_streaming.mgenerateEnsembleTable.mvalidationEnsemble.mat
要下载示例文件,请在 MATLAB 命令行窗口中键入以下内容。
openExample("compilersdk/DeployCoolingFanAnomalyDetectionExample", workDir=pwd)
前提条件
验证您已经训练了包含异常检测模型的异常检测模型
anomalyDetectionModelSVM.mat文件和包含测试数据的validationEnsemble.mat文件。验证您是否已在开发计算机上安装了 MATLAB Compiler SDK™。
通过在 MATLAB 命令行窗口中键入
[~,msg] = system('docker version'),验证您是否已在开发计算机上安装并配置了 Docker。注意:如果您使用的是 WSL,请改用命令[~,msg] = system('wsl docker version')。如果您尚未安装 Docker,请按照 Docker 网站上的说明安装并设置 Docker。docs.docker.com/engine/install/。要在 Windows® 上构建微服务镜像,您必须安装 Docker Desktop 或在 Windows Subsystem for Linux v2 (WSL2) 上安装 Docker。要安装 Docker Desktop,请参阅
https://docs.docker.com/desktop/setup/install/windows-install/。有关如何在 WSL2 上安装 Docker 的说明,请参阅
https://www.mathworks.com/matlabcentral/answers/1758410-how-do-i-install-docker-on-wsl2。确认您的计算机上安装了适用于 Linux® 的 MATLAB Runtime 安装程序。您可以从 MathWorks® 网站下载安装程序:
https://www.mathworks.com/products/compiler/matlab-runtime.html。
创建 MATLAB 函数
创建一个名为 detectCoolingFanAnomaly 的 MATLAB 函数,该函数用于处理工业冷却风扇数据,以实现可靠的异常检测。该函数采用包含冷却风扇测量值的矩阵或时间表 x,以及具有真异常的可选分类数组 y,以形成数据集合并计算诊断特征。从 anomalyDetectionModelSVM.mat 加载预先训练的 SVM 模型后,它会预测异常并返回 predictedAnomalies,如果提供,则返回 trueAnomalies。
function [predictedAnomalies, trueAnomalies] = detectCoolingFanAnomaly(x, y) % Load model model=load('anomalyDetectionModelSVM.mat'); anomalyDetectionModel=model.m; windowSize = size(x, 1); ensembleTable1 = generateEnsembleTable(x,y(:,1),windowSize); ensembleTable2 = generateEnsembleTable(x,y(:,2),windowSize); ensembleTable3 = generateEnsembleTable(x,y(:,3),windowSize); featureTable1 = diagnosticFeatures_streaming(ensembleTable1); featureTable2 = diagnosticFeatures_streaming(ensembleTable2); featureTable3 = diagnosticFeatures_streaming(ensembleTable3); % Predict results1 = anomalyDetectionModel.m1.predict(featureTable1); results2 = anomalyDetectionModel.m2.predict(featureTable2); results3 = anomalyDetectionModel.m3.predict(featureTable3); predictedAnomalies = [results1, results2, results3]; trueAnomalies = [ensembleTable1.Anomaly, ensembleTable2.Anomaly, ensembleTable3.Anomaly]; end
支持文件
IndexIterator.m - IndexIterator 类提供了一种在可配置窗口或框架中对一系列索引进行迭代的机制。它允许按顺序访问索引的子集,并控制索引之间的窗口大小和步长。
generateEnsembleTable.m - generateEnsembleTable 函数将信号数据矩阵 x 分割成指定大小 ws 的窗口,并根据标签 y 的总和指示它是否为异常将每个段与二值标签相关联。结果是一个表,每行包含一个信号窗口及其相应的异常标签。
diagnosticFeatures_streaming.m - diagnosticFeatures_streaming 函数根据输入时间表内的多个信号计算各种时间序列特征,包括自回归模型系数、频率、AIC、平均值、RMS、ACF 和 PACF。然后将计算出的特征组织成一个表,该表作为输出返回,以供进一步分析或建模。
anomalyDetectionModelSVM.mat - 异常检测模型。
validationEnsemble.mat - 验证数据。
从 MATLAB 命令行测试该函数:
load validationEnsemble validationData = validationEnsemble.readall; anomaly_data_validation = vertcat(validationData.Anomalies{1}.Data); yValidationAnomaly1=logical(anomaly_data_validation(:,1)); yValidationAnomaly2=logical(anomaly_data_validation(:,2)); yValidationAnomaly3=logical(anomaly_data_validation(:,3)); sensorDataValidation = vertcat(validationData.Signals{:}.Data); windowSize = 2000; ii = IndexIterator(1, size(sensorDataValidation,1), windowSize); predictedLabel = nan(floor(size(sensorDataValidation,1)/windowSize), 3); trueLabel = nan(floor(size(sensorDataValidation,1)/windowSize), 3); counter = 1; while ~ii.EndofRangeFlag frame = ii.nextFrameIndex; [predictedLabel(counter, :), trueLabel(counter, :)] = ... detectCoolingFanAnomaly(sensorDataValidation(frame(1):frame(2), 1:3), ... anomaly_data_validation(frame(1):frame(2), 1:3)); counter = counter+1; end reset(ii); tiledlayout(1,3); nexttile; confusionchart(trueLabel(:,1), predictedLabel(:,1)); nexttile; confusionchart(trueLabel(:,2), predictedLabel(:,2)); nexttile; confusionchart(trueLabel(:,3), predictedLabel(:,3));

创建可部署存档
使用 函数将 detectCoolingFanAnomaly 函数打包成可部署存档。
buildResults = compiler.build.productionServerArchive('detectCoolingFanAnomaly.m', ... ArchiveName='coolingFanAnomaly', ... Verbose=true)
buildResults 对象包含有关编译类型、生成的文件、包含的支持包和编译选项的信息。
编译完成后,该函数会在您的当前目录中创建一个名为 coolingFanAnomalyproductionServerArchive 的文件夹来存储可部署存档。
将存档打包成微服务 Docker 镜像
使用您创建的 buildResults 对象构建微服务 Docker 镜像。您可以使用名称-值参量在 compiler.build 命令中指定其他选项。有关详细信息,请参阅compiler.package.microserviceDockerImage。
compiler.package.microserviceDockerImage(buildResults, ... ImageName='detect-cooling-fan-microservice', ... DockerContext=fullfile(pwd,'microserviceDockerContext'), ... VerbosityLevel='concise');
该函数会在当前工作目录中名为 microserviceDockerContext 的文件夹中生成以下文件:
applicationFilesForMATLABCompiler/coolingFanAnomaly.ctf- 可部署存档文件。Dockerfile- 指定 Docker 运行时选项的 Docker 文件。GettingStarted.txt- 包含部署信息的文本文件。
测试 Docker 镜像
一旦 Docker 容器初始化完成,请通过复用 validationEnsemble 中的数据来验证其内部算法。按照既定过程:将数据分成窗口,每个窗口包含 2000 个样本,并使用这些样本构建 HTTP POST 请求的消息正文。该请求的响应包括预测的异常状态,然后将其与真实标签进行比较以评估算法的准确性。
在系统命令行窗口中,确认您的 detect-cooling-fan-microservice 镜像在 Docker 镜像列表中。
docker images REPOSITORY TAG IMAGE ID CREATED SIZE detect-cooling-fan-microservice latest af24e3fe610c 2 days ago 3.94GB
从系统命令提示符运行 detectCoolingFan-microservice 图像。
docker run --rm -p 9900:9910 detectCoolingFan-microservice -l trace &
端口 9910 是微服务在 Docker 容器中默认暴露的端口。您可以将微服务映射到主机上的任何可用端口。对于此示例,它被映射到端口 9900。
您可以在 Docker 命令中指定其他选项。有关选项的完整列表,请参阅微服务命令参量。
当微服务容器在 Docker 中运行后,您可以通过在 Web 浏览器中转至以下 URL 来检查服务的状态:http://hostname:9900/api/health
如果服务已准备就绪,可以接收请求,您将看到以下消息:"status: ok"
从 MATLAB 发送请求
import matlab.net.http.* import matlab.net.http.field.* data = matlab.net.http.MessageBody(); windowSize = 2000; ii = IndexIterator(1, size(sensorDataValidation, 1), windowSize); predictedLabel = nan(floor(size(sensorDataValidation,1)/windowSize), 3); trueLabel = nan(floor(size(sensorDataValidation,1)/windowSize), 3); counter = 1; while ~ii.EndofRangeFlag frame = ii.nextFrameIndex; rhs = {sensorDataValidation(frame(1):frame(2), :), anomaly_data_validation(frame(1):frame(2), :)}; data.Payload = mps.json.encoderequest(rhs, 'Nargout', 2, 'OutputFormat', 'large'); request = RequestMessage('POST', ... [HeaderField('Content-Type', 'application/json')], ... data); response = request.send('http://localhost:9900/coolingFanAnomaly/detectCoolingFanAnomaly'); predictedLabel(counter, :) = response.Body.Data.lhs(1).mwdata'; trueLabel(counter, :) = response.Body.Data.lhs(2).mwdata'; counter = counter+1; end reset(ii); figure; tiledlayout(1,3) nexttile; confusionchart(trueLabel(1:250,1), predictedLabel(1:250,1)); nexttile; confusionchart(trueLabel(1:250,2), predictedLabel(1:250,2)); nexttile; confusionchart(trueLabel(1:250,3), predictedLabel(1:250,3));

Docker 容器中的异常检测算法现可集成至现有 IT/OT 基础设施,并通过 Kubernetes® 进行管理,以实现高可用性并处理大量请求。Docker 图像可以轻松与其他成员共享,以测试算法,并集成到其他系统中。
注意
该微服务设计为通用访问,可通过任何编程语言、命令行工具(如 cURL)或通过 MATLAB Production Server 客户端 API 进行接口调用。为了确保无缝交互和准确处理,根据所使用的特定语言或工具适当地格式化验证数据至关重要。虽然本文档主要通过使用 MATLAB 的示例来进行说明,但数据格式化指南及与服务交互的规范具有通用性,可根据不同编程环境进行适配。
另请参阅
主题
- Industrial Cooling Fan Anomaly Detection Algorithm Development for Deployment to a Microservice Docker Image (Predictive Maintenance Toolbox)