반년전쯤에 새로우 연구팀에 합류하면서 이론 및 시뮬레이션 연구를 설정하면서 이번에는 LAMMPS를 사용하기 시작했습니다. 입자계 시뮬레이션으로는 오래전에 주로 직접 만든 코드를 사용하곤 했었는데, 이제는 오픈소스가 대부분의 경우 더 많은 기능들을 지원하면서 성능도 뛰어나니 안 쓸 이유가 없습니다.
오랫동안 시뮬레이션 쪽에 손을 놓고 있어서 연구방향을 잡으면서 여러가지 계산들을 재확인하고 있는 차, 현재 연구용으로 지급받은 M3 Pro 16인치 맥북프로 (이하 M3 Pro)의 벤치마크 데이터가 기존의 다른곳에서 나온 것에 비하면 월등이 뛰어나다는 것을 알게 되었습니다. 연구가 진행되면서 이제 시뮬레이션의 스케일을 올려야 할 시점이 오다보니 새로운 워크스테이션을 가격대비 성능을 기반으로 결정하고 싶어서 벤치마크를 진행해 보았습니다.
벤치마크에 사용된 요소들을 요약해보면 다음과 같습니다.
- M3 Pro 16인치 맥북프로: 6개의 퍼포먼스 코어 (+ 6개의 효율성 코어)에 GPU는 16개의 Compute Units (CU)를 가지고 있습니다. 메모리는 18기가 입니다. GPU계산은 OpenCL을 통해 single precision으로 진행되었습니다.
- Intel i9 기반의 PC. GPU는 Nvidia RTX 4000에 메모리는 128기가 입니다. 퍼포먼스는 엔트리형 워크스테이션 정도로 생각합니다. 다만 OS는 Windows 11이 설치되어 있다보니, 처음 벤치마크는 LAMMPS에서 제공되는 MPI버전으로 pre-compiled된 LAMMPS를 사용했습니다. (이후 Multipass를 이용해 Ubuntu Nobel Numbat LTS를 설치한 다음에 벤치마크를 진행해보았지만, CPU 계산 기준으로 성능차는 10%정도 밖에 나지 않아서 따로 분류하지는 않았습니다) GPU계산은 OpenCL을 이용해서 mixed precision으로 진행되었습니다. 이는 제공된 설치프로그램이 그렇게 설정된 것이라서 맥북에 설정된 single precision에 비해서는 훨씬 느릴 수 있다는 것을 감안해야 합니다.
- 동료에게 부탁해서 AMD 기반의 128 CPUs가 있는 모델에서 테스트를 했는데 실제 테스트 설정과 LAMMPS 버전, 그리고 자세한 스펙은 알지 못합니다. 계산용 GPU는 따로 없습니다.
Mac에서 LAMMPS의 기본 설치는 사실, 초보자라면 brew로 바로 설치할 수 있습니다. 다만 여러가지 설정들을 직접하기 위해서는 cmake로 직접 빌드하는것을 추천합니다. (당연하게도 메뉴얼들을 읽어보는 것을 추천합니다. ) 혹여 리눅스/맥의 터미널 시스템이 익숙치 않은 독자를 위해 언급하자면, 특별한 다른 설정이 필요없으시다면 brew로 바로 시작할 수 있습니다:
>> brew install LAMMPS
저의 경우에는 Git에서 받아온 다음에 빌드를 진행했습니다. 현재 제가 사용하는 LAMMPS 버전은 stable_2Aug2023_update3입니다.
>> git clone -b release https://github.com/lammps/lammps.git lammps
lammps 폴더로 클론을 생성하고 하위폴더로 build를 생성한 다음에 해당 폴더에서 설정합니다. GPU 지원은 맥북에서는 OpenCL을 통해 single precision만 지원하는 것으로 알고 있습니다. 그리고 제가 필요한 다른 패키지등을 함께 설치하기 위해 다음과 같이 빌드하고 설치를 진행합니다. 여기서 따로 설정을 덧붙이지 않는다면 -O3 최적화를 사용하게 되는데, 만약 -O2를 원하신다면 따로 옵션을 추가하시면 됩니다. 저의 경우에도 처음에는 마음에 걸려서 -O2로 진행하다가, stackoverflow나 제 계산 결과에서도 유의미한 결과 차이가 보이지 않아서 기본 설정값인 -O3으로 진행했습니다.
>> cmake -D FFT=FFTW3 -D BUILD_MPI=yes -D PKG_GPU=yes -D GPU_API=opencl -D GPU_PREC=single -D PKG_MC=yes -D PKG_COLLOID=yes -D PKG_BROWNIAN=yes -D PKG_EXTRA-PAIR=yes -D PKG_MOLECULE=yes -D PKG_RIGID=yes -D PKG_LATBOLTZ=yes -D PKG_ELECTRODE=yes -D PKG_KSPACE=yes -D DOWNLOAD_VORO=yes -D DOWNLOAD_KIM=yes ../cmake
>> cmake –build . -j 6
>> make install
제 맥북은 개발도구들이 이미 설치가 되어 있어서 빌드에 큰 문제가 없었던 것 같습니다만, 필요한 패키지가 있는 경우 brew로 대부분을 해결 할 수 있습니다. 패키지 의존성에 대한 자세한 내용은 공식 홈페이지를 참조하는 것을 추천드립니다.
기본적인 테스트는 lammps/bench 에 여러가지로 테스트 해 볼 수 있고, 각종 예시는 lammps/example에서 찾을 수 있습니다. 저는 Lennard-Jones potential을 이용해 벤치마크를 진행했고, 이 짧은 벤치마크에서는 쓰로틀링등을 고려한 부분까지는 불가능합니다. 이후 연구가 진행되면서 lj/cut 를 활용해서 오랜 계산의 벤치마크 역시 진행했습니다.
CPU만 사용한 경우와 CPU+GPU를 사용한 경우 둘 다 따져보았는데, 둘다 MPI를 활용하여 다음과 같은 형식으로 실행합니다.
>> mpirun -np 6 lmp -in in.lj -log cpu.log
>> mpirun -np 6 lmp -sf gpu -log gpu.log
벤치마크 수준으로는 이 정도로도 괜찮습니다만, 혹여 개별적인 LAMMPS를 테스트 할 때 GPU를 위해 input file을 수정하기가 싫으시다면 다음과 같은 기본 테스트를 활용 할 수 있습니다. 시뮬레이션의 조건과 GPU내에서 neighboring-list의 업데이트를 진행할지 등에 대해서 고려할 부분이 많이 있습니다. (저의 경우에는 -sf gpu로 그냥 계산해보고 큰 문제가 없으면 그대로 진행하는 편입니다만, 차후 워크스테이션이 도착하면 그 때부터는 옵션 최적화를 해 봐야 할 것 같습니다)
>> mpirun -np 6 lmp -sf gpu -pk gpu 1 newton off neigh no -in xxx.lammps -log xxx.lammps.log
-pk gpu를 통해서 설정이 가능하고 이후 숫자는 계산에 활용한 GPU의 숫자가 되는데, 저는 맥북과 PC 모두 GPU가 한개이므로 옵션을 명시적으로 활용할때는 1로 설정해두었습니다. 기타 옵션같은 경우에는 GPU에서 neighboring list를 계산할지 등등이 있고, 여기에 포함되지는 않았지만 split을 통해서 GPU로드를 조절할 수 있습니다.
- 짧은 벤치마크 예시 in.lj
기존의 벤치마크 데이터는 LAMMPS 공식 홈페이지에서 확인 할 수 있습니다 (https://www.lammps.org/bench.html#lj).
제가 사용하는 M3 Pro에서는 performance core가 6개가 있으므로 이를 기반으로 초당 계산하는 타임스텝의 갯수를 확인하면 다음과 같습니다 (높을수록 좋습니다)
6 CPUs: 659 ts/sec
3 CPUs + GPU: 1953 ts/sec
6 CPUs + GPU : 1745 ts/sec (벤치마크에 쓰인 시뮬레이션의 규모가 작아서 더 많은 자원을 할당하더라도 퍼포먼스가 하락한것으로 보입니다)
예전에 사용하던 2019년형 Intel Macbook Pro에서는 OpenMP로 4개 CPU로 계산해보니 67 ts/sec였던 것을 보니 성능차이가 압도적으로 커진것을 알 수 있습니다.
Windows i9 PC에서는 다음과 같습니다.
6 CPUs: 394 ts/sec
8 CPUs: 506 ts/sec
10 CPUs: 521 ts/sec
6 CPUs + GPU: 415 ts/sec
참고사항으로 또 다른 128개의 CPU를 가지고 있는 AMD에서는 6 CPU: 79 ts/sec라고 이야기를 들었습니다. 또한 기존의 2019년형 인텔 맥에서는 OpenMP를 이요해서 4개 CPU로 계산을 해 보니 67ts/sec 정도로 성능차이가 엄청 큼을 알 수 있습니다.
- 현재 연구에 사용되고 있는 lj/cut 2.5 기반의 32만개의 입자가 있는 시스템입니다.
M3 Pro에서는 다음과 같습니다
6 CPUs 147 ts/sec
3 CPUs + GPU 256 ts/sec
6 CPUs + GPU 414 ts/sec
퍼포먼스 코어를 최대로 활용해서 두개의 계산을 동시에 돌릴때:
2*(3 CPUs + GPU) -> 257 ts/sec *2 => 514 ts/sec
Windows i9 PC에서는 다음과 같습니다
12 CPUs 114 ts/sec
6 CPUs + 1 GPU 116 ts/sec
8 CPUs + 1GPU 133 ts/sec
총 12개의 코어를 활용해서 두개의 계산을 동시에 돌릴때:
2*(6 CPUs + GPU) -> 88 ts/sec * 2 => 176 ts/sec
결론적으로 스펙과 도입시 가격을 비교해도 상위에 있던 것으로 보이던 PC가 두개의 계산을 동시에 돌렸을때 기준으로 보면 M3 Pro 맥북프로에 비해 3배쯤 느리다는 결론을 알 수 있습니다. 또한, 저의 경우에는 항당 M3 Pro에서 Efficiency core를 사용할 수 있는 여지를 두려고 남겨두는 편입니다만, 이마저 활용했을때는 6개의 CPU만을 활용한 계산을 추가 할 수 있습니다. 신기할정도로 Apple Silicion이 열 특성이 많이 개선되어 있어서, 16인치 맥북프로 기반으로 1개의 6 CPUs + GPU계산이 돌아가고 있을때 팬의 소리가 어느정도 들릴 정도 수준으로 해결이 되는 것 같고, 2개의 3 CPUs + GPU계산이 돌아갈때도 약간 더 커진 팬의 속리 정도로 넘어가는 것 같습니다. 여기에 효율성 코어까지 염두에 둔 6 CPUs계산을 추가하면, 확실히 팬 소리는 커집니다만 istat menus기준으로 보았을때 퍼포먼스 코어의 클럭이 3.5-3.6 GHz로 유지되고, 효율성 코어역시 2.5 GHz정도로 유지되는 것을 보았을때 프로라는 이름에 걸맞는 열적 특성을 유지할 수 있었습니다.
결론: Apple Silicon에 들어서서 프로라는 이름에 걸맞는 물건이 나온 것 같습니다. 이제 노트북으로 왠만한 워크스테이션이 할 만한 작업량을 소화할 수 있습니다. 이전에 사용하던 인텔 맥북 프로에 비하면 제가 사용하는 시뮬레이션 기반으로는 성능차가 아예 비교할 수 없는 정도의 차이에 이르렀습니다. 또한 엔트리형 워크스테이션 (i9 12 cores intel CPU + RTX 4000 GPU + 128 GB RAM)이 비록 GPU의 설정이 mixed precision으로 되어 있어서 GPU계산이 single precision으로 설정된 맥북 프로와 공정한 경쟁을 하기는 힘들지만, 여러 작업을 동시에 돌리는 최대성능 형태로는 약 3배정도의 성능차이가 보입니다. 이는, 비슷한 성능이 나와도 괜찮다고 생각했던 저의 생각보다 훨씬 좋은 성능이었습니다. 덧붙여서, CPU만으로 계산한 경우에도 (이 경우 둘 다 double precision으로 기본설정되어 있습니다) 6개의 퍼포먼스 코어에서 나오는 성능이 12개의 i9 CPU에서 나오는 성능보다 높다는 것을 알 수 있습니다.
Apple Silicon의 벤치마크등에 대한 이야기들을 보다보면, 메모리 대역폭 (Memory Bandwidth)에 대한 부분들이 많이 나오더라고요. 이런 부분에서 속도 향상이 높아지지 않았나 추정하는 이야기들을 곳곳에서 본 적이 있습니다. 저는 이러한 부분에 대한 전문가가 아니라 특별한 논평을 하지는 않습니다만, 만약 그것이 정말이라면 M2 Ultra를 기반으로 한 Mac Studio는 M3 Pro에 비해 훨씬 높은 메모리 대역폭을 가지고 있는데, 실제 계산 성능이 어떻게 될것인지에 대해 궁금하기도 합니다.
다만 맥에서 OpenCL에 대한 애플의 지원이 공식적으로 중단되었다는 점과, 기존의 OpenCL 패키지를 사용해서 진행할때 single precision만 가능하다는 부분은 중요한 단점입니다. 필자의 경우에는, 정밀도가 필요한 문제등에서는 CPU만을 활용한다고 생각하고 진행하고 있기에 큰 문제가 없습니다. 만약 GPU의 성능을 모두 고려한 성능지표로 기존의 워크스테이션들과 단순 비교하기에는 여러가지 문제가 있을 수 있습니다.
Leave a Reply