오목 엔진 Rapfi 해부 Part 2: Rapfi 와 KataGo, 같은 문제를 반대로 푸는 두 엔진
이 글은 Claude Opus 5.5 을 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.
Part 1 에서 오목·렌쥬 오픈소스 생태계의 최상위권이 Rapfi 와 KataGomo 두 갈래라고 했습니다. KataGomo 는 바둑 엔진 KataGo 를 오목용으로 고친 것입니다. 이번 편은 두 엔진을 나란히 놓습니다.
결론부터 말하면 두 엔진은 같은 목표를 정반대의 트레이드오프로 풉니다.
- Rapfi: 평가를 극단적으로 싸게 만들고, 그만큼 깊고 빠르게 읽습니다. CPU 한 코어에서 초당 수십만 노드입니다.
- KataGo / KataGomo: 평가를 비싸고 정확하게 만들고, 그 평가가 가리키는 곳만 골라서 읽습니다. GPU 에서 초당 수천 번입니다.
1. KataGo 는 무엇인가#
KataGo 는 David J. Wu(lightvector)가 만든 바둑 엔진이고, 가장 널리 쓰이는 AlphaZero 계열 공개 바둑 엔진 중 하나입니다. 2026-08-30 에 v1.18.2 가 나왔습니다.
1.1 알고리즘#
- 탐색: MCTS(몬테카를로 트리 탐색)의 PUCT 변형입니다. 각 시뮬레이션이 “정책(어디에 둘 만한가) × 탐색 보너스 + 지금까지의 평균 가치” 가 가장 큰 자식을 따라 내려가고, 잎에서 신경망을 한 번 부른 뒤 결과를 거슬러 올립니다.
- 평가: 정책과 가치를 함께 내는 큰 잔차 신경망(ResNet)입니다. v1.17 부터는 트랜스포머 신경망도 지원하고, 주 학습 런이 그쪽으로 옮겨 가는 중입니다.
- 학습: 사람 기보 없이 자가대국으로 강화학습합니다. 지금은 katagotraining.org 에서 분산 학습합니다.
KataGo 논문 (2019년 초판, 2020년 v5)은 AlphaZero 대비 계산량을 50배 줄였다 고 주장하고, 그 근거로 게임에 무관한 기법 넷을 듭니다.
| 기법 | 한 줄 설명 |
|---|---|
| Playout cap randomization | 일부 수만 깊게 탐색해 학습 데이터로 쓰고 나머지는 얕게 빨리 둡니다 |
| Forced playouts + policy target pruning | 탐색 초기에 후보를 강제로 방문시키고, 학습 목표에서는 그 강제분을 걷어 냅니다 |
| Global pooling | 판 전체의 정보를 모아 각 칸의 판단에 섞습니다 |
| Auxiliary policy targets | 상대의 다음 수 등 보조 목표를 함께 학습합니다 |
바둑 전용 기법(집 소유권·점수 예측)도 따로 있습니다. 논문은 “AlphaZero 는 게임 전용 입력 특징 없이도 성공했지만, 그런 특징을 넣으면 여전히 학습이 크게 좋아진다” 고 적는데, 이 문장은 뒤에서 오목 이야기를 할 때 다시 나옵니다.
1.2 하드웨어와 인터페이스#
- 백엔드: OpenCL, CUDA, TensorRT, ROCm, ONNX Runtime, Eigen(CPU), 그리고 macOS 의 Metal 입니다. README 는 CPU 용 Eigen 이 GPU 보다 “상당히 느리지만 좋은 CPU 에서 작은 신경망이면 초당 10~20 플레이아웃” 이 나온다고 적습니다. GPU 가 전제인 엔진 입니다.
- 프로토콜: 바둑 표준인 GTP 와, 서버 백엔드용으로 설계된 JSON 분석 엔진 을 제공합니다. 분석 엔진은 한 줄짜리 JSON 질의를 비동기로 받아 여러 국면을 GPU 배치로 묶어 처리합니다.
- 라이선스: MIT 계열의 허용적 라이선스입니다.
2. KataGomo: KataGo 의 오목판#
KataGomo 는 Zhiyang Hang(hzyhhzy)이 KataGo 를 여러 보드게임으로 옮긴 저장소입니다. 게임마다 브랜치가 따로 있고, 오목(자유룰·표준)과 렌쥬는 Gom2024 브랜치입니다. 2025년 1월에 독립 저장소로 옮겼습니다.
KataGo 를 오목에 옮기면서 덧붙인 것을 보면 흥미롭습니다. Gom2024 브랜치에는 다음이 추가되어 있습니다.
cpp/vcfsolver/— VCF(연속 사로 이기기) 솔버cpp/forbiddenPoint/— 렌쥬 금수 판정기cpp/command/gomprotocol.cpp— Piskvork 프로토콜 처리
Gomocup 2021 소개문은 KataGomo 가 “엄격한 VCF 솔버를 추가하고, VCF 특징을 입력으로 받는 새 신경망” 을 썼다고 적습니다. 순수한 AlphaZero 방식의 엔진조차 오목에서는 전용 전술 탐색기를 붙였다 는 점이 이 비교의 핵심 단서입니다.
강도와 속도에 대해서는 저자가 릴리스 노트에 직접 적은 수치가 있습니다.
- 2025-02 릴리스
Gomoku_20250206은 b28c512nbt 신경망(28블록 512채널)을 제공합니다. - 같은 신경망이 RTX 4090 에서 초당 약 5,000 방문 입니다.
- Gomocup 용 단일 스레드 CPU 버전 은 1/50 크기의 b10c128nbt 신경망으로 초당 약 40 방문입니다.
- 저자는 GPU 풀버전이 이 CPU 버전보다 “1000~1500 Elo 강하다” 고 적었습니다. 저자 본인의 추정이고 측정값이라고 밝히지는 않았습니다.
KataGomo 는 Gomocup 2025 에 나오지 않았습니다. 릴리스 노트의 이유는 “Gomocup 은 룰마다 다른 엔진을 제출하는 것을 허용하지 않는다” 였습니다. 2026년에 돌아와 Rapfi 가 우승한 5개 리그에서 모두 2위를 했습니다.
3. 나란히 놓고 보기#
| 항목 | KataGo (바둑) | KataGomo (오목) | Rapfi |
|---|---|---|---|
| 탐색 | MCTS (PUCT) | MCTS (PUCT) + VCF 솔버 | 알파-베타 (PVS) + VCF 잎 탐색. MCTS 는 선택 사항 |
| 평가 | 큰 ResNet·트랜스포머 | KataGo 신경망 (b28c512nbt 등) | 초경량 NNUE (Mixnet) + 패턴 기반 고전 평가 |
| 주 하드웨어 | GPU | GPU (CPU 판은 크게 약함) | CPU SIMD (SSE/AVX2/AVX-512/NEON/WASM SIMD) |
| 속도 (단위가 다름) | CPU 에서 초당 10~20 플레이아웃 | GPU 에서 초당 약 5,000 방문 | CPU 1코어에서 초당 수십만 노드 |
| 학습 | 자가대국 강화학습 (분산) | 자가대국 강화학습 | KataGomo 기보 + ResNet 교사 신경망으로 증류 |
| 프로토콜 | GTP, JSON 분석 엔진 | Piskvork | Piskvork + Yixin-Board 확장 |
| 브라우저 | 공식 WASM 빌드 없음 | 없음 | 공식 WASM 빌드 (Gomocalc 가 사용) |
| 라이선스 | MIT 계열 | MIT 계열 | GPLv3 (가중치는 CC0) |
속도 행의 단위가 서로 다르다는 점에 주의하십시오. MCTS 의 “방문(visit)” 한 번은 신경망 평가 한 번이고, 알파-베타의 “노드” 하나는 대개 그보다 훨씬 싼 연산입니다. Rapfi 는 고전 평가가 탐색 창에서 멀리 벗어난 노드에서는 신경망을 아예 부르지 않기도 합니다(Part 3). 그래서 이 숫자들을 직접 나누어 “몇 배 빠르다” 고 말할 수는 없습니다.
같은 탐색 알고리즘에서 신경망만 바꿔 잰 공정한 비교는 Rapfi 논문의 Table 1 에 있습니다.
| 모델 | 추론 FLOPs (천) | 가중치 크기 | MCTS 플레이아웃/초 | 알파-베타 노드/초 |
|---|---|---|---|---|
| Mixnet small | 51 | 28.4 MiB | 47,575 | 428K |
| Mixnet medium | 131 | 54.7 MiB | 36,823 | 257K |
| Mixnet large | 381 | 111 MiB | 18,401 | 104K |
| ResNet 6b96f | 225,396 | 3.81 MiB | 297 | 484 |
| ResNet 20b256f | 5,318,727 | 90.0 MiB | 11 | 32 |
Mixnet small 과 ResNet 6b96f 를 비교하면 계산량은 약 4,400배, 알파-베타 탐색 속도는 약 880배 차이입니다. 반대로 Mixnet 은 가중치(대부분 미리 계산한 codebook)가 훨씬 큽니다. 계산을 메모리로 바꾼 설계 입니다.
논문은 정확도도 공정하게 적습니다. Mixnet 의 가치 예측은 ResNet 6b96f 급이지만, 정책 예측은 가장 큰 Mixnet 도 ResNet 4b64f 수준에 겨우 다가간다고 합니다. 한 번의 판단은 덜 정확하지만 수백 배 많이 판단한다 는 것이 Rapfi 쪽의 내기입니다.
4. 왜 오목에서는 이 내기가 통하는가#
아래는 1차 출처가 뒷받침하는 사실과 그로부터의 추론을 구분해 적은 것입니다.
출처가 뒷받침하는 사실
- 오목은 위협 공간 탐색(threat-space search)과 증명수 탐색으로 이미 풀렸습니다 (Allis 외, 1993~1996). 사(4)와 삼(3)으로 상대의 응수를 강제하는 수순을 좁게 파고드는 탐색이 이 게임에서 특히 강력하다는 뜻입니다.
- Rapfi 논문은 VCF 잎 탐색이 “방어 측에 단 하나의 응수만 허용하는 공격 수만 고려하므로 분기 수를 줄이고, 순수한 평가 모델로는 찾을 수 없는 숨은 전술 경로를 찾는다” 고 설명합니다.
- 같은 논문은 증분 업데이트가 “깊이 우선 탐색과 결합할 때 특히 빨라지며”, 알파-베타 탐색이 “깊이 우선 순회 덕분에 훨씬 높은 강도를 보였다” 고 보고합니다.
- MCTS 진영의 KataGomo 도 VCF 솔버와 VCF 입력 특징을 추가했습니다.
추론 (출처에 이 표현으로 적혀 있지는 않음)
- 오목의 결정적 순간은 대부분 강제 수순 입니다. 사를 두면 상대는 한 곳만 막을 수 있으므로 분기 수가 1에 가깝고, 이런 수순은 통계적으로 표본을 뽑기보다 정확히 끝까지 읽는 편 이 낫습니다.
- 한 수가 바꾸는 것은 돌 하나이고, 오목의 평가는 그 돌이 지나는 네 방향의 선 모양 에 크게 좌우됩니다. 바뀐 선만 다시 계산하는 증분 평가가 바둑보다 훨씬 잘 맞습니다.
- 바둑은 사활과 집처럼 판 전체를 봐야 하는 판단이 많고, 이런 판단은 큰 신경망의 전역 풀링이 잘하는 일입니다. KataGo 가 집 소유권·점수 같은 보조 목표를 둔 이유이기도 합니다.
flowchart LR
H0[" "]:::hdr
H1["평가가 싸다<br/>(초당 수십만)"]:::hdr
H2["평가가 비싸다<br/>(초당 수천)"]:::hdr
R1["강제 수순이<br/>승부를 가름"]:::hdr
A["오목의 Rapfi<br/>깊게 읽어<br/>수순을 확인"]
B["오목의 KataGomo<br/>VCF 솔버를<br/>따로 붙여 보완"]
R2["전역 판단이<br/>승부를 가름"]:::hdr
C["바둑의 고전 엔진<br/>평가가 부정확해<br/>한계"]
D["바둑의 KataGo<br/>정확한 평가로<br/>골라 읽음"]
H0 ~~~ H1 ~~~ H2
R1 ~~~ A ~~~ B
R2 ~~~ C ~~~ D
classDef hdr fill:none,stroke:none,color:#dddddd
style A fill:#FFD700,color:#000000
style B fill:#87CEEB,color:#000000
style C fill:#555555,color:#999999
style D fill:#90EE90,color:#000000
5. 그래서 누가 더 강한가#
이 질문에 1차 출처가 답하는 범위는 좁습니다.
| 조건 | 판정 | 근거 |
|---|---|---|
| CPU 1코어, 대회 시간 제한 | Rapfi 우세 | Gomocup 2022~2026. 2026년에도 5개 리그 모두 Rapfi 1위, KataGomo 2위 |
| CPU 전용, 제한된 자원 | Rapfi 가 약 400 Elo 우세 | Rapfi 논문 §5.3. KataGomo 를 CPU 버전으로 돌림 |
| 강한 GPU 를 쓰는 KataGomo 풀버전 대 멀티코어 Rapfi | 확인 불가 | 두 엔진을 이 조건에서 맞붙인 1차 자료를 찾지 못했습니다 |
KataGomo 저자는 GPU 풀버전이 CPU 버전보다 1000~1500 Elo 강하다고 추정했고, 논문의 +400 은 CPU 버전 기준입니다. 두 숫자를 이어 붙이면 GPU KataGomo 가 더 강하다는 결론이 나올 것 같지만, 앞의 숫자는 측정값이 아니고 두 숫자의 기준 조건(시간, 오프닝, 스레드 수)도 다릅니다. 그래서 이 글은 “CPU 조건에서는 Rapfi 가 가장 강하다” 까지만 말합니다.
2026년 Gomocup 자유룰-15 에서 두 엔진의 차이가 9 Elo 였다는 점도 기억해 둘 만합니다. 대회 조건에서도 격차는 벌어지는 중이 아니라 좁혀지는 중일 수 있습니다.
6. 경쟁자이자 협력자#
두 엔진의 관계는 단순한 라이벌이 아닙니다.
flowchart TB
KG["KataGo<br/>(바둑, lightvector)"] -->|"포크"| KM["KataGomo<br/>(hzyhhzy)"]
KM -->|"자가대국 기보<br/>약 3,080만 국면"| DS["학습 데이터"]
DS --> T["ResNet-6b128f<br/>교사 신경망"]
DS --> M["Mixnet<br/>(Rapfi NNUE)"]
T -->|"지식 증류"| M
M --> R["Rapfi"]
SF["Stockfish<br/>(체스)"] -->|"탐색 코드 일부"| R
style R fill:#FFD700,color:#000000
style KM fill:#87CEEB,color:#000000
- Rapfi 논문의 학습 데이터는 “KataGomo 가 몇 주에 걸쳐 AlphaZero 식 자가대국으로 만든” 약 3,080만 국면입니다.
- Mixnet 은 같은 데이터로 학습한 ResNet-6b128f 를 교사로 삼아 지식 증류(knowledge distillation) 로 학습합니다.
- KataGomo 저자는 Rapfi 논문의 공저자이고 Rapfi AUTHORS 파일에도 올라 있습니다. Gomocup 2022 소개문도 Rapfi 의 첫 NNUE 가 KataGomo 기보로 학습했다고 적었습니다.
정리하면 KataGomo 가 GPU 로 비싸게 얻은 지식을 Rapfi 가 CPU 에서 싸게 쓸 수 있는 형태로 압축한 구조입니다. 바둑의 KataGo 에서 시작한 강화학습의 성과가 오목의 KataGomo 를 거쳐, 체스 엔진 Stockfish 에서 빌려 온 탐색 뼈대 위에 얹힌 것이 Rapfi 입니다.
7. 어느 쪽을 고를 것인가#
엔진을 가져다 무언가를 만들 사람의 관점에서 정리하면 다음과 같습니다. 자세한 고려사항은 Part 5 에서 다룹니다.
| 상황 | 권장 | 이유 |
|---|---|---|
| 브라우저 안에서 돌리고 싶다 | Rapfi | 공식 WASM 빌드와 Gomocalc 라는 선례가 있습니다 |
| GPU 없는 서버, 낮은 대국당 비용 | Rapfi | CPU 1코어에서 대회 최상위 강도입니다 |
| GPU 서버가 있고 최고 강도의 분석이 목표 | KataGomo 검토 | GPU 에서의 우열은 확인되지 않았으므로 직접 대국시켜 재 봐야 합니다 |
| 엔진을 고쳐서 앱에 넣어 배포 | 라이선스 검토 필수 | Rapfi 는 GPLv3, KataGomo 는 MIT 계열입니다 |
다음 편에서는 Rapfi 가 한 수를 고르기까지 무슨 일을 하는지 소스 코드를 따라가 봅니다.
References#
1차 출처 (2025~2026)#
- Jin, Duan, Hang, “Rapfi: Distilling Efficient Neural Network for the Game of Gomoku”, arXiv:2503.13178 (2025-03-17), Table 1, §5.2~5.3, Appendix A.4: https://arxiv.org/abs/2503.13178
- KataGo 저장소·README (v1.18.2, 2026-08-30): https://github.com/lightvector/KataGo
- KataGo 분석 엔진 문서: https://github.com/lightvector/KataGo/blob/master/docs/Analysis_Engine.md
- KataGomo 저장소: https://github.com/hzyhhzy/KataGomo
- KataGomo 릴리스
Gomoku_20250206: https://github.com/hzyhhzy/KataGomo/releases/tag/Gomoku_20250206 - KataGomo 릴리스
gomocup2025(CPU/GPU 속도·강도 추정, Gomocup 2025 불참 사유): https://github.com/hzyhhzy/KataGomo/releases/tag/gomocup2025 - Gomocup 2026 결과: https://gomocup.org/results/gomocup-result-2026
- Rapfi 저장소 (master
3c94c2a): https://github.com/dhbloo/rapfi
배경 자료 (구자료, 연도 명시)#
- David J. Wu, “Accelerating Self-Play Learning in Go”, arXiv:1902.10565 (2019, v5 2020): https://arxiv.org/abs/1902.10565
- Gomocup 2021 결과 (KataGomo 의 VCF 솔버 도입): https://gomocup.org/results/gomocup-result-2021
- Gomocup 2022 결과 (Rapfi 의 첫 NNUE 가 KataGomo 기보로 학습): https://gomocup.org/results/gomocup-result-2022
- L.V. Allis, H.J. van den Herik, M.P.H. Huntjens, “Go-Moku Solved by New Search Techniques” (1993/1996): https://cdn.aaai.org/Symposia/Fall/1993/FS-93-02/FS93-02-001.pdf