ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

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

ジョブの作成と実行

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

この節では、MJS、LSF®、PBS Pro、TORQUE または Windows HPC Server (CCS および HPC Server 2008 を含む) スケジューラがインストールされ、ネットワークで実行されていることを前提とします。LSF についての詳細は、http://www.platform.com/Products/ を参照してください。Windows HPC Server についての詳細は、http://www.microsoft.com/hpc を参照してください。これらすべてのクラスター タイプで、ジョブの基本的なプログラミング順序は同じです。

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

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

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

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

parallel.defaultClusterProfile('MyProfile')

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

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

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

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

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

クラスターの検索

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

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

c = parcluster('MyProfile');
 MJS Cluster

   Properties
                            Name: my_mjs
                         Profile: MyProfile
                        Modified: false
                            Host: node345
                        Username: mylogin

                      NumWorkers: 1
                  NumBusyWorkers: 0
                  NumIdleWorkers: 1

              JobStorageLocation: Database on node345
               ClusterMatlabRoot: C:\apps\matlab
                 OperatingSystem: windows
                AllHostAddresses: 0:0:0:0
                   SecurityLevel: 0 (No security)
          HasSecureCommunication: false

   Associated Jobs

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

ジョブの作成

関数 createJob を使用してジョブを作成します。このコマンドはクライアント セッションで実行されますが、実際にはジョブはクラスター c に作成され、job1 ジョブ オブジェクトがクライアント セッションに作成されます。

job1 = createJob(c)
 Job

    Properties:
                   ID: 1
                 Type: Independent
             Username: mylogin
                State: pending
           SubmitTime: 
            StartTime: 
     Running Duration: 0 days 0h 0m 0s

      AutoAttachFiles: true
  Auto Attached Files: List files
        AttachedFiles: {}
      AdditionalPaths: {}

    Associated Tasks:

       Number Pending: 0
       Number Running: 0
      Number Finished: 0
    Task ID of Errors: []

ジョブの State プロパティが pending であることに注意してください。これは、ジョブがまだ実行用にキューに入れられていないことを示し、したがって現時点ではジョブにタスクを追加できます。

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

c
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
         ID       State    FinishTime  Function  Error
 -----------------------------------------------------
    1     1     pending                   @rand       
    2     2     pending                   @rand       
    3     3     pending                   @rand       
    4     4     pending                   @rand       
    5     5     pending                   @rand       

あるいは、各タスクの入力引数を定義する 5 つのセル配列からなるセル配列を指定して、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 で指定できます。MJS を使用している場合、このジョブの後続のタスクを同じワーカーで評価するならば、jobStartup はタスク間では実行されません。

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

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

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

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

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

ジョブ結果の取得

各タスクの評価結果は、セル配列としてタスク オブジェクトの 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 Distributed Computing Server™ ソフトウェアのオブジェクトや他のクラスター リソースは削除されずに残ります。クライアント セッションが終了すると、ローカル参照オブジェクトのみが失われ、クラスター内にある実際のジョブやタスクのデータは失われません。

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

オブジェクトの復元

MATLAB Distributed Computing 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 で完了したすべてのジョブを参照するジョブ オブジェクトからなる配列が返されます。

コールバック プロパティのリセット (MJS のみ)

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

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

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

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

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

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

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

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

ネットワーク管理機能として、startjobmanager スクリプトの -clean フラグについての説明は、『MATLAB Distributed Computing Server System Administrator's Guide』の「クリーンアップされた状態での起動」にあります。

この情報は役に立ちましたか?