マイクロサービスとしてのオブジェクト検出モデルのデプロイ
この例では、MATLAB オブジェクト検出モデルからマイクロサービスの Docker® イメージを作成する方法を説明します。MATLAB® Compiler SDK™ で作成されたマイクロサービスのイメージは、MATLAB コードにアクセスするための HTTP/HTTPS エンドポイントを提供します。
MATLAB 関数をデプロイ可能なアーカイブにパッケージ化し、アーカイブと最小限の MATLAB Runtime パッケージを含む Docker イメージを作成します。次に、Docker でイメージを実行し、任意の MATLAB Production Server クライアント API を使用して、サービスへの呼び出しを行います。
サポート パッケージのダウンロード
MATLAB コマンド プロンプトで「matlabshared.supportpkg.getInstalled
」と入力し、次のアドオンがインストールされているかどうかを確認します。
Computer Vision Toolbox Model for YOLO v4 Object Detection
アドオンをインストールする必要がある場合は、MATLAB ツールストリップの [アドオン] アイコンをクリックし、アドオンを検索します。MathWorks File Exchange からダウンロードしてインストールすることもできます。
前提条件
開発マシンに MATLAB Compiler SDK がインストールされていることを確認します。
MATLAB コマンド ウィンドウで「
[~,msg] = system('docker version')
」と入力して、開発マシンで Docker がインストールおよび構成されていることを確認します。WSL を使用する場合は、代わりにコマンド[~,msg] = system('wsl docker version')
を使用します。Docker がインストールされていない場合は、Docker の Web サイトの指示に従って、Docker のインストールと設定を行います。詳細については、
docs.docker.com/engine/install/
.
を参照してください。Windows でマイクロサービスのイメージをビルドするには、Docker Desktop または Docker on Windows Subsystem for Linux v2 (WSL2) をインストールする必要があります。Docker Desktop をインストールする場合は、
docs.docker.com/desktop/windows/install/
を参照してください。WSL2 に Docker をインストールする方法の説明については、https://www.mathworks.com/matlabcentral/answers/1758410-how-do-i-install-docker-on-wsl2
を参照してください。使用しているコンピューターがインターネットに接続していない場合、インターネットに接続しているコンピューターから Linux 用の MATLAB Runtime インストーラーをダウンロードし、そのインストーラーをインターネットに接続していないコンピューターに移す必要があります。次に、オフラインのマシンでコマンド
compiler.runtime.createInstallerDockerImage
を実行します。ここで、filepath
は MATLAB Runtime インストーラー アーカイブのパスです。インストーラーは MathWorks の Web サイトからダウンロードできます。詳細については、https://www.mathworks.com/products/compiler/matlab-runtime.html
.
を参照してください。
オブジェクトを検出する MATLAB 関数の作成
以下のコードを使用して、cvt
という名前のオブジェクト検出関数を作成します。この関数を cvt.m
という名前のファイルに保存します。
function [bboxes, scores, labels] = cvt(imageUrl) iminfo = imfinfo(imageUrl); % Read image % If indexed image, read colormap and convert to rgb if strcmp(iminfo.ColorType,'indexed') == 1 [im, cmap] = webread(imageUrl, 'Timeout', 10); im = ind2rgb(im, cmap); else im = webread(imageUrl, 'Timeout', 10); end % Add pretrained YOLO v4 dataset tinyYOLOv4COCO.mat to MATLAB path for testing % Comment or remove the next 2 lines of code prior to deploying as microservice detectorPath = [matlabshared.supportpkg.getSupportPackageRoot, '/toolbox/vision/supportpackages/yolov4/data']; addpath(detectorPath) load('tinyYOLOv4COCO.mat', 'detector'); % Detect objects in image using detector [bboxes,scores,labels] = detect(detector,im); labels = cellstr(labels); end
MATLAB コマンド ラインからこの関数をテストします。
%% Specify image URL imageUrl = "https://www.mathworks.com/help/examples/deeplearning_shared/win64/TrafficSignDetectionAndRecognitionExample_02.png" %% Display image imageFile = "trafficimage.jpg"; imageFileFullPath = websave(imageFile, imageUrl); [im, cmap] = imread(imageFileFullPath); imshow(im, cmap) %% Detect objects in image [bboxes, scores, labels] = cvt(imageUrl)
bboxes = 2×4 single matrix 445.3871 326.4009 223.3270 98.7086 504.2861 271.4571 45.7471 41.0955 scores = 2×1 single column vector 0.9151 0.6610 labels = 2×1 cell array {'truck' } {'stop sign'}
デプロイ可能なアーカイブの作成
デプロイ可能なアーカイブを作成する前に、cvt.m
ファイル内の次のコード行をコメント化します。
% detectorPath = [matlabshared.supportpkg.getSupportPackageRoot, '/toolbox/vision/supportpackages/yolov4/data']; % addpath(detectorPath)
関数 compiler.build.productionServerArchive
を使用して、関数 cvt
をデプロイ可能なアーカイブにパッケージ化します。
compiler.build
コマンドで名前と値の引数を使用して、追加オプションを指定できます。詳細については、compiler.build.productionServerArchive
を参照してください。
buildResults = compiler.build.productionServerArchive('cvt.m', ... 'ArchiveName','yolov4od','Verbose',true, ... 'SupportPackages',{'Computer Vision Toolbox Model for YOLO v4 Object Detection'});
buildResults = Results with properties: BuildType: 'productionServerArchive' Files: {'/home/mluser/work/yolov4odproductionServerArchive/yolov4od.ctf'} IncludedSupportPackages: {'Computer Vision Toolbox Model for YOLO v4 Object Detection'} Options: [1×1 compiler.build.ProductionServerArchiveOptions]
buildResults
オブジェクトには、ビルド タイプ、生成ファイル、含まれるサポート パッケージ、およびビルド オプションに関する情報が含まれています。
ビルドが完了すると、この関数は yolov4odproductionServerArchive
という名前のフォルダーを現在のディレクトリに作成し、デプロイ可能なアーカイブを保存します。
マイクロサービスの Docker イメージへのアーカイブのパッケージ化
作成した buildResults
オブジェクトを使用してマイクロサービスの Docker イメージをビルドします。
compiler.build
コマンドで名前と値の引数を使用して、追加オプションを指定できます。詳細については、compiler.package.microserviceDockerImage
を参照してください。
compiler.package.microserviceDockerImage(buildResults,... 'ImageName','yolov4od-microservice',... 'DockerContext',fullfile(pwd,'microserviceDockerContext'));
この関数により、現在の作業ディレクトリにある microserviceDockerContext
という名前のフォルダー内に以下のファイルが生成されます。
applicationFilesForMATLABCompiler/yolov4od.ctf
— デプロイ可能なアーカイブ ファイル。Dockerfile
— Docker 実行時オプションを指定する Docker ファイル。GettingStarted.txt
— デプロイ情報が含まれるテキスト ファイル。
Docker イメージのテスト
システム コマンド ウィンドウで、yolov4od-microservice
イメージが Docker イメージのリストに含まれていることを確認します。
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE yolov4od-microservice latest 4401fa2bc057 33 seconds ago 7.56GB matlabruntime/r2022b/update0/4200000000000000 latest 5259656e4a32 24 minutes ago 7.04GB
システムのコマンド プロンプトから yolov4od-microservice
マイクロサービス イメージを実行します。
docker run --rm -p 9900:9910 yolov4od-microservice -l trace &
ポート 9910 は、Docker コンテナー内でマイクロサービスによって公開される既定のポートです。ホスト マシン上の任意の使用可能なポートにマッピングできます。この例では、ポート 9900 にマッピングしています。
Docker コマンドで追加オプションを指定できます。オプションの完全なリストについては、マイクロサービスのコマンド引数を参照してください。
マイクロサービス コンテナーが Docker で実行されたら、Web ブラウザーで URL http://
hostname
:9900/api/health
に移動してサービスのステータスを確認できます。
サービスでリクエストを受け取る準備ができている場合は、"status: ok"
というメッセージが表示されます。
実行されているサービスをテストします。ターミナルで、curl
コマンドを使用し、ポート 9900 を介して JSON クエリをサービスに送信します。JSON リクエストの作成の詳細については、MATLAB データ型の JSON 表現 (MATLAB Production Server) (MATLAB Production Server) を参照してください。
curl -v -H Content-Type:application/json \ -d '{"nargout":3,"rhs":["https://www.mathworks.com/help/examples/deeplearning_shared/win64/TrafficSignDetectionAndRecognitionExample_02.png"]}' \ "http://hostname:9900/yolov4od/cvt" | jq -c
出力は以下のようになります。
{"lhs":[{"mwdata":[445.387146,504.286102,326.40094,271.457092,223.327026,45.7471,98.7086487,41.09552],"mwsize":[2,4],"mwtype":"single"}, {"mwdata":[0.91510725,0.661022],"mwsize":[2,1],"mwtype":"single"}, {"mwdata":[{"mwdata":["truck"],"mwsize":[1,5],"mwtype":"char"}, {"mwdata":["stop sign"],"mwsize":[1,9],"mwtype":"char"}],"mwsize":[2,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": 3,"rhs": ["https://www.mathworks.com/help/examples/deeplearning_shared/win64/TrafficSignDetectionAndRecognitionExample_02.png"]}'; %% Setup request requestUri = URI('http://hostname:9900/yolov4od/cvt'); 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); %% Clean up printed output for i = 1:length(lhs) [r,c] = size(lhs{i}); if ~iscell(lhs{i}) && c==1 tmp(:,i) = num2cell(lhs{i}); elseif ~iscell(lhs{i}) && c~=1 tmp(:,i) = num2cell(lhs{i},2); else tmp(:,i) = lhs{i}; end end %% Display response as a table T = cell2table(tmp,'VariableNames',{'Boxes', 'Scores', 'Labels'})
出力は以下のようになります。
T = 2×3 table Boxes Scores Labels ____________________________________ _______ _____________ 445.39 326.4 223.33 98.709 0.91511 {'truck' } 504.29 271.46 45.747 41.096 0.66102 {'stop sign'}
サービスを停止するには、以下のコマンドを使用してコンテナー ID を表示します。
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f372b8b574e8 yolov4od-microservice "/opt/matlabruntime/…" 6 hours ago Up 6 hours 0.0.0.0:9900->9910/tcp distracted_panini
示されたコンテナー ID を使用してサービスを停止します。
docker stop f372b8b574e8
Docker イメージの共有
Docker イメージはさまざまな方法で共有できます。
イメージを Docker の中央レジストリ DockerHub にプッシュするか、プライベート レジストリにプッシュします。これが最も一般的なワークフローです。
イメージを tar アーカイブとして保存するか、他のユーザーと共有します。このワークフローは、ただちにテストを行う場合に適しています。
イメージを DockerHub またはプライベート レジストリにプッシュする方法の詳細については、Docker のドキュメンテーションを参照してください。
Docker イメージを tar アーカイブとして保存
Docker イメージを tar アーカイブとして保存するには、システム コマンド ウィンドウを開き、Docker コンテキストのフォルダーに移動して次を入力します。
docker save yolov4od-microservice -o yolov4od-microservice.tar
このコマンドにより、現在のフォルダー内に yolov4od-microservice.tar
という名前のファイルが作成されます。tarball を他のユーザーと共有する前に、(chmod
を使用するなどして) 適切な権限を設定します。
tar アーカイブからの Docker イメージの読み込み
エンド ユーザーのマシン上で tarball に含まれるイメージを読み込みます。
docker load --input yolov4od-microservice.tar
イメージが読み込まれたことを確認します。
docker images
Docker イメージの実行
docker run --rm -p 9900:9910 yolov4od-microservice
参考
matlabshared.supportpkg.getInstalled
| compiler.build.productionServerArchive
| compiler.package.microserviceDockerImage
| compiler.runtime.createInstallerDockerImage