主要内容

デスクトップからクラスタ,へのスケ,ルアップ

ロカルマシンで並列matlab®コドを開発し,クラスタにスケルアップします。

クラスタ,は,計算を高速化して分散するためのより多くの計算リソ,スを提供します。ローカルマシンで対話的にコードを並列で実行してから,コードを変更せずにクラスターでも同様に実行できます。ローカルマシンでのコードのプロトタイプの作成完了後,バッチジョブを使用して計算をクラスターにオフロードできます。これにより,matlabを閉じて,結果を後で取得することができます。

アルゴリズムの開発

ロカルマシンでアルゴリズムのプロトタプを作成することから始めます。この例ではサンプル問題として整数の因数分解を使用します。これは,数の絶対値と共に因数分解の複雑度が高くなる計算量の多い問題です。シンプルなアルゴリズムを使用して整数の数列を因数分解します。

64年ビットの精度で素数のベクトルを作成し,素数のペアをランダムに乗算して大きな合成数を取得します。各因数分解の結果を保存する配列を作成します。この例の以降の各節にあるコドの実行には20分以上かかる場合があります。高速化するには、使用する素数の数を減らして(2 ^ 19など)負荷を軽減します。2 ^ 21を指定して実行し,最適な最終プロットを表示します。

primeNumbers =质数(uint64(2^21));compositeNumbers = primeNumbers.*primeNumbers(randperm(numel(primeNumbers)));factors = 0 (number (primeNumbers),2);

ル,プを使用して個々の合成数を因数分解し,計算の所要時間を測定します。

抽搐;idx = 1:numel(compositeNumbers) factors(idx,:) = factor(compositeNumbers(idx));结束toc
运行时间为684.464556秒。

ロ,カル並列プ,ルでのコ,ドの実行

并行计算工具箱™では,並列プールの複数のワーカーで計算を実行することにより,ワークフローをスケールアップできます。前述したル,プの反復は独立しているため,parforル,プを使用して複数のワ,カ,に反復を分散することができます。単純にルプをparforル,プに変換します。次に,コ,ドを実行して全体の計算時間を測定します。コードは追加の変更なしで並列プールで実行され,ワーカーは計算結果をローカルワークスペースに返します。作業負荷が複数のワ,カ,に分散されているため,計算時間は短くなります。

抽搐;parforidx = 1:numel(compositeNumbers) factors(idx,:) = factor(compositeNumbers(idx));结束toc
运行时间为144.550358秒。

parforを使用するときに并行计算工具箱がある場合,MATLABは自動的にワーカーの並列プールを起動します。並列プ,ルの起動にはある程度の時間がかかります。この例は,プ,ルが既に起動した状態での2回目の実行を示します。

既定のプロファ@ @ルは“过程”です。MATLABの[ホ,ム]タブ,[並列][並列環境を選択]で,このプロファ。このプロファルが有効の場合,matlabは並列プル用のマシンにワカを作成します。“过程”プロファイルを使用すると,MATLABは既定でマシンの物理コアと同じ数のワーカー(上限は推奨されるワーカー数)を起動します。並列基本設定を使用して並列動作を制御することができます。MATLABの[ホ,ム]タブで,[並列][並列基本設定]を選択します。

ワーカーの数による高速化を測定するために,ワーカーの最大数を制限して,同じコードを複数回実行します。まず,各実行のワーカー数を定義し(上限はプール内のワーカー数),各テストの結果を保存するための配列を作成します。

numWorkers = [1 2 4 6];tLocal = 0 (size(numWorkers));

ル,プを使用してワ,カ,の最大数まで反復し,前述のコ,ドを実行します。ワ,カ,数を制限するために,parforの2番目の入力引数を使用します。

w = 1:数字(numWorkers) tic;parfor(idx = 1: number (compositeNumbers), numWorkers(w)) factors(idx,:) = factor(compositeNumbers(idx));结束tLocal(w) = toc;结束

1 .のワカでの計算時間と各最大ワカ数での計算時間との比を計算して,。ワーカー数と共に計算がスケールアップしている様子を可視化するために,ワーカー数に対して高速化をプロットします。ワ,カ,数と共に高速化も上昇していることがわかります。しかし,並列化に伴うオ,バ,ヘッドがあるため,スケ,リングは比例的ではありません。

F =数字;speedup = tLocal(1)./tLocal;情节(numWorkers加速);标题(“随着工人数量的增加而加速”);包含(“工人人数”);xticks (numWorkers);ylabel (“加速”);

計算が完了したら,現在の並列プ,ルを削除します。これにより,クラスタ,用に新しい並列プ,ルを作成できます。関数gcpで現在の並列プ,ルを取得できます。

删除(gcp);

クラスタ,の設定

計算タスクがローカルコンピューターにとって大きすぎるまたは遅すぎる場合は,計算をオンサイトのクラスターまたはクラウドにオフロードできます。以降の節の内容を実行するには,クラスタ,にアクセスできなければなりません。MATLABの[ホ,ム]タブで,[並列][クラスタ,の検出]に移動し,MATLAB并行服务器™がインストールされたクラスターにアクセスできるかどうかを確認します。詳細にいては,クラスタ,の検出を参照してください。

クラスターにアクセスできない場合は,以降の節に進む前にクラスターへのアクセスを設定しなければなりません。MATLABでは、Amazon AWS などのクラウド サービス上に MATLAB デスクトップから直接クラスターを作成することができます。[ホ,ム]タブの[並列]メニュ,で[クラスタ,の作成と管理]を選択します。クラスタプロファルマネジャで,[クラウドクラスタ,の作成]をクリックします。クラウドへのスケルアップの詳細にいては,开始使用云中心を参照してください。ネットワク上のクラスタにスケリングするオプションの詳細にいては,MATLAB并行服务器入門(MATLAB并行服务器)を参照してください。

クラスタプロファルを設定した後,そのプロパティを[並列][クラスタ,の作成と管理]で変更できます。詳細にいては,クラスタの検出とクラスタプロファルの使用を参照してください。次の内のクラスタプロファルを示します。

クラスタ,並列プ,ルでのコ,ドの実行

並列関数を既定でクラスタ,で実行する場合,[並列][並列環境を選択]で,クラスタ,プロファ,ルを既定として設定します。

また,プログラムによる方法でクラスタ,を指定することもできます。このためには,parpoolコマンドにクラスタプロファルの名前を指定して,クラスタで並列プルを起動します。次のコ,ドのMyClusterをクラスタプロファルの名前に置き換えます。また,2番目の入力引数でワ,カ,数を指定します。

parpool (“MyCluster”, 64);
启动并行池(parpool)使用'MyCluster'配置文件…与64名员工相连。

前と同様に,ワーカーの最大数を制限して同じコードを複数回実行することで,ワーカー数による高速化を測定します。この例のクラスタ,はロ,カル設定よりも多くのワ,カ,を使用できるため,numWorkersにより多くの値を指定できます。このコ,ドを実行すると,parforル,プがクラスタ,で実行されます。

numWorkers = [1 2 4 6 16 32 64];tCluster = 0 (size(numWorkers));w = 1:数字(numWorkers) tic;parfor(idx = 1: number (compositeNumbers), numWorkers(w)) factors(idx,:) = factor(compositeNumbers(idx));结束tCluster(w) = toc;结束

高速化を計算してワーカー数に対してプロットし,ワーカー数と共に計算がスケールアップする様子を可視化します。この結果をロ,カル設定の結果と比較します。ワ,カ,数と共に高速化も上昇していることがわかります。しかし,並列化に伴うオ,バ,ヘッドがあるため,スケ,リングは比例的ではありません。

图(f);持有speedup = tCluster(1)./tCluster;情节(numWorkers加速);标题(“随着工人数量的增加而加速”);包含(“工人人数”);xticks (numWorkers(2:结束));ylabel (“加速”);

計算が完了したら,現在の並列プ,ルを削除します。

删除(gcp);

批处理による計算のオフロ,ドとスケ,リング

プロトタイプの作成と対話的な実行の完了後,バッチジョブを使用して,実行時間の長い計算をオフロードしてバックグラウンドのバッチ処理で実行できます。計算はクラスタ,で実行されるため,matlabを閉じて,結果を後で取得することができます。

関数批处理を使用してジョブをクラスタ,に投入します。スクリプト内にアルゴリズムの内容を配置し,関数批处理を使用してスクリプトを投入します。たとえば,スクリプトmyParallelAlgorithmは,この例で示した整数の因数分解問題に基づくシンプルなベンチマ,クを実行します。このスクリプトは,異なるワ,カ,数を使用して複数の問題の複雑度の計算時間を測定します。

批处理を使用してスクリプトファイルを送信すると,MATLABはスクリプトで使用しない場合でも,すべてのワークスペース変数をクラスターに転送します。ワ,クスペ,スが大きい場合,これはデ,タ転送時間に悪影響を及ぼします。ベストプラクティスとして,スクリプトを関数ファイルに変換することにより,この通信オーバーヘッドを回避します。これを行うには,スクリプトの冒頭に関数の行を単純に追加します。myParallelAlgorithmを関数に変換する方法の詳細にいては,myParallelAlgorithmFcnを参照してください。

次のコ,ドはmyParallelAlgorithmFcnをバッチジョブとして投入します。myParallelAlgorithmFcnは2の出力引数,numWorkers时间を返すため,出力数の入力引数として2を指定しなければなりません。このコ,ドにはparforル,プ用の並列プ,ルが必要であるため,批处理で名前と値のペア“池”を使用してワ,カ,数を指定します。クラスタ,は追加のワ,カ,を使用して関数自体を実行します。既定で,批处理はクラスター内のワーカーの現在のフォルダーをMATLABクライアントの現在のフォルダーに変更します。これは現在のフォルダ,の制御に便利な場合があります。たとえば,クラスターの使用しているファイルシステムが異なる場合(WindowsクライアントマシンからLinuxクラスターに送信する場合など)パスが異なります。名前と値のペア“CurrentFolder”を任意のフォルダ,に設定するか,“。”に設定してワ,カ,のフォルダ,の変更を回避します。

totalNumberOfWorkers = 65;Cluster = parcluster(“MyCluster”);作业=批处理(集群,“myParallelAlgorithmFcn”2,“池”totalNumberOfWorkers-1,“CurrentFolder”“。”);

投入後のジョブの状態を監視するには,[並列][ジョブの監視]でジョブモニタ,を開きます。計算がクラスタ,で開始されるときに,ジョブの状態が运行に変更されます。

ジョブが投入されたら,matlabを閉じることができます。MATLABを再度開くと、ジョブ モニターがジョブを記録しており、ジョブを右クリックして操作することができます。たとえば、ジョブ オブジェクトを取得するには[詳細を表示]を選択し,バッチジョブの出力をワ,クスペ,スに転送するには[出力の取得]を選択します。

あるいは,ジョブが完了するまでMATLABをブロックする場合は,ジョブオブジェクトに対して関数等待を使用します。

等待(工作);

関数の出力をクラスタ,から転送するには,関数fetchOutputsを使用します。

输出= fetchOutputs(作业);numWorkers =输出{1};时间=输出{2};

結果の取得後,ロ,カルマシンでの計算に結果を使用できます。高速化を計算し,ワ,カ,数に対してプロットします。このコドは異なる問題複雑度にいて因数分解を実行するため,各レベルのプロットが得られます。それぞれの問題複雑度で,追加のワーカーによるオーバーヘッドが並列化によるパフォーマンス上昇を超えるまで,ワーカーの数と共に高速化が上昇していることがわかります。問題複雑度が高くなるほど,ワ,カ,数が多いときにより良い高速化が得られます。これは並列化に付随するオ,バ,ヘッドの影響が少ないためです。

图speedup = time(1,:)./time;情节(numWorkers加速);传奇(“问题复杂性1”“问题复杂性2”“问题复杂性3”“问题复杂性4”“位置”“西北”);标题(“加速vs复杂”);包含(“工人人数”);xticks (numWorkers(2:结束));ylabel (“加速”);

参考

|||

関連する例

詳細