NONMEM 성능향상을 위해 Linux + intel fortran + MPICH 조합을 이용해 보세요.
안녕하십니까? 김민걸입니다.
컴퓨터의 성능이 나날이 발전하고 있지만, core 당 클럭수는 그다지 발전되지 않고 있습니다.
즉, 현재는 multicore 또는 many core 방식으로 컴퓨터가 발전하고 있습니다.
그러다보니 일반적인 실행법으로는 NONMEM 실행 시간이 생각보다 많이 단축되지는 않고 있습니다.
왜냐하면 NONMEM을 그냥 실행하면 1 core 상에서 작동하기 때문입니다. (물론 새로운 CPU 기술이 있긴 하지만…)
제 경험상 NONMEM의 성능을 향상시키기 위해서는 아래와 같은 조합으로 하는 것이 보다 빠른 결과 도출이 가능해 이를 공유하고자 합니다.
- windows < linux
- gfortran < intel fortran
- MPICH를 이용하여 multicore 활용
MPICH의 경우, 제가 특정 데이터로 테스트해 본 결과 아래와 같았습니다. (별도의 최적화 세팅 없이 실행)
node 수 | 1 | 2 | 4 | 8 | 16 | 24 | 32 | 48 |
---|---|---|---|---|---|---|---|---|
Estimation time(sec) | 2336.51 | 1260.06 | 703.52 | 423.56 | 262.99 | 219.80 | 235.18 | 295.22 |
Covariate time(sec) | 64.08 | 37.06 | 21.36 | 12.30 | 7.86 | 6.80 | 7.95 | 8.63 |
Test environment: HP Z820, Intel xeon CPU E5-2697 v2 @ 2.70GHz (12 core) * 2, Memory 64 GB, 512 SSD (samsung 840)
24개 이상의 node를 설정했을 때 오히려 느려지고 있는데, 이는 테스트환경의 한계로 보여집니다. CPU 물리코어는 24개(12 core * 2CPU), 하이퍼쓰레딩시 48개여서, node를 48까지 올려본 것인데, 어디선가 들었던 정보에 의하면, 병렬처리시에는 하이퍼쓰레딩을 적용하지 않아야 한다고 하였습니다. 따라서 실제 물리코어 숫자인 24개 이상부터는 오히려 느려진 것으로 생각됩니다.
이를 극복하는 방법으로는 amazon EC2 서비스를 활용하거나, 여러대의 컴퓨터를 network로 연결하는 방안이 고려될 수 있겠습니다. 그 외에도 NONMEM을 Xeon Phi에서 실행해 볼 수 있지 않을까 생각해 봅니다.