使用 Docker 将晶圆图缺陷分类器部署为微服务
此示例演示了如何从Classify Defects on Wafer Maps Using Deep Learning (Image Processing Toolbox)中描述的晶圆图缺陷分类器创建一个微服务 Docker® 镜像。通过 MATLAB® Compiler SDK™ 创建的微服务镜像提供一个可用于访问 MATLAB 代码的 HTTP/HTTPS 端点。
您可以先将 MATLAB 函数打包成可部署存档,然后创建包含该存档和最小 MATLAB Runtime 包的 Docker 镜像。之后,您可以在 Docker 中运行该镜像,并使用任何 MATLAB Production Server™ 客户端 API 调用服务。
示例文件列表
waferdefect.m
要下载示例文件,请在 MATLAB 命令行窗口中键入以下内容。
openExample("compilersdk/WaferDefectExample", workDir=pwd)
必需的产品
在 MATLAB 命令提示符下键入 ver
以验证是否安装了以下产品:
MATLAB
Deep Learning Toolbox™
MATLAB Compiler™
MATLAB Compiler SDK
前提条件
验证
CNN-WM811K.mat
(在示例 Classify Defects on Wafer Maps Using Deep Learning (Image Processing Toolbox) 中训练或下载的卷积神经网络)是否位于您的 MATLAB 路径中。验证您是否已在开发计算机上安装了 MATLAB Compiler SDK。
通过在 MATLAB 命令行窗口中键入
[~,msg] = system('docker version')
,验证您是否已在开发计算机上安装并配置了 Docker。注意:如果您使用的是 WSL,请改用命令[~,msg] = system('wsl docker version')
。如果您尚未安装 Docker,请按照 Docker 网站上的说明进行安装和设置 Docker。docs.docker.com/engine/install/
要在 Windows® 上构建微服务镜像,您必须安装 Docker Desktop 或在 Windows Subsystem for Linux v2 (WSL2) 上安装 Docker。要安装 Docker Desktop,请参阅
https://docs.docker.com/desktop/setup/install/windows-install/
。有关在 WSL2 上安装 Docker 的说明,请参阅 https://www.mathworks.com/matlabcentral/answers/1758410-how-do-i-install-docker-on-wsl2.
确认您的计算机上安装了适用于 Linux® 的 MATLAB Runtime 安装程序。您可以从 MathWorks® 网站下载安装程序:https://www.mathworks.com/products/compiler/matlab-runtime.html
创建推理函数
首先,在一个名为 waferdefect.m
的单独文件中创建一个执行推理的函数。
function prediction = waferdefect(image) load("CNN-WM811K.mat","preTrainedNetwork"); %classify the wafer images in the batch and return the results prediction = string(classify(preTrainedNetwork,imresize(imread(image), [48,48]))); disp(string(prediction)) end
使用下面的附带图像,从 MATLAB 命令行测试该函数。
[im, cmap] = imread("waferimage.jpg"); imshow(im, cmap) %% Detect objects in image prediction = waferdefect(im)
prediction = "Edge-Loc"
注意:对于此示例,用于测试分类器的 waferimage.jpg
文件将包含在 AdditionalFiles
参量下。实际上,这些图像可能会被摄像机定期捕捉到。
创建可部署存档
接下来,使用 waferdefect
函数将 compiler.build.productionServerArchive
函数打包成可部署的存档。
您可以使用名称-值参量在 compiler.build
命令中指定其他选项。有关详细信息,请参阅compiler.build.productionServerArchive
。
deployableArchive = compiler.build.productionServerArchive('waferdefect.m',... ArchiveName='waferdefectclassifier', AdditionalFiles=["CNN-WM811K.mat", "waferimage.jpg"], Verbose=true);
编译完成后,该函数会在您的当前目录中创建一个名为 waferdefectproductionServerArchive
的文件夹来存储可部署存档。
将存档打包成微服务 Docker 镜像
使用您创建的 deployableArchive
对象构建微服务 Docker 镜像。
您可以使用名称-值参量在 compiler.build
命令中指定其他选项。有关详细信息,请参阅compiler.package.microserviceDockerImage
。
compiler.package.microserviceDockerImage(deployableArchive,'ImageName','waferdefectclassifier');
此函数会在本地容器仓库中创建一个名为 waferdefectclassifier
的 Docker 容器镜像。您可以通过打开命令提示符窗口并输入以下命令来验证 Docker 容器镜像是否已创建:
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE waferdefectclassifier latest 809ec52ec3f9 About a minute ago 6.96GB matlabruntime/r2023a/release/update3/f08140002000000010 latest e46173b11d3c 2 days ago
此外,该函数会在当前目录中生成一个 MicroserviceDockerContext
文件夹,其中包含以下文件:
applicationFilesForMATLABCompiler/waferdefect.ctf
- 可部署存档文件。Dockerfile
- 指定 Docker 运行时选项的 Docker 文件。GettingStarted.txt
- 包含部署信息的文本文件。
GettingStarted.txt
文件包含用于在本地启动微服务进行测试的命令
docker run --rm -p 9900:9910 waferdefectclassifier -l trace &
端口 9910 是 Docker 容器内微服务公开的默认端口。您可以将微服务映射到主机上的任何可用端口。对于此示例,微服务映射到端口 9900。
您可以在 Docker 命令中指定其他选项。有关完整选项列表,请参阅微服务命令参量。
一旦微服务容器在 Docker 中运行,您就可以通过在 Web 浏览器中访问以下 URL 来检查服务的状态:
http://localhost:9900/api/health
如果服务已准备就绪,可以接收请求,您将看到以下消息:
"status: ok"
测试正在运行的服务。在终端中,使用 curl
命令通过端口 9900 向服务发送 JSON 查询。有关构造 JSON 请求的详细信息,请参阅MATLAB 数据类型的 JSON 表示 (MATLAB Production Server)。
Linux 和 macOS 终端
curl -v -H Content-Type:application/json \ -d '{"nargout":1,"rhs":["https://<path_to_the_image_file>"]}' \ "http://localhost:9900/waferdefectclassifier/waferdefect" | jq -c
Windows PowerShell
Invoke-RestMethod -Uri 'http://localhost:9900/waferdefectclassifier/waferdefect' -Method Post -ContentType 'application/json' -Body '{"nargout":1,"rhs":["https://uk.mathworks.com/help/examples/images_deeplearning/win64/ClassifyWaferMapDefectsUsingDeepLearningExample_08.png"]}' | ConvertTo-Json
输出为:
{"lhs":[{"mwdata": "Edge-Loc", "mwsize": "1 1", "mwtype": "string"}]}
共享 Docker 镜像
您的 Docker 镜像可以通过多种方式共享。
将您的镜像推送到 Docker 的中央注册表 DockerHub,或者推送到您的私有注册表。这是最常见的工作流。
将您的镜像保存为 tar 存档,然后与他人共享。该工作流适合于立即测试。
有关将您的镜像推送到 DockerHub 或您的私有注册表的详细信息,请查阅 Docker 文档。
将 Docker 镜像保存为 Tar 存档
要将您的 Docker 镜像保存为 tar 存档,请打开系统命令行窗口,导航到 Docker 上下文文件夹,然后键入以下命令。
docker save waferdefectclassifier -o waferdefectclassifier.tar
此命令会在当前文件夹中创建一个名为 waferdefectclassifier.tar
的文件。在与其他用户共享 tarball 之前,请设置适当的权限(例如,使用 chmod
进行设置)。
从 Tar 存档加载 Docker 镜像
在最终用户计算机上加载 tarball 中包含的镜像。
docker load --input waferdefectclassifier.tar
验证镜像是否已加载。
docker images
运行 Docker 镜像
docker run --rm -p 9900:9910 waferdefectclassifier
另请参阅
matlabshared.supportpkg.getInstalled
| compiler.build.productionServerArchive
| compiler.package.microserviceDockerImage
| compiler.runtime.createInstallerDockerImage