MATLAB Parallel Serverとparforとsave

21 ビュー (過去 30 日間)
NT
NT 2023 年 1 月 13 日
編集済み: NT 2023 年 1 月 16 日
以下のスクリプト(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 件のコメント
Kojiro Saito
Kojiro Saito 2023 年 1 月 13 日
2点確認があります。
MATLAB Parallel Serverが実行されているサーバーはWindowsのクライアントと同じマシンでしょうか?それともリモートのサーバーでしょうか?
また、もしMATLAB Parallel Serverがリモートサーバーにある際に、results_dirで指定しているクライアントのフォルダーは、リモートサーバーからマウントしたりホスト名またはIPアドレスでアクセスできる共有フォルダーになっていますでしょうか?
NT
NT 2023 年 1 月 13 日
編集済み: NT 2023 年 1 月 13 日
お世話になっております。
MATLAB Parallel Serverはリモート、3台構成(Head1台、Node2台)で、OSは全てLinux(Ubuntu)です。
フォルダ(results_dir)は共有フォルダではありません。
ただ、MATLAB Parallel Serverを構成する全てのパソコンではSambaが動作しているので、共有フォルダを設定してクライアント(Windows)からアクセスすることは可能です。
どうぞよろしくお願いいたします。

サインインしてコメントする。

採用された回答

Kojiro Saito
Kojiro Saito 2023 年 1 月 13 日
> 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 件のコメント
NT
NT 2023 年 1 月 13 日
編集済み: NT 2023 年 1 月 13 日
サンプルまで作成していただき、ありがとうございます。
MATLAB Parallel ServerとクライアントをR2022bにバージョンアップし、サンプルの一部を修正して、当初の目的であるクライアント側の「results_dir」にMATファイルを保存することができました。
解決済みとさせていただきます。
% ファイルを保存するディレクトリ
results_dir = fullfile(pwd, 'Results'); % 追加
% ローカルに保存するファイル名を作成
fileNames = keyset + ".mat";
fileNames = fullfile(results_dir, fileNames); % 追加
NT
NT 2023 年 1 月 14 日
編集済み: NT 2023 年 1 月 16 日
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

サインインしてコメントする。

その他の回答 (0 件)

タグ

製品


リリース

R2021b

Community Treasure Hunt

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

Start Hunting!