Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

ローカル クラスターでの独立ジョブのプログラム

ローカル クラスターでのジョブの作成と実行

一部のジョブでは、spmdparfor などの大枠の構造が提供する機能よりも多くの制御を必要とします。このような場合、ジョブの作成と実行のステップをすべてプログラムしなければなりません。マシンのローカル クラスター (またはローカル スケジューラ) を使用することで、ネットワーク クラスターのリソースを使用せずにジョブを作成し、テストすることができます。すべてクライアント マシンで実行されているワーカーにタスクを分散しても、パフォーマンスの向上はありません。そのため、この機能は主にコードの作成、テストおよびデバッグ向けに提供されています。

メモ

Microsoft® Windows® オペレーティング システム上のローカル クラスターで実行されているワーカーは、Simulink® グラフィックスと、uigetfileuigetdir などの特定の関数からの出力を表示できます (他のプラットフォームやスケジューラでは、ワーカーはグラフィックス出力を一切表示できません)。この動作は将来のリリースで削除される可能性があります。

この節では、ローカル クラスターを使用した、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}});

job1Tasks プロパティは、タスク オブジェクトからなる 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 クライアント セッションを終了すると、ローカル スケジューラおよび実行中のすべてのワーカーがただちに停止します。