GLM의 추론 인프라를 바꾼 촘촘한 피드백
GLM 기반 Infra Agent가 수치 오류, 전송 동시성, 커널 병목을 고친 사례로 살펴보는 추론 인프라의 피드백 설계와 성능 검증.
TL;DR
- GLM 기반 Infra Agent는 엔지니어와 함께 중국산 가속기 10만 개 이상 규모의 추론 인프라를 구축했다. 초기 구동부터 운영 준비까지 2주 미만이 걸렸다. 종단 간 처리량은 초기 기준선의 약 3배가 됐다.
- 촘촘한 피드백은 로그를 많이 주는 방식이 아니다. 오류를 특정 커널과 실행 경로에 연결하고 가설을 저렴하게 시험하는 설계다. 국소 검증과 실제 서비스 부하 시험은 서로 다른 역할을 맡는다.
- 수치 검증에서는 긴 문맥의 상태 병합 오차를 줄였다. 동시성 분석에서는 Python GIL 때문에 지연되던 KV 전송 제출을 바로잡았다. 같은 시험에서 Prefill 단독 대비 전송 병행의 성능 격차는 20% 초과에서 1% 미만으로 줄었다.
- KDA Decode 커널은 중복 계산을 없애 직전 버전보다 1.71배 빨라졌다. 이 수치는 전체 서비스의 약 3배 향상과 다른 지표다. 목표 설정과 위험 검토는 여전히 사람의 몫이므로 완전한 재귀적 자기개선은 아니다.
Z.ai가 공개한 GLM-5.3-Flash 개발 기록의 출발점은 중국산 AI 가속기 10만 개 이상으로 구성한 클러스터다. 칩의 메모리 용량과 대역폭이 제한된 환경에서 새 모델 구조, 100만 토큰 문맥, 멀티모달 요청을 함께 지원해야 했다. 커널과 문서도 충분하지 않은 상황에서 GLM-5.3 기반 Infra Agent가 개발 작업의 상당 부분을 맡았고 GLM-5.3-Flash의 모든 운영 추론은 이 시스템에서 실행된다.
약 3배의 처리량이 뜻하는 것
최적화는 계산과 대역폭, 통신과 장치 메모리 사이의 교환 관계를 이용했다. 선형 어텐션과 LM Head의 노드 내부 텐서 병렬화, ReplaySSM, W8A8 양자화, INT8·FP8·BF16 혼합 정밀도 캐시 양자화, Layer Split을 조합했다. 여기에 인코딩·프리필·디코딩 단계를 분리하는 Encode-Prefill-Decode 구조를 더했다. 모델 적응부터 운영 준비까지 걸린 시간은 2주 미만이며 그림 1의 종단 간 처리량은 T+0의 W8A8 기준선 1.00배에서 출시 시점인 T+13의 3.22배로 올라갔다.
이 그래프의 수치는 각 기법의 독립적인 가속 배수가 아니라 그 시점의 누적 시스템 성능이다. 계층형 캐시 도입 뒤에는 1.42배에서 1.41배로 소폭 내려갔고 일부 단계는 2.67배에 머물렀다. 정확성과 운영 안정성을 확보하는 변경이 언제나 즉시 처리량을 높이지는 않았다. Ox-Alpha라는 익명 모델로 OpenCode와 OpenRouter에서 사용된 뒤 6일간 62조 토큰 이상을 처리했다는 실사용 규모도 있지만 이는 벤치마크의 초당 처리량이나 요청 수가 아니다.
Z.ai는 하드웨어 활용 효율과 토큰당 비용이 주류 NVIDIA GPU와 비슷한 수준에 도달했다고 평가한다. 다만 이 글에는 비교 GPU의 구체적인 모델, 비용 산식, 절대 처리량, 부하 분포와 반복 측정 조건이 없다. 10만 개 이상의 가속기는 구축한 클러스터의 규모이며 개별 벤치마크에 투입한 장치 수까지 알려주는 값은 아니다. 따라서 약 3배는 초기 구현 대비 개선 폭으로 읽어야 하며 다른 하드웨어보다 3배 빠르다는 비교로 옮길 수 없다.
원인을 좁히는 피드백 환경
코드 전체를 읽을 수 있어도 종단 간 지표만으로는 실패 원인을 찾기 어렵다. 처리량 저하가 커널 계산, 통신 대기, 메모리 관리, 서비스 스케줄링 중 어디에서 생겼는지 분리되지 않기 때문이다. 예컨대 전송이 느리다는 관찰만으로 전송 장치 자체가 느린지 상위 계층이 작업 제출을 늦추는지 판정할 수 없다. Infra Agent의 작업 환경은 정확성 시험, 실행 로그, 타임라인과 런타임 이벤트, 마이크로벤치마크를 반복 실행할 수 있는 절차로 묶었다.
촘촘한 피드백, 즉 dense feedback의 조건은 국소성, 짧은 검증 주기, 객관적인 판정이다. 결과를 특정 입력 형태와 커널, 스레드, 실행 구간에 연결해야 다음 실험의 범위가 좁아진다. 커널 시험으로 답할 질문에 매번 전체 서비스를 배포할 필요는 없지만 타임라인의 상관관계만으로 근본 원인을 확정해서도 안 된다. 참조 구현과 대조 실험으로 후보를 거른 뒤 실제 부하에서 종단 간 이득과 회귀 여부를 확인해야 한다. 엔지니어는 목표와 경계를 정하고 에이전트는 가설·코드 변경·실험을 맡았다. 이 역할 분담으로 검증을 반복했다.
병렬화가 숨긴 수치 오류
정확성 검증은 배포 설정이 실제로 어떤 계산을 만드는지 확인하는 데서 시작했다. 같은 커널도 병렬화 전략에 따라 입력 분할과 실행 경로, 결과 병합 방식이 달라지므로 분할하지 않은 입력만 시험해서는 부족하다. Infra Agent는 추론 엔진의 병렬화 전략과 커널 구현을 연결한 지도를 바탕으로 분할 실행과 비분할 실행을 비교했다. 같은 입력의 계산 의미와 출력 위치를 맞춘 뒤 오차 허용 범위를 검사하자 KDA 커널의 Context Parallelism 경로에서 불일치가 드러났다.
문제는 문맥 조각 사이의 상태 변환을 병합하고 다음 조각의 초기 상태를 갱신하는 두 행렬곱에 있었다. 입력이 FP32여도 기존 tl.dot은 기본적으로 TF32 계산을 사용했으며 낮은 계산 정밀도에서 생긴 오차가 긴 문맥에서 누적됐다. 두 연산에 input_precision="tf32x3"를 명시하는 수정은 TF32 Tensor Core 연산 세 번을 조합해 더 높은 정밀도를 얻었다. Tensor Core의 성능 이점을 가능한 한 유지하면서 누적 오차를 줄이는 선택이다. 국소 회귀 시험을 통과한 구현도 목표 배포 환경에서 모델 정확성과 서비스 성능을 다시 검증해야 했으며 수치 수정은 Flash Linear Attention의 PR #1180에 병합됐다.
전송보다 먼저 막혀 있던 Python 스레드
동시성 문제에서는 Prefill 단독, Prefill과 KV Transfer 병행, Decode 단독을 분리한 시험이 출발점이었다. 엔지니어가 정한 기준은 동일한 부하에서 Prefill 단독 대비 전송 병행의 성능 격차가 5%를 넘지 않는 것이었다. 일부 시나리오에서는 격차가 20%를 넘었고 실행 타임라인에서 Python 측 KV Transfer와 DeepEP의 dispatch·combine 호출 구간이 겹치지 않았다. 이 관찰은 전송 자체의 속도보다 두 구성요소의 동시 실행을 조사할 근거가 됐다.
사용한 DeepEP v1.2.1의 intranode_dispatch와 intranode_combine은 Python GIL을 명시적으로 해제하지 않았다. dispatch는 수신 토큰 수가 필요할 때 GPU의 응답을 CPU에서 기다렸고 같은 프로세스의 Mooncake Transfer Python 스레드는 그동안 GIL을 제때 얻지 못했다. C++로 진입한다고 GIL이 자동 해제되지는 않으므로 비동기 전송 기능이 있어도 작업 제출부터 지연될 수 있다. 같은 버전의 노드 간 경로인 internode_dispatch는 이미 KV Transfer 방해를 피하려고 GIL을 해제하고 있어 비교 근거가 됐다.
수정은 해당 C++ 실행 구간에서 GIL을 풀어 Mooncake Transfer 스레드가 작업을 진행하도록 하는 것이었다. 검증에서는 전송과 계산이 겹칠 기회를 얻었는지 타임라인을 확인하고 원래 성능 기준도 다시 측정했다. 같은 시험 조건에서 Prefill 단독 대비 전송 병행의 성능 격차는 1% 미만으로 줄었다. 이는 전송 속도가 20배 빨라졌다는 뜻이 아니라, Prefill 기준 성능에서 전송 병행 때문에 벌어지던 격차를 줄인 결과다.
중복 계산을 없애는 커널 최적화
커널의 실행 시간만 줄이면 전체 서비스가 빨라진다는 보장은 없다. 계산 커널에 자원을 더 주는 선택이 KV Transfer 커널의 자원을 빼앗으면 전체 파이프라인은 오히려 느려질 수 있다. Infra Agent는 SGLang, Flash Linear Attention, DeepGEMM의 수작업 커널에서 최적화 기법을 추출하고 점진적인 변경과 요소 제거 실험으로 적용 조건을 확인했다. 적용 조건, 변환 방법, 자원 제약, 검증 근거를 함께 담은 optimization skeletons를 출발점으로 삼되 새로운 커널과 하드웨어에서 타일링·메모리 접근·자원 배분을 다시 시험했다.
대표 KDA Decode 커널에서는 메모리를 아끼고 계산을 늘리는 ReplaySSM 도입으로 v0에서 v1로 갈 때 실행 시간이 먼저 증가했다. 이어 나눗셈 최적화가 v1의 실행 시간을 9.6% 줄였다. 계산이 주된 병목이라는 피드백을 받은 뒤에는 V 차원의 타일 분할 때문에 같은 FP32 정규화와 게이팅 계산이 네 번 반복되는 구조를 찾았다. 타일들을 하나의 스레드 블록으로 합치고 공유 중간값을 레지스터에 유지하며 warp 단위 축약으로 중복 계산을 대체하자, 일부 병렬성을 포기하고도 v2보다 1.71배 빨라졌다.
그림 4는 v0 대비 속도를 표시하며 v1은 0.90배, v2는 1.00배, v3는 1.71배다. 본문에서 설명하는 v2 대비 가속과 그래프의 v0 대비 가속은 비교 기준이 다르지만 그래프에서 v2가 기준선 수준이므로 표시된 수치는 같다. 이 그래프에도 입력 차원, 배치 크기, 장치 사양과 절대 실행 시간은 없어 결과를 모든 KDA 커널에 일반화할 수 없다. 검증된 변경과 적용 조건은 다시 skeleton 라이브러리에 쌓였으며 개별 커널의 이득을 채택하는 마지막 기준은 종단 간 성능이었다.
모델이 개선한 시스템과 사람이 정한 경계
이 사례에서 모델은 자신이 속한 모델 계열의 추론 시스템을 최적화하는 일에 참여했다. 개선된 시스템은 GLM-5.3-Flash를 운영하고 축적한 최적화 경험은 다음 개발의 출발점이 된다. 그렇다고 다음 세대 모델의 설계와 훈련을 처음부터 끝까지 자율적으로 수행하는 재귀적 자기개선, RSI가 달성된 것은 아니다. 목표 선택과 시스템 경계 설정, 위험 평가는 여전히 사람이 맡았다.
엔지니어의 역할에는 에이전트가 직접 이용할 피드백 환경을 만드는 일도 포함된다. 시스템 구조, 비동기 동시성, 수치 계산의 의미, 운영 위험을 바꾸는 중요한 수정은 사람의 검토 대상이었다. 최종 수용 기준은 코드 생성량이 아니라 정확성·안정성·종단 간 성능의 동시 충족이다. 2주 미만의 개발과 약 3배의 처리량 개선은 사람이 정한 경계 안에서 사람, 모델, 실험 환경이 함께 만든 결과다.
참고 자료
Toward Recursive Self-Improvement: How GLM Built Its Own Inference Infrastructure
