部署经过训练的回归模型为微服务 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 Compiler SDK。
通过在 MATLAB 命令行窗口中键入
[~,msg] = system('docker version')
,验证您是否已在开发计算机上安装并配置了 Docker。注意:如果您使用的是 WSL,请改用命令[~,msg] = system('wsl docker version')
。如果您尚未安装 Docker,请按照 Docker 网站上的说明进行安装和设置 Docker。
docs.docker.com/engine/install/
要在 Windows 上构建微服务镜像,您必须在 Windows 子系统 for Linux v2(WSL2)上安装 Docker Desktop 或 Docker。要安装 Docker Desktop,请参阅
docs.docker.com/desktop/setup/install/windows-install/
。有关在 WSL2 上安装 Docker 的说明,请参阅 https://www.mathworks.com/matlabcentral/answers/1758410-how-do-i-install-docker-on-wsl2.如果您使用的计算机未连接到互联网,您必须从连接到互联网的计算机下载 MATLAB Runtime 安装程序,并将安装程序传输到未连接到互联网的计算机。然后,在该离线计算机上运行命令
compiler.runtime.createInstallerDockerImage
(filepath)
,其中filepath
是 MATLAB Runtime 安装程序存档的路径。您可以从 MathWorks 网站下载安装程序。httpshttps://www.mathworks.com/products/compiler/matlab-runtime.html
创建 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