라즈베리파이 클러스터 설정 2
이전 포스트에서는 라즈베리파이 클러스터 설정 중에서 MPICH 설치를 마쳤습니다.
라즈베리파이 클러스터 설정을 마무리하는 단계로 MPI를 통해 파이썬 코드가 작동되도록 설정하고 연동이 완료된 클러스터로 파이썬 병렬 프로그래밍이 작동하는지를 확인하는 과정을 설명해 볼까 합니다.
MPICH를 통해 파이썬 코드가 작동하도록 설정
파이썬을 설치합니다.
☞ pi@raspberrypi:~ $ sudo aptitude install python-dev
만약 aptitude 명령어가 실행이 안 될 경우에는 해당 패키지가 설치되어 있지 않아서 그런 것이기 때문에 먼저 패키지를 설치하고 상기 명령을 실행하면 됩니다.
☞ pi@raspberrypi:~ $ sudo apt install aptitude
파이썬 용 MPI 설치 파일을 다운로드합니다.
MPI 설치 파일 압축을 풀어줍니다.
☞ pi@raspberry:~ $ tar -zxf mpi4py-3.0.3.tar.gz
MPI 디렉터리로 들어갑니다.
☞ pi@raspberry:~ $ cd mpi4py-3.0.3
파이썬 모듈을 설치합니다.
☞ pi@raspberry:~/mpi4py-3.0.3 $ python setup.py build
☞ pi@raspberry:~/mpi4py-3.0.3 $ sudo python setup.py install
☞ pi@raspberry:~/mpi4py-3.0.3 $ export PYTHONPATH=/home/pi/mpi4py-3.0.3
파이썬 코드가 MPICH로 잘 작동하는지 데모 코드를 실행시켜서 확인합니다.
☞ pi@raspberry:~/mpi4py-3.0.3 $ mpiexec -n 5 python demo/helloworld.py
다음과 같이 실행되면 MPICH 환경에서 파이썬이 잘 작동하고 있다는 것입니다.
이제 하나의 라즈베리파이에 MPICH 환경 설정을 마쳤습니다.
나머지 라즈베리파이에 동일한 작업을 반복해야 하는데 시간이 오래 걸리고 지루한 작업이다 보니 MPICH 설정을 마친 것을 img 파일로 압축하여 다른 라즈베리파이에다가 풀어버리는 게 더 효율적일 것입니다.
img 파일로 압축에 사용되는 라이터로 win32DiskImager를 사용합니다.
win32DiskImager를 다운로드한 후 PC에 설치합니다.
MPICH 설정을 마친 라즈베리파이에서 마이크로 SD 카드를 꺼내서 리더기에 삽입한 후 win32DiskImager를 실행합니다.
Device 항목에서는 마이크로 SD 카드가 삽입된 드리이브를 선택하고, Image File 항목에서는 img 파일명을 작성하고 압출 파일을 저장할 폴더를 선택하여 Read 버튼이 활성화가 되면 클릭하여 압축을 진행합니다.
압축을 마치면 win32DiskImager의 Image File 항목에서 압축했던 파일을 불러들이고 리더기에 비어있는 마이크로 SD 카드를 삽입합니다.
이때 win32DiskImager의 Write 버튼이 활성화되면 클릭을 하여 마이크로 SD 카드에 압축을 풉니다.
노드의 개수만큼 이 작업을 반복해야 합니다.
이후로는 라즈베리파이가 아닌 노드로 명명하겠습니다
라즈베리파이 클러스터 하에서 모든 노드 연동시키기
서버 마스터 역할을 부여할 노드에 nmap
네트워킹 준비 작업을 진행합니다.
다음에도 언급될 예정이지만 저는 192.168.0.102 ip를 사용하고 있는 노드를 서버 마스터로 지정하였으며 이후의 작업은 모두 서버 마스터로 지정된 노드에서 진행된 것입니다.
☞ pi@raspberrypi:~ $ sudo apt-get update
☞ pi@raspberrypi:~ $ sudo apt-get install nmap
연결된 모든 라즈베리파이의 ip 주소를 확인합니다.
☞ pi@raspberrypi:~ $ sudo nmap -sn 192.168.0.*
ip 주소는 사용하고 있는 공유기가 제공하는 것을 기입하면 됩니다.
machinefile
를 작성하여 모든 ip 주소를 기록한 후 저장합니다.
☞ pi@raspberrypi:~ $ sudo nano machinefile
저는 192.168.0.102 ~ 192.168.0.106을 사용하고 있고 192.168.0.102를 사용하고 있는 라즈베리파이를 서버 마스터로 지정하였습니다.
이제 각 노드에 해당하는 라즈베리파이의 HOSTNAME을 변경해 줍니다.
저는 해당 ip 순으로 HOSTNAME을 변경해 주었는데요.
예를 들어 192.168.0.102는 c1, 192.168.0.103은 c2 이렇게 해서 c5까지 지정해 주었습니다.
HOSTNAME을 변경할 때는 SSH 통신을 통해 각 노드를 연결해야 합니다.
먼저 서버 마스터로 지정된 노드로 접속하여 HOSTNAME을 변경하고 SSH 설정을 활성화합니다.
이때 마이크로 SD 카드 용량을 확장하기도 하는데 라즈비안 최신 버전에서는 이미 확장이 되어 있어서 용량 확장은 하지 않으셔도 됩니다.
라즈베리파이 소프트웨어 설정 툴로 진입합니다.
☞ pi@raspberrypi:~ $ sudo raspi-config
첫 번째 항목인 System Options을 선택합니다.
Hostname 항목을 선택합니다.
HOSTNAME을 변경하고 Ok를 선택합니다.
Interface Options 항목을 선택합니다.
SSH 항목을 선택하고 Yes를 선택하여 SSH를 활성화합니다.
Finish를 선택하여 HOSTNAME 변경하고 SSH 활성화를 마치고 나서 재부팅합니다.
☞ pi@raspberrypi:~ $ sudo reboot
다시 서버 마스터 노드로 접속을 다시 접속하면 HOSTNAME이 raspberry에서 c1으로 변경되어 있음을 확인할 수 있습니다.
나머지 노드도 HOSTNAME과 SSH 활성화를 진행해야 하는데 이때 서버 마스터 노드인 c1에서 SSH 통신을 통해 다른 노드와 접속해야 합니다.
☞ pi@c1:~ $ ssh pi@192.168.0.103
이 상태에서 HOSTNAME을 변경하고 SSH를 활성화를 마친 다음 타 노드와의 연결을 끊습니다.
☞ pi@c2:~ $ exit
노드 간에 자동 원격 접속하기
모든 노드에서 이 작업을 마치고 나서 공개키와 비밀키를 사용해서 각각의 노드 간에 자동 원격 접속이 이루어지도록 설정을 해야 합니다.
서버 마스터 노드인 c1에서 공개키와 비밀키를 생성합니다.
☞ pi@c1:~ $ ssh-keygen
각 항목마다 아무것도 입력하지 말고 커서가 나올 때까지 엔터키만 누릅니다.
☞ pi@c1:~ $ cd ~
☞ pi@c1:~ $ cd .ssh
☞ pi@c1:~/.ssh $ cp id_rsa.pub c1
c2 노드에서 공개키와 비밀키를 생성하는데 이때도 서버 마스터 노드인 c1에서 타 노드를 접속해야 합니다.
☞ pi@c1:~/.ssh $ ssh pi@192.168.0.103
☞ pi@c2:~ $ ssh-keygen
c1 노드와 마찬가지로 각 항목마다 아무것도 입력하지 말고 c2 노드 접속 시 비밀번호를 입력하라는 항목이 나타나면 해당 비밀번호를 입력하면 됩니다.
다른 노드도 마찬가지로 설정을 해주면 됩니다.
☞ pi@c2:~ $ cd .ssh
☞ pi@c2:~/.ssh $ cp id_rsa.pub c2
☞ pi@c2:~./ssh $ scp 192.168.0.102:/home/pi/.ssh/c1 .
☞ pi@c2:~/.ssh $ cat c1 >> authorized_keys
☞ pi@c2:~/.ssh $ exit
서버 마스터 노드인 c1에서 c2 노드의 공개키를 수용합니다.
☞ pi@c1:~/.ssh $ scp 192.168.0.103:/home/pi/.ssh/c2 .
☞ pi@c1:~/.ssh $ cat c2 >> authorized_keys
c3 노드에서 동일하게 공개키와 비밀키를 생성합니다.
☞ pi@c1:~/.ssh $ ssh pi@192.168.0.104
☞ pi@c3:~ $ ssh-keygen
☞ pi@c3:~ $ cd .ssh
☞ pi@c3:~/.ssh $ cp id_rsa.pub c3
☞ pi@c3:~./ssh $ scp 192.168.0.102:/home/pi/.ssh/c1 .
☞ pi@c3:~/.ssh $ cat c1 >> authorized_keys
☞ pi@c3:~/.ssh $ exit
서버 마스터 노드인 c1에서 c3 노드의 공개키를 수용합니다.
☞ pi@c1:~/.ssh $ scp 192.168.0.104:/home/pi/.ssh/c3 .
☞ pi@c1:~/.ssh $ cat c3 >> authorized_keys
c4 노드
☞ pi@c1:~/.ssh $ ssh pi@192.168.0.105
☞ pi@c4:~ $ ssh-keygen
☞ pi@c4:~ $ cd .ssh
☞ pi@c4:~/.ssh $ cp id_rsa.pub c
4
☞ pi@c4:~./ssh $ scp 192.168.0.102:/home/pi/.ssh/c1 .
☞ pi@c4:~/.ssh $ cat c1 >> authorized_keys
☞ pi@c4:~/.ssh $ exit
서버 마스터 노드인 c1에서 c4 노드의 공개키를 수용합니다.
☞ pi@c1:~/.ssh $ scp 192.168.0.105:/home/pi/.ssh/c4 .
☞ pi@c1:~/.ssh $ cat c4 >> authorized_keys
c5 노드
☞ pi@c1:~/.ssh $ ssh pi@192.168.0.106
☞ pi@c5:~ $ ssh-keygen
☞ pi@c5:~ $ cd .ssh
☞ pi@c5:~/.ssh $ cp id_rsa.pub c
5
☞ pi@c5:~./ssh $ scp 192.168.0.102:/home/pi/.ssh/c1 .
☞ pi@c5:~/.ssh $ cat c1 >> authorized_keys
☞ pi@c5:~/.ssh $ exit
서버 마스터 노드인 c1에서 c5 노드의 공개키를 수용합니다.
☞ pi@c1:~/.ssh $ scp 192.168.0.106:/home/pi/.ssh/c5 .
☞ pi@c1:~/.ssh $ cat c5 >> authorized_keys
이제 각각의 노드 간에 클러스터 연동 상태를 확인합니다.
☞ pi@c1:~/.ssh $ cd ~
☞ pi@c1:~ $ mpiexec -f machinefile -n 5 hostname
상기와 같이 모든 노드의 HOSTNAME이 출력되면 연동이 완벽하게 이루어지고 있는 것입니다.
참고로 .ssh 디렉터리는 중요한 키가 보관되어 있으므로 외부에서 접속할 수 없도록 퍼미션을 설정해야 합니다.
라즈베리파이 클러스터 설정이 완료된 노드 간에 파이썬 코드 작동 확인하기
테스트에 사용할 간단한 파이썬 코드를 작성합니다.
☞ pi@c1:~/.ssh $ cd ~
☞ pi@c1:~ $ sudo nano clustertest.py
# ! python
# integer arith
a=4
print a
b=12+5
print b
c=b%a
print c
a, b, 나머지 값 c를 출력하라는 연산 코드를 각각의 노드로 복사합니다.
☞ pi@c1:~ $ scp -r
clustertest.py 192.168.0.103:/home/pi
☞ pi@c1:~ $ scp -r
clustertest.py 192.168.0.104:/home/pi
☞ pi@c1:~ $ scp -r
clustertest.py 192.168.0.105:/home/pi
☞ pi@c1:~ $ scp -r
clustertest.py 192.168.0.106:/home/pi
파이썬 코드 복사를 완료하고 설정된 클러스터가 잘 작동하는지 코드를 실행합니다.
☞ pi@c1:~ $ mpiexec -f machinefile -n 5 python clustertest.py
다음과 같이 연산 값을 5번 출력하면 각각의 노드에서 동시에 연산을 한 것이므로 클러스터 설정이 완벽하게 작동하고 있음을 확인할 수 있습니다.
라즈베리파이 클러스터 설정이 좀 복잡해 보이지만 차근차근 따라 하시면 큰 무리 없이 설정을 완료할 수 있을 것입니다.
이제 다양하게 라즈베리파이 클러스터를 활용하면 됩니다.
2021년 04월 11일
라즈베리파이 클러스터 설정 2
이전 포스트에서는 라즈베리파이 클러스터 설정 중에서 MPICH 설치를 마쳤습니다.
라즈베리파이 클러스터 설정을 마무리하는 단계로 MPI를 통해 파이썬 코드가 작동되도록 설정하고 연동이 완료된 클러스터로 파이썬 병렬 프로그래밍이 작동하는지를 확인하는 과정을 설명해 볼까 합니다.
MPICH를 통해 파이썬 코드가 작동하도록 설정
파이썬을 설치합니다.
☞ pi@raspberrypi:~ $ sudo aptitude install python-dev
만약 aptitude 명령어가 실행이 안 될 경우에는 해당 패키지가 설치되어 있지 않아서 그런 것이기 때문에 먼저 패키지를 설치하고 상기 명령을 실행하면 됩니다.
☞ pi@raspberrypi:~ $ sudo apt install aptitude
파이썬 용 MPI 설치 파일을 다운로드합니다.
MPI 설치 파일 압축을 풀어줍니다.
☞ pi@raspberry:~ $ tar -zxf mpi4py-3.0.3.tar.gz
MPI 디렉터리로 들어갑니다.
☞ pi@raspberry:~ $ cd mpi4py-3.0.3
파이썬 모듈을 설치합니다.
☞ pi@raspberry:~/mpi4py-3.0.3 $ python setup.py build
☞ pi@raspberry:~/mpi4py-3.0.3 $ sudo python setup.py install
☞ pi@raspberry:~/mpi4py-3.0.3 $ export PYTHONPATH=/home/pi/mpi4py-3.0.3
파이썬 코드가 MPICH로 잘 작동하는지 데모 코드를 실행시켜서 확인합니다.
☞ pi@raspberry:~/mpi4py-3.0.3 $ mpiexec -n 5 python demo/helloworld.py
다음과 같이 실행되면 MPICH 환경에서 파이썬이 잘 작동하고 있다는 것입니다.
이제 하나의 라즈베리파이에 MPICH 환경 설정을 마쳤습니다.
나머지 라즈베리파이에 동일한 작업을 반복해야 하는데 시간이 오래 걸리고 지루한 작업이다 보니 MPICH 설정을 마친 것을 img 파일로 압축하여 다른 라즈베리파이에다가 풀어버리는 게 더 효율적일 것입니다.
img 파일로 압축에 사용되는 라이터로 win32DiskImager를 사용합니다.
win32DiskImager를 다운로드한 후 PC에 설치합니다.
MPICH 설정을 마친 라즈베리파이에서 마이크로 SD 카드를 꺼내서 리더기에 삽입한 후 win32DiskImager를 실행합니다.
Device 항목에서는 마이크로 SD 카드가 삽입된 드리이브를 선택하고, Image File 항목에서는 img 파일명을 작성하고 압출 파일을 저장할 폴더를 선택하여 Read 버튼이 활성화가 되면 클릭하여 압축을 진행합니다.
압축을 마치면 win32DiskImager의 Image File 항목에서 압축했던 파일을 불러들이고 리더기에 비어있는 마이크로 SD 카드를 삽입합니다.
이때 win32DiskImager의 Write 버튼이 활성화되면 클릭을 하여 마이크로 SD 카드에 압축을 풉니다.
노드의 개수만큼 이 작업을 반복해야 합니다.
이후로는 라즈베리파이가 아닌 노드로 명명하겠습니다
라즈베리파이 클러스터 하에서 모든 노드 연동시키기
서버 마스터 역할을 부여할 노드에 nmap
네트워킹 준비 작업을 진행합니다.
다음에도 언급될 예정이지만 저는 192.168.0.102 ip를 사용하고 있는 노드를 서버 마스터로 지정하였으며 이후의 작업은 모두 서버 마스터로 지정된 노드에서 진행된 것입니다.
☞ pi@raspberrypi:~ $ sudo apt-get update
☞ pi@raspberrypi:~ $ sudo apt-get install nmap
연결된 모든 라즈베리파이의 ip 주소를 확인합니다.
☞ pi@raspberrypi:~ $ sudo nmap -sn 192.168.0.*
ip 주소는 사용하고 있는 공유기가 제공하는 것을 기입하면 됩니다.
machinefile
를 작성하여 모든 ip 주소를 기록한 후 저장합니다.
☞ pi@raspberrypi:~ $ sudo nano machinefile
저는 192.168.0.102 ~ 192.168.0.106을 사용하고 있고 192.168.0.102를 사용하고 있는 라즈베리파이를 서버 마스터로 지정하였습니다.
이제 각 노드에 해당하는 라즈베리파이의 HOSTNAME을 변경해 줍니다.
저는 해당 ip 순으로 HOSTNAME을 변경해 주었는데요.
예를 들어 192.168.0.102는 c1, 192.168.0.103은 c2 이렇게 해서 c5까지 지정해 주었습니다.
HOSTNAME을 변경할 때는 SSH 통신을 통해 각 노드를 연결해야 합니다.
먼저 서버 마스터로 지정된 노드로 접속하여 HOSTNAME을 변경하고 SSH 설정을 활성화합니다.
이때 마이크로 SD 카드 용량을 확장하기도 하는데 라즈비안 최신 버전에서는 이미 확장이 되어 있어서 용량 확장은 하지 않으셔도 됩니다.
라즈베리파이 소프트웨어 설정 툴로 진입합니다.
☞ pi@raspberrypi:~ $ sudo raspi-config
첫 번째 항목인 System Options을 선택합니다.
Hostname 항목을 선택합니다.
HOSTNAME을 변경하고 Ok를 선택합니다.
Interface Options 항목을 선택합니다.
SSH 항목을 선택하고 Yes를 선택하여 SSH를 활성화합니다.
Finish를 선택하여 HOSTNAME 변경하고 SSH 활성화를 마치고 나서 재부팅합니다.
☞ pi@raspberrypi:~ $ sudo reboot
다시 서버 마스터 노드로 접속을 다시 접속하면 HOSTNAME이 raspberry에서 c1으로 변경되어 있음을 확인할 수 있습니다.
나머지 노드도 HOSTNAME과 SSH 활성화를 진행해야 하는데 이때 서버 마스터 노드인 c1에서 SSH 통신을 통해 다른 노드와 접속해야 합니다.
☞ pi@c1:~ $ ssh pi@192.168.0.103
이 상태에서 HOSTNAME을 변경하고 SSH를 활성화를 마친 다음 타 노드와의 연결을 끊습니다.
☞ pi@c2:~ $ exit
노드 간에 자동 원격 접속하기
모든 노드에서 이 작업을 마치고 나서 공개키와 비밀키를 사용해서 각각의 노드 간에 자동 원격 접속이 이루어지도록 설정을 해야 합니다.
서버 마스터 노드인 c1에서 공개키와 비밀키를 생성합니다.
☞ pi@c1:~ $ ssh-keygen
각 항목마다 아무것도 입력하지 말고 커서가 나올 때까지 엔터키만 누릅니다.
☞ pi@c1:~ $ cd ~
☞ pi@c1:~ $ cd .ssh
☞ pi@c1:~/.ssh $ cp id_rsa.pub c1
c2 노드에서 공개키와 비밀키를 생성하는데 이때도 서버 마스터 노드인 c1에서 타 노드를 접속해야 합니다.
☞ pi@c1:~/.ssh $ ssh pi@192.168.0.103
☞ pi@c2:~ $ ssh-keygen
c1 노드와 마찬가지로 각 항목마다 아무것도 입력하지 말고 c2 노드 접속 시 비밀번호를 입력하라는 항목이 나타나면 해당 비밀번호를 입력하면 됩니다.
다른 노드도 마찬가지로 설정을 해주면 됩니다.
☞ pi@c2:~ $ cd .ssh
☞ pi@c2:~/.ssh $ cp id_rsa.pub c2
☞ pi@c2:~./ssh $ scp 192.168.0.102:/home/pi/.ssh/c1 .
☞ pi@c2:~/.ssh $ cat c1 >> authorized_keys
☞ pi@c2:~/.ssh $ exit
서버 마스터 노드인 c1에서 c2 노드의 공개키를 수용합니다.
☞ pi@c1:~/.ssh $ scp 192.168.0.103:/home/pi/.ssh/c2 .
☞ pi@c1:~/.ssh $ cat c2 >> authorized_keys
c3 노드에서 동일하게 공개키와 비밀키를 생성합니다.
☞ pi@c1:~/.ssh $ ssh pi@192.168.0.104
☞ pi@c3:~ $ ssh-keygen
☞ pi@c3:~ $ cd .ssh
☞ pi@c3:~/.ssh $ cp id_rsa.pub c3
☞ pi@c3:~./ssh $ scp 192.168.0.102:/home/pi/.ssh/c1 .
☞ pi@c3:~/.ssh $ cat c1 >> authorized_keys
☞ pi@c3:~/.ssh $ exit
서버 마스터 노드인 c1에서 c3 노드의 공개키를 수용합니다.
☞ pi@c1:~/.ssh $ scp 192.168.0.104:/home/pi/.ssh/c3 .
☞ pi@c1:~/.ssh $ cat c3 >> authorized_keys
c4 노드
☞ pi@c1:~/.ssh $ ssh pi@192.168.0.105
☞ pi@c4:~ $ ssh-keygen
☞ pi@c4:~ $ cd .ssh
☞ pi@c4:~/.ssh $ cp id_rsa.pub c
4
☞ pi@c4:~./ssh $ scp 192.168.0.102:/home/pi/.ssh/c1 .
☞ pi@c4:~/.ssh $ cat c1 >> authorized_keys
☞ pi@c4:~/.ssh $ exit
서버 마스터 노드인 c1에서 c4 노드의 공개키를 수용합니다.
☞ pi@c1:~/.ssh $ scp 192.168.0.105:/home/pi/.ssh/c4 .
☞ pi@c1:~/.ssh $ cat c4 >> authorized_keys
c5 노드
☞ pi@c1:~/.ssh $ ssh pi@192.168.0.106
☞ pi@c5:~ $ ssh-keygen
☞ pi@c5:~ $ cd .ssh
☞ pi@c5:~/.ssh $ cp id_rsa.pub c
5
☞ pi@c5:~./ssh $ scp 192.168.0.102:/home/pi/.ssh/c1 .
☞ pi@c5:~/.ssh $ cat c1 >> authorized_keys
☞ pi@c5:~/.ssh $ exit
서버 마스터 노드인 c1에서 c5 노드의 공개키를 수용합니다.
☞ pi@c1:~/.ssh $ scp 192.168.0.106:/home/pi/.ssh/c5 .
☞ pi@c1:~/.ssh $ cat c5 >> authorized_keys
이제 각각의 노드 간에 클러스터 연동 상태를 확인합니다.
☞ pi@c1:~/.ssh $ cd ~
☞ pi@c1:~ $ mpiexec -f machinefile -n 5 hostname
상기와 같이 모든 노드의 HOSTNAME이 출력되면 연동이 완벽하게 이루어지고 있는 것입니다.
참고로 .ssh 디렉터리는 중요한 키가 보관되어 있으므로 외부에서 접속할 수 없도록 퍼미션을 설정해야 합니다.
라즈베리파이 클러스터 설정이 완료된 노드 간에 파이썬 코드 작동 확인하기
테스트에 사용할 간단한 파이썬 코드를 작성합니다.
☞ pi@c1:~/.ssh $ cd ~
☞ pi@c1:~ $ sudo nano clustertest.py
# ! python
# integer arith
a=4
print a
b=12+5
print b
c=b%a
print c
a, b, 나머지 값 c를 출력하라는 연산 코드를 각각의 노드로 복사합니다.
☞ pi@c1:~ $ scp -r
clustertest.py 192.168.0.103:/home/pi
☞ pi@c1:~ $ scp -r
clustertest.py 192.168.0.104:/home/pi
☞ pi@c1:~ $ scp -r
clustertest.py 192.168.0.105:/home/pi
☞ pi@c1:~ $ scp -r
clustertest.py 192.168.0.106:/home/pi
파이썬 코드 복사를 완료하고 설정된 클러스터가 잘 작동하는지 코드를 실행합니다.
☞ pi@c1:~ $ mpiexec -f machinefile -n 5 python clustertest.py
다음과 같이 연산 값을 5번 출력하면 각각의 노드에서 동시에 연산을 한 것이므로 클러스터 설정이 완벽하게 작동하고 있음을 확인할 수 있습니다.
라즈베리파이 클러스터 설정이 좀 복잡해 보이지만 차근차근 따라 하시면 큰 무리 없이 설정을 완료할 수 있을 것입니다.
이제 다양하게 라즈베리파이 클러스터를 활용하면 됩니다.
2021년 04월 11일
라즈베리파이 클러스터 설정 2
이전 포스트에서는 라즈베리파이 클러스터 설정 중에서 MPICH 설치를 마쳤습니다.
라즈베리파이 클러스터 설정을 마무리하는 단계로 MPI를 통해 파이썬 코드가 작동되도록 설정하고 연동이 완료된 클러스터로 파이썬 병렬 프로그래밍이 작동하는지를 확인하는 과정을 설명해 볼까 합니다.
MPICH를 통해 파이썬 코드가 작동하도록 설정
파이썬을 설치합니다.
☞ pi@raspberrypi:~ $ sudo aptitude install python-dev
만약 aptitude 명령어가 실행이 안 될 경우에는 해당 패키지가 설치되어 있지 않아서 그런 것이기 때문에 먼저 패키지를 설치하고 상기 명령을 실행하면 됩니다.
☞ pi@raspberrypi:~ $ sudo apt install aptitude
파이썬 용 MPI 설치 파일을 다운로드합니다.
MPI 설치 파일 압축을 풀어줍니다.
☞ pi@raspberry:~ $ tar -zxf mpi4py-3.0.3.tar.gz
MPI 디렉터리로 들어갑니다.
☞ pi@raspberry:~ $ cd mpi4py-3.0.3
파이썬 모듈을 설치합니다.
☞ pi@raspberry:~/mpi4py-3.0.3 $ python setup.py build
☞ pi@raspberry:~/mpi4py-3.0.3 $ sudo python setup.py install
☞ pi@raspberry:~/mpi4py-3.0.3 $ export PYTHONPATH=/home/pi/mpi4py-3.0.3
파이썬 코드가 MPICH로 잘 작동하는지 데모 코드를 실행시켜서 확인합니다.
☞ pi@raspberry:~/mpi4py-3.0.3 $ mpiexec -n 5 python demo/helloworld.py
다음과 같이 실행되면 MPICH 환경에서 파이썬이 잘 작동하고 있다는 것입니다.
이제 하나의 라즈베리파이에 MPICH 환경 설정을 마쳤습니다.
나머지 라즈베리파이에 동일한 작업을 반복해야 하는데 시간이 오래 걸리고 지루한 작업이다 보니 MPICH 설정을 마친 것을 img 파일로 압축하여 다른 라즈베리파이에다가 풀어버리는 게 더 효율적일 것입니다.
img 파일로 압축에 사용되는 라이터로 win32DiskImager를 사용합니다.
win32DiskImager를 다운로드한 후 PC에 설치합니다.
MPICH 설정을 마친 라즈베리파이에서 마이크로 SD 카드를 꺼내서 리더기에 삽입한 후 win32DiskImager를 실행합니다.
Device 항목에서는 마이크로 SD 카드가 삽입된 드리이브를 선택하고, Image File 항목에서는 img 파일명을 작성하고 압출 파일을 저장할 폴더를 선택하여 Read 버튼이 활성화가 되면 클릭하여 압축을 진행합니다.
압축을 마치면 win32DiskImager의 Image File 항목에서 압축했던 파일을 불러들이고 리더기에 비어있는 마이크로 SD 카드를 삽입합니다.
이때 win32DiskImager의 Write 버튼이 활성화되면 클릭을 하여 마이크로 SD 카드에 압축을 풉니다.
노드의 개수만큼 이 작업을 반복해야 합니다.
이후로는 라즈베리파이가 아닌 노드로 명명하겠습니다
라즈베리파이 클러스터 하에서 모든 노드 연동시키기
서버 마스터 역할을 부여할 노드에 nmap
네트워킹 준비 작업을 진행합니다.
다음에도 언급될 예정이지만 저는 192.168.0.102 ip를 사용하고 있는 노드를 서버 마스터로 지정하였으며 이후의 작업은 모두 서버 마스터로 지정된 노드에서 진행된 것입니다.
☞ pi@raspberrypi:~ $ sudo apt-get update
☞ pi@raspberrypi:~ $ sudo apt-get install nmap
연결된 모든 라즈베리파이의 ip 주소를 확인합니다.
☞ pi@raspberrypi:~ $ sudo nmap -sn 192.168.0.*
ip 주소는 사용하고 있는 공유기가 제공하는 것을 기입하면 됩니다.
machinefile
를 작성하여 모든 ip 주소를 기록한 후 저장합니다.
☞ pi@raspberrypi:~ $ sudo nano machinefile
저는 192.168.0.102 ~ 192.168.0.106을 사용하고 있고 192.168.0.102를 사용하고 있는 라즈베리파이를 서버 마스터로 지정하였습니다.
이제 각 노드에 해당하는 라즈베리파이의 HOSTNAME을 변경해 줍니다.
저는 해당 ip 순으로 HOSTNAME을 변경해 주었는데요.
예를 들어 192.168.0.102는 c1, 192.168.0.103은 c2 이렇게 해서 c5까지 지정해 주었습니다.
HOSTNAME을 변경할 때는 SSH 통신을 통해 각 노드를 연결해야 합니다.
먼저 서버 마스터로 지정된 노드로 접속하여 HOSTNAME을 변경하고 SSH 설정을 활성화합니다.
이때 마이크로 SD 카드 용량을 확장하기도 하는데 라즈비안 최신 버전에서는 이미 확장이 되어 있어서 용량 확장은 하지 않으셔도 됩니다.
라즈베리파이 소프트웨어 설정 툴로 진입합니다.
☞ pi@raspberrypi:~ $ sudo raspi-config
첫 번째 항목인 System Options을 선택합니다.
Hostname 항목을 선택합니다.
HOSTNAME을 변경하고 Ok를 선택합니다.
Interface Options 항목을 선택합니다.
SSH 항목을 선택하고 Yes를 선택하여 SSH를 활성화합니다.
Finish를 선택하여 HOSTNAME 변경하고 SSH 활성화를 마치고 나서 재부팅합니다.
☞ pi@raspberrypi:~ $ sudo reboot
다시 서버 마스터 노드로 접속을 다시 접속하면 HOSTNAME이 raspberry에서 c1으로 변경되어 있음을 확인할 수 있습니다.
나머지 노드도 HOSTNAME과 SSH 활성화를 진행해야 하는데 이때 서버 마스터 노드인 c1에서 SSH 통신을 통해 다른 노드와 접속해야 합니다.
☞ pi@c1:~ $ ssh pi@192.168.0.103
이 상태에서 HOSTNAME을 변경하고 SSH를 활성화를 마친 다음 타 노드와의 연결을 끊습니다.
☞ pi@c2:~ $ exit
노드 간에 자동 원격 접속하기
모든 노드에서 이 작업을 마치고 나서 공개키와 비밀키를 사용해서 각각의 노드 간에 자동 원격 접속이 이루어지도록 설정을 해야 합니다.
서버 마스터 노드인 c1에서 공개키와 비밀키를 생성합니다.
☞ pi@c1:~ $ ssh-keygen
각 항목마다 아무것도 입력하지 말고 커서가 나올 때까지 엔터키만 누릅니다.
☞ pi@c1:~ $ cd ~
☞ pi@c1:~ $ cd .ssh
☞ pi@c1:~/.ssh $ cp id_rsa.pub c1
c2 노드에서 공개키와 비밀키를 생성하는데 이때도 서버 마스터 노드인 c1에서 타 노드를 접속해야 합니다.
☞ pi@c1:~/.ssh $ ssh pi@192.168.0.103
☞ pi@c2:~ $ ssh-keygen
c1 노드와 마찬가지로 각 항목마다 아무것도 입력하지 말고 c2 노드 접속 시 비밀번호를 입력하라는 항목이 나타나면 해당 비밀번호를 입력하면 됩니다.
다른 노드도 마찬가지로 설정을 해주면 됩니다.
☞ pi@c2:~ $ cd .ssh
☞ pi@c2:~/.ssh $ cp id_rsa.pub c2
☞ pi@c2:~./ssh $ scp 192.168.0.102:/home/pi/.ssh/c1 .
☞ pi@c2:~/.ssh $ cat c1 >> authorized_keys
☞ pi@c2:~/.ssh $ exit
서버 마스터 노드인 c1에서 c2 노드의 공개키를 수용합니다.
☞ pi@c1:~/.ssh $ scp 192.168.0.103:/home/pi/.ssh/c2 .
☞ pi@c1:~/.ssh $ cat c2 >> authorized_keys
c3 노드에서 동일하게 공개키와 비밀키를 생성합니다.
☞ pi@c1:~/.ssh $ ssh pi@192.168.0.104
☞ pi@c3:~ $ ssh-keygen
☞ pi@c3:~ $ cd .ssh
☞ pi@c3:~/.ssh $ cp id_rsa.pub c3
☞ pi@c3:~./ssh $ scp 192.168.0.102:/home/pi/.ssh/c1 .
☞ pi@c3:~/.ssh $ cat c1 >> authorized_keys
☞ pi@c3:~/.ssh $ exit
서버 마스터 노드인 c1에서 c3 노드의 공개키를 수용합니다.
☞ pi@c1:~/.ssh $ scp 192.168.0.104:/home/pi/.ssh/c3 .
☞ pi@c1:~/.ssh $ cat c3 >> authorized_keys
c4 노드
☞ pi@c1:~/.ssh $ ssh pi@192.168.0.105
☞ pi@c4:~ $ ssh-keygen
☞ pi@c4:~ $ cd .ssh
☞ pi@c4:~/.ssh $ cp id_rsa.pub c
4
☞ pi@c4:~./ssh $ scp 192.168.0.102:/home/pi/.ssh/c1 .
☞ pi@c4:~/.ssh $ cat c1 >> authorized_keys
☞ pi@c4:~/.ssh $ exit
서버 마스터 노드인 c1에서 c4 노드의 공개키를 수용합니다.
☞ pi@c1:~/.ssh $ scp 192.168.0.105:/home/pi/.ssh/c4 .
☞ pi@c1:~/.ssh $ cat c4 >> authorized_keys
c5 노드
☞ pi@c1:~/.ssh $ ssh pi@192.168.0.106
☞ pi@c5:~ $ ssh-keygen
☞ pi@c5:~ $ cd .ssh
☞ pi@c5:~/.ssh $ cp id_rsa.pub c
5
☞ pi@c5:~./ssh $ scp 192.168.0.102:/home/pi/.ssh/c1 .
☞ pi@c5:~/.ssh $ cat c1 >> authorized_keys
☞ pi@c5:~/.ssh $ exit
서버 마스터 노드인 c1에서 c5 노드의 공개키를 수용합니다.
☞ pi@c1:~/.ssh $ scp 192.168.0.106:/home/pi/.ssh/c5 .
☞ pi@c1:~/.ssh $ cat c5 >> authorized_keys
이제 각각의 노드 간에 클러스터 연동 상태를 확인합니다.
☞ pi@c1:~/.ssh $ cd ~
☞ pi@c1:~ $ mpiexec -f machinefile -n 5 hostname
상기와 같이 모든 노드의 HOSTNAME이 출력되면 연동이 완벽하게 이루어지고 있는 것입니다.
참고로 .ssh 디렉터리는 중요한 키가 보관되어 있으므로 외부에서 접속할 수 없도록 퍼미션을 설정해야 합니다.
라즈베리파이 클러스터 설정이 완료된 노드 간에 파이썬 코드 작동 확인하기
테스트에 사용할 간단한 파이썬 코드를 작성합니다.
☞ pi@c1:~/.ssh $ cd ~
☞ pi@c1:~ $ sudo nano clustertest.py
# ! python
# integer arith
a=4
print a
b=12+5
print b
c=b%a
print c
a, b, 나머지 값 c를 출력하라는 연산 코드를 각각의 노드로 복사합니다.
☞ pi@c1:~ $ scp -r
clustertest.py 192.168.0.103:/home/pi
☞ pi@c1:~ $ scp -r
clustertest.py 192.168.0.104:/home/pi
☞ pi@c1:~ $ scp -r
clustertest.py 192.168.0.105:/home/pi
☞ pi@c1:~ $ scp -r
clustertest.py 192.168.0.106:/home/pi
파이썬 코드 복사를 완료하고 설정된 클러스터가 잘 작동하는지 코드를 실행합니다.
☞ pi@c1:~ $ mpiexec -f machinefile -n 5 python clustertest.py
다음과 같이 연산 값을 5번 출력하면 각각의 노드에서 동시에 연산을 한 것이므로 클러스터 설정이 완벽하게 작동하고 있음을 확인할 수 있습니다.
라즈베리파이 클러스터 설정이 좀 복잡해 보이지만 차근차근 따라 하시면 큰 무리 없이 설정을 완료할 수 있을 것입니다.
이제 다양하게 라즈베리파이 클러스터를 활용하면 됩니다.
2021년 04월 11일