추천 모델의 학습 단계를 GPU와 TPU로 옮기는 RecIR
추천 모델의 순전파·역전파·옵티마이저 갱신을 한 그래프로 묶어 GPU와 TPU로 옮기는 초기 컴파일러의 구조와 지원 범위를 소개합니다.
쉽게 말하면비유하자면 설계도 한 장으로 두 공장에서 물건을 만들게 해 주는 변환기다. 추천 모델의 학습 한 걸음을 통째로 도면 한 장에 옮긴 뒤, GPU와 TPU라는 서로 다른 계산 장치에 맞는 작업 지시서로 각각 바꾼다. 아직 시험판이고 DLRMv3라는 모델의 학습만 끝까지 지원한다.
- 왜 봐야 하나
- DLRMv3 계열 추천 모델을 GPU와 TPU 양쪽에서 학습시켜 보려는 팀에게 참고가 되는 초기 도구다. 모델 코드는 그대로 두고 실행 방식만 바꾸는 구조를 볼 수 있다. 다만 초기 시험판(알파)이고 처리 속도 수치는 공개되지 않았다. 성능은 직접 확인해야 한다.
이 글은 2026년 10월 29일 올라온 RecIR의 새 한국어 해설이다. RecIR은 Meta의 추천 모델 학습용 컴파일러로, 한 번 작성한 PyTorch 학습 단계를 그래프로 묶어 GPU나 TPU용으로 변환한다. 첫 지원 경로는 DLRMv3 훈련이며, 알파 단계로 추론은 실험적이다. 공식 문서는 실행 경로와 수치 대조 도구를 제공하지만 GPU·TPU 처리량 비교는 싣지 않았다. 저장소의 최초 공개일은 확인되지 않았으며, 이 해설의 게시일을 새 논문의 발표일로 볼 수는 없다.
알아낸 것
- 일반 PyTorch 모델의 학습 단계 전체를 FX 그래프로 캡처하고 실행 전략을 모델 코드 밖에서 적용합니다.
- 첫 지원 경로는 DLRMv3 훈련이며 GPU는 Inductor·TorchRec, TPU는 torchax·JAX/XLA를 사용합니다.
- CPU 설치 점검과 수치 대조 도구를 제공하지만 GPU·TPU 처리량 수치는 공개 문서에 없습니다.
한계와 주의할 점
- RecIR은 아직 초기(알파) 단계다. 처음부터 끝까지 지원하는 것은 DLRMv3 모델의 학습 하나뿐이고, 학습된 모델로 결과를 내는 추론은 실험 단계여서 실제 서비스용으로 보장되지 않는다.
- GPU와 TPU에서 얼마나 빠른지 보여 주는 처리량 수치는 공개되지 않았다. 글에 나오는 18.3ms는 다른 프로젝트인 TorchTPU의 결과이며 RecIR의 성능이 아니다.
- CPU만으로 하는 점검은 설치와 학습 흐름이 도는지만 확인한다. 실제 TPU에서의 동작과 속도는 따로 확인해야 하고, 한 번에 처리하는 데이터 묶음 크기나 장치 수가 바뀌면 다시 변환(컴파일)해야 한다.
용어 풀이
- make_fx
- PyTorch 함수를 추적해 FX 그래프를 만드는 도구다. RecIR은 순전파, 역전파, 옵티마이저 갱신까지 포함한 전체 학습 단계를 make_fx로 캡처한다.
- HybridParallel
- RecIR의 병렬 모드 중 하나로, 밀집 매개변수에는 데이터 병렬을 쓰고 큰 임베딩 테이블은 EmbeddingShardingPlan을 따라 나눈다. GPU DLRMv3 예제가 이 모드를 사용한다.
- GSPMD
- XLA의 자동 분할 방식으로, 텐서 샤딩을 파티션 명세로 표현하고 표준 밀집 연산의 집합 통신을 XLA가 자동으로 삽입한다. RecIR의 TPU 경로가 이 모드를 사용한다.
- Pallas 링 시프트
- TPU에서 임베딩 테이블을 행 단위로 샤딩하고, 전역 테이블을 만들지 않고 ID와 결과를 칩 사이에서 돌려 보내는 커널이다. RecIR의 TPU 기본 임베딩 백엔드가 이 방식을 사용한다.
- 토큰 예산 배치
- 가변 길이 입력을 고정 크기 블록으로 맞추는 전략. 남는 자리는 학습 가중치가 없는 더미 행으로 채우며, 예산이 실제 이력보다 작으면 긴 이력의 오래된 이벤트를 잘라낸다.
- 수치 동등성
- 즉시 실행 PyTorch와 컴파일 결과를 같은 초기 상태와 결정적 배치에서 비교해 손실, 출력, 그래디언트, 매개변수, 옵티마이저 상태가 허용 오차 내에 있는지 확인하는 검증 방식이다.
더 깊이 읽기 읽는 데 약 8분
배경과 문제
추천 모델은 밀집 신경망, 대형 임베딩 테이블, 사용자마다 길이가 다른 가변 길이 입력, 분산 집합 통신, 상태를 가진 옵티마이저가 한 모델 안에 섞여 있다. 그래서 같은 모델을 GPU 클러스터에서 TPU로 옮기려면 하드웨어별로 모델 코드를 따로 작성하는 경우가 많다. PyTorch 생태계에서는 TorchRec이 대규모 추천 모델용 샤딩을, FBGEMM이 임베딩 커널을 제공하지만, 이들을 GPU와 TPU 양쪽에서 동일한 모델 정의로 사용하기는 어렵다.
RecIR은 모델의 계산과 실행 전략을 분리하는 방식으로 이 문제에 접근한다. 모델은 일반 torch.nn.Module, 옵티마이저는 PyTorch 옵티마이저 그대로 두고, RecIR이 캡처와 그래프 변환, 상태 관리, 분산, 백엔드 변환을 맡는다. 샤딩, 패딩, 재계산 같은 실행 전략은 모델 클래스 밖에서 그래프를 고쳐 적용한다. 현재 지원하는 DLRMv3 경로에서는 모델 정의를 공유하고 하드웨어별 실행 설정을 분리한다.
기존 접근의 한계
TPU에서 PyTorch 추천 모델을 실행하는 다른 경로로 TorchTPU가 있다. TorchTPU는 Google과 Meta가 협력해 TorchRec 저장소에 TPU SparseCore용 네이티브 백엔드를 업스트림한 프로젝트다. 포럼 게시물에 따르면 이 백엔드로 32칩 TPU v7x에서 돌린 DLRMv2 모델은 Google의 JAX 기준 구현과 같은 18.3ms 스텝 지연 시간을 냈다고 한다. 그러나 이 수치는 외부 TorchTPU의 결과이지 RecIR의 DLRMv3 성능이 아니며, RecIR 저장소는 GPU와 TPU의 처리량 수치를 공개하지 않았다.
TorchTPU는 PyTorch 모델을 JAX를 거치지 않고 TPU에서 직접 실행하며, TorchTPU 자체는 즉시 실행과 torch.compile을 지원한다. 반면 RecIR은 학습 단계 전체를 그래프 하나로 캡처해 컴파일한다. TPU 임베딩 처리도 TorchTPU는 SparseCore 하드웨어 커널을 쓰는 반면, RecIR은 그래프 안의 행 단위 샤딩과 Pallas 링 시프트 조회를 쓴다. 두 프로젝트가 완전히 별개는 아니지만, RecIR의 공개된 DLRMv3 TPU 트레이너는 torchax와 JAX/XLA 경로를 사용한다.
작동 방식을 단계별로
RecIR에서 학습 단계는 평범한 파이썬 함수다. 설계 문서는 train_step(model, optimizer, batch) 함수가 손실을 계산하고 역전파한 뒤 optimizer.step()을 호출하는 예시를 든다. recir.compile()은 이런 함수를 실행기(runner)로 바꾼다. 실행기는 (모델 상태, 옵티마이저 상태, 입력 배치)를 받아 (갱신된 모델 상태, 갱신된 옵티마이저 상태, 출력)을 돌려주는 상태 전이로 동작한다. 매개변수, 버퍼, 옵티마이저 텐서는 그래프 입력으로 끌어올려지고, 갱신된 값은 그래프 출력으로 나온 뒤 런타임 상태 관리자가 반영한다.
컴파일은 상태와 입력 준비부터 시작한다. 모델·옵티마이저 상태를 찾고 캡처용 가짜 텐서를 만든 뒤, make_fx로 학습 단계의 ATen 연산을 기록한다. 이어 배치 차원과 상태·장치 배치 등의 정보를 붙이고, 통신·패딩·재계산·희소 임베딩 처리를 그래프 변환으로 적용한다. 그래프를 나누어 GPU 쪽은 Inductor로, TPU 쪽은 torchax를 거쳐 JAX/XLA로 컴파일한다. 마지막으로 실행 결과를 상태에 반영하고 원래 출력 구조로 복원한다. 추론 연산으로 바꾸는 변환도 있지만 아직 실험 경로다.
결과와 숫자의 의미
RecIR의 첫 지원 사례는 공개 패키지를 이용한 DLRMv3 학습 경로다. DLRMv3는 Meta의 생성형 추천 연구인 HSTU 논문의 공개 구현 저장소 generative-recommenders에 들어 있는 모델(DlrmHSTU)이다. 이 모델은 HSTU 트랜스듀서와 멀티태스크 헤드로 구성된다. RecIR은 이 모델을 GPU와 TPU 양쪽에서 학습시키는 트레이너와 수치 동등성 도구를 제공한다. GPU 경로는 HybridParallel 모드와 Inductor를 쓰고, TPU 경로는 GSPMD 모드와 torchax, XLA를 쓴다.
저장소는 GPU와 TPU의 처리량 수치를 공개하지 않았다. 대신 즉시 실행(eager) 결과와 컴파일 결과를 텐서 단위로 대조하는 수치 동등성 도구를 제공한다. 수치 검증은 같은 초기 상태와 결정적 배치에서 즉시 실행 PyTorch와 컴파일 결과를 비교하는 방식이다. 비교 대상은 태스크별 손실, 모델 출력, 선택한 그래디언트, 매 스텝 이후의 매개변수와 옵티마이저 상태이고, 검사한 텐서 중 하나라도 허용 오차를 넘으면 실패한다. GPU와 TPU는 커널과 기본 자료형이 달라 허용 오차를 따로 설정한다. 이는 비트 단위 일치를 보장하는 검사가 아니며, 이 해설에서 직접 실행한 결과도 아니다.
구체적인 예시
RecIR의 DLRMv3 예제는 XLA 컴파일이 선호하는 고정 텐서 모양과 추천 모델의 가변 길이 입력 사이의 간극을 토큰 예산 배치(token-budget batching)로 해결한다. 실제 샘플은 자기 이력 길이를 그대로 유지하고, 블록 하나의 전체 토큰 수만 batch_size * uih_budget으로 고정한다. 남는 토큰 자리는 더미 행이 채우고, 더미 행과 패딩된 후보는 가중치 0을 받아 손실과 지표에 영향을 주지 않는다. --uih_budget 기본값은 uih_len이라 이력이 잘리지 않는 대신 더미 행이 실제 행만큼 생길 수 있다. 예산을 줄이면 더미 행은 줄지만, 블록의 실제 토큰이 예산을 넘으면 가장 긴 이력의 오래된 이벤트부터 잘린다.
설치는 Python 3.12 이상에서 소스 체크아웃으로 진행하는 방식이다. 문서는 CPU만으로 설치와 전체 캡처·훈련 루프를 점검하는 예제, GPU 8장의 KuaiRand-1K 학습 예제, GPU 수치 대조 도구를 제공한다. TPU용 GKE JobSet 설정도 있으며 4칩은 기준 스모크 테스트, 128칩은 같은 코드의 멀티 호스트 실행 예다. 이 설정 파일들의 존재가 해당 규모의 처리량을 실증하는 것은 아니다.
한계와 오해하기 쉬운 점
RecIR은 알파 상태이며, 처음부터 끝까지 지원하는 참조는 DLRMv3 훈련 하나다. 추론 경로는 experimental이며 production serving contract가 아니다. 파이썬의 데이터 의존 제어 흐름은 자동으로 캡처되지 않고, 모양이 바뀌는 작업에는 명시적인 패딩이나 버킷 전략이 필요하다. batch_size, uih_len, uih_budget, num_candidates, 테이블 모양, 장치 수가 바뀌면 컴파일된 실행기를 새로 만들어야 한다.
Inductor와 torchax/XLA의 연산 지원 범위가 다르고, 희소 옵티마이저와 체크포인트 조합에도 백엔드별 제한이 있다. 예를 들어 TPU 트레이너의 CPU 임베딩 경로는 TorchRec 융합 옵티마이저 상태를 체크포인트에 저장하지 못한다. CPU 스모크 테스트는 설치·캡처·훈련 루프를 점검할 뿐, 실제 TPU의 Pallas 링 시프트나 TPU 처리 성능을 검증하지 않는다. 하드웨어별 성능과 지원 범위는 별도로 확인해야 한다.
실제로 어떻게 활용할까
이 자료는 DLRMv3 계열 추천 모델을 GPU와 TPU에서 비교하거나 학습 컴파일러를 설계하는 팀의 참고가 된다. 먼저 CPU 점검으로 설치와 캡처 경로를 살핀 뒤, 실제 하드웨어에서는 같은 초기 상태와 배치로 수치 차이를 확인하는 순서가 문서의 도구 구성에 맞는다. 다만 이는 활용 방향에 대한 해석이며, 임의의 추천 모델을 곧바로 운영 학습에 올릴 수 있음을 입증한 결과는 아니다.
문서의 검증 대상은 PyTorch 2.10, TorchRec 1.4, FBGEMM 1.5, JAX 0.8~0.10 조합이다. 최신 PyTorch 2.15와의 호환성을 확인한 자료는 아니다. TorchRec과 FBGEMM 휠은 특정 PyTorch 릴리스에 맞춰 빌드되므로, 버전을 임의로 섞으면 import 단계에서 실패하기 쉽다. 첫 스텝에는 컴파일이 포함되어 정상 학습 처리량과 구분해야 하며, 처리량을 비교할 때는 여러 번의 워밍업 스텝 이후 값을 쓰라고 안내되어 있다.
원문에서 확인한 근거 4곳
- RecIR은 PyTorch로 한 번 작성한 학습 단계를 FX 그래프 하나로 캡처해 GPU 또는 TPU용으로 변환하는 컴파일러 프레임워크다.RecIR is a compiler framework for training recommendation models from a single PyTorch definition on
- RecIR의 컴파일 파이프라인은 상태와 입력 준비, 전체 단계 캡처, 정규화와 주석, 그래프 변환, 분할과 저수준화, 실행과 상태 반영의 6단계로 구성된다.Compilation pipeline
- DLRMv3 예제는 토큰 예산 배치를 사용해 실제 샘플의 이력 길이를 유지하면서 블록 전체 토큰 수를 고정하고, 더미 행과 패딩된 후보는 가중치 0을 받아 손실에 영향을 주지 않는다.token-budget batch layout
- CPU 스모크 테스트는 JAX CPU 백엔드와 TorchRec 임베딩으로 설치, 추적, 그래프 변환, 옵티마이저 캡처, 학습 루프를 확인하지만 실제 TPU 성능의 모형이 아니다.CPU embedding backend is available for host-only debugging, but it is not
10월 30일(금) 정리 · AI가 쓰고 원문과 대조
AI 목록