400Gb/s면 얼마나 빠를까? Python으로 분산 AI 통신 시간 계산하기

분산 AI 통신의 이상적인 전송 시간은 ‘보낼 데이터량 ÷ 같은 경계의 대역폭’으로 계산합니다. 400Gb/s에서 64MiB를 한 번 보내는 직렬화 시간은 약 1.342ms이고, 아래 8-rank All-Reduce 모델의 하한은 약 2.349ms입니다. 두 값은 장비 실측이나 LLM 응답 시간 예측이 아닙니다. 데이터 단위, 참여자 수, 통신량과 병목 대역폭의 범위를 먼저 맞춰야 합니다.

30초 확인 · 계산이 8배쯤 다르면 b와 B부터 보세요

입력 크기가 MB인지 MiB인지, 속도가 Gb/s인지 GB/s인지 확인하세요. 다음 행동은 아래 계산기를 로컬에서 실행해 기준값을 만드는 것입니다. 네트워크 설정이나 권한을 바꿀 필요는 없습니다. 포트 속도를 전체 AI 작업의 처리량으로 읽지 마세요.

2026년 10월 26일 확인. Windows 11·Python 3.14.3에서 산술·단위·입력 검증 20개와 예제 프로그램 출력을 실제 실행했습니다. GPU·NCCL·네트워크 전송·LLM 벤치마크는 실행하지 않았습니다. 숫자와 효율 70%는 설명용 가정입니다.

목차 · 먼저 익힐 용어

  • payload: 전송 대상 데이터 본체. 헤더와 재전송 같은 부가 비용과 구분합니다.
  • 직렬화 시간: 정해진 데이터 비트를 링크로 내보내는 데 필요한 시간입니다.
  • rank: 집단 통신에 참여하는 프로세스의 식별 단위입니다.
  • All-Reduce: 참여자들의 대응 원소를 합산 등으로 결합해 모두에게 결과를 주는 집단 통신입니다.
  • 효율 η: 이 계산기에서 가정한 유효 대역폭과 명목 대역폭의 비율입니다.
  • 하한: 정해진 모델과 가정 아래 가능한 가장 짧은 시간입니다. 모든 장비에 적용되는 보편적 보장은 아닙니다.

1. 단위를 맞추면 400Gb/s는 50GB/s가 됩니다

소문자 b는 bit, 대문자 B는 byte입니다. 1byte는 8bit이므로 400Gb/s ÷ 8 = 50GB/s입니다. 여기서 G는 10⁹, Mi는 2²⁰입니다. NIST의 단위 정의처럼 MB와 MiB를 구분해야 합니다.

표기이 글의 뜻
1MB / 1MiB10⁶B / 2²⁰B
64MiB64 × 2²⁰B
400Gb/s50GB/s
(십진 단위)
ms1초의 1/1,000

자체 제작한 산술 도식입니다. 한 방향 payload를 한 번 보내는 이상적 계산이며, 장비 배선도나 패킷 측정 화면이 아닙니다.

2. 분자는 클러스터 총량인가, rank 하나의 입력인가

같은 64MiB라도 의미가 다르면 답이 달라집니다. 아래에서는 8개 호스트에 rank 하나씩, rank마다 입력 64MiB, rank당 바깥으로 나가는 가용 대역폭을 명목 400Gb/s로 보는 균일한 모델을 가정합니다. 다른 작업과 링크를 공유하지 않고, 여러 NIC를 묶지 않으며, 압축도 하지 않습니다.

8개 입력을 합친 512MiB를 rank 하나의 400Gb/s로 나누면 다른 질문을 계산하게 됩니다. 반대로 전체 클러스터의 NIC 속도를 모두 더한 분모를 rank 하나의 데이터에 바로 쓰면 시간을 과도하게 줄일 수 있습니다. 분자와 분모가 가리키는 범위를 같은 문장에 적으세요.

송신과 수신이 동시에 진행되는 full-duplex 모델에서 송신량을 계산한 뒤 수신량까지 무조건 더해 시간을 2배로 만들지도 않습니다. 어떤 경계에서 몇 번 센 바이트인지가 중요합니다. GPU 간 경로 자체가 다르다면 nvidia-smi로 GPU·PCIe 토폴로지를 읽는 순서부터 확인할 수 있습니다.

3. 8-rank All-Reduce의 하한을 계산해 봅니다

NVIDIA nccl-tests 설명의 All-Reduce 대역폭 모델은 rank 수 n에 대해 2 × (n − 1) / n의 통신량 보정 계수를 사용합니다. n=8이면 1.75입니다. 이 예에서는 rank당 입력 크기 S를 byte로, 대역폭 B를 byte/s로 맞춘 뒤 T = (S / B) × 1.75로 계산합니다.

따라서 모델상 rank당 송신 payload는 64MiB × 1.75 = 112MiB, 시간은 112MiB ÷ 50GB/s = 2.34881024ms입니다. 단순한 1회 전송의 1.342ms와 달라지는 이유는 입력 크기만으로 집단 통신량이 정해지지 않기 때문입니다.

이는 충분한 병렬성·균일한 rank 대역폭을 둔 이상적 모델입니다. 실제 구현의 알고리즘, 계층 구조, 공유 링크와 동기화 비용에 따라 달라집니다. NCCL의 All-Reduce 정의는 결과의 의미를 정합니다. 이 계수를 모든 통신 연산이나 실제 MoE 라우팅에 그대로 대입할 수는 없습니다.

4. 복사해서 실행하는 Python 계산기

아래 전체 코드를 communication_time.py로 저장하세요. 표준 라이브러리만 사용하므로 패키지 설치·관리자 권한·API 키가 필요 없습니다. Python 3.14.3에서 실행했고, 다른 버전은 이번에 시험하지 않았습니다. 함수 입력에는 숫자를 넣으세요. 문자열 파서나 임의 입력을 처리하는 웹 서비스용 코드는 아닙니다.

"""Offline arithmetic only: not an NCCL, NIC, GPU, or LLM benchmark."""
import math


def serialization_ms(size_mib, gbps, factor=1.0, efficiency=1.0):
    values = (size_mib, gbps, factor, efficiency)
    if any(not math.isfinite(x) for x in values):
        raise ValueError("All inputs must be finite")
    if size_mib < 0 or gbps <= 0 or factor <= 0:
        raise ValueError("Size >= 0; bandwidth and factor > 0")
    if not 0 < efficiency <= 1:
        raise ValueError("Efficiency must be in (0, 1]")
    payload_bytes = size_mib * (2 ** 20)
    bits_to_send = payload_bytes * factor * 8
    bits_per_second = gbps * (10 ** 9) * efficiency
    return bits_to_send / bits_per_second * 1000


def allreduce_factor(ranks):
    if isinstance(ranks, bool) or not isinstance(ranks, int) or ranks < 2:
        raise ValueError("Ranks must be an integer >= 2")
    return 2 * (ranks - 1) / ranks


if __name__ == "__main__":
    size_mib, gbps, ranks = 64, 400, 8
    factor = allreduce_factor(ranks)
    print(f"payload_bytes={size_mib * 2 ** 20}")
    print(f"point_to_point_ms={serialization_ms(size_mib, gbps):.6f}")
    print(f"allreduce_factor={factor:.2f}")
    print(f"allreduce_ideal_ms={serialization_ms(size_mib, gbps, factor):.6f}")
    print("allreduce_70pct_ms="
          f"{serialization_ms(size_mib, gbps, factor, 0.7):.6f}")

파일을 저장한 폴더에서 실행합니다.

python communication_time.py

실제 로컬 실행 출력입니다. 측정한 실행 지연이 아니라 프로그램이 계산한 값입니다.

payload_bytes=67108864
point_to_point_ms=1.342177
allreduce_factor=1.75
allreduce_ideal_ms=2.348810
allreduce_70pct_ms=3.355443

efficiency=0.7은 유효 대역폭이 400 × 0.7 = 280Gb/s라는 가정입니다. 이때 대역폭 항은 약 3.355ms입니다. 70%는 실측치도 권장 기본값도 아닙니다. 추가 지연을 포함한 예상 완료 시간의 상한도 아닙니다.

0 또는 음수 대역폭, 음수 크기, 0 이하·1 초과 효율, NaN·무한대는 거부합니다. rank는 2 이상의 정수만 허용합니다. math.isfinite로 유효한 수인지 확인하며, 잘못된 입력을 조용히 정상 결과처럼 출력하지 않도록 했습니다.

5. 실측이 계산과 다를 때 확인할 순서

  1. 8배 차이: Gb/s와 GB/s를 섞었는지 확인합니다. MB와 MiB 차이는 약 4.86%이므로 두 문제를 구분합니다.
  2. 작은 메시지에서 차이가 큼: 호출·동기화·처리 지연을 확인합니다. payload가 0이면 계산기의 직렬화 항은 0이지만, 실제 호출 비용까지 0이라는 뜻은 아닙니다.
  3. rank를 늘릴수록 급격히 느려짐: rank 배치, NIC 공유, 스위치 경로와 혼잡을 확인합니다. 이 모델은 대역폭 B가 고정된다고 가정합니다.
  4. 계산한 하한보다 실측이 짧음: 먼저 단위, 입력 크기 기준, 압축, 여러 NIC·경로의 병렬 사용, 통신 연산이 같은지 확인합니다. 비교 가정이 틀렸을 수 있으므로 곧바로 측정 오류라고 단정하지 않습니다.

nccl-tests의 algbw와 busbw도 구분하세요. 전자는 입력 크기/시간, 후자는 전자에 연산별 계수를 곱한 값입니다. 측정 보고서의 algbw로 시간을 역산하면 T = S / algbw입니다. busbw로 역산하면 T = (S / busbw) × 1.75이며, 여기서는 앞의 8-rank 조건을 적용합니다. 두 대역폭은 보고서에서 GB/s 단위이므로 S도 byte로 맞추면 초가 나옵니다. 명목 포트 속도·TCP 전송 속도·이 두 집단 통신 지표를 서로 같은 값으로 대입하지 마세요.

링크를 빠르게 바꾸면 위 계산의 대역폭 항은 줄어들 수 있습니다. 그러나 통신과 연산이 겹치거나 다른 병목이 지배하면 학습 step 시간이나 LLM의 TTFT·토큰 처리량이 같은 비율로 개선된다고 말할 수 없습니다. 네트워크 선택 관점은 Ethernet과 InfiniBand를 포트 속도 외의 조건으로 비교한 글에서 이어서 볼 수 있습니다.

6. 계산 결과를 이렇게 기록하세요

  • 단순 전송: 64MiB·400Gb/s → 약 1.342ms. 1회 송신 직렬화 항입니다.
  • 집단 통신 모델: rank마다 64MiB·8 rank·rank당 400Gb/s → 약 2.349ms. All-Reduce 보정 1.75를 적용한 하한입니다.
  • 가정 변경: 같은 조건에 효율 70% → 대역폭 항 약 3.355ms. 실제 완료 시간을 보장하지 않습니다.
  • 실측 보고: 별도 실험의 연산·크기·rank 수·배치·라이브러리 버전·평균/분위수·반복 조건을 함께 남깁니다. 이 글에는 그런 하드웨어 실측 결과가 없습니다.

Appendix · 검증 범위와 출처

실행 환경은 Windows 11 빌드 26200·CPython 3.14.3입니다. 이진/십진 단위 변환, 2·8 rank 계수, 400→800Gb/s 가정, 효율·잘못된 입력 거부, 표시한 전체 예제의 stdout 일치 등 20개 검증을 통과했습니다. GPU 접근, 프로세스 간 통신, NCCL 설치·실행, NIC 부하 시험, 유료 LLM 호출은 하지 않았습니다.

문서 확인일은 2026년 10월 26일입니다. NCCL 문서는 2.32.3, Python 공식 문서는 3.14 계열을 참고했습니다. nccl-tests의 master 문서는 변경될 수 있습니다. 코드·문장·계산 흐름은 자체 작성했고 외부 이미지를 복제하지 않았습니다.

  1. NIST: 이진 접두어와 bit·byte
  2. NVIDIA nccl-tests: Performance
  3. NCCL2.32.3: Collective Operations
  4. Python3.14: math.isfinite

댓글

이 블로그의 인기 게시물

소니 A6000 Wi-Fi 전송 (컴퓨터로 보내기)

C#, cmd 명령어 창 안보이게 실행하기

SVN 서버 설치 및 웹 접속 설정-Ubuntu 14.04