PCクラスタを利用したHPCの試験構築
CPU性能の限界を超える計算処理を目指し、複数サーバを連携させる技術が「PCクラスタ(HPC)」です。本稿では、Ubuntu Desktop上のKVM仮想環境(2台のUbuntu Server)を用い、Open MPIによる分散計算環境の構築手順を解説します。
【本記事の検証環境】
- ホストOS:Ubuntu Desktop
- 仮想化ソフト:KVM
- ゲストOS(VM):Ubuntu Server × 2台(Master / Worker)
- IPアドレス:
- Master: 192.168.122.10
- Worker: 192.168.122.20
1.概要
PCクラスタを利用したHPC(high-performance computing)がどのようなものであるかを調べているとOpen MPIを見つけました。Open MPIはHPCのライブラリで具体的な構築方法を探していると大学のWebサイトでMPIを利用し、Ubuntu Serverをベースとした環境構築資料を見つけました。- ホストOS:Ubuntu Desktop
- 仮想化ソフト:KVM
- ゲストOS(VM):Ubuntu Server × 2台(Master / Worker)
- IPアドレス:
- Master: 192.168.122.10
- Worker: 192.168.122.20
PC(x86サーバ)の単体性能は、マザーボードに搭載可能なCPUの数と単体性能に依存します。このトータル性能がPC(x86サーバ)を1台利用した場合の限界値です。大規模な計算を実行するためには、単体のPC(x86サーバ)では全く足りません。
そこで、複数のPC(x86サーバ)を同様の構成で構築して、実行する計算処理を各PC(x86サーバ)に分散することでトータル性能を向上することを目的としてPCクラスタが生まれました。ハードウェアだけでは性能は上がりません。如何にして計算処理を複数のPC(x86サーバ)に分散するかがポイントになります。
PCクラスタの試験的な構築をするため、Ubuntu DesktopのKVMを利用して、VMのUbuntu serverでhpcの仕組みを調べてみました。その内容を記述します。
(b) ubuntu-20.04 server install
(c) ip-address変更(vmは192.168.122.10, 192.168.122.20に設定)
(d) ubuntu update
(e) vm clone(vm ubuntu serverを2台構築)
(f) hostname変更
(g) master node(ubuntu desktop)にnfs-server構築
(h) worker node(vm ubuntu server)にnfs-client構築
(i) open MPIをmaster node, worker nodeに導入
(j) sshの追加設定
(k) sample programのmaster nodeでbuild
(l) maser nodeでsample program実行
(m) worker nodeでsample program実行
nfs server設定
master $ mkdir /home/username/share
/etc/exportsに下記1行を追加
/home/username/share 192.168.122.0/24(rw,async,no_root_squash)
worker $ mkdir /home/username/share
2.詳細
(1) 導入手順
(a) kvm install(b) ubuntu-20.04 server install
(c) ip-address変更(vmは192.168.122.10, 192.168.122.20に設定)
(d) ubuntu update
(e) vm clone(vm ubuntu serverを2台構築)
(f) hostname変更
(g) master node(ubuntu desktop)にnfs-server構築
(h) worker node(vm ubuntu server)にnfs-client構築
(i) open MPIをmaster node, worker nodeに導入
(j) sshの追加設定
(k) sample programのmaster nodeでbuild
(l) maser nodeでsample program実行
(m) worker nodeでsample program実行
(2) 詳細
(a)〜(f)までは、KVM環境にubuntu serverを2台構築するので省略します(g) master node(ubuntu desktop)にnfs-server構築
master $ sudo apt install nfs-kernel-servernfs server設定
master $ mkdir /home/username/share
/etc/exportsに下記1行を追加
/home/username/share 192.168.122.0/24(rw,async,no_root_squash)
(h) worker node(vm ubuntu server)にnfs-client構築
worker $ sudo apt install nfs-commonworker $ mkdir /home/username/share
/etc/fstabに下記1行を追加 ( vim利用 )
192.168.122.1:/home/username/share /home/username/share nfs defaults,_netdev,nofail 0 0
worker $ sudo apt install openmpi-bin libopenmpi-dev
master $ ssh-keygen -t rsa -b 4096
master $ cp .ssh/id_rsa.pub share
worker nodeでssh設定変更
worker $ cp share/id_rsa.pub .ssh/authorized_keys
Public-keyでの認証でssh-loginできるかmaster nodeで確認
/etc/ssh/sshd_configの下記箇所を修正( vim利用 )
PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no
master nodeの/home/username/shareにhello.cで作成
#include <stdio.h>
#include "mpi.h"
int main( int argc, char *argv[] )
{
int rank, size, len;
char name[MPI_MAX_PROCESSOR_NAME];
MPI_Init( &argc, &argv );
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
MPI_Comm_size( MPI_COMM_WORLD, &size );
MPI_Get_processor_name( name, &len );
name[len] = '\0';
printf( "Hello world: rank %d of %d running on %s\n", rank, size, name );
MPI_Finalize();
return 0;
}
buildします
master $ mpicc -o hello hello.c
192.168.122.20 slots=4
192.168.122.30 slots=4
worker nodeを利用した実行
worker $ mpirun -hostfile host -np 8 ./hello
192.168.122.1:/home/username/share /home/username/share nfs defaults,_netdev,nofail 0 0
(i) open MPIをmaster node, worker nodeに導入
worker $ sudo apt install gcc g++ gfortranworker $ sudo apt install openmpi-bin libopenmpi-dev
(j) sshの追加設定
master nodeでssh-keygen実行master $ ssh-keygen -t rsa -b 4096
master $ cp .ssh/id_rsa.pub share
worker nodeでssh設定変更
worker $ cp share/id_rsa.pub .ssh/authorized_keys
Public-keyでの認証でssh-loginできるかmaster nodeで確認
/etc/ssh/sshd_configの下記箇所を修正( vim利用 )
PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no
(k) sample programのmaster nodeでbuild
参考資料にサンプルがあります。利用しました。master nodeの/home/username/shareにhello.cで作成
#include <stdio.h>
#include "mpi.h"
int main( int argc, char *argv[] )
{
int rank, size, len;
char name[MPI_MAX_PROCESSOR_NAME];
MPI_Init( &argc, &argv );
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
MPI_Comm_size( MPI_COMM_WORLD, &size );
MPI_Get_processor_name( name, &len );
name[len] = '\0';
printf( "Hello world: rank %d of %d running on %s\n", rank, size, name );
MPI_Finalize();
return 0;
}
buildします
master $ mpicc -o hello hello.c
(l) maser nodeでsample program実行
master $ mpirun -n 4 ./hello(m) worker nodeでsample program実行
master nodeの/home/username/shareにhostを下記内容で作成192.168.122.20 slots=4
192.168.122.30 slots=4
worker nodeを利用した実行
worker $ mpirun -hostfile host -np 8 ./hello
3.初見
思ったよりも簡単に動作しました。今回はKVM仮想環境内の試験なので物理サーバを利用した試験とは異なり、問題が発生する場所が少なかったと言えるのかも知れません。PCクラスタは、まず、「何を計算するか」を決めてから物理構成を選定することになると思っています。つまり、アプリケーションを実現するソフトウェアエンジニアが全体を決める必要があります。このようなアプローチでプロジェクトが進む事例は少ない気がしています。
コメント
コメントを投稿