AI VIDEO BRIEFING
Ray와 KubeRay로 분산 학습 확장하기 — 캐피털원의 멀티 GPU 하이퍼파라미터 튜닝 사례
캐피털원 엔지니어들이 쿠버네티스 위에서 Ray 클러스터를 운영하며 겪은 데이터 로딩 병목과 자동·수동 샤딩 선택, 시행 한 건당 시간을 3분의 1로 줄인 과정을 Ray 서밋 발표 자막을 근거로 정리했습니다.

핵심 메시지
쉽게 이해하기
Ray 서밋 2025에서 캐피털원의 브라이언 응우옌과 닉 레스닉이 사내 머신러닝 플랫폼을 분산 환경으로 옮긴 경험을 공유했습니다. 출발점은 흔한 고민이었습니다. 탐색 단계에서는 주피터랩과 스파크를, 학습 단계에서는 XGBoost와 파이토치를 쓰는 식으로 도구가 갈라지고, 규제와 권한이 다른 환경마다 같은 기술 스택을 따로 관리해야 했다는 것입니다.
이들이 원한 것은 사용자가 인프라를 의식하지 않는 상태였습니다. 작업만 제출하면 뒤에서 의존성과 자원이 알아서 처리되는 구조를 목표로 삼았고, 파이썬으로 된 것이라면 무엇이든 분산할 수 있다는 점에서 Ray를 선택했습니다. 실행 기반으로는 쿠버네티스를 골랐는데, 사내에 운영 경험이 쌓여 있고 자원을 잘게 나눠 배분하거나 런타임에 늘리고 줄이기 쉽다는 이유였습니다.
적용 대상은 임베딩 연구 파이프라인의 뒷단이었습니다. 만들어 둔 임베딩이 실제 예측 과제에서 얼마나 도움이 되는지 확인하려면 XGBoost 모델을 제대로 맞춰야 하고, 그러려면 하이퍼파라미터 탐색을 돌려야 합니다. 시행마다 5겹 교차 검증을 수행하니 조합 하나당 모델을 다섯 번 학습하는 셈이라, 단일 노드에서는 학습 데이터를 줄이고 임베딩 차원을 낮추며 탐색 범위까지 제한해야 했습니다.
멀티 노드로 옮기자 새로운 문제가 나타났습니다. 예전에는 클라이언트에서 데이터를 메모리에 올려 튜너에 넘기면 같은 파드 안에서 끝났지만, 이제는 그 데이터가 직렬화돼 워커마다 네트워크로 전달됩니다. 라이브러리 버전을 고정해 직렬화 오류를 잡고 나서도 작업이 진행될수록 메모리가 계속 쌓여 자주 죽었습니다. 결국 데이터를 옮기는 방식 자체를 바꿔야 했습니다.
두 가지 대안을 비교한 결과가 이 발표의 핵심입니다. 파일 경로만 넘기고 프레임워크가 알아서 나누게 하는 자동 샤딩은 편했지만, 교차 검증 구간마다 워커들이 서로에게서 조각을 끌어모으느라 네트워크 트래픽이 수십 배로 뛰었고 그동안 GPU는 놀았습니다. 반면 각 액터가 자기 몫의 파일을 저장소에서 직접 읽는 수동 샤딩은 코드가 조금 복잡해지는 대신 그 전송을 통째로 없앴습니다.
주요 인사이트
- 분산 전환의 진짜 비용은 연산이 아니라 데이터가 어디서 어디로 움직이는지에 있습니다. 단일 노드에서 공짜였던 객체 저장소 공유가 멀티 노드에서는 네트워크 비용으로 바뀐다는 점이 이 사례의 핵심입니다.
- GPU가 크다고 답이 되는 것은 아닙니다. 발표자들은 큰 GPU를 미리 확보해 두는 대신, 작업 성격에 따라 런타임에 등급이 다른 GPU를 골라 쓰는 편이 낫다고 판단했습니다.
- 메모리 사용량이 안정적으로 예측되자 클러스터를 더 작게 요청할 수 있었고, 그 덕에 자원 확보가 빨라졌습니다. 성능 개선이 대기 시간 단축으로 이어진 사례입니다.
- GPU 사용률 지표는 오해를 부를 수 있습니다. 이들은 구간별 그래픽 엔진 활성 비율을 함께 보며 학습 중인 시간과 그렇지 않은 시간을 구분했고, 그 관측이 없었다면 병목을 찾지 못했을 것이라고 밝혔습니다.
- 판다스나 스파크에 익숙한 팀에 분산 데이터 처리를 그대로 옮기라고 요구하면 마찰이 커집니다. 코드를 옮기는 것과 동작 방식을 이해하는 것은 다른 일이라는 조언이 마지막에 붙었습니다.
자주 묻는 질문
자동 샤딩과 수동 샤딩의 차이는 무엇인가요?
자동 샤딩은 데이터를 프레임워크의 데이터셋으로 읽어 들이고 학습기가 알아서 나누게 맡기는 방식입니다. 수동 샤딩은 실행 중인 액터의 순번과 전체 개수를 확인해 각자 자기 몫의 파일만 읽어 학습용 자료 구조를 직접 만드는 방식으로, 코드는 복잡해지지만 워커 사이 데이터 전송을 피할 수 있습니다.
멀티 노드로 옮겼을 때 작업이 죽은 원인은 무엇이었나요?
클라이언트에서 학습 데이터를 통째로 객체 저장소에 넣던 기존 방식이 문제였습니다. 노드가 여러 개가 되면서 그 데이터가 직렬화돼 워커마다 전송됐고, 라이브러리 버전을 고정해 직렬화 오류를 해결한 뒤에도 튜닝이 진행될수록 메모리가 누적돼 반복적으로 한계를 넘겼습니다.
성능은 얼마나 개선됐나요?
같은 조건으로 비교했을 때 시행 한 건당 평균 소요 시간이 3분의 1로 줄어, 같은 시간에 세 배 많은 조합을 시험할 수 있게 됐습니다. 또 단일 노드에서는 GPU 한 장에 올리기 위해 차원 축소를 해야 했던 큰 데이터셋도 여러 GPU에 나눠 15분 안에 처리할 수 있었습니다.
원문과 출처
이 글은 원본 영상의 자막을 바탕으로 한국어 독자를 위해 요약했습니다. 전체 맥락과 최신 정보는 원문에서 확인하세요.
YouTube 원본 영상 보기 ↗