主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

将工业冷却风扇异常检测算法部署为微服务

本示例详细说明了将 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.mat

  • detectCoolingFanAnomaly.m

  • diagnosticFeatures_streaming.m

  • generateEnsembleTable.m

  • validationEnsemble.mat

要下载示例文件,请在 MATLAB 命令行窗口中键入以下内容。

openExample("compilersdk/DeployCoolingFanAnomalyDetectionExample", workDir=pwd)

前提条件

创建 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));

CoolingFanAnomalyDetectionExample_05.png

创建可部署存档

使用 函数将 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));

CoolingFanAnomalyDetectionExample_06.png

Docker 容器中的异常检测算法现可集成至现有 IT/OT 基础设施,并通过 Kubernetes® 进行管理,以实现高可用性并处理大量请求。Docker 图像可以轻松与其他成员共享,以测试算法,并集成到其他系统中。

注意

该微服务设计为通用访问,可通过任何编程语言、命令行工具(如 cURL)或通过 MATLAB Production Server 客户端 API 进行接口调用。为了确保无缝交互和准确处理,根据所使用的特定语言或工具适当地格式化验证数据至关重要。虽然本文档主要通过使用 MATLAB 的示例来进行说明,但数据格式化指南及与服务交互的规范具有通用性,可根据不同编程环境进行适配。

另请参阅

主题