ローカル クラスターでの独立ジョブのプログラム
ローカル クラスターでのジョブの作成と実行
一部のジョブでは、parfor や spmd などの高度な構造が提供する機能よりも多くの制御が必要とされます。このような場合、ジョブの作成と実行のステップをすべてプログラムしなければなりません。マシンのローカルの並列環境 (またはローカル クラスター) で、ネットワーク クラスターのリソースを使用せずにジョブを作成し、テストすることができます。すべてクライアント マシンで実行されているワーカーにタスクを分散しても、パフォーマンスの向上はありません。そのため、この機能は主にコードの作成、テストおよびデバッグ向けに提供されています。
メモ
Microsoft® Windows® オペレーティング システム上のローカル クラスターで実行されているワーカーは、Simulink® グラフィックスと、uigetfile や uigetdir などの特定の関数からの出力を表示できます (他のプラットフォームやスケジューラでは、ワーカーはグラフィックス出力を一切表示できません)。この動作は将来のリリースで削除される可能性があります。
この節では、ローカル クラスターを使用した、Parallel Computing Toolbox™ ソフトウェアでの代表的なプログラミング セッションの手順を詳述します。
クライアント セッションがクラスターとの連携に使用するオブジェクトは、クライアント セッション内のデータではなく、クラスターのジョブ ストレージの場所にあるデータの単なる参照です。ジョブとタスクを作成したら、クライアント セッションを閉じて再起動できますが、ジョブは保存場所に残ったままとなります。既存のジョブを検索するには、関数 findJob またはクラスター オブジェクトの Jobs プロパティを使用します。
クラスター オブジェクトの作成
関数 parcluster を使用して、ローカルの MATLAB® セッションでローカル スケジューラを表すオブジェクトを作成します。
c = parcluster('local');ジョブの作成
関数 createJob を使用してジョブを作成します。このステートメントは、クラスターのジョブ ストレージの場所にジョブを作成し、クライアント セッションにジョブ オブジェクト job1 を作成します。コマンドの最後のセミコロンを省略すると、ジョブに関する一部の情報が表示されます。
job1 = createJob(c)
Job
Properties:
ID: 1
Type: independent
Username: mylogin
State: pending
SubmitDateTime:
StartDateTime:
RunningDuration: 0 days 0h 0m 0s
NumThreads: 1
AutoAttachFiles: true
Auto Attached Files: List files
AttachedFiles: {}
AutoAddClientPath: false
AdditionalPaths: {}
Associated Tasks:
Number Pending: 0
Number Running: 0
Number Finished: 0
Task ID of Errors: []
Task ID of Warnings: []ジョブの State プロパティは pending です。これは、ジョブがまだ実行用に投入されていない (キューに登録されていない) ことを示し、したがって、現時点ではジョブにタスクを追加できます。
次の部分リストに見られるように、スケジューラの表示には現在、保留中のジョブの存在が示されています。
c
Local Cluster
Properties:
Profile: local
Modified: false
Host: myhost
NumWorkers: 6
NumThreads: 1
JobStorageLocation: C:\Users\mylogin\AppData\Roaming\MathWorks...
\MATLAB\local_cluster_jobs\R2021b
RequiresOnlineLicensing: false
Associated Jobs:
Number Pending: 1
Number Queued: 0
Number Running: 0
Number Finished: 0タスクの作成
ジョブを作成した後は、関数 createTask を使用してそのジョブにタスクを作成できます。タスクでは、ジョブの実行中にワーカーで評価する関数を定義します。多くの場合、ジョブのタスクはすべて同一です。次の例では、5 つのタスクがそれぞれ乱数からなる 3 行 3 列の行列を生成します。
createTask(job1, @rand, 1, {{3,3} {3,3} {3,3} {3,3} {3,3}});job1 の Tasks プロパティは、タスク オブジェクトからなる 5 行 1 列の行列になります。
job1.Tasks
5x1 Task array:
ID State FinishDateTime Function Errors Warnings
-----------------------------------------------------------------
1 1 pending rand 0 0
2 2 pending rand 0 0
3 3 pending rand 0 0
4 4 pending rand 0 0
5 5 pending rand 0 0クラスターへのジョブの投入
ジョブを実行してそのタスクを評価させるには、関数 submit を用いてジョブをクラスターに投入します。
submit(job1)
ローカル スケジューラはマシンでワーカーを起動し、job1 のタスクを評価するために、これらのワーカーに分散します。
ジョブの結果の取得
各タスクの評価結果は、cell 配列としてタスク オブジェクトの OutputArguments プロパティに格納されます。ジョブが完了するのを待ってから、関数 fetchOutputs を使用してジョブの全タスクの結果を取得します。
wait(job1) results = fetchOutputs(job1);
各タスクの結果を表示します。
results{1:5}ans =
0.1349 0.5332 0.2621
0.6744 0.1150 0.9625
0.9301 0.6540 0.8972
ans =
0.6383 0.6509 0.4429
0.5195 0.3018 0.3972
0.1398 0.7101 0.7996
ans =
0.9730 0.2934 0.6071
0.7104 0.1558 0.5349
0.3614 0.3421 0.4118
ans =
0.3241 0.9401 0.1897
0.0078 0.3231 0.3685
0.9383 0.3569 0.5250
ans =
0.4716 0.6667 0.7993
0.5674 0.6959 0.9165
0.3813 0.8325 0.8324ジョブが完了したら、コマンドを繰り返して、クラスター、ジョブおよびタスク オブジェクトの更新されたステータスを調べることができます。
c job1 job1.Tasks
ローカル クラスターの動作
ローカル スケジューラは MATLAB クライアント セッションで実行されるため、ローカル スケジューラ用に別のスケジューラまたは MATLAB ジョブ スケジューラ プロセスを起動する必要はありません。ジョブをローカル クラスターに投入すると、ジョブ内の各タスクに対し、スケジューラにより MATLAB ワーカーが開始されます。ローカル プロファイルで許可されているワーカー数だけ、これを行うことができます。許可されているワーカー数より多くのタスクがジョブにある場合、スケジューラは現在のタスクの 1 つが完了するのを待ってから、次のタスクの評価用にもう 1 つの MATLAB ワーカーを起動します。local クラスター プロファイルで許可されているワーカー数を変更することができます。指定がない場合、既定では、マシン上の計算コアと同数に限ってワーカーを実行します。
ローカル クラスターは他のいかなるスケジューラまたは MATLAB ジョブ スケジューラとも連携せず、クライアント マシンで mjs サービスの下に実行されている可能性がある他のすべてのワーカーとも連携しません。コンピューターの複数の MATLAB セッションは、それぞれ、自分のワーカーを使用してローカル スケジューラを開始することができますが、これらのグループは相互に連携しません。
MATLAB クライアント セッションを終了すると、ローカル スケジューラおよび実行中のすべてのワーカーがただちに停止します。