FlipSight 의 자체 오델로 AI 엔진, FlipMind 를 소개합니다
페이지 정보
본문
FlipSight 는 앱 v2.0.4 까지 Edax 4.5.6(okuhara 님의 edax-reversi-AVX)을 기반 엔진으로 써 왔습니다. 속도와 강도 모두 아주 만족스러운 엔진이었는데요. 이번에 안티, 팔각, 10×10 같은 변형 오델로의 봇을 만들면서 자체 대국 데이터로 평가 함수를 직접 학습시키고 만들게 되었고, 이 경험을 바탕으로 스탠다드 오델로도 자체 엔진을 만들어 보면 어떨까 하는 생각이 들어 오델로 AI 엔진 FlipMind 를 개발하게 되었습니다.
FlipMind 는 이렇게 만들었습니다
- 평가 함수는 학습으로 직접 만들었습니다. 변형 오델로는 FlipSight 의 자체 대국 데이터로, 스탠다드 오델로는 Egaroucid 의 학습 데이터와 자체 대국 데이터로 학습했습니다. Egaroucid 의 데이터는 스탠다드 오델로 평가 함수를 만드는 데 정말 큰 도움이 되었습니다. 이렇게 방대한 데이터를 공개해 주신 Takuto Yamana 님께 감사드립니다.
- 탐색 로직도 직접 구현했습니다. 알려진 탐색 방법들은 참고하되, 기존 엔진의 코드는 쓰지 않고 직접 작성했습니다. Logistello, Edax, Egaroucid 의 기술 자료와 okuhara 님의 edax-reversi-AVX SSE/AVX 최적화 자료가 많은 도움이 되었습니다.
- 결과: 평가 파일 크기를 Edax 와 비슷한 약 14MB 로 유지하면서, 기존 Edax 를 상대로 평균 승률 60% 이상을 기록했습니다. 속도도 가장 좋은 수를 찾는 BEST 모드에서는 고성능 Edax AVX 버전과 비슷한 수준을 유지했고, 분석 화면에서 많이 쓰는 모든 수의 평가값 구하기(ALL 모드)는 크게 빨라졌습니다.
- 웹은 네이티브 앱보다 계산 속도가 느리지만, 같은 엔진과 평가 함수를 쓰기 때문에 같은 레벨에서는 강도 차이가 없습니다.
※ 학습 데이터 인용: Yamana, Takuto. Egaroucid Free Training Data. https://www.egaroucid.nyanyan.dev/en/technology/train-data/
벤치마크
비교 대상으로는 대표적인 오픈소스 오델로 엔진인 Edax 4.5.6 과 Egaroucid 7.8.2 를 썼습니다.
속도
아래 세 가지 종반 문제 묶음을 두 가지 모드로 쟀습니다.
- Edax 16: Edax 의 성능 측정 명령(bench)이 쓰는 종반 16국면입니다. 빈칸 20~23칸. 국면 출처: Edax bench 생성 코드, 생성된 16국면
- FFO 33~51: FFO 종반 시험 국면 33~51번(19국면)입니다. 빈칸 20~27칸. 공식 파일: fforum-20-39.obf(#33~#39), fforum-40-59.obf(#40~#51)
- FFO 40~59: 오델로 엔진의 종반 성능을 비교할 때 널리 쓰는 FFO 종반 시험 국면 40~59번(20국면)입니다. 빈칸 20~34칸으로, 세 묶음 가운데 가장 깁니다. 모든 수 평가(ALL)는 한 회차에 시간이 너무 오래 걸려 이 묶음에서는 재지 않았습니다. 공식 파일: fforum-40-59.obf
※ FFO 종반 시험 국면은 프랑스 오델로 연맹(FFO) 포럼에 공개된 종반 문제 모음입니다.
- BEST: 가장 좋은 수와 그 수의 평가값을 구하는 모드(대전에서 사용). 다른 수는 가장 좋은 수보다 낫지 않다는 것만 확인하고, 정확한 평가값은 구하지 않습니다.
- ALL: 둘 수 있는 모든 수 각각의 정확한 평가값을 구하는 모드(분석에서 사용)
분석 화면에서는 후보 수마다 평가값을 보여 줘야 하므로 ALL 모드의 속도도 중요합니다.
표의 시간을 누르면 그 엔진의 국면별 결과와 원본 출력을 볼 수 있습니다.
x86 AVX2 빌드 (AMD Ryzen 5 5600X)
| 문제 | 모드 | FlipMind 1.0.0 AVX2 | Edax 4.5.6 공식 AVX2 (x86-64-v3) | Egaroucid 7.8.2 공식 SIMD AMD (AVX2) |
|---|---|---|---|---|
| Edax 16 | BEST | 2.497초 | 2.630초 | 2.151초 |
| FFO 33~51 | BEST | 5.198초 | 5.281초 | 5.923초 |
| FFO 40~59 | BEST | 48.869초 | 46.027초 | 51.836초 |
| Edax 16 | ALL | 9.508초 | 15.192초 | 18.025초 |
| FFO 33~51 | ALL | 23.856초 | 27.711초 | 40.458초 |
12스레드, 엔진별로 3바퀴 돌린 평균.
※ 측정 결과는 운영체제, CPU, 빌드 옵션 등 환경에 따라 달라질 수 있습니다. 이 CPU 는 SMT(하이퍼스레딩)를 쓰는 6코어 12스레드 CPU 입니다.
ARM64 빌드 (Apple M4)
FlipSight 의 iOS, Android 앱은 이 ARM64 빌드를 씁니다.
| 문제 | 모드 | FlipMind 1.0.0 arm64 (NEON) | Edax 4.5.6 arm64 (NEON) | Egaroucid 7.8.2 arm64 Generic |
|---|---|---|---|---|
| Edax 16 | BEST | 2.841초 | 3.316초 | 2.370초 |
| FFO 33~51 | BEST | 5.668초 | 6.966초 | 5.978초 |
| FFO 40~59 | BEST | 60.107초 | 66.698초 | 60.771초 |
| Edax 16 | ALL | 11.884초 | 19.827초 | 19.074초 |
| FFO 33~51 | ALL | 22.768초 | 33.606초 | 41.005초 |
MacBook (Apple M4, 10코어), 10스레드, 엔진별로 3바퀴 돌린 평균. macOS 용 공식 실행 파일이 없어 세 엔진 모두 공식 소스를 이 Mac 에서 arm64 로 빌드했습니다.
웹 빌드 (WASM)
Edax 는 공식 WASM 빌드가 없어, FlipSight에서 직접 만들어 사용했었습니다.
| 문제 | 모드 | FlipMind 1.0.0 WASM (SIMD128) | Edax 4.5.6 WASM (자체 빌드) | 차이 |
|---|---|---|---|---|
| Edax 16 | BEST | 4.568초 | 9.893초 | 2.17배 빠름 |
| FFO 33~51 | BEST | 9.552초 | 20.542초 | 2.15배 빠름 |
| FFO 40~59 | BEST | 87.612초 | 182.874초 | 2.09배 빠름 |
| Edax 16 | ALL | 16.954초 | 51.911초 | 3.06배 빠름 |
| FFO 33~51 | ALL | 44.884초 | 154.250초 | 3.44배 빠름 |
Chrome 157, 두 엔진 모두 8스레드, 3바퀴 평균, 모든 국면 점수 일치. 같은 PC(Ryzen 5 5600X). 멀티스레드 웹 빌드입니다.
※ Edax 는 WASM SIMD 용 코드가 없어, 웹에서는 SIMD 없이 빌드한 Edax 를 썼습니다. FlipMind 는 평가 함수 계산을 특정 CPU 명령에 묶이지 않은 일반 벡터 타입으로 짜서, 같은 소스가 AVX2(x86), NEON(ARM), SIMD128(웹)으로 그대로 적용됩니다.
강도
레벨 1, 5, 10, 15, 20 에서 XOT 시작 국면으로 레벨마다 2,000판씩 비교 대국을 했습니다. 같은 시작 국면을 흑과 백으로 한 판씩 두고, 두 판의 돌 차를 합쳐 한 번의 승, 무, 패로 셉니다(레벨마다 1,000번). 북은 쓰지 않았습니다.
평가 함수 파일 크기: FlipMind 약 14MB, Edax 약 14MB, Egaroucid 약 39MB(평가 38MB + 종반 수 정렬용 0.5MB).
| 레벨 | 상대 | 횟수 (2판씩) | 승 / 무 / 패 | FlipMind 승률 |
|---|---|---|---|---|
| 1 | Edax 4.5.6 | 1,000 | 636 / 20 / 344 | 64.6% |
| 5 | Edax 4.5.6 | 1,000 | 604 / 33 / 363 | 62.1% |
| 10 | Edax 4.5.6 | 1,000 | 583 / 68 / 349 | 61.7% |
| 15 | Edax 4.5.6 | 1,000 | 587 / 128 / 285 | 65.1% |
| 20 | Edax 4.5.6 | 1,000 | 522 / 203 / 275 | 62.4% |
| 1 | Egaroucid 7.8.2 | 1,000 | 496 / 29 / 475 | 51.1% |
| 5 | Egaroucid 7.8.2 | 1,000 | 549 / 29 / 422 | 56.4% |
| 10 | Egaroucid 7.8.2 | 1,000 | 531 / 80 / 389 | 57.1% |
| 15 | Egaroucid 7.8.2 | 1,000 | 428 / 165 / 407 | 51.1% |
| 20 | Egaroucid 7.8.2 | 1,000 | 422 / 202 / 376 | 52.3% |
※ 같은 레벨이어도 세부 설정은 엔진마다 조금씩 다릅니다. 레벨 1, 5, 10 은 세 엔진 모두 같은 조건입니다. 중반은 레벨만큼의 깊이를 100% 로 읽고, 빈칸 2 × 레벨부터 완전읽기를 합니다. 레벨 15, 20 은 종반 직전 구간을 끝까지 읽을 때의 신뢰도가 엔진마다 다릅니다. 신뢰도가 높을수록 시간은 더 걸리지만 더 정확합니다.
레벨 15
| 빈칸 | FlipMind 1.0.0 | Edax 4.5.6 | Egaroucid 7.8.2 |
|---|---|---|---|
| 28 이상 | 중반 깊이 15 (75%) | 중반 깊이 15 (73%) | 중반 깊이 15 (74%) |
| 25~27 | 끝까지 85% | 끝까지 87% | 끝까지 98% |
| 23~24 | 끝까지 98% | 끝까지 98% | 끝까지 99% |
| 22 | 끝까지 98% | 끝까지 98% | 완전읽기 |
| 21 이하 | 완전읽기 | 완전읽기 | 완전읽기 |
| 한 판 평균 시간 | 1.17초 | 1.96초 | 1.95초 |
레벨 20
| 빈칸 | FlipMind 1.0.0 | Edax 4.5.6 | Egaroucid 7.8.2 |
|---|---|---|---|
| 31 이상 | 중반 깊이 20 (75%) | 중반 깊이 20 (73%) | 중반 깊이 20 (74%) |
| 29~30 | 끝까지 85% | 끝까지 87% | 끝까지 93% |
| 28 | 끝까지 85% | 끝까지 87% | 끝까지 98% |
| 27 | 끝까지 98% | 끝까지 98% | 끝까지 98% |
| 25~26 | 끝까지 98% | 끝까지 98% | 끝까지 99% |
| 24 이하 | 완전읽기 | 완전읽기 | 완전읽기 |
| 한 판 평균 시간 | 5.15초 | 8.55초 | 8.68초 |
※ 한 판 평균 시간은 강도 대국 2,000판에서 엔진마다 한 판에 쓴 탐색 시간을 더해 평균을 낸 값입니다. 시간은 엔진이 스스로 보고한 탐색 시간이며, 명령 처리와 입출력은 들어가지 않습니다. 각 엔진은 여러 판을 동시에 두었기 때문에, 절대값보다는 엔진끼리의 비교로 보아 주세요.
적용
- 웹: 분석과 평가를 비롯한 FlipSight 의 엔진 기능에 FlipMind 가 이미 적용되었습니다.
- iOS, Android 앱: v2.0.5 부터 FlipMind 가 적용됩니다. 앱을 v2.0.5 이상으로 업데이트해 주세요.
핵심 엔진이 바뀐 만큼 예상하지 못한 문제가 있을 수 있습니다. 기능에 문제가 보이면 쪽지, 메일, 진단 전송 등으로 알려 주세요. 빠르게 확인해서 고치도록 하겠습니다.