このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
ローカル クラスターでの独立ジョブのプログラム
ローカル クラスターでのジョブの作成と実行
一部のジョブでは、spmd
や parfor
などの大枠の構造が提供する機能よりも多くの制御を必要とします。このような場合、ジョブの作成と実行のステップをすべてプログラムしなければなりません。マシンのローカル クラスター (またはローカル スケジューラ) を使用することで、ネットワーク クラスターのリソースを使用せずにジョブを作成し、テストすることができます。すべてクライアント マシンで実行されているワーカーにタスクを分散しても、パフォーマンスの向上はありません。そのため、この機能は主にコードの作成、テストおよびデバッグ向けに提供されています。
メモ
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 クライアント セッションを終了すると、ローカル スケジューラおよび実行中のすべてのワーカーがただちに停止します。