“You Only Compute Once”: How Clockwork wants to put an end to AI training restarts

“You Only Compute Once”: How Clockwork wants to put an end to AI training restarts

분산 시스템에서의 내결함성: 왜 백엔드 개발자도 알아야 하는가

대규모 분산 환경에서 "무언가는 항상 장애가 난다"는 명제는 GPU 클러스터만의 이야기가 아니다. 수십 개의 마이크로서비스가 얽힌 Java 백엔드 시스템에서도 동일한 진리가 적용된다. 노드 하나가 죽거나, 네트워크가 순간 끊기거나, GC pause가 길어지는 상황은 언제든 발생한다. 핵심은 이런 장애가 발생했을 때 처음부터 다시 시작해야 하는 구조인지, 아니면 마지막 안정 지점부터 이어갈 수 있는 구조인지의 차이다.

Clockwork가 GPU 학습 재시작 문제를 해결하려는 방식의 본질은 체크포인트 전략상태 복구 설계에 있다. 이는 백엔드 시스템 설계에서도 동일하게 중요한 개념이다.

체크포인트 패턴: 상태를 저장하고 재개하는 설계

분산 작업에서 체크포인트란 특정 시점의 처리 상태를 영속성 있는 저장소에 기록해두고, 장애 발생 시 해당 지점부터 재개하는 전략이다. Java 백엔드에서 배치 처리나 대용량 데이터 파이프라인을 구현할 때 이 패턴은 매우 실용적이다.

Spring Batch가 대표적인 예시다. JobRepository를 통해 각 Step의 실행 상태와 처리된 아이템 수를 DB에 저장하고, 실패 시 해당 Step의 마지막 커밋 지점부터 재시작한다.

@Bean
public Step processStep(JobRepository jobRepository,
                         PlatformTransactionManager txManager) {
    return new StepBuilder("processStep", jobRepository)
        .<Order, Receipt>chunk(100, txManager)
        .reader(orderReader())
        .processor(orderProcessor())
        .writer(receiptWriter())
        .faultTolerant()
        .retryLimit(3)
        .retry(TransientDataAccessException.class)
        .build();
}

chunk(100)은 100개 단위로 트랜잭션을 커밋하므로, 50만 건 처리 중 30만 건째에서 장애가 나도 처음부터 재처리할 필요가 없다. 이것이 체크포인트의 핵심이다.

Idempotency와 재시도 설계

체크포인트만으로는 충분하지 않다. 재개 지점부터 다시 처리할 때 중복 실행이 발생하지 않으려면 멱등성(Idempotency) 이 보장되어야 한다. 특히 외부 API 호출, 결제 처리, 이벤트 발행 등의 사이드 이펙트가 있는 작업은 중복 실행 시 데이터 정합성이 깨질 수 있다.

// 멱등 키를 활용한 중복 처리 방지
public void processPayment(String idempotencyKey, PaymentRequest request) {
    if (paymentRepository.existsByIdempotencyKey(idempotencyKey)) {
        return; // 이미 처리된 요청
    }
    // 결제 처리 로직
    paymentRepository.save(new Payment(idempotencyKey, request));
}

Kafka 기반의 이벤트 드리븐 아키텍처에서도 마찬가지다. 컨슈머가 메시지를 처리하다 실패했을 때 오프셋을 커밋하지 않으면 재처리가 발생한다. 이때 동일 메시지를 두 번 처리해도 결과가 동일하도록 설계해야 한다. at-least-once 전략을 선택했다면 반드시 멱등성 처리가 뒤따라야 한다.

정리

  • 분산 환경에서 장애는 예외가 아닌 기본값이다. "처음부터 재시작" 대신 "마지막 안정 지점에서 재개"하는 체크포인트 설계가 시스템 복원력의 핵심이다.
  • Spring Batch의 청크 기반 커밋, Kafka의 오프셋 관리 등 Java 생태계는 체크포인트 패턴을 구현할 수 있는 도구를 이미 갖추고 있다.
  • 재시도 가능한 구조를 만들려면 멱등성 보장이 전제되어야 하며, 이는 외부 연동 및 상태 변경 로직 전반에 걸쳐 의식적으로 설계되어야 한다.
Source
The New Stack
원문 보기 →
← 목록으로 돌아가기