TrendShift 딥다이브 · 2026-07-02

TabFM 딥다이브
— "학습 없이" 표를 예측하는 구글의 표 데이터 파운데이션 모델

TabFM(Tabular Foundation Model)은 구글 리서치가 공개한 표(tabular) 데이터용 파운데이션 모델이다. 놀라운 점은 여러분의 데이터로 모델을 "학습"시키지 않는다는 것 — 훈련 데이터를 그저 "문맥(context)"으로 읽어 새 행을 즉석에서 분류·회귀한다. 이것을 인컨텍스트 러닝(in-context learning)이라 부르며, 마치 대형 언어 모델이 프롬프트 속 예시 몇 개만 보고 답하듯 작동한다. 게다가 scikit-learn 호환이라 fit()·predict()로 바로 쓸 수 있고, JAX 원본과 PyTorch 이식본 두 백엔드를 함께 제공한다. (저장소: google-research/tabfm · Apache-2.0 · 최초 릴리스 v1.0.0 (2026-06-29) · ★542 · TrendShift Monthly 6위)
목차
  1. 프로젝트 한줄 요약
  2. 왜 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트 (기술별)
  7. 하드웨어 / 시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한줄 요약

이 저장소가 대체 무엇인가.

핵심 메시지

"표 데이터를 위한 GPT" — 예시를 보여 주면, 학습 없이 즉석에서 새 행을 예측한다.

여러분이 엑셀 표를 하나 갖고 있다고 하자. 왼쪽에는 나이·직업·소득 같은 특성(feature) 열들이 있고, 맨 오른쪽엔 "고위험/저위험" 같은 정답(label) 열이 있다. 보통은 이 표로 XGBoost 같은 모델을 몇 분~몇 시간 학습시켜야 예측기가 만들어진다.

TabFM은 다르다. 이미 방대한 합성 표 데이터로 딱 한 번 사전학습된 하나의 모델이, 여러분의 훈련 행들을 그냥 "예시 문맥"으로 읽고 곧바로 테스트 행의 답을 내놓는다. 여러분 데이터에 대한 추가 학습(파라미터 업데이트)이 전혀 없다. 비유하면 — XGBoost = 매번 새로 교육시키는 신입, TabFM = 표 읽는 법을 이미 통달해서 예시만 슥 보면 바로 답하는 베테랑이다.

README의 자기소개는 이렇다: "TabFM is a scikit-learn compatible tabular foundation model. It allows you to perform zero-shot classification and regression on tabular datasets with mixed column types out-of-the-box." 풀어 쓰면 — (1) scikit-learn 호환이라 익숙한 fit/predict/predict_proba를 그대로 쓰고, (2) 숫자·범주가 섞인 혼합형 열을 별도 원-핫 인코딩 없이 바로 먹으며, (3) 제로샷(zero-shot) — 즉 사용자 데이터로 재학습하지 않고 예측한다는 뜻이다.

README는 그 원리를 한 문장으로 요약한다: "At inference time, TabFM does not require training parameters on your dataset; instead, it leverages in-context learning by reading your training data as 'context' to make instant predictions on new test samples." 이 문장이 이 프로젝트의 전부다. 추론 시점에 학습 파라미터가 필요 없고, 훈련 데이터를 문맥으로 읽어 즉시 예측한다.

용어
파운데이션 모델 (Foundation Model)
방대한 데이터로 한 번 크게 사전학습(pre-train)해 두면, 이후 다양한 과제에 추가 학습을 거의 없이 재사용할 수 있는 범용 모델. GPT·BERT가 "글"의 파운데이션 모델이라면, TabFM은 "표"의 파운데이션 모델을 지향한다. 표 데이터는 데이터셋마다 열 개수·의미가 제각각이라 오랫동안 "하나의 모델로 다 커버"하기가 어렵다고 여겨졌는데, TabFM은 인컨텍스트 러닝으로 이 벽을 넘으려 한다.
솔직히 짚고 넘어가기
"공식 지원 구글 제품"은 아니다

README에 "This is not an officially supported Google product."라고 명시돼 있다. 구글 리서치 조직(google-research)이 공개한 연구 결과물이며, 상용 SLA·지원이 붙는 정식 제품은 아니라는 뜻이다. 최초 릴리스 v1.0.02026-06-29에 올라온 갓 나온 코드이고, GitHub Releases 탭에는 아직 배포 노트가 비어 있다(태그만 존재). 학습·실험용으로 보는 게 맞다.

2왜 주목받는가

빅테크가 "표 파운데이션 모델" 경쟁에 정식 진입 · 학습 0초 · sklearn 드롭인 · 이중 백엔드.

표(tabular) 데이터는 여전히 산업 현장 ML의 8할이다. 은행 신용평가, 이탈 예측, 수요 예측, 의료 위험도 — 대부분 행·열로 된 표다. 그리고 이 영역의 오랜 왕은 딥러닝이 아니라 XGBoost·LightGBM 같은 그래디언트 부스팅 트리(GBDT)였다. 그런데 2022년 TabPFN이라는 논문이 "트랜스포머로 표를 인컨텍스트 러닝하면 학습 없이도 작은 표에서 GBDT를 능가한다"는 걸 보이며 판을 흔들었다. TabFM은 바로 그 흐름에 구글 리서치가 정식으로 뛰어든 결과물이다.

기존 접근과 무엇이 다른가

비교 축XGBoost / LightGBM (GBDT)TabFM (표 파운데이션 모델)
새 데이터셋에 쓰려면매번 처음부터 학습 (수초~수시간)학습 0 — 훈련 행을 문맥으로 읽고 즉시 예측
동작 원리결정 트리를 순차적으로 쌓아 오차 보정트랜스포머의 인컨텍스트 러닝 (1회 forward pass)
하이퍼파라미터 튜닝보통 필수 (학습률·깊이·규제…)기본값으로 바로 — 튜닝 부담 낮음
혼합형 열(숫자+범주)전처리·인코딩 손이 감out-of-the-box (내부에서 처리)
강한 구간크고 복잡한 표, 대용량작은~중간 표, 빠른 베이스라인
비유

GBDT는 "요리 학원"이고, TabFM은 "레시피를 통째로 외운 요리사"다. 새 요리(데이터셋)를 낼 때 GBDT는 매번 학원에 등록해 처음부터 배워야(학습) 한다. TabFM은 이미 수천 가지 요리를 익혀 둔 요리사라, 여러분이 냉장고 속 재료 몇 개(훈련 행)를 보여 주면 그 자리에서 새 요리를 만들어 낸다 — 다시 학원 갈 필요 없이.

주목도를 끌어올린 구체적 요인은 다음과 같다.

① 출신과 타이밍. google-research 조직 계정에서, 표 파운데이션 모델을 학습 코드가 아니라 "쓸 수 있는 라이브러리 + 사전학습 가중치" 형태로 냈다. 2026-06-29 릴리스 직후 월간 트렌딩에 진입한 따끈한 프로젝트다.
② scikit-learn 드롭인. TabFMClassifier(model).fit(X, y).predict(X_test) — 파이썬 데이터 분석가에게 학습 곡선이 거의 0이다.
③ 이중 백엔드 + HF 가중치. 구글 내부 스택인 JAX/Flax 원본과, 커뮤니티가 쓰기 편한 PyTorch 이식본을 모두 제공하고, 가중치는 Hugging Face Hub(google/tabfm-1.0.0-jax, -pytorch)에 올려 자동 다운로드된다.
④ 코드가 곧 교과서. 뒤에서 보겠지만 PyTorch 이식본(model.py, 약 19KB)은 RoPE·RMSNorm·SwiGLU·Set Transformer 같은 최신 트랜스포머 부품이 한 파일에 응축된 훌륭한 학습 자료다.

3기술 스택 전체 지도

Python 하나로 통일 · JAX 원본과 PyTorch 이식본의 이중 구조 · Bazel + flit 이중 빌드.

이 저장소는 언어 구성이 단순하다 — Python 98.7%, 나머지는 Bazel 빌드 파일(Starlark) 1.3%다. 하지만 그 안에는 "같은 모델을 두 딥러닝 프레임워크로 구현"하는 흥미로운 이중 구조가 들어 있다. 아래 지도를 보자.

① 핵심(공통) 스택 — 프레임워크 무관

영역도구역할
런타임Python ≥ 3.11flax.nnx가 3.11+를 요구 → 하한선이 높음
데이터numpy · pandas · scipy표를 배열/데이터프레임으로 다룸
ML APIscikit-learn 1.6estimator 인터페이스(fit/predict) + 전처리·지표
타입 안전jaxtyping <0.3 · typeguard <3배열 shape/dtype을 타입으로 검증(런타임)
가중치 배포huggingface-hub사전학습 가중치 자동 다운로드
로깅/유틸absl-py구글 표준 로깅·플래그

② JAX 백엔드 — 학습·추론 "원본(source of truth)"

도구버전역할
jax · jaxlib0.10.1수치 연산 + JIT 컴파일 + 자동미분
flax (nnx API)0.12.7신경망 정의 — 모던 nnx 사용(구 linen 아님)
optax0.2.8옵티마이저(학습용)
orbax-checkpoint0.12.0대규모 체크포인트 저장/복원
chex · einops테스트 유틸 · 텐서 축 재배열
jax[cuda12](옵션)pip install tabfm[cuda] 시 GPU 실행

③ PyTorch 백엔드 — 커뮤니티용 "추론 이식본"

도구버전역할
torch2.12.1추론 전용 포트 — 단 하나의 의존성

PyTorch 쪽 의존성이 torch 하나뿐인 게 핵심이다. 학습 스택(optax·orbax…)이 전혀 필요 없다 — 추론만 하기 때문이다. 가중치는 JAX에서 학습된 것을 변환해서 가져온다.

④ 빌드·품질 도구

flitPyPI 패키징 백엔드(pyproject.toml). __version__을 자동으로 버전에 반영
BazelMODULE.bazel·WORKSPACE·BUILD — 구글 내부 표준 빌드. bazel test //...로 전체 테스트
pip-compilerequirements.txt핀 고정 락파일로 자동 생성(재현 가능한 환경)
pyink · pylint구글 스타일 코드 포매터(들여쓰기 2칸, 80열) · 린터
pytest / unittest파이썬 unittest과 Bazel 양쪽으로 테스트 실행 가능
설계 통찰
"왜 JAX와 PyTorch를 둘 다 만들었나?"

구글 리서치의 학습 인프라는 JAX/Flax + TPU다. 그래서 실제 사전학습이 일어난 진짜 모델(원본)은 JAX이고, jax/model.py는 89KB로 학습·추론·flash attention 옵션까지 다 들어 있다. 반면 바깥세상의 대다수 실무자는 PyTorch를 쓴다. 그래서 팀은 pytorch/model.py(19KB)라는 추론 전용 이식본을 따로 손으로 짜서, 두 구현이 ~1e-6(float32) 오차 내로 일치하도록 맞췄다. 가중치는 JAX에서 학습 → 변환 스크립트로 PyTorch state_dict로 바꿔 HF에 업로드한다. "한 모델, 두 생태계"를 지원하는 정석적 방법이다.

4아키텍처 심화 분석

표를 2차원 격자로 보고, "열 방향 ↔ 행 방향" 어텐션을 번갈아 → 마지막에 인컨텍스트 예측.

TabFM의 forward pass를 이해하는 열쇠는 "표는 2차원이다"라는 관찰이다. 글(LLM)은 토큰의 1차원 시퀀스지만, 표는 행(샘플) × 열(특성)의 격자다. TabFM은 이 두 축 각각에 어텐션을 걸어 번갈아 정보를 섞는다. 전체 흐름은 이렇다.

입력: X_train, y_train ← "문맥(예시)" X_test ← "질문" (행=샘플, 열=특성이 섞인 하나의 큰 표로 이어붙임) │ ▼ ┌───────────────────────────────────────────────────────────┐ │ 1) CellEmbedder 각 셀(숫자/범주) → 벡터 │ │ · 숫자열: Fourier 특징 sin/cos + feature grouping │ │ · 범주열: 별도 Fourier 경로 (cat_mask로 선택) │ │ · 훈련 행에만 y 임베딩을 더함 (테스트 행엔 X만) │ │ 출력 텐서 모양: [B, T=행, HC=열+CLS, E=256] │ └───────────────────────────────────────────────────────────┘ │ ▼ ┌───────────────────────────────────────────────────────────┐ │ 2) ColEmbedding #1 ⟵ "열 방향" Set Transformer │ │ · 유도점(inducing points) 256개로 O(n²)→O(n·m) │ │ · 열 순서가 바뀌어도 결과 동일(permutation invariant) │ └───────────────────────────────────────────────────────────┘ │ CLS 토큰 8개를 열 축 앞에 prepend ▼ ┌───────────────────────────────────────────────────────────┐ │ 3) RowInteraction #1 ⟵ "행 방향" Encoder (RoPE 사용) │ │ · 샘플들끼리 서로를 본다 (유사 사례 참고) │ └───────────────────────────────────────────────────────────┘ │ ▼ 4) ColEmbedding #2 → 5) RowInteraction #2 (CLS만 출력) ▼ 결과: 각 행의 요약 표현 reps [B, T, d] │ ▼ ┌───────────────────────────────────────────────────────────┐ │ 6) ICLearning ⟵ 24블록 Encoder (RoPE 없음) │ │ · 훈련 행: reps + y인코딩 / 테스트 행: reps만 │ │ · 어텐션 마스크: "테스트 행은 훈련 행만 참고" │ │ · decoder MLP → 분류 로짓(≤10클래스) 또는 회귀 스칼라 │ └───────────────────────────────────────────────────────────┘ │ ▼ 출력: predict() / predict_proba()
용어
인컨텍스트 러닝 (In-Context Learning, ICL)
모델 가중치를 바꾸지 않고, 입력에 예시를 함께 넣어 과제를 수행하게 하는 방식. LLM에게 "고양이→cat, 개→dog, 새→?"처럼 예시를 주면 "bird"라 답하는 것과 같다. TabFM은 표의 훈련 행들을 이 "예시"로 취급하고, 테스트 행을 "?"로 놓아 한 번의 forward pass에서 답을 뽑는다. 그래서 역전파(학습)가 없다.

핵심 설계 패턴 6가지

패턴 1 — 두 축 어텐션 (열 ↔ 행 교대)

열 방향에는 Set Transformer를 쓴다. 이유가 중요하다: 표에서 열의 순서는 의미가 없다(나이·소득 순서를 바꿔도 같은 표). 그래서 순서에 불변인(permutation invariant) Set Transformer가 적합하다. 반대로 행 방향엔 RoPE를 쓴 일반 Encoder를 써서 샘플 간 상호작용을 학습한다.

패턴 2 — Set Transformer & 유도점(ISAB)

용어
유도점 (Inducing Points) · ISAB
어텐션은 원래 모든 원소가 서로를 봐서 비용이 O(n²)이다. 표는 행·열이 수백~수천이라 부담이 크다. ISAB(Induced Set Attention Block)는 학습되는 "대리 요약점" m개(여기선 256개)를 두고 → 원소들이 먼저 이 요약점과 어텐션(n→m) → 요약점이 다시 원소로 퍼뜨림(m→n). 이렇게 하면 비용이 O(n·m)으로 줄고, 원소 개수 n이 달라져도 유연하게 처리된다. "회의에서 전원이 1:1로 다 대화하는 대신, 대표 256명을 거쳐 소통"하는 셈.
# pytorch/model.py — ISAB 한 눈에 보기
class InducedSelfAttentionBlock(nn.Module):
    def forward(self, src, attn_mask=None):
        ind = self.ind_vectors.expand(src.shape[0], -1, -1)  # 유도점 256개
        hidden = self.mab1(ind, src, src, attn_mask=attn_mask) # 원소→요약점 (n→m)
        return  self.mab2(src, hidden, hidden)                 # 요약점→원소 (m→n)

패턴 3 — 최신 트랜스포머 부품 총집합

어텐션 블록 하나에 요즘 LLM에서 검증된 부품이 알뜰히 박혀 있다.

부품무엇 / 왜
RoPE회전 위치 인코딩(interleaved). 행 축의 "순서/거리"를 어텐션에 주입
RMSNormLayerNorm의 경량판. float32로 계산해 정밀도 확보
SwiGLU게이트가 달린 FFN. silu(gate(x)) * lin(x) — 표현력↑
QK-RMSNormquery·key에 정규화를 걸어 어텐션 안정화
PerDimScale차원별 학습 스케일(softplus). 스케일드 닷프로덕트에 scale=1.0으로 흡수

패턴 4 — Fourier 특징으로 숫자를 인코딩

숫자값 하나(예: 소득 85000)를 그냥 넣으면 신경망이 크기 차이를 다루기 어렵다. TabFM은 값을 여러 주파수의 sin/cos로 펼치는 Fourier 특징(주파수 32개)으로 바꾼다. 또 feature grouping(오프셋 2^i−1로 이웃 열을 묶기)으로 열 간 상호작용의 단서를 준다. 이 sin/cos 계산은 값이 커지면 오차가 누적되므로 반드시 float32로 돌린다.

패턴 5 — 정밀도 규율 & 이중 백엔드 패리티

엔지니어링 하이라이트
"JAX와 PyTorch가 소수점 6자리까지 같아야 한다"

PyTorch 이식본의 주석들은 그 자체로 교육적이다. 예컨대 RoPE 주파수(freqs)를 공식으로 다시 계산하지 않고 체크포인트에서 로드하는데, 이유가 적혀 있다 — "train 시 bf16으로 만든 값을 fp32로 재계산하면 ~1e-3 차이가 나고, 시퀀스가 길수록 오차가 커진다." RMSNorm과 Fourier도 float32로 고정한다. 이런 규율 덕에 트랜스포머 수학이 ~1e-6(float32)로 패리티 검증된다. "두 프레임워크에서 같은 결과"를 지키는 실전 노하우가 코드에 박제돼 있다.

패턴 6 — 메모리 효율 & 패딩 인식

큰 표는 어텐션 중간 텐서가 폭발한다. 그래서 곳곳에 청킹(chunking) 옵션(ffn_chunk_size, row_chunk_size, col_chunk_size)과 전용 memory_efficient_attention.py가 있다. 또 데이터셋마다 특성 수가 다르므로, 실제 특성 수 d를 기준으로 패딩된 열을 어텐션에서 제외하는 마스킹이 세심하게 들어간다.

v1.0.0 아키텍처 설정값(하드코딩)

파라미터의미
embed_dim256기본 임베딩 차원
max_classes10분류 시 최대 클래스 수
col (열)3블록 · 4헤드 · 유도점 256ColEmbedding Set Transformer
row (행)3블록 · 8헤드 · CLS 8 · RoPE base 1e5RowInteraction Encoder
icl24블록 · 8헤드인컨텍스트 예측기 — 가장 깊음
ff_factor4FFN 확장 배수
activationswigluFFN 활성화
feature_group_size3특성 묶음 크기
fourier freq32Fourier 주파수 개수
use_biasfalse선형층 바이어스 제거

분류/회귀는 이 설정을 공유하되 y 인코딩·디코더·손실만 바뀐다. 분류는 y를 원-핫→선형(OneHotAndLinear)으로 인코딩하고 max_classes 로짓을 내며 손실은 cross_entropy. 회귀는 스칼라 y를 작은 MLP로 인코딩하고 값 하나를 내며 손실은 rmse다.

5디렉토리 구조 해부

"공통 sklearn 래퍼 하나 + JAX/PyTorch 두 백엔드 + HF 변환기"의 3분할.

tabfm/ ├── tabfm/ ← 실제 파이썬 패키지 │ ├── __init__.py ← 공개 API. try/except로 설치된 백엔드만 로드 │ │ (JAX 없으면 조용히 건너뜀 → PyTorch만도 OK) │ └── src/ │ ├── classifier_and_regressor.py (116KB!) ← sklearn 래퍼: │ │ 전처리·인코더/스케일러·앙상블·예측 오케스트레이션의 심장 │ ├── jax/ ← ★ 학습+추론 "원본(source of truth)" │ │ ├── model.py (89KB) ← Flax nnx 트랜스포머 전체 정의 │ │ ├── memory_efficient_attention.py (21KB) ← 큰 표용 절약 어텐션 │ │ ├── checkpointing.py ← Orbax 저장/복원 │ │ └── tabfm_v1_0_0.py ← Config + HF 로더(TabFM_HF) │ ├── pytorch/ ← ☆ 추론 전용 이식본 (커뮤니티용) │ │ ├── model.py (19KB) ← 동일 구조를 PyTorch로 포팅 │ │ └── tabfm_v1_0_0.py ← Config + HF 로더(.bin, state_dict) │ └── hugging_face/ ← JAX → PyTorch 가중치 변환·업로드 │ ├── convert_and_upload.py │ └── torch_convert.py ├── examples/ ← classification_example.py / regression_example.py │ (OpenML·TabArena 데이터로 실행) ├── results/ ← 평가 결과 ├── BUILD · MODULE.bazel · WORKSPACE ← Bazel 빌드 3종 세트 ├── pyproject.toml · requirements.txt ← flit 메타 + pip-compile 락파일 ├── conftest.py · .pylintrc ← pytest 설정 · 린트 규칙 └── CHANGELOG.md · CONTRIBUTING.md · LICENSE(Apache-2.0)

세 덩어리로 나눠 읽으면 명료하다.

① 공통 진입점 classifier_and_regressor.py(116KB). 가장 큰 파일이자 사용자가 실제로 만나는 지점이다. TabFMClassifier·TabFMRegressor가 여기 있고, scikit-learn 규약대로 fit()순서형 인코더(범주→정수)·수치 스케일러를 준비하고, predict()/predict_proba()가 표를 모델이 먹는 텐서로 변환→모델 호출→후처리한다. 큰 표를 나눠 넣고 여러 예측을 합치는 앙상블·청킹 조율도 이 파일 몫이다.

② 두 백엔드 jax/·pytorch/. 구조가 데칼코마니다 — 양쪽 다 model.py(신경망)와 tabfm_v1_0_0.py(설정 + HF 로더)를 갖는다. 다만 JAX 쪽이 89KB로 훨씬 크다(학습 로직·flash attention 선택지 포함). PyTorch 쪽은 19KB로 추론 경로만 담아 담백하다.

③ 변환기 hugging_face/. JAX에서 학습된 Orbax 체크포인트를 PyTorch state_dict로 옮기고 Hub에 올리는 스크립트다. PyTorch model.py모듈·파라미터 이름을 JAX와 똑같이 지은 이유가 여기서 드러난다 — 이름이 같아야 변환이 "기계적"으로 된다.

용어
state_dict vs Orbax 체크포인트
state_dict는 PyTorch가 모델 가중치를 {이름: 텐서} 딕셔너리로 저장하는 표준 방식. Orbax는 JAX 생태계의 체크포인트 라이브러리로, TPU·대규모 분산 학습에 맞춰 설계됐다. TabFM은 학습(JAX/Orbax) → 변환 → 배포(양쪽 포맷 모두 HF에 업로드)라는 파이프라인을 갖는다. 그래서 사용자는 huggingface_hub.snapshot_download로 자기 백엔드에 맞는 가중치를 자동으로 받는다.

6학습 포인트 (기술별)

이 저장소에서 "무엇을 배울 수 있는가" — 개념 → 코드 위치 → 실습 아이디어.

학습 포인트 A

표 파운데이션 모델 & 인컨텍스트 러닝 (TabPFN 계보)

"학습 없이 표를 예측한다"는 패러다임 자체가 최신 연구 주제다. TabFM으로 왜 이게 가능한지(합성 데이터로 사전학습 → 문맥으로 일반화)를 체감하고, 원조 격인 TabPFN 논문으로 이어 가면 개념이 단단해진다.

실습: 같은 데이터셋에서 TabFM(학습 0)과 XGBoost(학습 필요)의 정확도·소요 시간을 나란히 재 보기.

학습 포인트 B

최신 트랜스포머 부품을 한 파일에서 읽기

pytorch/model.py(19KB)는 RoPE·RMSNorm·SwiGLU·QK-norm·PerDimScale·SDPA가 응축된 보기 드문 "요약 교과서"다. 거대 LLM 코드는 방대해 엄두가 안 나지만, 여기선 각 부품이 20~40줄짜리 작은 클래스로 나온다.

실습: RMSNorm·RoPE·MultiheadAttention을 한 줄씩 주석 달며 손으로 따라가고, forwardprint(x.shape)를 심어 텐서 모양 변화를 추적.

학습 포인트 C

Set Transformer / ISAB / 순열 불변성

"열 순서가 바뀌어도 결과가 같아야 한다"는 제약을 어떻게 구조로 보장하는지 배운다. Deep Sets → Set Transformer → 유도점(ISAB)으로 이어지는 흐름은 표·집합·점군(point cloud) 등 여러 도메인에 쓰인다.

실습: 유도점 개수(col_num_inds)를 256→64→512로 바꿔 속도/메모리/정확도 트레이드오프 관찰(개념 재현용 미니 구현으로).

학습 포인트 D

JAX/Flax nnx ↔ PyTorch, 같은 모델을 두 프레임워크로

드물게 동일 아키텍처가 두 프레임워크로 병존한다. flax.nnx(모던 JAX API)와 PyTorch의 모듈 정의를 비교하면 두 생태계의 사고방식 차이가 선명하게 보인다.

실습: jax/model.py의 한 블록과 pytorch/model.py의 대응 블록을 나란히 놓고 파라미터 이름이 왜 같은지 확인 → 변환기(torch_convert.py)가 어떻게 이름 매칭으로 동작하는지 추적.

학습 포인트 E

수치 정밀도 & 재현성 엔지니어링

"float32로 정규화", "freqs는 재계산 말고 로드", "bf16 SDPA는 내부 softmax만 fp32" 같은 실전 정밀도 노하우가 주석과 함께 박혀 있다. 두 구현을 1e-6로 맞추는 과정은 그 자체가 훌륭한 사례연구다.

실습: JAX·PyTorch 로더로 같은 입력을 넣고 출력 차이(max abs diff)를 측정 → 어디서 오차가 커지는지 실험.

학습 포인트 F

scikit-learn estimator API 설계 + HF 가중치 배포

"모델을 어떻게 친숙한 인터페이스로 포장하는가"를 배운다. fit/predict/predict_proba 규약, 전처리 파이프라인 내장, 그리고 huggingface-hub로 가중치를 자동 다운로드·캐시하는 배포 패턴(ModelHubMixin, snapshot_download)까지.

실습: 최소한의 BaseEstimator 래퍼를 직접 만들어, 내부 텐서 모델을 sklearn Pipeline·cross_val_score에 물려 보기.

7하드웨어 / 시스템 요구사항

학습 인프라가 필요 없다 — 추론만 하므로 노트북 CPU로도 시작 가능.

항목요구/권장
Python≥ 3.11 (flax.nnx 요구)
백엔드 선택pip install -e .[jax] 또는 .[pytorch]하나만 있어도 됨
CPU작은~중간 표는 CPU로 충분(JAX CPU / torch+cpu). 첫 시작에 권장
GPU선택 — pip install tabfm[cuda](CUDA 12). 큰 표·빠른 추론 시
메모리어텐션이 행²·열²로 커짐 → 큰 표는 *_chunk_size·앙상블로 완화
인터넷최초 1회 — HF에서 가중치 다운로드(google/tabfm-1.0.0-*) 후 캐시
디스크가중치 캐시 공간(HF 캐시 디렉토리)
진입장벽 관점
"학습이 없다 = 무거운 GPU 클러스터가 없다"

일반적인 딥러닝 프로젝트는 학습을 위해 GPU와 긴 시간이 든다. TabFM은 사전학습이 이미 끝난 가중치를 내려받아 추론만 하므로, 개인 노트북에서도 작은 표로 바로 실험할 수 있다. 다만 표가 커질수록(수천 행·수백 열) 어텐션 메모리가 부담되니, 그때 GPU와 청킹 옵션을 꺼내면 된다.

현실적 한계
만능은 아니다

기본 설정상 분류는 최대 10클래스(max_classes=10)를 전제로 하고, 매우 크거나 극단적으로 특성이 많은 표에서는 GBDT가 여전히 유리할 수 있다. "작은~중간 표에서 빠르게 강한 베이스라인을 학습 없이 얻는" 도구로 보는 것이 현실적 기대치다. 또한 갓 나온 v1.0.0이라 API·성능이 더 바뀔 수 있다.

8직접 해볼 수 있는 실습 과제

난이도별로 손을 움직여 보는 6가지.

입문 ★☆☆

과제 1 — 5분 만에 첫 예측 돌려 보기

PyTorch 백엔드로 설치 후 README의 분류 예제를 그대로 실행한다.

# 설치
git clone https://github.com/google-research/tabfm.git
cd tabfm && pip install -e .[pytorch]

# 실행 (examples/)
python examples/classification_example.py

predict_proba()가 내놓는 클래스별 확률을 관찰하고, 훈련 행을 몇 개 지워 보며 예측이 어떻게 흔들리는지 감을 잡는다("문맥이 곧 학습"임을 체감).

과제 2 — 내 CSV로 vs XGBoost 대결

숫자·범주가 섞인 내 데이터(또는 OpenML 데이터)를 TabFMClassifierfit/predict하고, 같은 데이터로 XGBoost를 학습해 정확도와 총 소요 시간을 비교한다. "학습 0"의 위력(또는 한계)을 직접 확인.

중급 ★★☆

과제 3 — 두 백엔드 패리티 측정

JAX 로더와 PyTorch 로더로 동일한 입력을 넣고 출력 로짓의 max|Δ|를 잰다. README의 백엔드 전환 주석(OPTION A/B)을 활용. 이론상 ~1e-6인지 눈으로 확인하고, dtype을 bf16↔fp32로 바꿔 오차가 어떻게 변하는지 실험.

과제 4 — model.py 해부 노트 만들기

pytorch/model.py를 위에서 아래로 읽으며 RMSNorm → RoPE → MultiheadAttention → MAB → ISAB → SetTransformer → Encoder → CellEmbedder → ICLearning → TabFM 순으로 각 클래스의 입력/출력 텐서 모양을 표로 정리한다. forward에 shape 프린트를 심어 실제와 대조.

고급 ★★★

과제 5 — 큰 표에서 메모리 프로파일링

행·열을 점점 키우며 어텐션 메모리가 어떻게 폭증하는지 측정하고, row_chunk_size·col_chunk_size·ffn_chunk_size를 설정해 피크 메모리 vs 속도 곡선을 그린다. 청킹이 결과값은 바꾸지 않고 메모리만 줄이는지 검증.

과제 6 — ISAB 미니 재구현

순수 PyTorch로 ISAB 블록을 60줄 안에 재구현하고, 유도점 수 m을 바꿔 가며 O(n²) 풀 어텐션과 속도·근사 품질을 비교한다. "왜 표에 순열 불변 구조가 필요한가"를 토이 데이터로 실증.

9관련 기술 심화 학습 로드맵

표 ML 기초에서 시작해 "미니 표 ICL 모델"까지 8주.

주차주제핵심 질문 / 산출물
1주표 데이터 ML 기초scikit-learn·XGBoost·LightGBM 훑기. "왜 표는 오랫동안 딥러닝이 약했나?"
2주Transformer & Attentionself-attention·multi-head 직접 구현. Q·K·V가 뭔지 손으로
3주인컨텍스트 러닝 & TabPFNTabPFN 논문 정독. "학습 없이 예측"의 메커니즘 이해
4주Set Transformer / ISABDeep Sets → 순열 불변성 → 유도점. 왜 열에 쓰는가
5주모던 LLM 부품RoPE·RMSNorm·SwiGLU·Flash Attention 논문+구현
6주JAX/Flax nnx 입문PyTorch와 대조하며 같은 MLP를 양쪽으로
7주가중치 관리·재현성Orbax·HF Hub·정밀도(bf16/fp32)·패리티 검증
8주종합 프로젝트작은 표에 대한 미니 ICL 예측기를 스스로 조립
학습 순서 팁

이 로드맵의 3주(TabPFN)와 4주(Set Transformer)가 심장이다. 이 둘을 이해하면 TabFM의 "왜"가 대부분 풀린다. 5주 부품들은 "어떻게"에 해당하니, 코드를 읽다 막힐 때마다 해당 부품 논문으로 잠깐 다녀오는 필요 기반 학습을 추천한다. 전부 선행 학습하려 들면 지친다.

10핵심 키워드 사전

문서에 등장한 용어를 한 곳에.

키워드한 줄 뜻
Tabular data행(샘플)×열(특성)로 된 표 형식 데이터. 산업 ML의 다수
Foundation Model크게 사전학습해 여러 과제에 재사용하는 범용 모델
In-Context Learning가중치를 안 바꾸고 입력에 예시를 넣어 과제 수행
Zero-shot대상 데이터로 재학습 없이 바로 예측
TabPFN"트랜스포머로 표를 ICL"의 원조 격 연구. TabFM의 계보
GBDT그래디언트 부스팅 결정트리(XGBoost·LightGBM). 표 ML의 전통 강자
Set Transformer집합(순서 무관) 입력용 트랜스포머. 열 축에 사용
ISAB / 유도점학습되는 요약점 m개로 어텐션 비용 O(n²)→O(n·m)
Permutation invariance입력 순서를 바꿔도 출력 동일 — 열 순서 무관성 보장
RoPE회전 위치 인코딩. 행 축의 위치/거리를 주입
RMSNorm경량 정규화층. 여기선 float32로 계산해 정밀도 확보
SwiGLU게이트 달린 FFN 활성화. 표현력↑
QK-norm / PerDimScale어텐션 안정화용 정규화·차원별 스케일(softplus)
Fourier features숫자값을 여러 주파수 sin/cos로 펼쳐 인코딩
SDPAScaled Dot-Product Attention(PyTorch 내장, flash 백엔드 활용)
JAX / Flax nnx구글의 수치연산+신경망 프레임워크. 학습 원본
OrbaxJAX 생태계의 대규모 체크포인트 라이브러리
Hugging Face Hub사전학습 가중치를 올리고 자동 다운로드하는 허브
state_dictPyTorch의 {이름:텐서} 가중치 저장 표준
Bazel / flit구글식 빌드 시스템 / 파이썬 PyPI 패키징 백엔드

11참고 링크

원본과 배경 지식.

프로젝트 원본

· GitHub: github.com/google-research/tabfm (Apache-2.0, v1.0.0 · 2026-06-29)
· 가중치(JAX): huggingface.co/google/tabfm-1.0.0-jax
· 가중치(PyTorch): huggingface.co/google/tabfm-1.0.0-pytorch
· 예제: examples/classification_example.py · examples/regression_example.py

배경 개념(검색 키워드)

· TabPFN — "A Transformer That Solves Small Tabular Classification Problems in a Second"(ICLR 2023) / 후속 Nature 2025
· Set Transformer — Lee et al., 2019 (ISAB·유도점)
· Deep Sets — Zaheer et al., 2017 (순열 불변성)
· RoPE — RoFormer(Su et al.) · RMSNorm(Zhang & Sennrich) · SwiGLU(Shazeer, "GLU Variants")

프레임워크 문서

· Flax nnx 문서(모던 JAX 신경망 API) · Orbax 체크포인트 · Hugging Face Hub(ModelHubMixin)
· scikit-learn "Developing scikit-learn estimators"(BaseEstimator 규약)