Echo: 텐서 병렬 통신을 4비트로 줄이고 오차는 다음 연산에 갚는 방법
텐서 병렬 all-reduce를 4비트로 보내면서 합산은 고정밀로 하고 양자화 오차를 다음 호출에 되돌려주는 Echo의 설계와 A100 측정, 추론과 학습 결과를 따라갑니다.
원문 논문 보기
이번에 다룰 논문은 Echo: Error-Compensated 4-Bit Tensor-Parallel Communication for LLM Training and Inference이며, arXiv 2610.14277로 공개된 연구입니다. 이 연구가 내세우는 주장은 텐서 병렬 통신을 4비트로 보내면서도 양자화 오차를 다음 연산에 되돌려주면 학습과 추론 정확도를 거의 그대로 유지할 수 있다는 것입니다. 원문 링크는 제목 아래에 걸어두었습니다.
텐서 병렬이라는 말을 들으면 많은 분이 연산량을 나누는 기술로 먼저 이해하는데, 실제로 병목은 연산보다 그 사이를 잇는 통신에서 생깁니다. 매 층마다 all-reduce가 두 개의 의존적인 행렬 곱셈 사이에 끼어 있어서 다른 작업과 겹쳐 숨길 수가 없기 때문인데요. 연산 장치가 세대가 바뀔 때마다 빨라지는 속도를 상호연결 대역폭이 따라가지 못하면서 이 틈은 점점 더 벌어지고 있습니다.
계산은 빨라졌는데 왜 첫 토큰은 여전히 기다려야 할까
안녕하세요, 패트릭입니다. 제가 요즘 추론 서버를 볼 때 가장 답답하게 느끼는 지점은 GPU 사용률이 낮은데도 응답이 늦어지는 장면입니다. 연산은 분명히 빨라졌는데, 첫 토큰이 나오기까지의 시간은 생각보다 줄지 않거든요. 그렇다면 시간은 도대체 어디에서 새는 걸까요?
이 논문이 짚는 지점은 바로 그 틈입니다. 텐서 병렬에서는 한 층의 연산이 끝나면 여러 GPU가 각자 가진 부분 결과를 모아 합쳐야 다음 행렬 곱셈을 시작할 수 있는데, 이 합치는 과정이 all-reduce입니다. 앞 연산이 끝나야 시작할 수 있고, 이 통신이 끝나야 다음 연산을 시작할 수 있으니 겹쳐서 숨길 여지가 없습니다. 그래서 GPU가 빨라질수록 통신이 차지하는 비중은 오히려 커지죠.
여기서 재미있는 질문이 생깁니다. 통신량을 줄이면 이 기다림도 같은 비율로 줄까요? 16비트 값을 4비트로 보내면 통신량은 4분의 1 가까이 줄어드니, 얼핏 보면 답은 그렇다처럼 보입니다. 그런데 값을 줄이는 순간 정확도가 흔들리기 시작하고, 특히 층이 수십 개 쌓인 모델에서는 작은 오차도 금방 커지니까요. 저는 이 대목을 읽으면서, 압축 자체보다 오차를 어떻게 다스리느냐가 진짜 문제라는 생각이 들었습니다.

4비트로 보내면 통신이 4배 가까이 줄어든다는 계산
숫자부터 차분히 보죠. 16비트 값을 4비트로 바꾸면 비트 수가 4분의 1이 되니, 통신량은 이론상 4배 가까이 줄어듭니다. 모델이 커지고 시퀀스가 길어질수록 한 번의 all-reduce에서 오가는 메시지 크기가 커지는데, 이 비율은 메시지 크기와 무관하게 유지되니까요. 대역폭이 고정된 환경에서는 이 차이가 그대로 대기 시간 차이로 돌아옵니다.
그런데 이 계산에는 전제가 하나 숨어 있습니다. 4비트로 줄인 값을 받는 쪽에서 다시 제대로 복원하고 합산할 수 있어야 한다는 것이죠. 무작정 반올림해서 보내면 오차가 생기고, 그 오차가 매 층마다 더해지면 나중에는 원래 신호가 무엇이었는지 알기 어려워집니다. 특히 학습에서는 이런 작은 편향이 그래디언트를 통해 다음 스텝으로 이어지니 걱정이 더 커지죠.
그래서 연구자들이 예전에 시도한 방향은 대개 둘 중 하나였습니다. 정밀도를 조금만 낮추고 안전하게 가거나, 과감하게 낮추고 정확도 하락을 감수하는 것이죠. 반면 이 논문은 세 번째 길을 고릅니다. 과감하게 4비트로 보내되, 그 과정에서 생긴 오차를 그냥 버리지 않고 기록해 두었다가 다음 기회에 갚는 것입니다. 가계부로 치면 외상을 장부에 적어두는 셈인데요. 당장 현금이 부족해도 장부가 정확하면 나중에는 잔액이 맞는다는 발상입니다.
더하는 자리를 옮겼더니 양자화가 두 번으로 끝난 이유
제가 이 논문에서 가장 흥미롭게 본 부분은 합산하는 자리를 옮겼다는 점입니다. 보통 분산 환경에서 값을 합칠 때는 각 GPU가 양자화된 값을 주고받으며 여러 번 더하는데, 이 과정에서 양자화와 역양자화가 반복되면서 오차가 불어납니다. GPU 수가 늘어날수록 이 반복 횟수도 늘어나니 구조적으로 불리하죠.
Echo는 이 순서를 바꿨습니다. 데이터 이동은 4비트로 하되, 실제 덧셈은 고정밀(high precision)로 수행합니다. 각 값은 한 번의 all-reduce 호출 안에서 최대 두 번까지만 양자화되며, GPU가 몇 개이든 이 상한은 그대로 유지됩니다. GPU가 두 개든 여덟 개든 오차가 생기는 지점이 늘어나지 않는다는 뜻인데요. 이 성질은 생각보다 큽니다. 규모를 키울 때마다 오차 분석을 다시 해야 하는 구조와, 규모와 무관하게 오차 지점이 묶여 있는 구조는 운영의 난이도가 전혀 다르니까요.
여기서 또 하나 짚을 점은 특수한 하드웨어를 요구하지 않는다는 대목입니다. FP8이나 FP4 연산을 위한 장치가 없어도 동작한다고 논문은 밝히고 있습니다. 저는 이 문장을 보고 고개를 끄덕였습니다. 저희가 새로운 AI 아키텍처를 볼 때도 벤치마크 숫자만 보지는 않습니다. 실제로 무엇이 바뀌었고, 그 변화가 시스템에서 어떤 비용 구조를 만드는지를 함께 보는데요. 새로운 숫자 가속기를 사야만 쓸 수 있는 기술과, 이미 깔려 있는 A100 같은 장비에서 바로 돌릴 수 있는 기술은 도입의 문턱이 전혀 다릅니다.

오차를 덮지 않고 다음 연산에 갚는다는 발상
그렇다면 장부에 적는다는 것은 구체적으로 어떤 동작일까요? Echo는 양자화 오차를 합산 과정에서 그대로 드러나게 만든 뒤, 그 오차를 이후 호출에 다시 넣어줍니다. 이번에 반올림으로 잃은 만큼을 다음번에 보태는 식이라 오래된 오차는 상쇄되면서 사라지고, 새로 생긴 오차만 남는 구조입니다.
사람 일에 비유하면 거스름돈을 매번 정확히 주기 어려운 가게를 떠올리시면 됩니다. 100원 단위까지만 거슬러줄 수 있는데 30원을 더 줘야 한다면, 매번 그냥 넘기면 손님이 손해를 보죠. 대신 모자란 30원을 장부에 적어두고 다음에 올 때 30원을 더 얹어주면 장기적으로는 잔액이 맞습니다. Echo가 하는 일도 이와 비슷한데, 다만 돈이 아니라 텐서 값의 오차를 다음 all-reduce 호출에 실어 보내는 것이죠.
문제는 그다음입니다. 이렇게 갚는다고 해도 매번 새로운 오차가 생기는데, 정말로 잔액이 발산하지 않을까요? 직관만으로는 확신이 서지 않습니다. 매 층마다 오차가 조금씩 남고, 그 남은 오차가 다음 층의 입력에 영향을 주면 연쇄적으로 커질 수도 있으니까요. 그래서 논문은 직관에 증명을 덧붙입니다. 누적된 오차가 모델 깊이와 무관하게 유한한 범위 안에 머문다는 것을 보인 것인데요. 층이 깊어질수록 오차가 무한히 쌓일 수 있다는 걱정을 구조적으로 덜어낸 셈입니다.

층이 깊어져도 오차가 한없이 쌓이지 않는다는 증명
증명이라는 말을 들으면 수식이 먼저 떠오르지만, 여기서는 그 수식이 말하는 방향만 정확히 이해하면 됩니다. 각 호출에서 주입되는 오차는 그 호출 안에서 노출되고, 다음 호출에서 반대 방향으로 보상되니 오래된 오차가 그대로 남지 않는다는 것입니다. 마치 매번 그날의 정산을 그다음 날 바로잡는 것처럼요. 그래서 깊이가 늘어나도 오차의 총합이 깊이에 비례해 커지지 않습니다.
저는 이 숫자보다 그 뒤의 구조가 더 중요하다고 봅니다. 오차가 유한하다는 보장이 없으면 4비트 통신은 실험실에서는 빨라도 실제 깊은 모델에는 올리기 어렵습니다. 층이 10개일 때 괜찮았던 방법이 80개에서는 무너질 수 있으니까요. 반면 오차 상한이 깊이와 무관하다는 성질이 있으면 엔지니어는 마음이 놓입니다. 모델을 키우거나 층을 추가해도 통신 계층을 다시 뜯어고치지 않아도 되기 때문입니다.
여기서는 조금 조심해서 읽을 필요가 있습니다. 증명이 오차의 폭발을 막아준다고 해서 오차가 0이 된다는 뜻은 아닙니다. 여전히 매 호출마다 작은 오차는 생기고, 그 오차가 일시적으로 출력에 영향을 줄 수 있습니다. 다만 그 영향이 시간이 지나면서 상쇄되고, 깊이가 깊어진다고 해서 끝없이 불어나지는 않는다는 것이죠. 정확도를 완벽히 보존한다는 주장과 오차가 통제된다는 주장은 서로 다른데, 이 논문은 후자를 증명하고 전자는 실험으로 보여주는 구성입니다. 이런 구분을 흐리지 않고 읽어야 실험 숫자를 제대로 받아들일 수 있습니다.

A100에서 1GB 메시지가 2배 넘게 빨라졌다는 숫자
이제 측정으로 넘어가 보죠. 논문은 A100 GPU에서 1GB 메시지를 기준으로 16비트 NCCL all-reduce보다 2.09배 빨랐다고 보고합니다. 이론상 4배에 못 미치는 이유는 양자화와 역양자화, 고정밀 합산 같은 추가 연산이 들어가기 때문입니다. 통신 시간을 줄이는 대신 계산을 조금 더 얹은 셈인데요. 그럼에도 2배가 넘는 가속이 남았다는 것은 통신이 그만큼 지배적이었다는 뜻이기도 합니다.
이 숫자는 그대로 믿기 전에 조건을 봐야 합니다. 1GB라는 메시지는 상당히 큰 편이라 통신 시간이 전체에서 차지하는 비중이 큽니다. 메시지가 작아지면 통신보다 커널 실행이나 동기화 같은 고정 비용이 더 크게 느껴져서 가속 비율은 달라질 수 있습니다. 그래서 저는 이 2.09배를 모든 메시지 크기에서 약속되는 숫자가 아니라, 통신이 병목인 구간에서 기대할 수 있는 상한에 가깝다고 읽었습니다.
실제 시스템 관점에서 보면 다음 질문이 바로 생깁니다. 좋은데, 이걸 학습과 추론 전체 시간에 얹으면 얼마나 남을까요? all-reduce 하나가 빨라지는 것과 모델 전체의 응답 시간이 빨라지는 것은 서로 다른 이야기니까요. 논문이 다음에 보여주는 숫자들이 바로 그 연결고리입니다.
첫 토큰과 학습 스텝이 혼잡할수록 더 빨라지는 장면
추론에서는 첫 토큰이 나올 때까지 걸리는 시간, 학습에서는 한 스텝을 도는 시간이 체감 지표입니다. 논문에 따르면 상호연결이 한가한 상태에서는 첫 토큰 시간이 최대 1.16배, 학습 스텝이 최대 1.09배 빨라졌습니다. 얼핏 보면 2.09배보다 작아 보여서 실망스러울 수도 있는데요. 전체 시간에서 통신이 차지하는 몫만큼만 빨라지는 것이니 오히려 자연스러운 결과입니다. 연산이 여전히 큰 비중을 차지하는 구간에서는 통신을 아무리 줄여도 전체가 확 줄지는 않기 때문입니다.
반면 이야기는 배경 트래픽이 늘어날 때 달라집니다. 다른 작업이 같은 상호연결을 함께 쓰면서 대역폭이 혼잡해지면, 통신의 비중이 커지고 4비트 전송의 이득도 커집니다. 논문은 이런 상황에서 첫 토큰 시간이 최대 1.44배, 학습 스텝이 최대 1.38배까지 빨라졌다고 전합니다. 한가할 때보다 혼잡할 때 가속이 더 크다는 점이 이 기술의 성격을 잘 보여주는데요. 여유 있는 실험실이 아니라 여러 작업이 동시에 도는 실제 클러스터에서 진가를 발휘하는 방식입니다.
구체적인 장면을 떠올려 보시면 감이 옵니다. 밤사이 여러 학습 작업이 같은 랙을 나눠 쓰면서 네트워크가 붐비는 시간대가 있습니다. 그때 추론 서버까지 같은 패브릭에 물려 있다면 첫 토큰 지연이 평소보다 길어지죠. 통신량을 4분의 1로 줄인 all-reduce는 바로 이런 시간대에 숨통을 틔워줍니다. 저는 그래서 이 1.44배와 1.38배를 단순한 최대값이 아니라, 혼잡한 운영 환경에서 예산을 어디에 써야 하는지를 알려주는 힌트로 읽었습니다.

일곱 개 벤치마크에서 0.4점 안에 머물렀다는 말
속도가 빨라져도 답이 나빠지면 소용이 없습니다. 논문은 Qwen3-8B를 기준으로 일곱 개 벤치마크의 평균 정확도가 16비트 추론과 비교해 0.4점 안에 머물렀다고 보고합니다. 평균이라는 말에 주목할 필요가 있는데요. 일곱 개를 평균 냈다는 것은 특정 작업에서 조금 오르고 특정 작업에서 조금 내려도 전체적으로는 비슷한 수준이었다는 뜻입니다.
여기서 흔히 생기는 오해를 하나 짚고 싶습니다. 0.4점이라는 숫자를 오차 없이 완벽하다는 의미로 읽는 것입니다. 평균이 가깝다는 것은 분포까지 같다는 뜻이 아닙니다. 어떤 벤치마크에서는 4비트 쪽이 조금 낮았을 수도 있고, 그 차이가 평균 속에서는 가려졌을 수도 있죠. 그럼에도 평균 0.4점이라는 결과는 실용적인 관점에서 꽤 단단합니다. 일곱 개를 묶어서 볼 때 16비트와 거의 같은 자리라는 것은, 오차 보상 없이 4비트를 그냥 썼을 때 흔히 나타나는 무너짐은 적어도 피했다는 신호니까요.
개인적으로 인상 깊었던 점은, 이 정확도가 특수 하드웨어 없이 나왔다는 사실입니다. 낮은 정밀도 전용 연산 장치가 없어도 된다는 것은 기존 클러스터에 그대로 얹을 수 있다는 뜻입니다. 새로운 카드를 사기 전에는 기술을 못 쓴다는 조건이 붙으면 도입 논의 자체가 멈추는데, Echo는 그 장벽을 만들지 않았습니다.
10B 토큰 학습 뒤 손실 차이가 0.9% 안에 들어간 과정
학습 쪽 결과도 같은 방향을 가리킵니다. 10B 토큰 규모의 사전학습을 마친 뒤 최종 손실이 16비트 학습과 비교해 0.9% 안에 들어갔다고 논문은 전합니다. 학습은 추론보다 오차에 민감한데, 작은 편향이 매 스텝의 그래디언트를 통해 다음 스텝으로 이어지기 때문입니다. 그래서 추론에서 0.4점을 유지하는 것보다 학습에서 0.9%를 유지하는 쪽이 저에게는 더 눈에 들어왔습니다.
생각해보면 학습 과정에서 오차 보상이 빠졌다면 어떤 일이 생겼을까요? 매 all-reduce마다 한쪽으로 치우친 오차가 남고, 그 치우침이 가중치 업데이트에 스며들면서 손실 곡선이 조금씩 위로 뜨는 그림이 그려집니다. Echo는 매번의 치우침을 다음 호출에서 반대쪽으로 당겨주니 손실 곡선이 16비트 궤적 근처에 머무릅니다. 10B 토큰이라는 길이는 짧지 않은데, 그 구간 동안 벌어진 차이가 0.9% 안에 머물렀다는 것은 보상이 한두 번 반짝하고 마는 장치가 아니라는 뜻입니다.
다만 여기서도 과장하지 않고 읽어야 합니다. 0.9%라는 손실 차이가 모든 학습 설정에서 그대로 재현된다는 보장은 없습니다. 옵티마이저나 학습률 스케줄, 배치 크기, 데이터 혼합이 바뀌면 오차에 대한 민감도도 바뀌니까요. 논문이 보여준 것은 특정 규모의 사전학습에서 16비트 궤적을 크게 벗어나지 않았다는 것이고, 그 자체로도 4비트 통신에 대한 신뢰를 한 단계 올려주는 결과입니다.

통신이 병목인 시대에 남는 질문은 무엇일까요
지금까지의 흐름을 처음부터 다시 이어보겠습니다. 연산은 빨라졌고 통신은 그 속도를 따라가지 못하면서, 두 행렬 곱셈 사이에 낀 all-reduce가 그대로 드러났습니다. 4비트로 보내면 통신량은 4분의 1 가까이 줄지만 오차가 문제였고, Echo는 합산 자리를 고정밀로 옮겨 양자화 횟수를 최대 두 번으로 묶은 뒤 생긴 오차를 다음 호출에 갚았습니다. 그 결과 오차는 깊이와 무관하게 유한하게 머물렀고, A100에서 통신 자체는 2배 넘게 빨라졌으며, 전체 추론과 학습 시간도 혼잡할수록 더 크게 줄었고, 정확도와 손실은 16비트 근처에 머물렀습니다.
그렇다면 남는 질문은 어디에 있을까요? 저는 앞으로 보고 싶은 것이 두 가지 있습니다. 하나는 메시지 크기가 작아지거나 GPU 수가 더 늘어날 때 이득과 오버헤드의 균형이 어떻게 움직이는지입니다. 1GB 같은 큰 메시지에서는 통신 이득이 압도적이지만, 작은 메시지에서는 양자화와 동기화 비용이 상대적으로 커질 수 있으니까요. 다른 하나는 데이터 분포가 바뀌는 구간에서의 거동입니다. 이상치(outlier)가 많은 활성화가 나타나면 4비트 양자화 오차가 평소보다 커질 수 있는데, 그때도 보상이 같은 속도로 따라잡는지를 보고 싶습니다.
이 논문이 시사하는 것보다 더 넓게 보면, 평가의 관점 자체가 바뀌어야 한다는 생각도 듭니다. 지금까지는 모델의 능력을 파라미터 수나 벤치마크 점수로만 이야기했지만, 앞으로는 같은 점수를 내는 데 통신을 얼마나 썼는지도 함께 봐야 합니다. 같은 8B 모델이라도 통신을 4분의 1로 쓰는 모델과 그렇지 않은 모델은 클러스터에서의 실제 비용이 전혀 다르니까요. 좋은 모델이 무엇이냐는 질문이 점점 좋은 시스템이 무엇이냐는 질문과 겹쳐지고 있습니다.
그래서 저는 이 연구를 압축 기술 하나로만 보지 않았습니다. 통신이 병목인 시대에 모델을 어떻게 나눠서 돌릴 것인가에 대한 답을, 오차를 숨기지 않고 갚는 방식으로 풀어낸 시도이기 때문입니다. 다음에 여러분이 추론 지연이나 학습 처리량을 이야기할 때, 연산 시간 그래프 옆에 통신 시간 그래프를 함께 펼쳐보시길 권합니다. 그 두 그래프의 틈에서 다음 아이디어가 나올 가능성이 큽니다.