13.7.2.2 비중첩 데이터 집계를 통한 텀블링 윈도우(Tumbling Window) 단속 제어 시스템
분산 파이프라인 망에 스트림 데이터의 그물(Window)을 던져 데이터를 묶을 때, 그물의 투망과 회수가 한 치의 겹침(Overlap) 없이 이루어지는 가장 무자비하고 단호한 분할 통치 구역을 Zenoh-Flow 아키텍처는 텀블링 윈도우(Tumbling Window) 라 명명한다.
1초 주기로 텀블링 윈도우를 선언했다면, [0.0s ~ 1.0s] 구간의 데이터가 한 상자에 담기고 닫힌다. 정확히 그다음 [1.0s ~ 2.0s] 의 데이터가 다음 상자에 담긴다. 단 1나노초의 허점이나 데이터 복제(Duplicate Grouping)가 허락되지 않는, 완벽한 시계열 토막 살인(Temporal Chopping)의 진수다. 본 절에서는 통계 집계(Aggregating), 배치 변환(Batch Transformation)의 코어 엔진인 이 비중첩(Non-Overlapping) 윈도우잉 시스템의 제어론을 갈파한다.
1. 독립 변인(Independent Batch)으로서의 구획 단절
단순히 5초 동안 들어온 센서 데이터를 모았다는 것이 텀블링 윈도우의 본질이 아니다.
텀블링 윈도우 시스템에서 이전 상자(Window N-1)와 현재 상자(Window N) 사이에는 완벽할 정도의 메모리 단절 장벽(Memory Boundary) 이 존재해야만 한다.
# [텀블링 윈도우 Stateful 파이썬 오퍼레이터의 단속 런북]
class TumblingAggregator:
def __init__(self, size_limit=100):
self.buffer = []
self.size = size_limit
def on_data(self, incoming_data):
self.buffer.append(incoming_data)
# 1. 버퍼가 텀블링 윈도우 크기(100개)를 정확히 채우면, 임계 트리거 폭발!
if len(self.buffer) == self.size:
# 2. 윈도우 집계(Aggregate) 연산을 가동한다
aggregate_result = np.sum(self.buffer)
# 3. [초격차 핵심] 과거의 기억을 완전히 자비 없이 지워(Clear)버린다!
# 이전 상자의 찌꺼기 데이터가 다음 상자에 단 1바이트라도 오염(Overlap)되선 안 된다.
self.buffer.clear()
send_sink(aggregate_result)
이 단절의 원칙 덕분에, 각각 생성되는 텀블링 윈도우의 산출물들은 독립 확률 변수와 같다.
공장의 하루치 전력량을 계산할 때 “1시~2시 상자의 합“과 “2시~3시 상자의 합“을 멍청하게 더하기만 해도 전력량의 총합 무결성이 증명된다. 만약 버퍼가 지워지지 않고 서로 겹쳐졌다면 절대 단순 합산과 통계 평균의 연쇄 법칙을 쓸 수 없었을 것이다.
2. 딥러닝 미니 배치(Mini-Batch)와 L3 캐시(Cache) 최적화의 극의
자율주행 시스템에 텀블링 윈도우가 쓰이는 가장 위력적인 지점은 통계 따위가 아니다. GPU 딥러닝 추론 최적화(Batched Inference) 다.
초당 30프레임으로 들어오는 비전 데이터를 C++ 엣지에서 파이썬 Yolo 모델로 넘겨 처리할 때, 파이썬이 데이터를 1개(Batch Size=1)씩 받을 때마다 CUDA 라이브러리를 콜하고 matmul 연산을 태우면, GPU 로딩 오버헤드(Launch latency) 때문에 초당 15프레임도 처리하지 못하고 병목에 박살 난다.
아키텍트는 Yolo 오퍼레이터 앞단에 “크기 8짜리 텀블링 윈도우 큐(Tumbling Queue)” 를 강제로 심어 넣는다.
카메라에서 뽑힌 제로카피 캡슐 포인터 8개가 텀블링 버퍼에 차곡차곡 쌓일 때까지 파이프라인의 연산 스레드를 강제로 재우며 마취(Suspend)시킨다.
8장이 정확히 닫히는 순간(Tumbling Cut-off), 이 8개의 포인터 주소를 하나의 4차원 연속 텐서(Batch Dimension) 행렬로 병합 결속 시켜버린 뒤 GPU CUDA 코어로 한 번에(Single Launch) 던져버린다(Batch Size=8).
동일한 아키텍처임에도 이 텀블링 윈도우의 단속 묶음(Batching) 하나로 GPU 캐시 스래싱이 박살 나고 추론 스루풋(Throughput)은 무려 3배~5배까지 수직으로 폭발 상승한다. 연속된 시계열에서 “수치 해석적 독립 배치(Batch)“를 강제 직조해 내는 것, 그것이 텀블링 윈도우의 파괴력이다.
3. 타임 워터마크 충돌 지연과 꼬리 짜르기(Tail Dropping)
시간 기반 텀블링 윈도우(예: 1초 간격 텀블링)를 Zenoh-Flow 망에서 가동할 때, 지각 도착 패킷과 네트워크 지터(Jitter)로 인해 마지막 1초 구역(09:00:00 ~ 09:00:01)의 상자 뚜껑을 닫지 못하고 워터마크(Watermark) 메시지 타격 타이밍을 놓쳐 계속 들고 있게 되는 재앙이 도사린다.
파이프라인 통과 시간(Latency) 임계치를 넘긴 이 고인 물 윈도우들은 뒷단 모터 제어를 심각하게 지연시키므로, 텀블링 윈도우 설정자(Architect)는 디스크립터에 반드시 꼬리 짜르기(Max Tolerable Lateness/TTL) 타이머 런북을 병행 삽입해야 한다.
워터마크가 다소 도착하지 않았거나 큐 체증이 있더라도 물리 시간 타이머(Wall-clock timer)상 300ms가 넘어가는 순간 그 텀블링 윈도우의 미완성 버퍼를 강제 절단(Cut-off)하고 여태 담긴 데이터만으로 GPU에 사출(Flush)시킨 후 버퍼 메모리를 척살해 버린다.
데이터가 모자라다 한들 결단코 과거에 매달려 시스템의 전체 스케줄링 동맥경화를 초래할 수는 없다. 이것이 무결점 시간 분할의 심장에 박히는 하드 리얼타임 단속 제어의 율법이다.