ノート:
- このチュートリアルでは、Oracle Cloudへのアクセスが必要です。無料アカウントにサインアップするには、Oracle Cloud Infrastructure Free Tierの開始を参照してください。
- Oracle Cloud Infrastructureの資格証明、テナンシおよびコンパートメントに例の値を使用します。演習を終える際は、これらの値をクラウド環境に固有の値に置き換えてください。
Oracle Roving Edge InfrastructureでのOpen MPIの使用
イントロダクション
Oracle Roving Edge Infrastructureは、堅牢なクラウド・コンピューティングおよびストレージ・プラットフォームであり、ネットワーク・エッジでのデプロイメントや、外部の接続が制限された場所やない場所でのデプロイメントに適しています。より大きく、より複雑で要求の厳しいワークロードがネットワーク・エッジに移動するにつれて、エッジ・インフラストラクチャに課題が生じる可能性があります。
Open MPIは、High Performance Computing (HPC)で並列アプリケーションを開発するために使用されるMessage Passing Interface (MPI)規格の実装です。オープンMPIを使用して、High Performance Computingおよび高度にパラレルなワークロードを比較的小さなインフラストラクチャにデプロイし、さらに大規模な集約されたリソース・セットとして動作させることができます。このアプローチは、ワークロードをCPUやその他のコンピュート・リソース(GPUなど)に分散するために使用でき、予測モデリングやその他の人工知能/機械学習(AI/ML)タスクなど、ネットワーク・エッジに大規模で計算集中型のタスクをデプロイできます。
Open MPIを使用して、Oracle Roving Edge Infrastructureノード全体のリソースを利用したパラレル・ワークロードをデプロイできます。Netfilterは、Oracle Roving Edge Infrastructureノード全体でホストされているクラスタリング・ソフトウェアを使用して、VMインスタンスに必要な宛先ネットワーク・アドレス変換(DNAT)およびソース・ネットワーク・アドレス変換(SNAT)を提供します。このチュートリアルでは、Oracle Roving Edge InfrastructureでNetfilterを使用してOpen MPIを実装し、プライム数値計算機能を実行して、パラレル・リソースの使用時のパフォーマンスの向上を示します。
背景情報
Open MPIは、単一のOracle Roving Edge Infrastructureノード内の複数の仮想マシン(VM)インスタンス、または複数のOracle Roving Edge Infrastructureノードにわたって実行できます。単一のOracle Roving Edge Infrastructureノードで実行することはシームレスであり、問題は発生しません。複数のOracle Roving Edge Infrastructureノードで実行する場合は、Oracle Roving Edge Infrastructure VMインスタンスでのネットワーキングと、Open MPIによるトラフィックのルーティング方法を理解して、考えられる問題を回避することが重要です。
Oracle Roving Edge Infrastructure仮想マシン・インスタンスのネットワーキング
Oracle Roving Edge Infrastructureで実行されている仮想マシン・インスタンスは、プライベートIPアドレスを使用して、同じノードでホストされている同じサブネット上の他のVMインスタンスと通信します。パブリックIPアドレスは、Oracle Roving Edge InfrastructureでホストされているVMインスタンスに割り当てて、インスタンスがホストされているOracle Roving Edge Infrastructureノードの外部で実行されている他のサブネットおよびリソースと通信できるようにします。
ノート:パブリックIPアドレスは、パブリックIPアドレス・プールからVMインスタンスVNICに割り当てられます。アドレスはパブリックIPと呼ばれますが、実際には、Oracle Roving Edge InfrastructureノードがRJ-45ポートを介して接続されているのと同じローカル・ネットワーク上のIPアドレスです。これらのアドレスは、インターネットからアクセス可能なIPv4アドレスにすることも、ローカル・ネットワーク上のプライベート・サブネット上のアドレスにすることもできます。これらのアドレスは、VMインスタンスがホストされているノードの外部のリソースに接続できるため、外部IPアドレスとも呼ばれます。
Oracle Roving Edge Infrastructureノード内で実行されているVMインスタンスがノード外のリソースにアクセスしようとすると、トラフィックは外部IPアドレスを通過し、ノード内でルーティングされ、外部ネットワーク接続にルーティングされます。
-
VMが使用しているプライベートIPアドレスは、ホスティングしているOracle Roving Edge Infrastructureノードによって、パブリックIPアドレス・プールから割り当てられたパブリック(外部)IPアドレスに変換されます。
-
ネットワーク・トラフィックは、ホスティングしているOracle Roving Edge Infrastructureノード上のVMインスタンスから外部ネットワークに転送されます。これは事実上、1:1ネットワーク・アドレス変換(NAT)です。
-
VMインスタンスにはパブリック(外部) IPアドレスがありますが、VMインスタンス自体にはそのIPアドレスは表示されません。
-
一方、割り当てられたパブリック(外部)IPアドレスを使用するVMインスタンスの外部トラフィックは、パブリック(外部)IPアドレスを宛先VMインスタンスの関連付けられたプライベートIPアドレスに変換するホスティングOracle Roving Edge Infrastructureノードに送信されます。
次のイメージに、Oracle Roving Edge Infrastructureノード上のVMインスタンスの例を示します。割り当てられたパブリックIPアドレスとプライベートIPアドレスを確認します。
複数の Oracle Roving Edge InfrastructureノードでオープンMPIを実行するための課題
VMインスタンスのプライベートIPアドレスの使用は、Open MPIなどのクラスタリング・ソフトウェアが複数のOracle Roving Edge Infrastructureノードに実装されている場合、問題になります。各ノードは、プライベートIPアドレスからパブリックIPアドレスへのマッピング、およびほかのノードでホストされている VMインスタンスのマッピングの変換を認識しません。マッピングは共有されないため、プライベートIPアドレスを使用するパケットは正しくルーティングされないか、失われます。
-
クラスタリング・ソフトウェアは、多くの場合、VMインスタンス・インタフェースおよびIPアドレスを調べ、ソフトウェア・クラスタ内の他のノードに情報を登録します。
-
VMインスタンスはプライベートIPアドレスのみを認識し、割り当てられたパブリックIPアドレスを共有する方法がありません。
-
他のクラスタ・メンバーをホストしているリモートOracle Roving Edge Infrastructureノードには、ホストされていないVMインスタンスのプライベートIPアドレスをそれぞれのパブリックIPアドレスに変換する方法もありません。
-
異なるOracle Roving Edge Infrastructureノード上でホストされているVMインスタンスをクラスタ化すると、パブリックIPアドレスをハンドシェイクする場合、その構成交換にはプライベートIPアドレスのみを含めることができます。
- これらのVMインスタンスがOracle Roving Edge Infrastructureノード間でプライベートIPアドレスを介して通信しようとすると、トラフィックは外部ネットワークにプッシュされ、外部ネットワークによって誤って削除またはルーティングされる可能性があります。
この問題がOpen MPIを使用してどのように見えるかの例:
VMインスタンス上で実行されているオープンMPIは、ほかの VMインスタンスメンバーに到達するために使用する最適なネットワークパスを判定しようとします。ソフトウェアは、ローカルインタフェースとIPアドレスを調べ、クラスタ内のほかのノードに登録することがあります。
-
残念ながら、接続の実行に必要なネットワーク・アドレス変換は、ソース・ノードも宛先ノードも認識していません。
-
vm-node-1
のプライベートIPが10.0.100.2
(パブリックIPが10.123.123.9
)で、vm-node-2
のプライベートIPが10.0.200.12
(パブリックIPが10.123.123.99
)の場合、最初にvm-node-1
およびvm-node-2
を取得して、パブリックIP (10.123.123.x
)をハンドシェイクできます。-
検出および交換する構成には、
10.0.x.x
IP (プライベートIPアドレス)が含まれます。 -
したがって、
vm-node-1
がvm-node-2
のプライベートIP (10.0.200.12
)を使用して通信しようとした場合(ローカルではない宛先)、トラフィックは外部ネットワークにプッシュされます。 -
外部ネットワークは、
10.0.200.12
で何をすべきかわからないか、他のOracle Roving Edge Infrastructureノードでホストされている目的の宛先VMインスタンスではなく、完全に別の場所にルーティングされる可能性があります。これは、Open MPI通信パケットが失われる方法です。 -
10.0.200.12
は、Oracle Roving Edge Infrastructureノードにホストされている仮想インスタンスIPでプライベートであることに注意してください。外部ネットワークは、プライベートIPアドレスをVMインスタンスにマップする方法を認識しません。 -
外部ネットワークは、宛先のOracle Roving Edge Infrastructureノードに送信される
10.123.123.99
(VM-node-2
のパブリックIP)についてのみ認識し、これにより、アドレスが変換され、トラフィックが正しいVMインスタンスに送信されます。
-
Oracle Roving Edge Infrastructure全体のオープンMPIの実装
Oracle Roving Edge Infrastructureの内部ネットワークの非共有の性質に対処するために、Linux VMインスタンス上のNetfilterソフトウェアを使用して、他のOracle Roving Edge InfrastructureノードでホストされているVMからのネットワーク・パケット、および宛先となるネットワーク・パケットをリライトします。
設計上の考慮事項
このチュートリアルでは、3つのOracle Roving Edge Infrastructure Roving Edge Devices (RED)ノードを使用してOpen MPIクラスタを作成します。すべてのREDは、共有外部ネットワークに接続されています。各ノードには、VMインスタンスへの割り当て用に独自の外部IPプールが構成されています。
-
REDの外部ネットワークは、RFC1918内のプライベート・ネットワークです。
-
各REDはVCNで構成されます。このユースケースでは、VCNは
10.0.0.0/16
のCIDRを使用しています。 -
REDは、使用するサブネットごとに異なるCIDRを持ちます。異なるサブネットCIDRを使用すると、設定が簡略化され、異なるRED上のVM間のIP競合が発生しないようになります。
VCNおよびサブネットCIDR表
RED名 | VCN CIDR | サブネットCIDR |
---|---|---|
RED1 | 10.0.0.0/16 | 10.0.1.0/24 |
RED2 | 10.0.0.0/16 | 10.0.2.0/24 |
RED3 | 10.0.0.0/16 | 10.0.3.0/24 |
この例は、次の図に示されています。2つの異なるREDの2つのネットワーク構成です。
対象読者
Oracle Roving Edge Infrastructureの管理者、開発者およびユーザー。
目的
-
Oracle Roving Edge InfrastructureにOpen MPIを実装します。
-
複数のOracle Roving Edge InfrastructureノードでOpen MPIを使用する場合の注意事項を理解します。
-
Open MPIを使用して、複数のOracle Roving Edge Infrastructureノードにわたるパラレル処理をデモンストレーションします。
前提条件
-
1つ以上のOracle Roving Edge InfrastructureノードwebUIにアクセスします。このチュートリアルの例では、3つのOracle Roving Edge Infrastructureデバイス(RED)を使用します。
-
インスタンスを作成および起動するためのOracle Roving Edge Infrastructureのユーザー権限。詳細は、Roving Edge Infrastructureのコンピュート権限を参照してください。
-
各Oracle Roving Edge InfrastructureノードにVirtual Cloud Network (VCN)を設定します。詳細は、Roving Edge InfrastructureデバイスのVCNの作成を参照してください。
-
パブリックIPアドレスを使用して、各Oracle Roving Edge Infrastructureノードにサブネットを設定します。詳細は、Roving Edge Infrastructureデバイスのサブネットの作成を参照してください。
-
カスタム・コンピュート・イメージをOracle Roving Edge Infrastructureにインポートする方法を知っています。詳細は、OCIコンピュートでのカスタム・イメージの管理およびバケットからRoving Edge Infrastructureデバイスへのカスタム・イメージのインポートを参照してください。
-
Oracle Roving Edge Infrastructureノードで実行されているインスタンスを設定し、SSHを介してそれらのノードにアクセスします。Roving Edge Infrastructureデバイスのインスタンスの作成を参照してください。
-
SSHを介したインスタンスへの接続、IP表の使用、サービスの使用、ファイルの編集、シェル・スクリプトの実行、ディレクトリの変更、ソフトウェアのインストール、パッケージ・リポジトリの操作およびプロキシ・サーバーの使用に関するOracle Linuxの基本的な理解。
タスク1: 仮想マシン・インスタンスの作成
各REDの各サブネットにVMインスタンスを作成します。
IPアドレスの割当ての例:
RED名 | VM名 | VM O/S | VMプライベートIP | VMパブリックIP |
---|---|---|---|---|
RED1 | redvm1 | Ubuntu 22.04 | 10.0.1.2/24 | 10.123.123.32 |
RED2 | redvm2 | Ubuntu 22.04 | 10.0.2.2/24 | 10.123.123.67 |
RED3 | redvm3 | Ubuntu 22.04 | 10.0.3.2/24 | 10.123.123.101 |
ノート:このタスクのVMインスタンスは、OCI Ubuntu
22.04
LTSを使用してOracle Cloud Infrastructure (OCI)からエクスポートされたイメージを使用して作成されます。適切なOpen MPIパッケージを備えたLinuxディストリビューション(Oracle Linux 8や9、Fedoraなど)を使用できます。
-
各REDで、「コンピュート」、「インスタンス」に移動し、「インスタンスの作成」をクリックします。
-
「コンピュート・インスタンスの作成」で、「名前」と入力し、インポートされた「カスタム・イメージ」、「シェイプ」、「ネットワーキングの構成」、「SSHキー」の順に選択して、「作成」をクリックします。
タスク2: 各 VMインスタンスへのOpen MPIパッケージのインストール
すべての VMインスタンスが作成されたら、プロビジョニング中に指定された鍵を使用して、SSH経由で各 VMインスタンスにログインします。次のコマンドは、Ubuntu 22.04
に適しています。別のLinuxディストリビューションを使用している場合は、これらの手順を適応させるか、追加のパッケージ・リポジトリを含める必要がある場合があります。
-
次のコマンドを実行して、システムを更新してリブートします。
sudo apt update && sudo apt upgrade -y
完了には時間がかかる可能性があります。これが完了したら、インスタンスを再起動します。
sudo shutdown -r now
-
インスタンスにログインし、Open MPIパッケージをインストールします。
ノート:
-
これにより、かなりの数の依存関係が引き継がれます。
-
libopenmpi-dev
パッケージは、後でテストするサンプル・プログラムをコンパイルする場合にのみ必要です。Open MPI機能をプログラムにコンパイルしない場合は、このパッケージは必要ありません。
sudo apt install openmpi-bin libopenmpi-dev -y
-
タスク3: 宛先ネットワーク・アドレス変換(DNAT)およびソース・ネットワーク・アドレス変換(SNAT)の設定
-
起動された各VMインスタンスの詳細を表示し、プライベートでランダムに割り当てられたパブリックIPアドレスを書き留めます。「コンピュート」、「インスタンス」にナビゲートし、インスタンス名をクリックして詳細を表示します。
-
SNATを作成します。
-
表内の各VMのSNATルールをマップすると、次のようになります。
スポーツ RED1から RED2から RED3から redvm1
N/A 入力 src 10.123.123.67 SNAT to src 10.0.2.2
入力 src 10.123.123.101 SNAT to src 10.0.3.2
redvm2
入力 src 10.123.123.32 SNAT to src 10.0.1.2
N/A 入力 src 10.123.123.101 SNAT to src 10.0.3.2
redvm3
入力 src 10.123.123.32 SNAT to src 10.0.1.2
入力 src 10.123.123.67 SNAT to src 10.0.2.2
N/A -
VMごとに
iptables
コマンドを使用します。-
redvm1
。sudo iptables -I INPUT --src 10.123.123.0/24 -j ACCEPT -m comment --comment "Allow REDs public subnet access." sudo iptables -t nat -I INPUT -p tcp -s 10.123.123.67 -j SNAT --to-source 10.0.2.2 sudo iptables -t nat -I INPUT -p tcp -s 10.123.123.101 -j SNAT --to-source 10.0.3.2 sudo netfilter-persistent save
-
redvm2
。sudo iptables -I INPUT --src 10.123.123.0/24 -j ACCEPT -m comment --comment "Allow REDs public subnet access." sudo iptables -t nat -I INPUT -p tcp -s 10.123.123.32 -j SNAT --to-source 10.0.1.2 sudo iptables -t nat -I INPUT -p tcp -s 10.123.123.101 -j SNAT --to-source 10.0.3.2 sudo netfilter-persistent save
-
redvm3
。sudo iptables -I INPUT --src 10.123.123.0/24 -j ACCEPT -m comment --comment "Allow REDs public subnet access." sudo iptables -t nat -I INPUT -p tcp -s 10.123.123.32 -j SNAT --to-source 10.0.1.2 sudo iptables -t nat -I INPUT -p tcp -s 10.123.123.67 -j SNAT --to-source 10.0.2.2 sudo netfilter-persistent save
ノート: REDがパブリックIPに使用しているサブネットからのアクセスを許可する最初のルール(
sudo iptables -I INPUT --src 10.123.123.0/24 -j ACCEPT
)の追加。これ(または同様のルール)がないと、REDからREDへのインバウンド・トラフィックは受信側のREDによってドロップされる可能性があります。これらの仮想マシンでは、新しいルールはsudo netfilter-persistent save
で保持されます。ただし、別のLinuxディストリビューションを使用している場合、このコマンドは別のものになる可能性があります。 -
-
-
DNATを作成します。
-
同様に、表内の各VMのDNATルールをマップする場合、次のようになります。
DNAT RED1に移動します RED2に移動します RED3に移動します redvm1
N/A 出力 dst 10.0.2.2 DNAT to dst 10.123.123.67
出力 dst 10.0.3.2 DNAT to dst 10.123.123.101
redvm2
出力 dst 10.0.1.2 DNAT to dst 10.123.123.32
N/A 出力 dst 10.0.3.2 DNAT to dst 10.123.123.101
redvm3
出力 dst 10.0.1.2 DNAT to dst 10.123.123.32
出力 dst 10.0.2.2 DNAT to dst 10.123.123.67
N/A -
VMごとに
iptables
コマンドを使用します。-
redvm1
。sudo iptables -t nat -I OUTPUT -p tcp -d 10.0.2.2 -j DNAT --to-destination 10.123.123.67 sudo iptables -t nat -I OUTPUT -p tcp -d 10.0.3.2 -j DNAT --to-destination 10.123.123.101 sudo netfilter-persistent save
-
redvm2
。sudo iptables -t nat -I OUTPUT -p tcp -d 10.0.1.2 -j DNAT --to-destination 10.123.123.32 sudo iptables -t nat -I OUTPUT -p tcp -d 10.0.3.2 -j DNAT --to-destination 10.123.123.101 sudo netfilter-persistent save
-
redvm3
。sudo iptables -t nat -I OUTPUT -p tcp -d 10.0.1.2 -j DNAT --to-destination 10.123.123.32 sudo iptables -t nat -I OUTPUT -p tcp -d 10.0.2.2 -j DNAT --to-destination 10.123.123.67 sudo netfilter-persistent save
ノート: VMインスタンスでは、新しいルールは
sudo netfilter-persistent save
で保持されます。 -
-
タスク4: オープンMPIの設定
Open MPIでは、SSHを使用してクラスタメンバー間の通信を行うため、ジョブを実行する前に注意する必要がある処理がいくつかあります。
-
Open MPIは各VMのプライベートIPアドレスを使用し、各Open MPI VMインスタンスで各 VMインスタンスとそのプライベートIPアドレスに対して
/etc/hosts
エントリを作成します。たとえば、
redvm1
の/etc/hosts
エントリの上にある構成を使用すると、次のエントリが含まれます。127.0.0.1 localhost 127.0.1.1 redvm1 redvm1 10.0.2.2 redvm2 10.0.3.2 redvm3
redvm2
では、/etc/hosts
には次のエントリが含まれます。127.0.0.1 localhost 127.0.1.1 redvm2 redvm2 10.0.1.2 redvm1 10.0.3.2 redvm3
redvm3
では、/etc/hosts
には次のエントリが含まれます。127.0.0.1 localhost 127.0.1.1 redvm3 redvm3 10.0.1.2 redvm1 10.0.2.2 redvm2
-
また、Open MPIで使用する各 VM間にSSH等価が存在することを確認する必要があります。
ノート:ここでは、これらがUbuntuユーザーの既存のSSHキーを含まない新しいVMであることを前提としています。SSH鍵がすでに作成されている古いVMを使用している場合は、これらの手順を適応させる必要があります。これらの手順により、既存の鍵が上書きされ、VMからロックアウトされる可能性があります。
-
redvm1
で、新しい公開キーまたは秘密キーのペアを作成します(キーがまだ作成されていない場合)。ssh-keygen -b 4096 -t rsa
と同様のssh-keygen
コマンドを使用します(デフォルトを受け入れ、新しいキーのパスワードは設定しません)。これにより、~/.ssh/id_rsa
および~/.ssh/id_rsa.pub
が生成されます。 -
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
を実行するか、テキスト・エディタを使用して手動でコピーして、新しい公開キーをauthorized_keys
ファイルに追加します。 -
id_rsa
とid_rsa.pub
の両方を、redvm2
およびredvm3
のubuntu
ユーザーの~/.ssh
ディレクトリにコピーします。id_rsa.pub
をauthorized_keys
に追加し、redvm2
およびredvm3
でcat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
を実行します。 -
これが完了したら、各VMから、VM自体を含む他のすべてのVMに接続して、接続が機能し、SSHが他のホストを信頼することを確認します。
-
redvm1
でのSSH接続。ubuntu@redvm1:~$ ssh redvm1 date The authenticity of host 'redvm1 (127.0.1.1)' can't be established. ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'redvm1' (ED25519) to the list of known hosts. Fri Apr 5 04:28:57 UTC 2024 ubuntu@redvm1:~$ ubuntu@redvm1:~$ ssh redvm2 date The authenticity of host 'redvm2 (10.0.2.2)' can't be established. ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'redvm2' (ED25519) to the list of known hosts. Wed Jan 31 04:29:11 UTC 2024 ubuntu@redvm1:~$ ubuntu@redvm1:~$ ssh redvm3 date The authenticity of host 'redvm3 (10.0.3.2)' can't be established. ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'redvm3' (ED25519) to the list of known hosts. Wed Jan 31 04:29:19 UTC 2024
-
-
redvm3
、redvm1
およびredvm2
に接続するredvm2
、redvm1
およびredvm3
およびredvm3
に接続するredvm2
について、前述のステップを繰り返します。
-
-
クラスタ・メンバーごとに共通の記憶域の場所を作成します。
ノート: Open MPIを使用するすべての VMインスタンスが共有ストレージロケーションを持つことが理想的です。これは、NFS、GlusterFS、OCFS2、またはその他の任意の数の共有ファイルシステム・ソリューションの形式にできます。これは、ワークロードに共通の作業ディレクトリまたはデータセットが必要な場合に特に重要です。
この例では、共有ファイルシステムは必要ありません。テストバイナリの共通名を持つ場所だけです。各VMで、共通の名前の場所
/mpitest
を作成します。sudo mkdir /mpitest && sudo chown ubuntu:ubuntu /mpitest
共有ファイルシステムを使用する場合、共有ファイルシステムはこの場所にすべての VMインスタンスにマウントされます。
-
mpirun
で使用するhostfile
を作成します。詳細は、「mpirunに-hostfileオプションを使用する方法」を参照してください。-
テスト用に2つの
hostfiles
を作成します。redvm1
で、前述で作成した一般的な名前の場所/mpitest
を使用して、次の内容を含むファイル/mpitest/mpihosts.txt
を作成します。redvm1 redvm2 redvm3
-
次の内容のファイル
/mpitest/mpihosts_slots.txt
を作成します。redvm1 slots=1 redvm2 slots=1 redvm3 slots=1
-
ノート:このチュートリアルでは、テストは
redvm1
からのみ実行されるため、これらのファイルをredvm2
およびredvm3
にコピーする必要はありません。他のVMからもジョブを実行する場合は、これらのファイルを他のVMインスタンスにコピーするか、NFSなどの適切な共有ファイルシステムを使用する必要があります。
タスク5: VMインスタンスのテスト
-
分散コマンドの簡単なテスト。
-
単純なテストは、すべてのクラスタ・メンバーで
hostname
などのコマンドを呼び出すことです。slots=1
(mpihosts_slots.txt
)ファイルを使用して、3つのノードで予想される出力を次に示します。slots
ディレクティブは、プロセス数を決定するmpirun
ではなく、このノードに割り当てることができるプロセスの数をmpirun
に通知します。ノート: CPU以外の制限されたリソース(GPUなど)を使用している場合、
slots
の指定が必要になることがあります。ここで、プロセスを他のリソースの数に制限します。これに失敗すると、他のリソースを割り当てることができないためにプロセスが失敗する可能性があります。ubuntu@redvm1:~$ cd /mpitest ubuntu@redvm1:/mpitest$ cat mpihosts_slots.txt redvm1 slots=1 redvm2 slots=1 redvm3 slots=1 ubuntu@redvm1:/mpitest$ mpirun --hostfile mpihosts_slots.txt hostname redvm1 redvm2 redvm3
-
slots
(mpihosts.txt
)ファイルを指定せずに同じテストを実行すると、mpirun
によって使用可能なCPUが判別され、各ノードでCPU数のhostname
コマンドが実行されます。これら3つの仮想マシンには16個のCPUがあるため、3 x 16の応答(各ホスト名の16個)を取得する必要があります。ubuntu@redvm1:/mpitest$ cat mpihosts.txt redvm1 redvm2 redvm3 ubuntu@redvm1:/mpitest$ mpirun --hostfile mpihosts.txt hostname | sort | uniq -c 16 redvm1 16 redvm2 16 redvm3
-
-
Open MPIテストバイナリを構築します。
Open MPIを使用するプログラムで適切なテストを行うには、John Burkardtの素数計算機の例を使用します。これは、
redvm1
でダウンロードおよびコンパイルする必要があります。詳細は、Prime Number Calculator by John Burkardtを参照してください。ubuntu@redvm1:~$ cd /mpitest ubuntu@redvm1:/mpitest$ curl https://people.sc.fsu.edu/~jburkardt/c_src/prime_mpi/prime_mpi.c -o prime_mpi.c % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 4699 100 4699 0 0 2990 0 0:00:01 0:00:01 --:--:-- 2991 ubuntu@redvm1:/mpitest$ mpicc prime_mpi.c -o prime_mpi ubuntu@redvm1:/mpitest$ ls -l prime_mpi -rwxrwxr-x 1 ubuntu ubuntu 16736 Apr 5 05:38 prime_mpi
共有ファイルシステムはテスト用に設定されていないため、
prime_mpi
バイナリは、redvm1
と同じ場所のredvm2
およびredvm3
にコピーする必要があります。次のコマンドを実行しますubuntu@redvm1:/mpitest$ scp prime_mpi redvm2:/mpitest prime_mpi 100% 16KB 27.4MB/s 00:00 ubuntu@redvm1:/mpitest$ scp prime_mpi redvm3:/mpitest prime_mpi 100% 16KB 28.3MB/s 00:00
-
ベースラインを比較するには、Open MPIバイナリスタンドアロンを実行します。ベースラインまたは比較に対して、オープンMPIなしで
prime_mpi
を実行します。ubuntu@redvm1:/mpitest$ ./prime_mpi 31 January 2024 06:08:17 AM PRIME_MPI C/MPI version An MPI example program to count the number of primes. The number of processes is 1 N Pi Time 1 0 0.000003 2 1 0.000000 4 2 0.000000 8 4 0.000000 16 6 0.000000 32 11 0.000001 64 18 0.000002 128 31 0.000022 256 54 0.000019 512 97 0.000066 1024 172 0.000231 2048 309 0.000810 4096 564 0.002846 8192 1028 0.010093 16384 1900 0.037234 32768 3512 0.137078 65536 6542 0.515210 131072 12251 1.932970 262144 23000 7.243419 PRIME_MPI - Master process: Normal end of execution. 31 January 2024 06:08:27 AM
ノート:プロセス数は1で、完了までに約10秒かかります。
-
Open MPIを使用した分散実行。
mpihosts.txt
ファイルを使用して、3つのVMインスタンスで使用可能なすべてのCPUでOpen MPIを指定してprime_mpi
を実行します。ubuntu@redvm1:/mpitest$ mpirun --hostfile mpihosts.txt ./prime_mpi 31 January 2024 06:09:02 AM PRIME_MPI C/MPI version An MPI example program to count the number of primes. The number of processes is 48 N Pi Time 1 0 0.020740 2 1 0.000428 4 2 0.000331 8 4 0.000392 16 6 0.000269 32 11 0.000295 64 18 0.000374 128 31 0.000390 256 54 0.000380 512 97 0.000331 1024 172 0.000351 2048 309 0.000385 4096 564 0.000740 8192 1028 0.001931 16384 1900 0.006316 32768 3512 0.021577 65536 6542 0.078834 131072 12251 0.273368 262144 23000 0.808825 PRIME_MPI - Master process: Normal end of execution. 31 January 2024 06:09:03 AM
48個のプロセスが使用され、実行に約1秒かかります。
mpihosts_slots.txt
ファイルを使用して、同じ例を実行してOpen MPIを調べます。スタンドアロンprime_mpi
の実行と比較して改善が見られますが、すべてのノードで完全な補完ではなく、各ノードで1つのプロセッサ(合計3)のみが使用されます。各 VMインスタンスのスロット数を変更することで、ジョブの分散を制御できます。
関連リンク
承認
- 著者 - James George (マスター・プリンシパル・クラウド・アーキテクト)、Melinda Centeno (シニア・プリンシパル・プロダクト・マネージャー)
その他の学習リソース
docs.oracle.com/learnの他のラボをご覧いただくか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスして、Oracle Learning Explorerになります。
製品ドキュメントは、Oracle Help Centerを参照してください。
Use Open MPI on Oracle Roving Edge Infrastructure
F96272-01
April 2024