主要内容

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

部署经过训练的强化学习策略作为微服务 Docker 镜像

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

此示例演示了如何从一个 MATLAB® 强化学习策略创建一个 Docker® 微服务镜像。通过 MATLAB Compiler SDK™ 创建的微服务镜像提供一个可用于访问 MATLAB 代码的 HTTP/HTTPS 端点。

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

示例文件列表

  • evaluatePolicy.m

  • policy.mat

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

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

必需的产品

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

  • MATLAB

  • Deep Learning Toolbox

  • Reinforcement Learning Toolbox

  • MATLAB Compiler™

  • MATLAB Compiler SDK

前提条件

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

另请参阅

外部网站