部署经过训练的强化学习策略作为微服务 Docker 镜像
支持的平台:Linux®、Windows®、macOS
此示例演示了如何从一个 MATLAB® 强化学习策略创建一个 Docker® 微服务镜像。通过 MATLAB Compiler SDK™ 创建的微服务镜像提供一个可用于访问 MATLAB 代码的 HTTP/HTTPS 端点。
您可以先将 MATLAB 函数打包成可部署存档,然后创建包含该存档和最小 MATLAB Runtime 包的 Docker 镜像。之后,您可以在 Docker 中运行该镜像,并使用任何 MATLAB Production Server™ 客户端 API 调用服务。
示例文件列表
evaluatePolicy.mpolicy.mat
要下载示例文件,请在 MATLAB 命令行窗口中键入以下内容。
openExample("compilersdk/DeployReinforcementExample", workDir=pwd)
必需的产品
在 MATLAB 命令提示符下键入 ver 以验证是否安装了以下产品:
MATLAB
Deep Learning Toolbox
Reinforcement 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 网站下载该安装程序。请参阅https://www.mathworks.com/products/compiler/matlab-runtime.html。
创建 MATLAB 函数以评估策略
在这个示例中,我们使用预先训练的 DQN 代理来平衡手推车杆系统。有关更多详细信息,请参阅Train DQN Agent to Balance Discrete Cart-Pole System (Reinforcement Learning Toolbox)。使用以下代码编写一个名为 evaluatePolicy.m 的策略评估函数。
function action = evaluatePolicy(observation) % Generate action from policy % Load the policy from a MAT file % policy.mat may contain an agent or policy with the name "agent" persistent policy if isempty(policy) policy = load("policy.mat"); end % Evaluate the policy action = getAction(policy.agent,observation); end
从 MATLAB 命令行测试该函数:
load("policy.mat")
evaluatePolicy(rand(agent.ObservationInfo.Dimension))
ans =
1×1 cell array
{[10]}
创建可部署存档
使用 函数将 evaluatePolicy 函数打包成可部署存档。
您可以使用名称-值参量在 compiler.build 命令中指定其他选项。
buildResults = compiler.build.productionServerArchive('evaluatePolicy.m',... 'ArchiveName','cartPoleDQN','Verbose',true);
buildResults =
Results with properties:
BuildType: 'productionServerArchive'
Files: {'\home\mluser\work\cartPoleDQNproductionServerArchive\cartPoleDQN.ctf'}
IncludedSupportPackages: {}
Options: [1×1 compiler.build.ProductionServerArchiveOptions]
RuntimeDependencies: [1×1 compiler.runtime.Dependencies]
compiler.build.Results 对象 buildResults 包含有关编译类型、生成的文件、包含的支持包和编译选项的信息。
编译完成后,该函数会在您的当前目录中创建一个名为 cartPoleDQNproductionServerArchive 的文件夹来存储可部署存档。
将存档打包成微服务 Docker 镜像
使用您创建的
buildResults对象构建微服务 Docker 镜像。您可以使用名称-值参量在compiler.build命令中指定其他选项。有关详细信息,请参阅compiler.package.microserviceDockerImage。
compiler.package.microserviceDockerImage(buildResults,... 'ImageName','cartpoledqn-microservice',... 'DockerContext',fullfile(pwd,'microserviceDockerContext'));
该函数会在当前工作目录中名为 microserviceDockerContext 的文件夹中生成以下文件:
applicationFilesForMATLABCompiler/cartPoleDQN.ctf- 可部署存档文件。Dockerfile- 指定 Docker 运行时选项的 Docker 文件。GettingStarted.txt- 包含部署信息的文本文件。
测试 Docker 镜像
在系统命令行窗口中,确认您的 cartPoleDQN-microservice 镜像在 Docker 镜像列表中。
docker images
该命令应返回包含您的微服务在内的 Docker 镜像列表:
REPOSITORY TAG IMAGE ID CREATED SIZE cartpoledqn-microservice latest 57f43b6811ce 22 seconds ago 7.31GB matlabruntime/r2023a/release/update4/f08180002000003010 latest 3d8fedb4189b 5 weeks ago 7.31GB
从系统命令提示符运行 cartpoledqn-microservice 微服务镜像。
docker run --rm -p 9900:9910 cartpoledqn-microservice -l trace &
端口 9910 是 Docker 容器内微服务公开的默认端口。您可以将微服务映射到主机上的任何可用端口。对于此示例,微服务映射到端口 9900。
您可以在 Docker 命令中指定其他选项。有关完整选项列表,请参阅微服务命令参量。
一旦微服务容器在 Docker 中运行,您就可以通过在 Web 浏览器中访问以下 URL 来检查服务的状态:
http://<hostname>:9900/api/health
注意:如果 Docker 与浏览器在同一台计算机上运行,则使用 localhost 作为主机名。
如果服务已准备就绪,可以接收请求,您将看到以下消息:
"status: ok"
测试正在运行的服务。在终端中,使用 curl 命令通过端口 9900 向服务发送 JSON 查询。有关构造 JSON 请求的详细信息,请参阅MATLAB 数据类型的 JSON 表示 (MATLAB Production Server)。
curl --location 'http://localhost:9900/cartPoleDQN/evaluatePolicy' \
--header 'Content-Type: application/json' \
--data '{"nargout":1,"rhs":[{"mwdata":[0,0,0,0],"mwsize":[4,1],"mwtype":"double"}]}'
输出为:
{"lhs":[{"mwdata":[{"mwdata":[-10],"mwsize":[1,1],"mwtype":"double"}],"mwsize":[1,1],"mwtype":"cell"}]}
您也可以从 MATLAB 桌面进行测试:
%% Import MATLAB HTTP interface packages import matlab.net.* import matlab.net.http.* import matlab.net.http.fields.* %% Setup message body body = MessageBody; body.Payload = ... '{"nargout":1,"rhs":[{"mwdata":[0,0,0,0],"mwsize":[4,1],"mwtype":"double"}]}'; %% Setup request requestUri = URI('http://hostname:9900/cartPoleDQN/evaluatePolicy'); 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 lhs = mps.json.decoderesponse(response.Body.Data); %% Display response as a table T = cell2table(lhs{:},'VariableNames',{'Action'})
注意:将上面代码中的 hostname 替换为适当的主机。由于 Docker 在本地运行,请使用 localhost。
输出为:
T =
table
Action
______
-10
要停止服务,请使用以下命令显示容器 ID。
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0662c1e1fa85 cartpoledqn-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 cartpoledqn-microservice -o cartpoledqn-microservice.tar
此命令在当前文件夹中创建一个名为 cartpoledqn -microservice.tar 的文件。在与其他用户共享 tarball 之前,请设置适当的权限(例如,使用 chmod 进行设置)。
从 Tar 存档加载 Docker 镜像
在最终用户计算机上加载 tarball 中包含的镜像。
docker load --input cartpoledqn-microservice.tar
验证镜像是否已加载。
docker images
运行 Docker 镜像
docker run --rm -p 9900:9910 cartpoledqn-microservice