13.7.2.2 비중첩 데이터 집계를 통한 텀블링 윈도우(Tumbling Window) 단속 제어 시스템

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)시킨 후 버퍼 메모리를 척살해 버린다.
데이터가 모자라다 한들 결단코 과거에 매달려 시스템의 전체 스케줄링 동맥경화를 초래할 수는 없다. 이것이 무결점 시간 분할의 심장에 박히는 하드 리얼타임 단속 제어의 율법이다.