MATLAB Parallel Serverとparforとsave

9 views (last 30 days)
NT
NT on 13 Jan 2023
Edited: NT on 16 Jan 2023
以下のスクリプト(parfor_save.m)は、「並列」→「既定のクラスターの選択」でMATLAB Parallel Serverで作成したクラスターを選択した場合に動作しますが、save関数で保存したMATファイルが見つかりません。
ファイルはどこに保存されるのでしょうか?
また、指定したディレクトリ(results_dir)にMATファイルを保存したいのですが、どのように修正すれば良いでしょうか?
■環境
クライアント:MATLAB R2021b(Windows10 64bit)
MATLAB Parallel Server:R2021b
■スクリプト(main_save_func_parfor.m)
function main_save_func_parfor(fname, x)
save(fname, 'x');
end
■スクリプト(parfor_save.m)
% 変数の初期化
clear all;
% 作業ディレクトリに移動。
cd('D:\matlab');
% ファイルを保存するディレクトリ
results_dir = fullfile(pwd, 'Results');
% MATファイルのリスト取得
dirInfo = dir(fullfile(fullfile(pwd, 'data'), '/*.mat'));
% 並列プールの生成
parpool(4);
% 保存用のサンプルデータ
sampledata = ones(10);
parfor i = 1 : length(dirInfo)
[filepath, filename, ext] = fileparts(dirInfo(i).name);
save_fname = [filename, '_', num2str(i), '.mat'];
main_save_func_parfor(save_fname, sampledata);
end;
delete(gcp('nocreate'));
  2 Comments
Kojiro Saito
Kojiro Saito on 13 Jan 2023
2点確認があります。
MATLAB Parallel Serverが実行されているサーバーはWindowsのクライアントと同じマシンでしょうか?それともリモートのサーバーでしょうか?
また、もしMATLAB Parallel Serverがリモートサーバーにある際に、results_dirで指定しているクライアントのフォルダーは、リモートサーバーからマウントしたりホスト名またはIPアドレスでアクセスできる共有フォルダーになっていますでしょうか?
NT
NT on 13 Jan 2023
Edited: NT on 13 Jan 2023
お世話になっております。
MATLAB Parallel Serverはリモート、3台構成(Head1台、Node2台)で、OSは全てLinux(Ubuntu)です。
フォルダ(results_dir)は共有フォルダではありません。
ただ、MATLAB Parallel Serverを構成する全てのパソコンではSambaが動作しているので、共有フォルダを設定してクライアント(Windows)からアクセスすることは可能です。
どうぞよろしくお願いいたします。

Sign in to comment.

Accepted Answer

Kojiro Saito
Kojiro Saito on 13 Jan 2023
> save関数で保存したMATファイルが見つかりません。ファイルはどこに保存されるのでしょうか?
MATLAB Parallel Serverのワーカーの作業フォルダーの中に保存されます。
Windowsでは C:\ProgramData\MJS\Checkpoint\ホスト名_worker01_mlworker_log\matlab\work
Linuxでは /var/lib/mjs/ホスト名_worker01_mlworker_log/matlab/work
のようなフォルダー名がデフォルトになります。
このフォルダーはMATLAB Parallel Serverのインストールディレクトリのtoolbox/parallel/bin/にある
mjs_def.shファイルまたはmjs_def.batファイルのCHECKPOINTBASEで変更できます。
parforの中で
disp(pwd)
を入れれば作業フォルダーを確認できます。
> また、指定したディレクトリ(results_dir)にMATファイルを保存したいのですが、どのように修正すれば良いでしょうか?
バージョンR2022aからはファイルストアが使えるようになったので、クライアントとワーカー間のファイルの共有がかなり楽になりました。
R2021bでも使える方法としては、書き込み先フォルダーを指定する方法があります。results_dirの部分をLinuxのパスに変更し、save_fnameをフルパスで指定するように変更すれば実現できます。
下記のコードの変更1と変更2の部分です。
% 変数の初期化
clear all;
% 作業ディレクトリに移動。
cd('D:\matlab');
% ファイルを保存するディレクトリ
results_dir = '/tmp/results/'; % 変更1
% MATファイルのリスト取得
dirInfo = dir(fullfile(fullfile(pwd, 'data'), '/*.mat'));
% 並列プールの生成
parpool(4);
% 保存用のサンプルデータ
sampledata = ones(10);
parfor i = 1 : length(dirInfo)
[filepath, filename, ext] = fileparts(dirInfo(i).name);
save_fname = fullfile(results_dir, [filename, '_', num2str(i), '.mat']); % 変更2
main_save_func_parfor(save_fname, sampledata);
end;
delete(gcp('nocreate'));
変更1で/tmpディレクトリを指定していますが、ここを任意のディレクトリ名に変更してみてください。
細かい話になってしまいますが、MATLAB Parallel Serverはセキュリティレベルによってジョブの実行ユーザーが変わります。
こちらに詳細がありますが、デフォルトではセキュリティレベル0なので、「タスクは、ワーカー マシンで mjs プロセスを開始したユーザー権限 (通常は root または Local System) で実行されます。」となっています。つまり、ワーカーがroot権限で実行されるので、ユーザーのホームディレクトリ(/home/username)にアクセスできない場合が多いです。なので上記のコードではとりあえず/tmpディレクトリに書くようにしています。
  4 Comments
NT
NT on 13 Jan 2023
Edited: NT on 13 Jan 2023
サンプルまで作成していただき、ありがとうございます。
MATLAB Parallel ServerとクライアントをR2022bにバージョンアップし、サンプルの一部を修正して、当初の目的であるクライアント側の「results_dir」にMATファイルを保存することができました。
解決済みとさせていただきます。
% ファイルを保存するディレクトリ
results_dir = fullfile(pwd, 'Results'); % 追加
% ローカルに保存するファイル名を作成
fileNames = keyset + ".mat";
fileNames = fullfile(results_dir, fileNames); % 追加
NT
NT on 14 Jan 2023
Edited: NT on 16 Jan 2023
MATLAB Parallel Server(Linux)に保存されたデータを削除したかったので、delete関数で削除するようにしました。
■main_save_func_parfor_filestore.m
function main_save_func_parfor_filestore(store, fname, x)
save(fname, 'x');
copyFileToStore(store,fname,extractBefore(fname, ".mat")); % 上記の2
delete(fname); % 追加
end

Sign in to comment.

More Answers (0)

Tags

Products


Release

R2021b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!