일반 InfiniBand vs AWS EFA
해당 포스팅은 현재 재직중인 회사에 관련이 없고, 개인 역량 개발을 위한 스터디 자료로 활용 할 예정입니다.
HPC(High Performance Computing)나 대규모 분산 ML 학습을 하다 보면 노드 간 통신이 병목이 되는 순간이 온다. 수백, 수천 개의 GPU가 매 스텝마다 gradient를 주고받아야 하는데, 일반적인 TCP/IP 스택으로는 latency와 CPU 오버헤드를 감당하기 어렵다. 그래서 등장한 것이 RDMA(Remote Direct Memory Access) 기반의 고성능 인터커넥트이고, 온프레미스 환경에서는 그 대표주자가 InfiniBand다.
그렇다면 클라우드, 특히 AWS에서는 어떻게 할까? AWS는 물리적인 InfiniBand 하드웨어를 노출하지 않는다. 대신 자체적으로 개발한 EFA(Elastic Fabric Adapter) 를 제공한다. 이번 글에서는 일반 InfiniBand와 AWS EFA가 무엇이 같고 무엇이 다른지 정리해보려고 한다.
RDMA가 필요한 이유
비교에 앞서, 두 기술이 공통으로 풀려고 하는 문제부터 짚고 넘어가자. 바로 "노드끼리 데이터를 주고받을 때 생기는 낭비" 다.
우리가 흔히 쓰는 TCP/IP 통신을 택배에 비유해보자. 옆 건물에 물건을 보내려는데, 직접 가져다주는 게 아니라 이런 단계를 거친다.
- 내 물건을 우체국 박스에 옮겨 담는다. (애플리케이션 → 커널 버퍼 복사)
- 우체국 직원이 송장을 붙이고 분류한다. (커널의 TCP/IP 스택 처리)
- 택배 차가 출발한다. (NIC가 전송)
받는 쪽도 똑같이 역순으로 푼다. 문제는 이 "옮겨 담고, 직원이 처리하는" 과정마다 시간(latency)과 일손(CPU)이 든다는 것이다. 평소엔 괜찮지만, 수천 개의 GPU가 매 순간 서로 데이터를 주고받아야 하는 ML 학습에서는 이 낭비가 그대로 병목이 된다.
RDMA(Remote Direct Memory Access) 는 이 중간 단계를 통째로 건너뛴다. 우체국을 거치지 않고 내가 옆집 책상에 직접 물건을 올려두고 오는 것과 같다. 운영체제(커널)의 개입 없이 애플리케이션이 원격 노드의 메모리에 곧바로 읽고 쓴다. 그래서 이를 OS bypass(커널 우회) 라고 부른다. 결과적으로 지연 시간은 마이크로초 단위로 짧아지고, CPU도 거의 쓰지 않는다.
InfiniBand와 EFA는 둘 다 이 RDMA를 제공한다는 점에서 목표가 같다. 차이는 "그걸 어떻게 구현했느냐"에 있을 뿐이다. 아래에서 하나씩 보자.
일반 InfiniBand
InfiniBand는 1999년 InfiniBand Trade Association(IBTA)에서 표준화한 고속 인터커넥트(연결 기술)다. 지금은 사실상 NVIDIA(Mellanox 인수)가 생태계를 이끌고 있다.
한마디로 InfiniBand는 "고성능 통신만을 위해 따로 깔아둔 전용 도로" 라고 보면 된다. 우리가 쓰는 일반 이더넷(고속도로)과는 물리적으로 분리된, 전용 차선이다. 주요 특징은 다음과 같다.
- 전용 하드웨어 스택: InfiniBand 전용 카드(HCA), 전용 스위치, 전용 케이블이 따로 필요하다. 이더넷과 섞이지 않는 별도의 네트워크다.
- IB verbs: 애플리케이션은
libibverbs라는 표준 API로 통신한다. InfiniBand 세계에서는 이게 사실상 공용어다. - Subnet Manager(SM): 도로에 신호와 교통정리가 필요하듯, InfiniBand 패브릭에도 관제탑 역할을 하는 SM이 반드시 하나 떠 있어야 한다. SM이 모든 노드에 주소(LID)를 나눠주고 경로를 정한다. SM이 없으면 패브릭 자체가 동작하지 않는다.
- 신뢰성 있는 연결(RC): 하드웨어 차원에서 "보낸 순서대로, 빠짐없이" 도착하는 것을 보장하는 전송 모드를 지원한다.
- 무손실(lossless) 네트워크: 차가 막히면 미리 신호를 보내 출발을 늦추는 방식(credit 기반 흐름 제어)으로, 패킷이 버려지는 일이 거의 없도록 설계되었다.
정리하면 InfiniBand는 성능은 최고지만, 전용 장비를 사서 깔고 관제탑(SM)까지 직접 운영해야 하는 기술이다. 규모가 커질수록 이 전용 도로를 설계하고 관리하는 난이도도 함께 올라간다.
AWS EFA
그렇다면 AWS는 어떻게 했을까? AWS는 InfiniBand 전용 도로를 새로 깔지 않았다. 대신 이미 있는 도로(자사 네트워크) 위에서 고속 통신이 가능하도록 똑똑한 우회로를 만든 것이 EFA(Elastic Fabric Adapter)다. 기존 ENA(일반 네트워크 어댑터)에 RDMA 기능을 더한 형태로, EC2 인스턴스에서 EFA만 켜면 OS bypass 통신을 쓸 수 있다.
핵심 특징은 다음과 같다.
- SRD(Scalable Reliable Datagram): EFA의 심장에 해당하는 전송 프로토콜이다. InfiniBand가 "정해진 한 길로 순서대로" 보낸다면, SRD는 택배를 여러 갈래 길로 나눠서 동시에 보내는(multipath) 방식을 쓴다. 그래서 일부 패킷이 순서가 뒤바뀐 채 도착할 수 있는데, 순서를 다시 맞추는 일은 받는 쪽 상위 계층이 처리한다. 이는 길이 수없이 많고 군데군데 막히기도 하는 대규모 클라우드 네트워크의 현실에 맞춘 선택이다. 한 길이 막혀도 다른 길로 우회하면 되니 더 유연하다.
- libfabric provider: EFA는 InfiniBand의 IB verbs가 아니라 libfabric이라는 라이브러리를 통해 동작한다. MPI나 NCCL 같은 상위 도구가 이 libfabric을 호출하는 구조다.
- 관제탑(SM)이 필요 없음: EFA는 AWS가 알아서 관리하는 네트워크 위에서 돌아가므로, 사용자가 Subnet Manager를 직접 운영할 필요가 없다. 인스턴스 띄우고 EFA 체크박스만 켜면 끝이다.
- 손실을 허용하는(lossy) 설계: InfiniBand가 "애초에 패킷을 안 버리게" 만든다면, SRD는 "버려질 수도 있다고 보고, 버려지면 아주 빠르게 다시 보내는" 쪽으로 접근한다. 손실을 막는 대신, 손실이 나도 마이크로초 단위로 복구하는 데 집중한다.
즉 EFA는 InfiniBand를 그대로 베낀 게 아니라, 같은 목표(저지연 OS bypass 통신)를 클라우드 환경에 맞는 다른 방식으로 다시 설계한 기술이다.
한눈에 보는 비교
| 항목 | 일반 InfiniBand | AWS EFA |
|---|---|---|
| 제공 형태 | 전 용 하드웨어(HCA/스위치/케이블) | EC2 인스턴스의 네트워크 인터페이스 |
| 전송 프로토콜 | RC 등 IB verbs 기반 | SRD(Scalable Reliable Datagram) |
| 프로그래밍 인터페이스 | libibverbs (IB verbs) | libfabric (efa provider) |
| 순서 보장 | 하드웨어 레벨에서 보장(RC) | 보장 안 함, 상위 계층이 재정렬 |
| 경로 | 단일 경로 중심 | multipath |
| 네트워크 가정 | lossless(무손실) | lossy(손실 허용 후 복구) |
| 관리 주체 | 사용자가 SM/패브릭 운영 | AWS 관리형, SM 불필요 |
| 호환 라이브러리 | MPI, NCCL | MPI(OpenMPI/Intel MPI), NCCL(aws-ofi-nccl) |
| 확장성 | 패브릭 설계에 의존 | 클라우드 스케일에 맞춰 설계 |
그래서 같은 코드가 돌아가나?
여기서 자연스럽게 드는 궁금증이 있다. "InfiniBand랑 EFA가 속은 이렇게 다른데, 그럼 내 코드를 양쪽에서 다 고쳐야 하나?" 결론부터 말하면 대부분 그대로 돌아간다.
비결은 중간에 통역사(추상화 계층)가 끼어 있기 때문이다. 우리가 직접 InfiniBand나 EFA에게 말을 거는 게 아니라, MPI(HPC용)나 NCCL(분산 학습용) 같은 라이브러리에게 "데이터 좀 모아서 나눠줘"라고 부탁하면, 그 라이브러리가 알아서 하부 통신 방식에 맞게 통역해준다.
- MPI: 똑같은 MPI 코드라도, InfiniBand 위에서는 IB verbs로, EFA 위에서는 libfabric으로 알아서 연결된다. 애플리케이션은 그냥 동일한 MPI 함수를 부를 뿐이다.
- NCCL: GPU 분산 학습의 핵심인 NCCL은
aws-ofi-nccl이라는 플러그인을 통해 EFA(libfabric)에 연결된다. InfiniBand 환경에서는 NCCL이 IB verbs를 직접 쓴다. 어느 쪽이든 PyTorch나 TensorFlow 입장에서는 그저all_reduce를 호출할 뿐, 밑에서 뭐가 도는지 신경 쓸 필요가 없다.
그래서 "애플리케이션이 잘 도느냐"는 양쪽에서 똑같이 검증할 수 있다. 다만 주의할 점은, 하드웨어/프로토콜 레벨의 동작(IB verbs 특유의 기능, SM 운영, 무손실 전송 같은 것)까지 EFA로 똑같이 재현할 수는 없다는 것이다. EFA는 InfiniBand를 흉내 낸 게 아니라 아예 다른 방식이기 때문이다.
AWS에서 테스트해보려면
EFA 기반 고성능 통신을 직접 검증하고 싶다면 다음 순서로 접근하면 된다.
EFA 지원 인스턴스 선택
먼저 알아둘 점은, EFA가 모든 사이즈에서 지원되는 것이 아니라는 것이다. EFA는 인스턴스가 호스트의 네트워크 대역폭을 충분히 확보해야 하므로, 많은 패밀리에서 가장 큰 사이즈(16xlarge / 32xlarge / 48xlarge 등) 위주로 지원된다.
- HPC용:
hpc6a,hpc7g,c5n.18xlarge등 - GPU 분산 학습용:
p4d,p5,g5,g6등
다만 예외가 있다. 2021년에 AWS가 C5n, G4, I3 등 일부 패밀리에 대해 작은 사이즈에도 EFA를 확장했다. 예를 들어 c5n.9xlarge(절반 사이즈)나 g4dn.8xlarge도 EFA를 지원한다. 단순히 "EFA가 동작하는지" 학습/검증하는 용도라면 이런 작은 사이즈가 진입 장벽이 낮아 유용하다.
특정 리전에서 EFA를 지원하는 인스턴스 목록은 다음 명령으로 직접 확인할 수 있다.
aws ec2 describe-instance-types \
--filters Name=network-info.efa-supported,Values=true \
--query "InstanceTypes[].InstanceType" \
--output text