…

전체 붙여넣기.
–>

The One Body Problem

Why scaling stalls at the optimizer — and what changes when integration is done by rules instead of gradients

CAIDE Systems, Inc. — HIPLE

“Just buy more GPUs.”

That is the first answer most people reach for when a monolithic model gets too big to train, and it is not a foolish one. For a long stretch of the last decade it was simply correct.

But anyone who has actually watched a large training run knows that the bottleneck is often not the forward pass, and not the backward pass. It is the line that comes after both of them.

optimizer.step()

What that one line costs

Adam keeps two extra state tensors for every parameter — a first moment and a second moment. In a standard mixed-precision setup, a single parameter carries roughly sixteen bytes:

per parameter (mixed precision)
  fp16 weight              2 bytes
  fp16 gradient            2 bytes
  fp32 master weight       4 bytes
  fp32 first moment  (m)   4 bytes
  fp32 second moment (v)   4 bytes
  ─────────────────────────────────
                          16 bytes

A one-billion-parameter model therefore needs roughly sixteen gigabytes simply to hold the state of its own training. And every single step, all of it is read, updated, and written back, element by element.

Three properties of that operation matter more than its raw cost.

1. It is bound by memory bandwidth, not arithmetic

The Adam update is a handful of multiplies and adds per parameter, wrapped around several reads and a write. The arithmetic is trivial; the data movement is not. An operation shaped like this is limited by how fast bytes travel between memory and the compute units — not by how many floating-point operations per second the chip can theoretically sustain.

This matters because those two numbers have not grown at the same rate. Over the past two decades peak compute throughput has risen far faster than memory bandwidth, and each new generation of accelerator widens the gap. A step whose real cost is moving data does not get proportionally shorter when you buy a faster chip — and buying more chips does not help at all if each one is already waiting on its own memory.

2. It is globally synchronous

Now scale out. Data parallelism across many devices means that before any device can take its step, gradients must be reduced across all of them — every parameter, every step.

step t:  forward → backward → ALL-REDUCE (every parameter) → update → step t+1
                                    ▲
                          every device waits here

The traffic each device moves in that collective is proportional to the size of the model, and the collective itself takes longer as more devices join it. Doubling the number of GPUs does not halve the time per step. Past some point, adding devices adds more synchronization than it removes work.

3. It cannot be parallelized along the step axis

This is the property people forget, and it is the hardest one. Update t+1 depends on the result of update t. That dependency is not an implementation detail to be engineered away — it is what gradient descent is.

training time  =  number of steps  ×  time per step

Compute buys you a shorter second term, and only partly, for the reasons above. It buys you nothing at all on the first. You cannot run step 900,000 before step 899,999, no matter how large the cluster is.

The usual answers, and what they leave in place

None of this is news, and the field has good engineering answers. It is worth being precise about what each one actually changes.

Sharding the optimizer state (ZeRO and its relatives) splits those sixteen bytes per parameter across devices so that no single device holds all of it. This is a real and large win for memory. It does not remove the synchronization; it usually adds communication, trading bandwidth for capacity.

Sparse activation (Mixture-of-Experts) means only a fraction of the parameters participate in any given forward pass — a real win for inference cost and for compute per token during training. But training still backpropagates a single loss through the router and the selected experts, and those experts are still parameters of one model moving toward one objective.

Pipeline and tensor parallelism cut the model across devices so each holds a slice. They split where the computation happens. They do not split what the computation is optimizing.

Each of these is a way to carry one body with more hands. None of them makes it stop being one body.

Why does all of it have to move together?

Here is the question underneath the engineering. Why must the whole thing be updated at once, every step?

Because the whole thing is tied to a single differentiable objective. One loss runs through every parameter, and a gradient is by definition the derivative of that one number with respect to everything. So everything is coupled to everything else, and everything must move together, in lockstep, for the entire run.

That coupling is what produces all three properties above. The linear cost in N, the global synchronization, the strict sequencing — none of them are properties of Adam. Adam is a perfectly reasonable way to carry the load. They are properties of the load.

The real bottleneck is not the optimizer. It is the one body the optimizer is made to carry.

Seen that way, the ceiling stops looking like a hardware problem. More hardware removes none of the three properties, because none of them came from the hardware. It is a structural problem, and it wants a structural answer.

HIPLE does not slice gradient descent more cleverly

HIPLE stands for Hierarchical Independent Parallel Learning Engine. Given everything above, it would be easy to assume its answer is a better way to distribute training. It is not — and that is worth saying plainly, because it is the assumption people reach for first.

The individual engines train perfectly normally.

Each engine is a small, independently trained model, on its own domain and its own data, with ordinary backpropagation and ordinary Adam. There is no reason to change that and no attempt to. Gradient descent is an excellent tool at the scale where its costs are tolerable, and the entire point is to keep it at that scale.

Two things follow, and they are the whole argument.

First, N per engine is small. The three properties from the first half of this essay never grow to a size that matters. Sixteen bytes per parameter is not a problem when the parameter count is modest; a bandwidth-bound elementwise update is not a problem when the tensors fit comfortably; a sequential dependency across steps is not a problem when the steps are short.

Second, the engines share no loss function. There is no single number they are jointly minimizing. And where there is no shared objective, there are no gradients to exchange. The all-reduce in the diagram above does not get optimized — it does not exist.

monolithic                        HIPLE
──────────                        ─────
one loss                          no shared loss
one gradient over everything      each engine its own
global all-reduce every step      nothing to reduce
retrain the whole to change part  revise the part

Then what holds them together?

If the engines do not share an objective, something else has to combine their judgments. The obvious move — the one the field reaches for — is to learn the combination: train a router, a gating network, a meta-learner on top. But that puts a single differentiable objective back over everything, and with it every property we just removed.

So HIPLE does not do that. Integration is not done by learning. It is done by a rules engine — Rules and Law.

No gradient flows through that layer. There is no backpropagation in it, no optimizer state, no global synchronization step. Instead, explicit and auditable rules take each engine’s judgment, integrate them, and decide which judgments to accept as knowledge.

        Case
          │
   ┌──────┼──────┐        each trained independently,
   ▼      ▼      ▼        no shared loss, no shared gradient
Engine  Engine  Engine
   A       B       C
   │       │       │
   └──────┼──────┘
          ▼
   Rules and Law          gradient-free integration
   (no backprop,          verified against external evidence
    no optimizer state)
          │
   ┌──────┴──────┐
   ▼             ▼
Decision      Abstain

That changes what maintenance means.

Conflicting evidence revises a rule, not the model. When new external evidence contradicts something the system holds, the rule is re-evaluated and revised. The engines are not retrained to absorb the correction.

A new domain is a new engine plus rules. Adding coverage does not mean retraining the whole system, because there is no whole system to retrain — only engines that do not depend on one another, and a rule set that grows.

Disagreement produces no answer. When the engines’ judgments conflict, or the evidence runs out, the rules do not resolve the conflict by averaging it away. They return nothing. The system holds.

That last one is not a fallback; it is the reason the separation is worth its cost. A learned integration layer is trained to produce an output, and it will produce one — confidently — for an input it has no business judging. A rule that requires agreement can decline.

An honest boundary

This approach buys a great deal, and it is not free.

It requires a domain with knowable structure. Medicine has one; physiology and anatomy have been accumulating structure for centuries. Industrial equipment, law, finance, and much of science have enough. Problems whose structure is genuinely unknown still need broad relational search, and HIPLE does not pretend otherwise.

It also moves work rather than deleting it. Integration quality becomes a rules problem instead of a learning problem. Rules have to be written, verified, and grown — real labor that gradient descent would otherwise have done implicitly. The claim is not that this is less work. It is that this work is auditable and the other kind is not.

And the boundaries between engines are a search prior, not a wall. The world is not perfectly separable: chest pain can originate in the abdomen, referred pain crosses anatomical regions, and cancer ignores the partition entirely. So the divisions have to be soft and overlapping, with explicit cross-cutting links living in the symbolic layer, able to activate another engine when evidence points across a boundary. Where no clean route exists, the system broadens its search, escalates, or abstains.

That commitment has to be measured, not asserted. Two numbers gate whether a partition can be trusted: cross-boundary recall — does the system still find what sits between its own divisions — and critical-miss rate. A structure that scores well on average while dropping the cases that cross its seams has not earned the efficiency it claims.

Learning stays local; integration is done by rules

The first half of this essay is an argument about arithmetic: the optimizer’s update is bandwidth-bound, globally synchronous, and strictly sequential, and no amount of hardware changes any of the three.

The second half is an argument about why. All three follow from a single differentiable objective binding every parameter into one body — which means the ceiling was never really about compute at all.

Scale the parts that scale well. Keep each learner small enough that gradient descent stays cheap. And where the parts must be joined, join them with something you can read, verify, and revise — something that is permitted to say it does not know.

What we need is not a machine that spins one large model faster. It is a structure that never tied all of it to one gradient to begin with.

— Kyewook Lee
HIPLE — Hierarchical Independent Parallel Learning Engine
Patent pending — U.S. Provisional Application No. 64/122,459


한 몸 문제

확장은 왜 옵티마이저에서 멈추는가 — 그리고 경사가 아니라 규칙으로 통합한다는 것

CAIDE Systems, Inc. — HIPLE

“GPU를 더 사면 되지 않나.”

모놀리식 모델이 학습하기에 너무 커졌을 때 가장 먼저 나오는 답이고, 어리석은 답도 아니다. 지난 10년의 상당 기간 동안 그것은 그냥 옳은 답이었다.

하지만 큰 학습을 실제로 지켜본 사람은 안다. 병목은 순전파도 아니고 역전파도 아닌, 그 둘 다음에 오는 한 줄에 있는 경우가 많다.

optimizer.step()

그 한 줄의 비용

Adam은 파라미터 하나마다 상태를 두 개씩 더 들고 다닌다. 1차 모멘트와 2차 모멘트다. 표준적인 혼합정밀도 구성에서 파라미터 하나가 지고 가는 무게는 대략 16바이트다.

파라미터 1개당 (혼합정밀도)
  fp16 가중치              2 bytes
  fp16 그래디언트          2 bytes
  fp32 마스터 가중치       4 bytes
  fp32 1차 모멘트 (m)      4 bytes
  fp32 2차 모멘트 (v)      4 bytes
  ─────────────────────────────────
                          16 bytes

따라서 10억 파라미터 모델은 자기 학습 상태를 담아두는 데만 약 16GB가 필요하다. 그리고 매 스텝, 그 전체를 원소 단위로 읽고 갱신하고 다시 쓴다.

이 연산에서는 절대적인 비용보다 세 가지 성질이 더 중요하다.

1. 연산이 아니라 메모리 대역폭에 묶여 있다

Adam의 갱신은 파라미터당 곱셈과 덧셈 몇 번에, 그 주위를 여러 번의 읽기와 한 번의 쓰기가 감싸고 있는 모양이다. 산술은 사소하고, 데이터 이동은 그렇지 않다. 이런 모양의 연산은 칩이 이론적으로 낼 수 있는 초당 부동소수점 연산 수가 아니라, 메모리와 연산 유닛 사이를 바이트가 얼마나 빨리 오가느냐로 제한된다.

이 구분이 중요한 이유는 그 두 수치가 같은 속도로 성장하지 않았기 때문이다. 지난 20년 동안 최대 연산 성능은 메모리 대역폭보다 훨씬 빠르게 올라갔고, 가속기 세대가 바뀔 때마다 그 격차는 더 벌어진다. 실제 비용이 데이터를 실어 나르는 데 있는 스텝은, 더 빠른 칩을 산다고 해서 그에 비례해 짧아지지 않는다. 그리고 각각이 이미 자기 메모리를 기다리고 있다면, 칩을 더 사는 것은 아무 도움도 되지 않는다.

2. 전역 동기 연산이다

이제 규모를 옆으로 늘려보자. 여러 장비에 걸친 데이터 병렬은, 어느 장비든 자기 스텝을 밟기 전에 모든 장비에 걸쳐 그래디언트가 리듀스되어야 한다는 뜻이다. 모든 파라미터에 대해, 매 스텝.

스텝 t:  순전파 → 역전파 → ALL-REDUCE (전체 파라미터) → 갱신 → 스텝 t+1
                                    ▲
                          모든 장비가 여기서 기다린다

그 집합 통신에서 각 장비가 옮기는 트래픽은 모델 크기에 비례하고, 장비가 더 합류할수록 집합 통신 자체가 길어진다. GPU를 두 배로 늘려도 스텝당 시간은 절반이 되지 않는다. 어느 지점을 넘어가면, 장비를 더하는 일은 덜어내는 작업량보다 더 많은 동기화를 더한다.

3. 스텝 축으로는 병렬화할 수 없다

사람들이 가장 자주 잊는, 그리고 가장 완고한 성질이다. t+1번째 갱신은 t번째 갱신의 결과에 의존한다. 이 의존은 잘 설계해서 없앨 수 있는 구현상의 문제가 아니라, 경사하강이 무엇인가 그 자체다.

학습 시간  =  스텝 수  ×  스텝당 시간

컴퓨팅 파워는 뒤쪽 항을 줄여준다. 그것도 앞에서 본 이유들 때문에 부분적으로만. 앞쪽 항에 대해서는 아무것도 해주지 못한다. 클러스터가 아무리 커도 899,999번째 스텝보다 900,000번째 스텝을 먼저 돌릴 수는 없다.

흔한 답들, 그리고 그것들이 그대로 남겨두는 것

여기까지는 새로운 이야기가 아니고, 이 분야에는 좋은 공학적 답들이 있다. 각각이 실제로 무엇을 바꾸는지는 정확히 짚어둘 가치가 있다.

옵티마이저 상태 샤딩(ZeRO 계열)은 파라미터당 16바이트를 장비들에 나눠서 어느 한 장비도 전부를 들고 있지 않게 한다. 메모리 측면에서 실질적이고 큰 이득이다. 하지만 동기화를 없애지는 못한다. 대개는 통신을 더하며, 대역폭을 내주고 용량을 얻는 거래다.

희소 활성화(Mixture-of-Experts)는 주어진 순전파에 파라미터의 일부만 참여한다는 뜻이다. 추론 비용과 학습 중 토큰당 연산량에서 실질적인 이득이다. 하지만 학습은 여전히 라우터와 선택된 전문가들을 통해 하나의 손실을 역전파하고, 그 전문가들은 여전히 하나의 목적함수를 향해 움직이는 한 모델의 파라미터다.

파이프라인·텐서 병렬은 모델을 장비에 걸쳐 잘라 각자 한 조각씩 들게 한다. 연산이 어디서 일어나는지를 나눈다. 그 연산이 무엇을 최적화하는지는 나누지 않는다.

이것들은 모두 한 몸을 더 많은 손으로 드는 방법이다. 그중 어느 것도 그것이 한 몸이기를 그만두게 하지는 않는다.

왜 전부가 함께 움직여야 하는가

공학 아래에 깔린 질문은 이것이다. 왜 전체가 매 스텝 한꺼번에 갱신되어야 하는가?

전체가 하나의 미분 가능한 목적함수에 묶여 있기 때문이다. 하나의 손실이 모든 파라미터를 관통하고, 경사란 정의상 그 하나의 수를 모든 것에 대해 미분한 값이다. 그러므로 모든 것은 모든 것에 결합되어 있고, 전체는 학습이 끝날 때까지 한 걸음씩 함께 움직여야 한다.

세 가지 성질을 만들어내는 것이 바로 그 결합이다. N에 선형인 비용, 전역 동기화, 엄격한 순차성 — 이 중 어느 것도 Adam의 성질이 아니다. Adam은 그 짐을 지는 충분히 합리적인 방식일 뿐이다. 그것들은 짐의 성질이다.

진짜 병목은 옵티마이저가 아니다. 옵티마이저가 짊어져야 하는 그 한 몸이다.

그렇게 보면 이 천장은 더 이상 하드웨어 문제로 보이지 않는다. 하드웨어를 늘려도 세 성질 중 어느 것도 사라지지 않는데, 애초에 그중 어느 것도 하드웨어에서 온 것이 아니기 때문이다. 이것은 구조의 문제이고, 구조의 답을 요구한다.

HIPLE은 경사하강을 더 영리하게 자르지 않는다

HIPLE은 Hierarchical Independent Parallel Learning Engine, 계층적 독립 병렬 학습 엔진이다. 여기까지 읽고 나면 그 답이 학습을 더 잘 분산시키는 방법이라고 짐작하기 쉽다. 아니다. 사람들이 가장 먼저 떠올리는 짐작이기 때문에, 분명히 말해둘 필요가 있다.

개별 엔진은 지극히 평범하게 학습한다.

각 엔진은 자기 영역과 자기 데이터 위에서, 평범한 역전파와 평범한 Adam으로 독립적으로 학습된 작은 모델이다. 그것을 바꿀 이유도 없고, 바꾸려는 시도도 없다. 경사하강은 그 비용이 견딜 만한 규모에서는 훌륭한 도구이며, 요점은 그것을 계속 그 규모에 붙들어 두는 것이다.

여기서 두 가지가 따라 나오고, 그 둘이 논지의 전부다.

첫째, 엔진 하나의 N이 작다. 이 글 전반부의 세 성질은 문제가 될 만한 크기로 자라지 않는다. 파라미터 수가 크지 않으면 파라미터당 16바이트는 문제가 아니다. 텐서가 넉넉히 들어가면 대역폭에 묶인 원소별 갱신도 문제가 아니다. 스텝이 짧으면 스텝 간 순차 의존도 문제가 아니다.

둘째, 엔진들은 손실함수를 공유하지 않는다. 그들이 함께 최소화하는 단 하나의 수 같은 것은 없다. 그리고 공유하는 목적함수가 없는 곳에는 주고받을 그래디언트도 없다. 앞의 그림에 있던 all-reduce는 최적화되는 것이 아니라 — 존재하지 않는다.

모놀리식                          HIPLE
──────────                        ─────
하나의 손실                       공유 손실 없음
전체에 대한 하나의 경사           엔진마다 자기 것
매 스텝 전역 all-reduce           리듀스할 것이 없음
일부를 바꾸려면 전체 재학습       그 일부만 수정

그렇다면 무엇이 이들을 묶는가

엔진들이 목적함수를 공유하지 않는다면, 그 판단들을 합치는 일은 다른 무언가가 해야 한다. 뻔한 수순은 — 이 분야가 손을 뻗는 방향은 — 그 결합을 학습시키는 것이다. 라우터를 훈련시키고, 게이팅 네트워크를 얹고, 메타 학습기를 올린다. 그러나 그것은 전체 위에 다시 하나의 미분 가능한 목적함수를 씌우는 일이고, 방금 제거한 성질들을 전부 되돌려 놓는다.

그래서 HIPLE은 그렇게 하지 않는다. 통합은 학습으로 하지 않는다. 규칙 엔진 — Rules and Law — 이 한다.

그 계층에는 경사가 흐르지 않는다. 역전파도 없고, 옵티마이저 상태도 없고, 전역 동기화 단계도 없다. 대신 명시적이고 감사 가능한 규칙이 각 엔진의 판단을 받아 통합하고, 그중 어느 판단을 지식으로 승인할지 결정한다.

        사례
          │
   ┌──────┼──────┐        각자 독립적으로 학습됨
   ▼      ▼      ▼        공유 손실 없음, 공유 경사 없음
 엔진    엔진    엔진
  A       B       C
   │       │       │
   └──────┼──────┘
          ▼
   Rules and Law          경사 없는 통합
   (역전파 없음,          외부 증거에 대해 검증됨
    옵티마이저 상태 없음)
          │
   ┌──────┴──────┐
   ▼             ▼
  판정          보류

이것은 유지보수가 무엇을 뜻하는지를 바꾼다.

증거가 어긋나면 모델이 아니라 규칙이 수정된다. 새로운 외부 증거가 시스템이 붙들고 있던 것과 충돌하면, 그 규칙이 재평가되고 수정된다. 그 정정을 흡수시키려고 엔진을 다시 학습시키지 않는다.

새로운 영역은 새 엔진과 규칙이다. 다루는 범위를 넓힌다고 해서 전체 시스템을 재학습하지 않는다. 재학습할 전체 시스템이라는 것이 없기 때문이다. 서로 의존하지 않는 엔진들과, 자라나는 규칙 집합이 있을 뿐이다.

불일치는 답을 내지 않는다. 엔진들의 판단이 충돌하거나 증거가 바닥나면, 규칙은 그 충돌을 평균으로 뭉개서 해소하지 않는다. 아무것도 내놓지 않는다. 시스템은 보류한다.

마지막 항목은 예비 장치가 아니라, 이 분리가 비용을 치를 만한 이유 그 자체다. 학습된 통합 계층은 출력을 내도록 훈련되었고, 판단할 자격이 없는 입력에 대해서도 — 자신 있게 — 출력을 낸다. 합의를 요구하는 규칙은 거절할 수 있다.

정직한 경계

이 접근은 많은 것을 사들이고, 공짜가 아니다.

알 수 있는 구조가 있는 영역이어야 한다. 의학에는 있다. 생리학과 해부학은 수백 년 동안 구조를 축적해왔다. 산업 설비, 법률, 금융, 과학의 상당 부분도 충분히 갖고 있다. 구조를 정말로 모르는 문제에는 여전히 넓은 관계 탐색이 필요하고, HIPLE은 그렇지 않은 척하지 않는다.

또한 이것은 일을 없애는 것이 아니라 옮기는 것이다. 통합의 품질이 학습의 문제가 아니라 규칙의 문제가 된다. 규칙은 쓰여야 하고, 검증되어야 하고, 자라야 한다. 경사하강이라면 암묵적으로 해주었을 실제 노동이다. 이쪽이 일이 더 적다는 주장이 아니다. 이쪽 일은 감사 가능하고 저쪽 일은 그렇지 않다는 것이다.

그리고 엔진 사이의 경계는 벽이 아니라 탐색 우선순위다. 세계는 깔끔하게 분리되지 않는다. 흉통이 복부에서 기원할 수 있고, 연관통은 해부학적 구역을 가로지르며, 암은 분할 자체를 무시한다. 그래서 구분은 부드럽고 겹쳐야 하며, 구역을 가로지르는 명시적 연결이 심볼릭 계층에 놓여 증거가 경계 너머를 가리킬 때 다른 엔진을 활성화할 수 있어야 한다. 깨끗한 경로가 없는 경우 시스템은 탐색을 넓히거나, 상위로 올리거나, 보류한다.

이 약속은 주장이 아니라 측정으로 확인되어야 한다. 분할을 신뢰해도 되는지를 가르는 두 수치가 있다. 경계 교차 재현율 — 자기가 그어놓은 구분 사이에 놓인 것을 여전히 찾아내는가 — 그리고 치명적 누락률이다. 평균적으로는 좋은 점수를 내면서 이음매를 가로지르는 사례를 떨어뜨리는 구조는, 자신이 주장하는 효율을 얻어낸 것이 아니다.

학습은 국소적으로, 통합은 규칙으로

이 글의 전반부는 산술에 관한 논증이다. 옵티마이저의 갱신은 대역폭에 묶여 있고, 전역 동기이며, 엄격히 순차적이고, 하드웨어를 아무리 늘려도 그 셋 중 무엇도 바뀌지 않는다.

후반부는 왜 그런가에 관한 논증이다. 그 셋은 모두 하나의 미분 가능한 목적함수가 모든 파라미터를 한 몸으로 묶어놓은 데서 따라 나온다. 그렇다면 그 천장은 애초에 계산량의 문제가 아니었다는 뜻이다.

잘 확장되는 부분을 확장하라. 각 학습기를 경사하강이 여전히 값싼 크기로 유지하라. 그리고 그 부분들을 이어야 하는 자리에서는, 읽을 수 있고 검증할 수 있고 수정할 수 있는 것으로 이어라. 모른다고 말하는 것이 허용된 것으로.

필요한 것은 큰 모델 하나를 더 빨리 돌리는 기계가 아니다. 애초에 전부를 하나의 경사에 묶지 않는 구조다.

— Kyewook Lee
HIPLE — Hierarchical Independent Parallel Learning Engine
특허 출원 중 — U.S. Provisional Application No. 64/122,459