(Note. 생각이 날 때 마다 추가하고는 있습니다. 부정확한 정보가 있다면 편히 알려주세요.)
서버 하드웨어
가장 이상적인 상황은 전문 업체에게 설계부터 시공까지 모든 것을 맡기는 방식입니다.
전원, 서버랙 관련
- 서버 랙: 서버와 서버에 필요한 모든 장비들을 수납하는 곳입니다. 서버실 사진을 보면 기다란 철제 캐비닛 같은 것들이 늘어서 있는데 이것이 서버 랙입니다. 보통은 연구실 마다 하나씩 할당이 됩니다. 서버랙의 깊이에 따라 종류가 나뉘게 됩니다. 학교 서버실마다 요구되는 사양이 다릅니다.
보통은 대학에서 충분한 양의 전력을 공급을 하고, 이에 맞는 시설을 준비해 줍니다. 그렇지만, GPU가 많이 활용이 되면서 이에 필요한 전력량이 기존의 예상보다 많아지게 되었습니다. 서버를 구매하시기 이전에 이러한 전력과 관련된 부분을 서버실을 담당하는 행정 선생님을 통해 충분히 논의를 하는 것이 좋겠습니다.
- PDU (Power Distribute Unit): 서버랙 단위로 전력을 분배하게 하는 장비입니다. 굵은 전선의 형태로 서버랙에 있는 멀티탭처럼 생긴 장비에 연결이 됩니다. 상당히 고전류가 흐르니 해당 케이블을 직접 다루지는 마세요.
- UPS (Uninterruptible Power Supply system): 갑자기 데이터센터 등에 전원 공급이 끊길 경우 임시적으로 전기를 공급하는 장비입니다. 이를 통해 서버가 안전하게 종료될 때 까지 시간을 벌 수 있습니다.
- 파워 서플라이: 각 서버에 달린 장치로, 각 서버의 부품에 전력을 공급하는 장비입니다. 상대적으로 개인이 사용하는 파워보다는 고전력(2200W etc.)을 제공할 수 있게 설계되어 있습니다. 하나의 서버는 여러 파워 서플라이를 가지는게 보통입니다. PDU에 여유가 있다면 각각의 파워 서플라이가 다른 PDU에 연결이 되어, 하나가 끊기더라도 완전히 종료되지는 않게 되는 것이 좋겠습니다.
- Unit: 서버 랙에 들어가는 서버 혹은 부속장비의 높이를 의미합니다. 보통의 서버는 2U정도이지만, Graphic card 등을 연결하는 서버의 경우 4U, 8U등도 존재합니다.
서버
- CPU: 연산을 처리하는 주된 장치입니다.
- GPU: 본래는 우리가 모니터에서 보이는 그래픽을 처리하기 위해 만들어진 장치입니다. 부동소숫점을 병렬로 처리하는데 이점이 있으며, 인공지능 모델을 실행하는데 필수로 자리잡은 장치입니다.
- RAM: 랜덤 엑세스 메모리로, 프로그램이 실행되기 위해 필요한 정보를 저장하는 공간입니다. 물리적으로 설치를 하는 순서가 있으며 (순서에 맞는 것이 보다 빠릅니다.) DDR4, DDR5와 같이 맞는 규격에 맞는 램을 구매하셔야 합니다.
- HDD / SSD: 둘 다 데이터를 저장하기 위한 장치입니다. SSD의 경우 상대적으로 빠른 장점이 있으나, 상대적으로 비싸고, 복구가 어려운 단점이 있습니다. HDD의 경우 물리적 자성을 통해 데이터를 저장하고, SSD에 비해서는 느린 단점이 있습니다. 그렇지만 저렴하고, 복구가 가능은 한 장점이 있습니다.
- RAID(Redundant Array of Independent Disks)
- SATA
- PCIe
GPU는 전력을 많이 소모하여 별도의 전력을 공급하는 케이블을 활용합니다. 흔히 PCIe 8pin 혹은 6+2pin으로 구성된 케이블을 활용하나, 최근에는 소모되는 전력량이 많아짐으로써, CPU에 들어가는 EPS-12V 케이블을 활용하기도 합니다. (A100 등)
서버의 설치
만약 서버를 구매하셨다면 구매한 업체에게 서버의 설치를 맡기는 편이 가장 안전하고, 편리한 방법입니다. 운영체제와 기타 등등 프로그램도요…!
운영체제의 기본적인 역할은 하드웨어와 프로그램 사이를 관리한다고 생각하면 편하겠습니다. 또한 이러한 프로그램의 실행을 Windows 에서는 더블 클릭 등으로 실행하였지만, 보통 서버는 쉘(shell)이라고 하는 프로그램을 통해 실행하게 됩니다. 쉘의 역할은 운영체제와 사용자(user) 사이에서의 명령을 전달하고 출력을 보여주는 역할을 합니다. 보통의 shell의 첫 시작은 $
로 시작하여서 $ <blah>
라면, 쉘에서 <blah>
를 입력하라는 의미가 됩니다. 간혹 #
으로 시작하는 경우는 컴퓨터의 (거의) 모든 권한을 가진 root 권한의 경우입니다.
직접 설치를 하여야만 한다면, 보통은 Rufus 와 같은 프로그램을 통해 OS를 설치할 USB를 만듭니다. 서버에 운영체제가 설치가 되어 있지 않는다면 USB를 꼽는다면 이를 우선적으로 부팅에 활용할 것입니다. 만약 서버를 초기화 해야한다는 상황 등으로 기존에 운영체제가 설치되어 있다면, F2
나 F12
키를 통해 부팅 순서를 결정해 주어야 합니다. 이 경우 부팅 순서를 USB를 우선해서 선택해 주세요. (보통은 USB 제조사로 USB의 이름이 나올 것입니다.)
그 이후의 설치는, 보통은 YES를 눌러 넘어가지만 몇 가지 사항은 직접 입력하여야 합니다.
1) 네트워크의 설정: 각 학교라면, 고정 IP를 정보기술팀 등에서 관리하고 있을 것입니다. 네트워크 접속 주소를 신청해서 받는 절차가 필요합니다. 신청하기 전에 설치위치와 MAC 주소(네트워크 장치의 고유한 번호, 주민번호와 비슷한 역할을 합니다.)를 안다면 신청에 편리합니다. 자동으로 잡는 경우도 존재는 합니다만, 추천드리지는 않습니다.
2) HDD / SSD 파티션의 설정: /
로 시작하는 대부분의 파일은 SSD에 위치하는 것을 추천드립니다. 이를 통해 필요한 라이브러리나 부팅에 필요한 설정들을 빠르게 로드하는 장점이 있습니다. 그렇지만 모든 내용을 SSD에 저장을 하게 된다면, 금방 SSD가 차게 될 것입니다. 저의 경우 보통은 홈 디렉토리 /home
의 경우 별도로 HDD에 설정을 하게 됩니다. 혹은 NAS가 있다면 여기에 mount를 하면 될 것입니다.
3) User ID 및 Server Name의 설정: 여기서 설정하는 user는 superuser로써 기능을 하게 될 것입니다. 설치 시 비밀번호와 user id를 까먹지 않게 주의하세요 (그렇다고 포스트잇에 적고 바로 밑에 붙이는건… 좀 아닌거 같아요.)
서버가 설치된 곳에서 직접 작업하기 보다는, SSH(Secure SHell)을 통해서 원격으로 접속을 시도하게 됩니다.
보통은 22번 port에서 연결을 시도하지만, 반대로 생각하면 해커가 건드리기 좋은 장소이기는 합니다. 보통은 22번을 먼저 두들겨 보더라고요… 그래서 보통은 22번 port에서 다른 port로 설정을 바꾸고 있습니다. (방화벽 단에서 막는 경우도 있습니다.) 바꾸기 위해서는 /etc/ssh/sshd_config
의 초반 #Port 22
의 주석 처리된 #
을 지우고 다른 번호로 바꾸어주세요. (10000번대 이상을 보통은 추천드립니다. 65535까지는 가능합니다.) 설정을 완료했다면 sudo systemctl restart sshd
를 통해 재시작을 하면 해당 port로 연결이 가능합니다.
기타 등등
- 스위치: 서버와 서버를 네트워크를 통해 있기 위한 장치입니다. 보통은 서버 랙별로 하나를 두어 서버 랙 사이의 통신을 담당합니다. 자세한 내용은Cloudflare 설명을 참고해 주세요.
- NAS(Network Attached Storage): 컴퓨터 네트워크에 연결하는 저장장치입니다. 구글 드라이브와 같은 클라우드 서비스를 자신의 망 안에서 구축을 했다고 이해하시면 편하실 것입니다. NAS와 같은 스토리지를 가진 서버가 필요한 이유는, 모든 서버가 충분한 양의 데이터를 저장하고 백업을 하기에는 비용이 많이 듭니다. 실험을 돌리는 서버를 바꾸는 일이 종종 있는데 이때마다 로그와 같은 파일이 다른 곳에 있으면 번거로울 것입니다. 또한, 모든 유저가 서로 다른 데이터셋을 그때 그때 원본에서 다운 받거나, 저장하고 있으면 스토리지가 금방 차게 될 것입니다. 저의 경우는, 스토리지 서버를 별도로 두고, 실험 시에만 데이터셋을 옮기고, 실험을 마치면 데이터셋을 지우는 방식으로 실험을 실행하고 있습니다.
- KVM (Keyboard, Video, Mouse): 서버 랙에는 여러 서버가 동시에 설치되어 있습니다. 키보드와 모니터를 필요 시마다 바꾸는 것은 번거로운 일이고, 선 정리에도 불편합니다. KVM Switch의 경우 키보드, 마우스, 모니터 한 세트를 여러 PC에 연결하는 형태입니다. 서버 랙에서 여러 PC를 하나의 기기로 관리할 수 있다는 이점이 있습니다.
얼추 제가 생각하는 이상적인 서버 lack의 구조는 다음과 같습니다.
- Network switch (내부 인트라넷, 혹은 외부 회선과 연결 + 서버 랙 안의 서버 사이의 연결)
- NAS 혹은 Storage server (NFS 등을 통해 switch와 고규격의 회선으로 연결)
- 관리 서버 (이전 master server와 같은 역할로, 다른 서버를 관리하는 역할입니다. 우리는 이 서버에 접근을 하여 연산 작업 queue를 보냅니다.)
- 연산 서버 1, 2, 3 etc. (연산 노드의 경우 관리서버, storage 서버와 잘 연결이 되었다면... 외부랑 연결할 필요까지는 없을 것입니다. 하나씩 외부랑 연결해도 좋지만 많아지면 번거로워 집니다.)
자질구레한 팁들
- 데이터를 옮기는 비용은 큽니다. 시간도 공간도요. 먼 거리를 고규격의 이더넷으로 연결하기에는 비용이 증가합니다. 가능한 서버 랙 안에서는 고규격을, 외부와 연결은 최소화 해서 쓸 수 있도록 합시다.
- 서버 랙에는 여러 전선 들이 존재합니다. 나중에 가면 스파게티와 같이 꼬여 전원을 연결하기 어렵습니다. 최소한, 케이블의 양 끝에 어디서 어디로 연결이 되는지 태그를 달아두면 나중에 편합니다.
- 서버 랙 전선의 정리는 양 옆 기둥에 묶어서 관리 할 수 있습니다.
- 적어도 한 서버랙에는 특별한 일이 없는 이상 최소 2개의 PDU가 연결이 됩니다. power supply를 양 쪽에 나누어 달아, 한 쪽이 문제가 생기더라도 이중화 하면 나중에 도움이 됩니다. 보통은 하나가 고장나더라도, 다른 하나로 최소한 안전한 종료까지는 버틸 수 있을 겁니다. (둘 다 나가면 어쩔 수 없죠.)
- SSD 만으로 서버를 구성할 경우, SSD가 죽으면 해당 서버를 사용하기 어렵다는 단점이 있습니다. SSD의 수명은 읽고 쓰는 시간만큼 소모됩니다. 그러므로, 많은 양의 데이터를 처리할 경우에는 HDD를 통하여 처리할 수 있도록 구성하는 것이 좋겠습니다. 제가 생각하는 이상적인 경우는
/
루트 디렉토리 전체는 SSD에 담아두어 라이브러리 등은 빠르게 가져오되, 그 중 user가 많이 사용하는/home
디렉토리의 경우 HDD에 마운트를 하여 SSD에 로그나 데이터셋을 읽고 쓰는 일이 줄어들면 좋습니다.