Main Content

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

サポートされているスケジューラの独立ジョブのプログラム

ジョブの作成と実行

この節では、サポートされているジョブ スケジューラをクラスターで使用する、Parallel Computing Toolbox™ ソフトウェアでの代表的なプログラミング セッションの手順を詳述します。サポートされているスケジューラには MATLAB® ジョブ スケジューラ、Spectrum LSF® (Load Sharing Facility)、Microsoft® Windows HPC Server (CCS を含む)、PBS Pro®、TORQUE スケジューラなどがあります。

この節では、MATLAB ジョブ スケジューラ、LSF®、PBS Pro、TORQUE または Windows HPC Server (CCS および HPC Server 2008 を含む) スケジューラがインストールされ、ネットワークで実行されていることを前提とします。これらすべてのクラスター タイプで、ジョブの基本的なプログラミング順序は同じです。

クライアント セッションが MATLAB ジョブ スケジューラと交信するために使用するオブジェクトは、クライアント セッションにではなく、MATLAB ジョブ スケジューラに実際に格納されているデータの参照にすぎないことに注意してください。ジョブとタスクを作成したら、クライアント セッションを閉じて再起動できますが、ジョブは MATLAB ジョブ スケジューラに保存されたままになります。既存のジョブを検索するには、関数 findJob または MATLAB ジョブ スケジューラ クラスター オブジェクトの Jobs プロパティを使用します。

プロファイルの定義と選択

クラスター プロファイルでは、使用するクラスターのタイプとその具体的プロパティが特定されます。プロファイルには、ジョブがアクセスできるワーカー数、ジョブ データの保存先、MATLAB にアクセスする場所、その他多くのクラスター プロパティが定義されます。プロパティの正確な設定はクラスターのタイプによって決定されます。

この節のどの手順でも、MyProfile という名前のプロファイルにより、使用するクラスターが、必要なすべてのプロパティ設定と共に特定されるものと仮定します。プロファイルを適切に使用することで、クラスター タイプとは無関係に残りのプログラミングは同じになります。プロファイルを定義またはインポートしたら、Profile Manager GUI または次のコマンドを使用してそれを既定のプロファイルとして設定できます。

parallel.defaultClusterProfile('MyProfile')

以下に、さまざまなクラスター タイプとそのプロパティに関するいくつかのメモを示します。

メモ:

共有ファイル システムでは、すべてのノードがクラスター オブジェクトの JobStorageLocation プロパティで指定されたフォルダーにアクセスする必要があります。

Windows HPC Server には共有ファイル システムが必要なため、すべてのノードがクラスター オブジェクトの JobStorageLocation プロパティで指定されたフォルダーにアクセスする必要があります。

共有ファイル システムでは、多数のコンピューター上の MATLAB クライアントが、ネットワーク上の同じジョブ データにアクセスできます。特定のジョブまたはタスクのプロパティは、一度に 1 つのクライアント コンピューターのみから設定する必要があります。

非共有ファイル システムの LSF スケジューラを使用すると、ジョブのファイルの転送が未完了の場合でも、ジョブが完了状態であることを LSF スケジューラがレポートする可能性があります。

クラスターの検索

関数 parcluster を使用してクラスターを確認し、ローカル MATLAB セッションでクラスターを表すオブジェクトを作成します。

特定のクラスターを検索するには、クラスター プロファイルを使用して、使用するクラスターのプロパティと照合します。次の例では、MyProfile が特定のクラスターを定義するプロファイルの名前です。

c = parcluster('MyProfile');

ジョブの作成

関数 createJob を使用してジョブを作成します。このコマンドはクライアント セッションで実行されますが、実際にはジョブはクラスター c に作成され、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 であることに注意してください。これは、ジョブがまだ実行用にキューに入れられていないことを示し、したがって現時点ではジョブにタスクを追加できます。

クラスターの表示には保留中のジョブが 1 件記載されるようになります。

c
 MJS Cluster

    Properties: 

                      Name: my_mjs
                   Profile: MyProfile
                  Modified: false
                      Host: myhost.mydomain.com
                  Username: myuser

                NumWorkers: 1
                NumThreads: 1
            NumBusyWorkers: 0
            NumIdleWorkers: 1

        JobStorageLocation: Database on myhost.mydomain.com
         ClusterMatlabRoot: C:\apps\matlab
         SupportedReleases: R2021b
           OperatingSystem: windows
          AllHostAddresses: 0:0:0:0
             SecurityLevel: 0 (No security)
    HasSecureCommunication: false
 RequiresClientCertificate: false
   RequiresOnlineLicensing: false

    Associated Jobs: 

            Number Pending: 1
             Number Queued: 0
            Number Running: 0
           Number Finished: 0

ジョブ オブジェクトの AttachedFiles プロパティを使用して、ファイルをワーカーに転送できます。詳細については、ワーカーとのコードの共有を参照してください。

タスクの作成

ジョブを作成した後は、関数 createTask を使用してそのジョブにタスクを作成できます。タスクでは、ジョブの実行中にワーカーで評価する関数を定義します。多くの場合、ジョブのタスクはすべて同一です。次の例では、各タスクは乱数からなる 3 行 3 列の行列を生成します。

createTask(job1, @rand, 1, {3,3});
createTask(job1, @rand, 1, {3,3});
createTask(job1, @rand, 1, {3,3});
createTask(job1, @rand, 1, {3,3});
createTask(job1, @rand, 1, {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

あるいは、各タスクの入力引数を定義する 5 つの cell 配列からなる cell 配列を指定して、createTask の 1 回の呼び出しで 5 つのタスクを作成できます。

T = createTask(job1, @rand, 1, {{3,3} {3,3} {3,3} {3,3} {3,3}});

この場合、T はタスク オブジェクトからなる 5 行 1 列の行列になります。

ジョブ キューへのジョブの投入

ジョブを実行してそのタスクを評価させるには、関数 submit を用いてジョブをジョブ キューに投入します。

submit(job1)

評価のために、ジョブ マネージャーが job1 のタスクを登録されているワーカーに分散します。

タスクの評価を行うため、各ワーカーは以下の手順を実行します。

  1. ジョブから AttachedFilesAdditionalPaths を受け取ります。ファイルを配置し、パスを適宜変更します。

  2. このジョブのタスクを最初に評価する際には関数 jobStartup を実行します。この関数は AttachedFiles または AdditionalPaths で指定できます。MATLAB ジョブ スケジューラを使用していて、このジョブの後続のタスクを同じワーカーが評価する場合、タスク間で jobStartup は実行されません。

  3. 関数 taskStartup を実行します。この関数は AttachedFiles または AdditionalPaths で指定できます。この関数は、ワーカーが行う各タスク評価の前に実行されるため、ワーカーでジョブごとに複数回実行される可能性があります。

  4. 新しい並列プール形成の一環としてワーカーを使用する場合は、関数 poolStartup を実行します(parpool を実行する場合や、batch など並列プールを形成および使用する他の種類のジョブを実行する場合がこれに該当します)。

  5. 評価対象となるタスク関数と引数を受け取ります。

  6. タスク関数を評価し、結果をタスクの OutputArguments プロパティに格納します。エラー情報がある場合は、すべてタスクの Error プロパティに格納されます。

  7. 関数 taskFinish を実行します。

ジョブ結果の取得

各タスクの評価結果は、cell 配列としてタスク オブジェクトの OutputArguments プロパティに格納されます。ジョブの全タスクの結果を取得するには、関数 fetchOutputs を使用します。

wait(job1)
results = fetchOutputs(job1);

各タスクの結果を表示します。

results{1:5}
    0.9501    0.4860    0.4565
    0.2311    0.8913    0.0185
    0.6068    0.7621    0.8214

    0.4447    0.9218    0.4057
    0.6154    0.7382    0.9355
    0.7919    0.1763    0.9169

    0.4103    0.3529    0.1389
    0.8936    0.8132    0.2028
    0.0579    0.0099    0.1987

    0.6038    0.0153    0.9318
    0.2722    0.7468    0.4660
    0.1988    0.4451    0.4186

    0.8462    0.6721    0.6813
    0.5252    0.8381    0.3795
    0.2026    0.0196    0.8318

スケジューラでのオブジェクトの管理

ジョブおよびタスクのデータはすべてクラスターのジョブ保存場所にあるため、これらを作成したクライアント セッションが終了している場合でも、これらのオブジェクトは残ります。以下の節では、これらのオブジェクトにアクセスする方法と、永久的に削除する方法について説明します。

クライアント セッションの終了時に起こること

Parallel Computing Toolbox ソフトウェアのクライアント セッションを閉じると、ワークスペース内のすべてのオブジェクトが消去されます。ただし、MATLAB Parallel Server™ ソフトウェアのオブジェクトや他のクラスター リソースは削除されずに残ります。クライアント セッションが終了すると、ローカル参照オブジェクトのみが失われ、クラスター内にある実際のジョブやタスクのデータは失われません。

このため、ジョブを実行するためにクラスターのジョブ キューに投入した場合でも、MATLAB のクライアント セッションを終了でき、ジョブはクラスターによって実行されます。ジョブの結果は後から別のクライアント セッションで取得できます。

オブジェクトの復元

MATLAB Parallel Server の任意のオブジェクトは、現在のクライアント セッションで作成されたか別のクライアント セッションで作成されたかを問わず、Parallel Computing Toolbox ソフトウェアのクライアント セッションからアクセスできます。

クライアント セッションでクラスター オブジェクトを作成するには、関数 parcluster を使用します。

c = parcluster('MyProfile');

c オブジェクトによってクラスターにアクセスできる場合、そのクラスターに含まれるすべてのジョブを参照するオブジェクトを作成できます。ジョブにはクラスター オブジェクトの Jobs プロパティでアクセスでき、このプロパティはジョブ オブジェクトの配列です。

all_jobs = c.Jobs

配列 all_jobs にインデックスを付けて、特定のジョブを検索することができます。

あるいは、関数 findJob を使用して、クラスター内で任意のジョブや、State などのプロパティによって識別される特定のジョブを検索することができます。

all_jobs = findJob(c);
finished_jobs = findJob(c,'State','finished')

このコマンドにより、クラスター c で完了したすべてのジョブを参照するジョブ オブジェクトからなる配列が返されます。

コールバック プロパティのリセット (MATLAB ジョブ スケジューラのみ)

クライアント セッションを再起動すると、ジョブやタスクのあらゆるコールバック プロパティ (たとえば、FinishedFcn プロパティなど) の設定が失われます。これらのプロパティは一般に、クライアント セッションでオブジェクトの状態変更に関する通知を取得するのに使用されます。新しいクライアント セッションで既存のジョブやタスクを参照するオブジェクトを作成する場合、これらのコールバック プロパティの使用にはリセットが必要となります。

オブジェクトの永久的削除

クラスター内のジョブは、ジョブの完了後も、また MATLAB ジョブ スケジューラを停止して再起動した後も残ります。クラスターからジョブを永久的に削除する方法は、以下の節で説明します。

選択したオブジェクトの削除.  MATLAB クライアント セッションのコマンド ラインで、任意のジョブ オブジェクトまたはタスク オブジェクトに対し関数 delete を呼び出すことができます。ジョブを削除する場合は、そのジョブに含まれるすべてのタスクも削除します。

たとえば、ユーザー joep が所有者であるすべての完了済みジョブをクラスターで検索して削除します。

c = parcluster('MyProfile')
finished_jobs = findJob(c,'State','finished','Username','joep')
delete(finished_jobs)
clear finished_jobs

関数 delete はこれらのジョブをクラスターから永久に削除します。関数 clear は、ローカルの MATLAB ワークスペースからオブジェクト参照を削除します。

クリーンアップされた状態からの MATLAB ジョブ スケジューラの起動.  MATLAB ジョブ スケジューラが起動するときに、既定では、前のセッションがすべてのジョブを維持したまま再開されます。代わりに、前の履歴をすべて削除して、クリーンアップされた状態から MATLAB ジョブ スケジューラを起動することもできます。クリーンアップされた状態から起動すると、特定のホスト上にあり指定名をもつ MATLAB ジョブ スケジューラからすべてのジョブとタスクのデータが永久的に削除されます。

ネットワーク管理機能としての startjobmanager スクリプトの -clean フラグについての説明は、『MATLAB Parallel Server システム管理者ガイド』のクリーンアップされた状態での起動 (MATLAB Parallel Server)にあります。