728x90
반응형

 

 

배경: 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 명령어 결과를 확인해 봅시다.

멀티 노드 계산장비의 통신 IP 구성 예시

 

eth1으로 표시된 이더넷 아이피, ib0로 표시된 인피니밴드 아이피, lo로 표시된 루프백 아이피가 존재합니다.

여기서 계산을 위한 노드-노드 통신을 위해서는 MPI 라이브러리가 ib0 아이피를 통해 정보를 전달해 줘야 합니다.

그런데, 문제 상황에서는 예를들어 lo 아이피로 정보를 전달했었기 때문에 통신이 재대로 이루어 지지 않았던 것입니다.

 

 

이 문제와 관련된 MPI 통신 관련 핵심 개념을 확인하고 싶으시면 아래 글을 참고해 주세요!

2023.10.22 - [Linux] - [ Linux - MPI ] 쉽게 설명하는 MPI 통신 핵심 개념 (feat. MPI 통신 멈춤 문제 해결 방법)

 

 

 

조금이나마 도움이 되길 바랍니다!

 

 

728x90
반응형

+ Recent posts