MATLAB Parallel Serverとparforとsave
17 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
以下のスクリプト(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 Kommentare
Kojiro Saito
am 13 Jan. 2023
2点確認があります。
MATLAB Parallel Serverが実行されているサーバーはWindowsのクライアントと同じマシンでしょうか?それともリモートのサーバーでしょうか?
また、もしMATLAB Parallel Serverがリモートサーバーにある際に、results_dirで指定しているクライアントのフォルダーは、リモートサーバーからマウントしたりホスト名またはIPアドレスでアクセスできる共有フォルダーになっていますでしょうか?
Akzeptierte Antwort
Kojiro Saito
am 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 Kommentare
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu ジョブおよびタスクの作成 finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!