主要内容

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

部署经过训练的回归模型为微服务 Docker 镜像

支持的平台:Linux®、Windows®、macOS

此示例演示了如何从在 Train Regression Trees Using Regression Learner App (Statistics and Machine Learning Toolbox) 中创建的 MATLAB® 回归树中创建一个 Docker® 微服务镜像。在该示例中,您通过训练回归树来预测给定其他输入变量时,某款车型的燃油经济性(以每加仑英里数为单位)。由 MATLAB Compiler SDK™ 创建的微服务镜像,如本示例中所描述,提供了一个 HTTP/HTTPS 端点,用于访问 MATLAB 代码。

您可以先将 MATLAB 函数打包成可部署存档,然后创建包含该存档和最小 MATLAB Runtime 包的 Docker 镜像。之后,您可以在 Docker 中运行该镜像,并使用任何 MATLAB Production Server™ 客户端 API 调用服务。

示例文件列表

  • trainedModel.mat

  • predictValue.m

  • httpTest.m

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

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

必需的产品

在 MATLAB 命令提示符下键入 ver 以验证是否安装了以下产品:

  • MATLAB

  • Statistics and Machine Learning Toolbox™

  • MATLAB Compiler™

  • MATLAB Compiler SDK

前提条件

创建 MATLAB 函数以预测燃油经济性

在此示例中,我们使用了一个预训练的回归模型。要使用回归学习器创建一个,请参阅Train Regression Trees Using Regression Learner App (Statistics and Machine Learning Toolbox)。按照示例操作至第 20 步,其中您将以默认名称 trainedModel 导出完整模型。然后,使用 save 函数保存模型。

save("trainedModel");

然后,创建一个预测函数。

function prediction = predictValue(x)
load("trainedModel.mat","trainedModel");
X = cell2table(x,...
    "VariableNames",{'Acceleration','Cylinders','Displacement','Horsepower','Model_Year','Weight','Origin','MPG'});
prediction = trainedModel.predictFcn(X);
end

从 MATLAB 命令行测试该函数。

predictValue({12, 8, 307, 130, 70, 3504, 'USA', 18})
ans =

    15.7500

创建可部署存档

使用 函数将 predictValue 函数打包成可部署存档。

您可以使用名称-值参量在 compiler.build 命令中指定其他选项。

buildResults = compiler.build.productionServerArchive('predictValue.m',...
'ArchiveName','regressionTreeModel','Verbose',true);
buildResults = 

  Results with properties:

                  BuildType: 'productionServerArchive'
                      Files: {'\home\mluser\work\regressionTreeModelproductionServerArchive\regressionTreeModel.ctf'}
    IncludedSupportPackages: {}
                    Options: [1×1 compiler.build.ProductionServerArchiveOptions]
        RuntimeDependencies: [1×1 compiler.runtime.Dependencies]

compiler.build.Results 对象 buildResults 包含有关编译类型、生成的文件、包含的支持包和编译选项的信息。

编译完成后,该函数会在您的当前目录中创建一个名为 regressionTreeModelproductionServerArchive 的文件夹来存储可部署存档。

将存档打包成微服务 Docker 镜像

  • 使用您创建的 buildResults 对象构建微服务 Docker 镜像。您可以使用名称-值参量在 compiler.build 命令中指定其他选项。有关详细信息,请参阅compiler.package.microserviceDockerImage

compiler.package.microserviceDockerImage(buildResults,...
'ImageName','regressiontreemodel-microservice',...
'DockerContext',fullfile(pwd,'microserviceDockerContext'));

该函数会在当前工作目录中名为 microserviceDockerContext 的文件夹中生成以下文件:

  • applicationFilesForMATLABCompiler/regressionTreeModel.ctf - 可部署存档文件。

  • Dockerfile - 指定 Docker 运行时选项的 Docker 文件。

  • GettingStarted.txt - 包含部署信息的文本文件。

测试 Docker 镜像

在系统命令行窗口中,确认您的 regressiontreemodel-microservice 镜像在 Docker 镜像列表中。

docker images

此命令返回包含您微服务在内的 Docker 镜像列表:

REPOSITORY                                                               TAG               IMAGE ID       CREATED          SIZEregressiontreemodel-microservice                                             latest            57f43b6811ce   22 seconds ago   7.31GB
matlabruntime/r2025a/release/update4/f08180002000003010                  latest            3d8fedb4189b   5 weeks ago      7.31GB

从系统命令提示符运行 regressiontreemodel-microservice 微服务镜像。

docker run --rm -p 9900:9910 regressiontreemodel-microservice -l trace &

端口 9910 是 Docker 容器内微服务公开的默认端口。您可以将微服务映射到主机上的任何可用端口。对于此示例,微服务映射到端口 9900。

您可以在 Docker 命令中指定其他选项。有关完整选项列表,请参阅微服务命令参量

一旦微服务容器在 Docker 中运行,您就可以通过在 Web 浏览器中访问以下 URL 来检查服务的状态:

http://<hostname>:9900/api/health

注意:如果 Docker 与浏览器在同一台计算机上运行,则使用 localhost 作为主机名。

如果服务已准备好接收请求,您将看到以下消息。

"status:  ok"

测试正在运行的服务。使用 MATLAB 桌面应用程序通过端口 9900 向服务发送 JSON 查询。有关构造 JSON 请求的详细信息,请参阅MATLAB 数据类型的 JSON 表示 (MATLAB Production Server)

%% Import MATLAB HTTP interface packages
import matlab.net.*
import matlab.net.http.*
import matlab.net.http.fields.*

%% Setup message body
body = MessageBody;

input_data = '{"mwdata": [[12], [8], [307], [130], [70], [3504], "USA", [18]], "mwsize": [1,8],"mwtype":"cell"}';
payloadText = strcat('{"nargout":1,"rhs":[', input_data,']}');

body.Payload = payloadText;

%% Setup request
requestUri = URI('http://localhost:9900/regressionTreeModel/predictValue');
options = matlab.net.http.HTTPOptions('ConnectTimeout',20,...
    'ConvertResponse',false);
request = RequestMessage;
request.Header = HeaderField('Content-Type','application/json');
request.Method = 'POST';
request.Body = body;

%% Send request & view raw response
response = request.send(requestUri, options);
disp(response.Body.Data)

%% Decode JSON and Display Response
lhs = mps.json.decoderesponse(response.Body.Data);

注意:将上面代码中的 hostname 替换为适当的主机。由于 Docker 在本地运行,请使用 localhost

输出为:

{"lhs":[{"mwdata":[15.750000000000002],"mwsize":[1,1],"mwtype":"double"}]}

要停止服务,请使用以下命令显示容器 ID。

docker ps
CONTAINER ID   IMAGE                          COMMAND                  CREATED          STATUS          PORTS                                       NAMES
0662c1e1fa85   regressiontreemodel-microservice   "/opt/matlabruntime/…"   17 minutes ago   Up 17 minutes   0.0.0.0:9900->9910/tcp, :::9900->9910/tcp   ecstatic_torvalds

使用指定的容器 ID 停止服务。

docker stop 0662c1e1fa85

共享 Docker 镜像

您的 Docker 镜像可以通过多种方式共享。

  • 将您的镜像推送到 Docker 的中央注册表 DockerHub,或者推送到您的私有注册表。这是最常见的工作流。

  • 将您的镜像保存为 tar 存档,然后与他人共享。该工作流适合于立即测试。

有关将您的镜像推送到 DockerHub 或您的私有注册表的详细信息,请查阅 Docker 文档。

Docker 镜像保存为 Tar 存档

要将您的 Docker 镜像保存为 tar 存档,请打开系统命令行窗口,导航到 Docker 上下文文件夹,然后键入以下命令。

docker save regressiontreemodel-microservice -o regressiontreemodel-microservice.tar

此命令会在当前文件夹中创建一个名为 regressiontreemodel-microservice.tar 的文件。在与其他用户共享 tarball 之前,请设置适当的权限(例如,使用 chmod 进行设置)。

从 Tar 存档加载 Docker 镜像

在最终用户计算机上加载 tarball 中包含的镜像。

docker load --input regressiontreemodel-microservice.tar

验证镜像是否已加载。

docker images

运行 Docker 镜像

docker run --rm -p 9900:9910 regressiontreemodel-microservice

另请参阅

主题

外部网站