배경: MPI 통신 IP 튜닝
단일 노드에서 병렬 계산이 잘 되다가, 2개 이상 노드를 잡고 계산을 할 때에 계산이 진행이 되지 않는다면... 아마도 노드-노드 간 MPI 통신 문제일 가능성이 높습니다.
병렬 연산을 수행하는 프로그램/코드를 다양한 리눅스 OS에서 사용하려고 할 때에 발생할 수 있는 이슈입니다.
보통 리눅스에서 openmpi 라이브러리로 복수노드로 병렬해석을 하게되면 "알아서" 잘 통신을 하는 경우가 많지만,
특히 최신 버전의 리눅스 OS의 경우 MPI 통신에 사용할 IP를 지정해줘야만 하는 경우가 있습니다.
문제상황 진단
- 병렬 프로그램/코드, 환경변수 등 모두 문제 없는 상태에서...
- MPI를 사용해서 단일노드, 단일코어 해석 --> 문제 없음
- MPI를 사용해서 단일노드, 복수코어 해석 --> 문제 없음
- MPI를 사용해서 복수노드, 복수코어 해석 --> 문제 발생
- 에러 메시지를 띄우는게 아니라, 그냥 계산 진행이 안 됨 (멈춤 상태로 지속)
- 위 상황이라면 노드 - 노드 간 통신 문제일 가능성이 높습니다. 해결방법을 참고해 주세요.
해결방법
일단 문제 해결이 중요하니 해결방법부터 살펴봅시다.
openmpi 기준 해결방법은 아래와 같은 옵션을 통해 불필요한 IP를 사용하지 않도록 제한해주면 됩니다.
--mca btl_tcp_if_exclude {mpi 통신에 불필요한 아이피}
보통의 경우 문제가 발생하는 경우는 루프백 아이피(lo)와 가상 아이피 (virbro, 특히 최신 버전 리눅스 OS에서 나타나는 것으로 보임)를 제한해 줍니다.
--mca btl_tcp_if_exclude virbro, lo
예를 들면 아래와 같이 mpirun 커맨드를 이용해서 병렬 계산을 수행하는 경우 다음과 같이 플래그가 들어가게 됩니다.
아래에 lo, virbro 등 불필요한 아이피는 시스템마다 다르니 $ ifconfig 를 통해 불필요한 아이피가 뭐가 있는지 확인하고 아래에 넣어줍니다.
mpirun --mca btl_tcp_if_exclude lo,virbro,enp5s0
커맨드 및 옵션에 대한 자세한 사항은 openmpi 매뉴얼에서 확인할 수 있습니다.
문제의 원인은?
HPC와 같은 계산 장비의 노드는 보통 여러 개의 IP를 가지고 있습니다.
노드-노드 통신을 위한 브로드캐스트 아이피, 인피니밴드 아이피와 더불어 루프백 아이피, 가상 아이피를 가지고 있습니다.
만일 MPI 라이브러리가 노드-노드 통신을 위한 인피니밴드 아이피를 사용하지 않고, 루프백 아이피를 사용하려고 한다면 노드 간 통신이 이루어 지지 않게 됩니다.
잘못된 경로로 정보를 보냈으니, 각 노드들이 서로 정보를 받지 못한 상태로 계속 기다리기만 해서 계산이 진행되지 않습니다.
아무런 에러 메시지도 띄우지 않기 때문에, 트러블 슈팅 시 난이도가 좀 있을 수 있습니다.
어떤 시스템의 ifconfig 명령어 결과를 확인해 봅시다.
eth1으로 표시된 이더넷 아이피, ib0로 표시된 인피니밴드 아이피, lo로 표시된 루프백 아이피가 존재합니다.
여기서 계산을 위한 노드-노드 통신을 위해서는 MPI 라이브러리가 ib0 아이피를 통해 정보를 전달해 줘야 합니다.
그런데, 문제 상황에서는 예를들어 lo 아이피로 정보를 전달했었기 때문에 통신이 재대로 이루어 지지 않았던 것입니다.
이 문제와 관련된 MPI 통신 관련 핵심 개념을 확인하고 싶으시면 아래 글을 참고해 주세요!
2023.10.22 - [Linux] - [ Linux - MPI ] 쉽게 설명하는 MPI 통신 핵심 개념 (feat. MPI 통신 멈춤 문제 해결 방법)
조금이나마 도움이 되길 바랍니다!
'Linux' 카테고리의 다른 글
[ Linux - MPI ] 쉽게 설명하는 MPI 통신 핵심 개념 (feat. MPI 통신 멈춤 문제 해결 방법) (0) | 2023.10.22 |
---|---|
[Linux - Error] ssh exchange identification: read: Connection reset by peer - SSH 접속이 안될 때 (0) | 2022.03.15 |
[Linux - How to] 리눅스 커맨드 명령어, 프로그램의 디폴트 버전 (기본 경로)를 변경하고 싶을 때 (0) | 2022.03.14 |
[Linux - How to] 리눅스 시스템 종료 / 재부팅 명령어 (0) | 2022.03.13 |
[Linux - Tip] 리눅스 압축 명령어 tar 속도 향상 (0) | 2022.03.01 |