Copyright (C) 커널연구회 (www.kernel.bz)문서작업: 정재준(rgbi3307 골뱅이 nate.com)문서위치 메인(출처): http://www.kernel.bz/SmartPrince아래 내용은 누구나 사용할 수 있습니다.단, 저자정보는 지우지 말고 공유하시고 출처를 기입해 주시기 바랍니다. 커널연구회의 SmartPrince 병렬처리 모듈은 라즈베리파이3 컴퓨팅모듈 4개를 병렬로 장착할 수 있도록 설계한 보드이다. 라즈베리파이 재단에서 컴퓨팅모듈을 장착할 수 있는 보드를 제공하고는 있으나 1개만을 장착할 수 있기때문에 컴퓨팅모듈의 장점을 최대화하지 못하는 문제가 있고 가격또한 상대적으로 비싼편이다. 라즈베리파이3 컴퓨팅 모듈(CM3) 참조 사이트: https://www.raspberrypi.org/blog/compute-module-3-launch/ 이러한 단점을 해결하기 위해서 커널연구회에서 라즈베리파이3 컴퓨팅모듈 4개를 1개조로 장착할 수 있는 SmartPrince 병렬처리 보드를 개발했다. 이 보드를 사용하면 라즈베리파이3 컴퓨팅 모듈의 장점을 극대화하여 병렬처리 네트워크 클러스터를 저렴한 가격으로 구축할 수 있다. 특히 하드웨어 자원을 많이 필요로 하는 머신러닝/딥러닝에 적용할 수 있으며, 무엇보다 저렴한 가격에 머신러닝/딥러닝 환경을 책상위에 개인용으로 구축할 수 있다. 아래 사진은 SmartPrince 병렬처리 보드의 외형이다. 라즈베리파이3 컴퓨팅모듈을 세로방향으로 장착할 수 있는 슬롯을 4개 배치하여 공간을 절약했다. 단일 5V 전원공급으로 모듈 4개가 한꺼번에 동작한다. 모듈끼리 데이터 교환할 수 있도록 I2C와 SPI 인터페이스를 연결했고, 모듈마다 USB 포트를 통하여 외부로 데이터 통신할 수 있도록 했다. USB에는 각종 장치들을 연결할 수 있다. 특히 WiFi 무선통신 및 TCP/IP 유선 이더넷 통신선을 연결할 수 있도록 구성하여 네트워크 병렬처리 클러스터로 확장해 나갈 수 있다. SmartPrince 병렬처리 모듈 외형 구매하기: https://www.kernel.bz/product/sp_cm 리눅스 배포본(NOOBS)라즈베리파이 리눅스 설치본은 라즈베리파이 재단 웹사이트에서 배포 한다 https://www.raspberrypi.org/downloads/ 라즈베리파이 리눅스 배포본은 위의 다운로드 주소에서 항상 최신 버전을 배포한다. 아울러 리눅스 커널 버전도 최신 버전으로 업데이트된다. 필자가 이 기고글을 집필하는 시점 이후에는 좀더 높은 버전이 다운로드 될것이다. 항상 높은 버전을 설치하여 개발 작업을 진행하면 좋겠지만, 문제는 버전업 될때마다 여러가지 장치를 운용하는 리눅스 커널의 드바이스 드라이버가 달라지기 때문에 이전 버전에서 잘 동작하던 프로그램이 새로운 커널 버전에서 동작하지 않는 문제가 발생할 수 있다. 위와 같은 버전관리 문제 때문에 커널연구회의 SmartPrince 병렬처리 모듈은 리눅스 커널 4.1.19버전에서 잘 동작하도록 맞추어져 있다. 아울러 머신러닝/딥러닝 코드들과 여러가지 장치을 동작시키는 프로그램들도 이 버전에 맞추어져 있기 때문에, SmartPrince 병렬처리 모듈을 동작 시키기 위해서는 커널연구회에서 배포하는 SD카드를 다음과 같이 SD카드 슬롯에 장착하여 부팅해야 한다. SmartPrince 병렬처리 모듈에 SD카드 장착 네트워크 연결 및 설정네트워크는 TCP/IP 이더넷을 무선(WiFi)과 유선으로 모두 연결된다. 모듈마다 USB 포트가 있으므로 여기에 USB to 이더넷 케이블을 연결할 수 있도록 했고, 무선 WiFi 동글도 USB 허브에 연결된다. USB to 이더넷(TCP/IP) 연결 4개 슬롯의 USB to 이더넷 케이블들은 스위칭 허브와 연결하여 내부 네트워크 망을 구성한다. 또한, 5번째 이더넷 케이블은 외부와 연결될 수 있도록 했다.네트워크 IP는 첫번째 모듈이 10.10.0.1 아이피 번호로 설정되고 두번째 모듈은 10.10.0.2, 세번째 모듈은 10.10.0.3, 내번째 모듈은 10.10.0.4로 설정된다. 외부로 나가는 IP는 10.10.0.5로 설정되어 있다. USB WiFi 동글 또한 첫번째 모듈에 WiFi USB 동글을 장착하여 무선 AP Host로도 동작하므로 외부에서 무선으로 모든 모듈에 접근할 수 있다.첫번째 모듈은 유선 IP가 10.10.0.1로 설정되어 있지만 무선 WiFi Host 10.20.0.1로도 설정되어 있다.유선은 내부 스위칭 허브를 통하여 모두 연결되고 무선 또한 브릿지 설정을 통하여 유선과 하나의 네트워크로 접근된다.이러한 네트워크 설정은 커널연구회에서 배포한 SD카드에 다음과 같이 설정되어 있다. 네트워크 IP 설정(/etc/network/interfaces) # interfaces(5) file used by ifup(8) and ifdown(8)# Please note that this file is written to be used with dhcpcd# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'# Include files from /etc/network/interfaces.d:source-directory /etc/network/interfaces.dauto loiface lo inet loopbackauto eth0iface eth0 inet staticaddress 10.10.0.1netmask 255.255.255.0broadcast 10.10.0.255gateway 10.10.0.1dns-nameservers 168.126.63.1 8.8.8.8hwaddress ether 1A:2B:3C:4D:5E:01allow-hotplug wlan0#iface wlan0 inet manual# wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf#iface default inet dhcpiface wlan0 inet staticaddress 10.20.0.1netmask 255.255.255.0network 10.20.0.0broadcast 10.20.0.255iface default inet dhcpauto br0iface br0 inet manualbridge_ports eth0 wlan0allow-hotplug wlan1iface wlan1 inet manual wpa-conf /etc/wpa_supplicant/wpa_supplicant.confiface default inet dhcp 네트워크 라우팅 설정(/etc/rc.local) echo 1 > /proc/sys/net/ipv4/ip_forwardiptables -t nat -A POSTROUTING -s 10.20.0.0/24 -o eth0 -j MASQUERADEiptables -t nat -A POSTROUTING -o eth0 -j MASQUERADEiptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPTiptables -A FORWARD -i wlan0 -o eth0 -j ACCEPTroute add default gw 10.10.0.1 dev eth0route add -net 10.10.0.0 netmask 255.255.255.0 gw 10.20.0.1 dev wlan0route add -net 10.10.0.0 netmask 255.255.255.0 gw 10.10.0.1 dev eth0 위의 네트워크 설정은 커널연구회에서 제공하는 SD카드에 이미 설정되어 있으므로 SD카드를 슬롯에 장착하여 부팅만 하면 된다. 네트워크 브릿지 설정네트워크 브릿지는 유선(eth0) 장치와 무선 WiFi(wlan0) 장치가 서로 다른 IP 대역을 사용하고 있더라도 같은 내부 네트워크망으로 접근될 수 있도록 해주기 때문에, 같은 내부 IP로 유선과 무선을 동시에 사용할 수 있다. 이렇게 설정하는것 또한 커널연구회에서 제공하는 SD카드에 모두 설정되어 있으므로 SD카드를 슬롯에 장착하여 부팅만 하면 된다.네트워크 브릿지 설정이 궁금하신 독자분은 아래 내용을 참고해 주기 바란다. 네트워크 IP 설정 확인 root@CM3_1_1:~# ifconfigeth0 Link encap:Ethernet HWaddr 1a:2b:3c:4d:5e:11 inet addr:10.10.1.1 Bcast:10.10.1.255 Mask:255.255.255.0 inet6 addr: fe80::182b:3cff:fe4d:5e11/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:2870 errors:4 dropped:2 overruns:1 frame:7 TX packets:1944 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:734233 (717.0 KiB) TX bytes:180876 (176.6 KiB)wlan0 Link encap:Ethernet HWaddr 90:9f:33:ec:e2:43 inet addr:10.20.1.1 Bcast:10.255.255.255 Mask:255.0.0.0 inet6 addr: fe80::2497:cb22:1844:f808/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:5423 errors:0 dropped:11 overruns:0 frame:0 TX packets:6321 errors:0 dropped:20 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:786546 (768.1 KiB) TX bytes:5642651 (5.3 MiB) 무선 WiFi을 Host AP로 동작하도록 hostap 프로그램을 다음과 같이 확인한다. hostap 버전 확인pi@CM3_1_1:~ $ ll /usr/sbin/hostap*-rwxr-xr-x 1 root root 1681667 7월 26 18:45 /usr/sbin/hostapd-rwxr-xr-x 1 root root 1681667 6월 7 2016 /usr/sbin/hostapd.rpi2-rwxr-xr-x 1 root root 1011492 11월 11 2015 /usr/sbin/hostapd.rpi3-rwxr-xr-x 1 root root 46756 11월 11 2015 /usr/sbin/hostapd_cli hostap 는 다음과 같이 설정한다. hostap 설정 확인 root@CM3_1_1:~# cat /etc/hostapd/hostapd.confinterface=wlan0bridge=br0#driver=nl80211driver=rtl871xdrvssid=SmartPrincehw_mode=gchannel=11wpa=3wpa_passphrase=kernel.bzwpa_key_mgmt=WPA-PSKwpa_pairwise=CCMPrsn_pairwise=CCMP 네트워크 설정 확인 root@CM3_1_1:~# cat /etc/network/interfacesauto br0#iface br0 inet staticiface br0 inet manualbridge_ports eth0 wlan0 hostap 실행 스크립트 root@CM3_1_1:~# cat /root/run_hostapd.sh#!/bin/bashkillall hostapdsleep 1killall dhcpdsleep 1ifconfig wlan0 downifconfig wlan0 10.20.1.1 up echo 1 > /proc/sys/net/ipv4/ip_forwardiptables -t nat -A POSTROUTING -s 10.20.1.0/24 -o eth0 -j MASQUERADEiptables -t nat -A POSTROUTING -o eth0 -j MASQUERADEiptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPTiptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT sleep 1hostapd -B /etc/hostapd/hostapd.conf#hostapd -d /etc/hostapd/hostapd.confsleep 1killall "dhcpd"sleep 2dhcpd -cf /etc/dhcp/dhcpd.conf wlan0 start#killall NetworkManager 라우팅 정보 설정 /etc/rc.localroute add –net 10.10.1.0 netmask 255.255.255.0 gw 10.20.1.1 dev wlan0 NFS 설치하기NFS(Network File System)는 SUN사가 개발한 RPC(Remote Procedure Call) 기반 시스템으로, NFS 서버의 특정 경로를 파일시스템으로 마운트하여 네트워크에서 자신의 영역인것처럼 사용할 수 있도록 해준다. Server/Client 기반에서 서버의 파일을 클라이언트들이 공유하여 사용할 수 있는 장점이 있다. SmartPrince 병렬처리 모듈도 4개의 모듈들을 NFS로 묶어서 하나의 파일 시스템처럼 사용할 수 있다. 이러게 하면 모듈간 파일 데이터 교환(파일 추가, 수정, 삭제)이 편리해 진다. 이렇게 설정하는 것 또한 커널연구회에서 제공하는 SD카드에 모두 설정되어 있으므로 SD카드를 슬롯에 장착하여 부팅만 하면 된다. NFS 설정이 궁금하신 독자분은 아래 내용을 참고해 주기 바란다. NFS 패키지 설치 # apt-get install nfs-common nfs-kernel-server portmap //rpcbind nfs4-acl-tools 다음과 같이 패키지들이 설치 진행된다.Reading package lists... DoneBuilding dependency tree Reading state information... DoneNote, selecting 'rpcbind' instead of 'portmap'nfs-common is already the newest version.rpcbind is already the newest version.rpcbind set to manually installed.The following NEW packages will be installed: nfs-kernel-server0 upgraded, 1 newly installed, 0 to remove and 178 not upgraded.Need to get 101 kB of archives.After this operation, 373 kB of additional disk space will be used.Do you want to continue? [Y/n]Get:1 http://mirrordirector.raspbian.org/raspbian/ jessie/main nfs-kernel-server armhf 1:1.2.8-9 [101 kB]Fetched 101 kB in 1s (81.7 kB/s) Selecting previously unselected package nfs-kernel-server.(Reading database ... 141206 files and directories currently installed.)Preparing to unpack .../nfs-kernel-server_1%3a1.2.8-9_armhf.deb ...Unpacking nfs-kernel-server (1:1.2.8-9) ...Processing triggers for systemd (215-17+deb8u2) ...Processing triggers for man-db (2.7.0.2-5) ...Setting up nfs-kernel-server (1:1.2.8-9) ...Creating config file /etc/exports with new versionCreating config file /etc/default/nfs-kernel-server with new versionProcessing triggers for systemd (215-17+deb8u2) ... 설치가 완료되면 다음과 같이 서버인 라즈베리파이에서 클라이언트에 공유할 경로를 생성한다.그런다음 이 경로에 읽고, 쓰고, 실행하는 권한을 부여한다.# pwd/home/pi# mkdir nfs# chmod 777 nfs# ls –altotal 48drwxr-xr-x 2 pi pi 4096 Dec 7 09:00 Desktopdrwxr-xr-x 5 pi pi 4096 Sep 8 00:45 Documentsdrwxr-xr-x 2 pi pi 4096 Sep 8 01:13 Downloadsdrwxr-xr-x 2 pi pi 4096 Sep 8 01:13 Musicdrwxrwxrwx 2 pi pi 4096 Dec 6 22:51 nfsdrwxr-xr-x 2 pi pi 4096 Sep 8 01:13 Picturesdrwxr-xr-x 2 pi pi 4096 Dec 6 21:45 Projectsdrwxr-xr-x 2 pi pi 4096 Sep 8 01:13 Publicdrwxr-xr-x 2 pi pi 4096 Sep 8 00:45 python_gamesdrwxr-xr-x 2 pi pi 4096 Dec 7 09:05 Setupdrwxr-xr-x 2 pi pi 4096 Sep 8 01:13 Templatesdrwxr-xr-x 2 pi pi 4096 Sep 8 01:13 Videos 다음은 NFS 환경설정 파일인 /etc/exports 파일에 아래의 내용을 vi 편집기로 추가한다. /etc/exports /home/pi/nfs 10.10.0.*(rw,sync,no_root_squash)/home/pi/nfs 10.20.0.*(rw,sync,no_root_squash) NFS 서버를 다음과 같이 실행한다.# /etc/init.d/nfs-kernel-server restartRestarting nfs-kernel-server (via systemctl): nfs-kernel-server.service.# /etc/init.d/rpcbind restartRestarting rpcbind (via systemctl): rpcbind.service. rpcinfo을 실행하면 다음과 같이 NFS 서버가 사용하고 있는 포트 번호들이 출력된다.# rpcinfo -pprogram vers proto port service 100000 4 tcp 111 portmapper 100000 3 tcp 111 portmapper 100000 2 tcp 111 portmapper 100000 4 udp 111 portmapper 100000 3 udp 111 portmapper 100000 2 udp 111 portmapper 100003 2 tcp 2049 nfs 100003 3 tcp 2049 nfs 100003 4 tcp 2049 nfs //이하 생략.. 위와같이 NFS 서버를 설치한후에 클라이언트 머신에서 NFS 서버 경로를 다음과 같이 마운트하여 사용한다. NFS 마운트하는 스크립트 (mount_nfs.sh) #!/bin/bashmount -t nfs -o nolock 10.10.0.1:/home/pi/nfs /mnt/cm01sleep 1mount -t nfs -o nolock 10.10.0.2:/home/pi/nfs /mnt/cm02sleep 1mount -t nfs -o nolock 10.10.0.3:/home/pi/nfs /mnt/cm03sleep 1mount -t nfs -o nolock 10.10.0.4:/home/pi/nfs /mnt/cm04 위와 같이 마운트하면 SmartPrince 모듈의 /home/pi/nfs 경로가 /mnt/cm0# 모듈 번호별로 마운트되어 파일시스템 경로를 공유하여 사용할 수 있게 된다.마운트된 파일 경로를 해제하는 스크립트는 다음과 같다. NFS 마운트 해제하는 스크립트 (umount_nfs.sh) #!/bin/bashumount /mnt/cm01sleep 1umount /mnt/cm02sleep 1umount /mnt/cm03sleep 1umount /mnt/cm04 원격 데스크탑 연결 방법SmartPrince 병렬처리 모듈은 라즈베리파이3가 4개 동시 동작하고 있는 것과 같으므로 4개 마다 각각 HDMI 화면과 키보드, 마우스를 연결하여 동작을 로컬로 확인하는 것은 상당히 번거럽고 불편하다. 그러므로 위에서 언급한 네트워크를 구성하여 NFS나 SSH로 접속하여 동작을 실행하고 확인하면 된다. NFS나 SSH는 작업환경이 텍스트로 구성되어 있어서 GUI기반의 화면은 볼 수가 없다. 하지만, 라즈베리파이3의 HDMI 출력 화면을 원격지에서도 네트워크로 접속하여 사용할 수 있도록 원격 데스크탑 기능이 설정되어 있다. 원격지의 내PC 혹은 노트북에서 SmartPrince 병렬처리 모듈에 무선 네트워크 데스크탑으로 연결하는 과정은 다음과 같다. (윈도우 기준 설명) 윈도우 메뉴에서 네트워크 연결을 클릭하면 다음과 같은 창이 나타난다. Wi-Fi 아이콘을 마우스 오른쪽 클릭하여 나타난 팝업메뉴에서 “사용” 메뉴를 클릭한다. 다시 Wi-Fi 아이콘을 마우스 오른쪽 클릭하여 나타난 팝업메뉴에서 “연결” 메뉴를 클릭한다. 연결을 클릭하면 다음과 같이 주변에서 WiFi을 검색하여 접속할 수 있는 SSID을 표시해 준다. SmartPrince##(번호)가 접속할 수 있는 SSID이다. SmartPrince00을 선택한후 “자동으로 연결”을 체크하고 연결 버턴을 누른다. 다음과 같이 접속 암호를 물어보면 kernel.bz 을 입력한다. 위의 연결암호는 입력할 때 화면에 나타나지 않는다. 한번 연결이 되면 다음부터는 암호를 입력하지 않아도 자동으로 연결된다.잠시 기다리면 SmartPrince00에 연결되었다는 메시지가 나타날 것이다. 연결되면 네트워크 연결창에서 Wi-Fi 아이콘을 마우스 오른쪽 클릭하여 나타난 팝업 메뉴에서 다음과 같이 상태 정보를 확인한다. WiFi 상태 정보창에서 자세히 버턴을 클릭하면 다음과 같이 무선 네트워크 연결 세부 정보창이 나타난다. 위의 세부정보에서 DHCP서버 10.20.0.1, DNS 서버 10.20.0.1이 SmartPrince00의 아이피 정보이다.SmartPrince00의 네크워크 아이피가 10.20.0.1라는 것이다.이제 다음과 같이 실행하여 SmartPrince00에 원격 접속해 보자. . 윈도우 메뉴에서 실행을 클릭한후, 실행창에 mstsc을 입력하고 확인 버턴을 누른다. mstsc는 윈도우에서 실행되는 원격연결 프로그램이다. 이 프로그램을 실행하면 다음과 같이 원격 데스크탑 연결 창이 나타나면서 원격 연결이 진행된다. 위의 창에 원격 연결 대상인 스마트홈M의 아이피(10.20.0.1)를 입력한후 연결 버턴을 클릭한다. 위의 창은 원격 데스크톱 연결을 확인하는 창이다. 예(Y) 버턴을 클릭하여 원격 연결을 진행한다. Module(Sessio)은 설정된 그대로 사용한다.username란에는 pi을 입력한다.password란에는 kernel.bz을 입력한다. 위와 같이 입력한후 OK 버턴을 클릭하면 접속이 진행된다. 잠시 기다리면 다음과 같이 SmartPrince00에 접속하여 그곳의 바탕화면이 나타난다. 이제 SmartPrince00에 연결되었다. 아래 메뉴들은 SmartPrince00에 있는 것이므로 그곳에서 내PC처럼 사용할 수 있게 된다. 구매하기: https://www.kernel.bz/product/sp_cm 기타 궁금한 내용은 댓글 주시기 바랍니다.감사합니다.