TL;DR

  • Pluto는 자가 대국 강화학습으로 훈련한 단일 신경망이 세 종족의 거시·미시 운영을 스크립트 없이 수행하는 StarCraft: Brood War AI임.
  • 현재 배포 모델은 CoG 2026 StarCraft AI Competition 참가 모델이며, CPU 추론을 사용해 GPU가 필요하지 않음.
  • BWAPI 4.4.0, 64비트 Windows 또는 Wine, AVX2 지원 x86-64 CPU가 필요하며, AVX-VNNI 지원 CPU와 6개 이상 코어가 권장됨.
  • 게임 중 모델은 6프레임마다 한 번 판단하며, 추론이 늦으면 게임 속도가 느려질 뿐 봇의 플레이 품질은 저하되지 않음.
  • 종족별 빌드 선택 통계와 경기 기록을 저장하며, 자체 승률 추정에 따라 항복하거나 엔진 오류 시 게임을 종료함.

Pluto

  • Pluto는 StarCraft: Brood War AI임. 자가 대국 강화학습으로 훈련한 단일 신경망이 거시 운영과 미시 운영을 포함해 세 종족 전체를 플레이하며, 스크립트 플레이는 없음.
  • BWAPI(https://bwapi.github.io/)를 통해 1대1 근접전을 수행함.
  • 현재 저장소는 바이너리 릴리스 배포용임. 최신 릴리스는 CoG 2026 StarCraft AI Competition에 참가한 모델 md07x02_cog2026_2578600_int8mv이며, GPU 없이 CPU 추론을 수행함. Releases 페이지에서 받을 수 있음.

요구 사항

  • StarCraft: Brood War 1.16.1 및 BWAPI 4.4.0
  • 64비트 Windows 또는 Wine이 필요함. StarCraft는 32비트이며 추론 엔진은 별도 64비트 프로세스임.
  • AVX2를 지원하는 x86-64 CPU가 필요함. 지원 범위는 Intel Haswell(2013년 이후) 및 AMD Zen 계열임.
  • AVX-VNNI 지원 CPU는 추론 속도가 대략 두 배로 빨라지며 강력히 권장됨. 지원 범위는 Intel 12세대(2021년 이후) 및 AMD Zen 5임.
  • 코어 6개 이상이 권장되며, 여유 RAM 약 2GB와 디스크 공간 약 0.4GB가 필요함.

설치

  • 릴리스 ZIP을 StarCraft 폴더의 bwapi-data/AI/에 압축 해제해야 함. 파일 배치는 다음과 같음.
  • bwapi-data/AI/pluto.dll: 32비트 BWAPI 모듈
  • bwapi-data/AI/pluto/pluto_infer.exe: 64비트 CPU 추론 엔진
  • bwapi-data/AI/pluto/pluto_weights.bin: 신경망 가중치(int8)
  • 평소와 같이 bwapi.ini에서 DLL을 지정해야 함: ai = bwapi-data/AI/pluto.dll.
  • 봇을 Zerg, Terran, Protoss 또는 Random으로 등록할 수 있으며, Pluto는 모든 종족을 플레이함. 게임이 시작되면 채팅에 Pluto online (md07x02_cog2026_2578600_int8mv). gl hf!라고 알림.
  • 바이너리에 서명이 없어 최초 실행 시 Windows SmartScreen 또는 백신 소프트웨어가 경고할 수 있음.

실행 방식

  • 게임이 시작되면 pluto.dll이 같은 폴더에 있는 pluto_infer.exe를 실행하고 공유 메모리로 통신함. 네트워크 연결은 하지 않으며 StarCraft 폴더 밖의 파일에도 접근하지 않음. 엔진 프로세스는 게임과 함께 종료됨.
  • 모델은 게임 프레임 6개마다 한 단계 진행함. DLL은 모델이 관찰한 프레임에서 엔진에 최대 40ms를 주며, 그 시간 안에 응답이 오지 않으면 다음 프레임에서 응답을 기다림. 따라서 모든 결정은 모델이 훈련 중 예상한 시점에 정확히 적용됨.
  • CPU가 느리면 게임 실행 속도가 느려지지만 봇의 플레이 품질은 떨어지지 않음. 현재 데스크톱 CPU에서는 한 단계에 약 20ms, 지도에 유닛 200개가 있는 2021년형 6코어 CPU(i5-12500T)에서는 약 60ms가 걸리며, 후반 대규모 교전에서는 최대 약 3배까지 걸릴 수 있음.
  • 지연이 상당 시간 계속되면 Pluto가 채팅에 한 번 Pluto: this machine can't keep up ... sorry about the pace라고 알리고 경기 기록에도 남김.
  • 엔진 실행에 실패하거나(파일 누락, 미지원 CPU) 경기 도중 엔진이 종료되면 봇이 게임 채팅과 로그에 이유를 알리고(Pluto: quitting in 10 seconds) StarCraft 프로세스를 종료함. 이는 게임이 아니라 오류이므로 충돌처럼 보이는 동작이 의도된 것임. StarCraft 폴더의 pluto.log와 pluto_infer.log를 확인해야 함.

기록 파일

  • pluto.log: DLL 로그(StarCraft 폴더)
  • pluto_infer.log: 엔진 로그(StarCraft 폴더)
  • bwapi-data/write/pluto_bandit_<opponent>.txt: 상대별 빌드 순서 통계와 해당 상대를 상대로 한 누적 전적
  • 봇은 상대별 승패 횟수를 이용하는 밴딧 방식으로 오프닝을 선택함. 모든 빌드가 마스크와 이름으로 나열되어 있어 수치를 편집해 선택을 유도할 수 있음.
  • 파일은 매 경기마다 다시 읽음. write/와 read/ 중 더 최신 파일을 읽으므로 경기 사이에 일반적으로 사용하는 write/에서 read/로의 복사 방식도 가능함.
  • 파일을 수정하면 수정한 복사본을 우선 적용하도록 seq 줄의 값을 높이고, 닫는 end 줄을 유지해야 함.
  • 통계 아래에는 경기마다 JSON 한 줄이 기록됨. 경기 시작 기록에는 상대, 맵, 선택한 빌드가 포함되고, 종료 기록에는 결과, 프레임 타이밍, 모델의 승리 확률 변화가 포함되며, 오류 또는 항복 이벤트도 기록됨.

참고 사항

  • 봇은 게임 속도 제한을 해제하고 추론 속도에 맞춰 실행함. 모델은 6프레임마다 한 단계 진행하며, 위 하드웨어에서 단계당 약 20~60ms가 걸림.
  • 선택 사항으로 각 컴퓨터에서 pluto_infer.exe --bench를 한 번 실행할 수 있음. 약 2~4분 동안 해당 하드웨어의 스레드 수별 성능을 측정하고 최적값을 pluto/pluto_config.json에 기록하며, 엔진이 이후 해당 값을 사용함. 실행하지 않으면 엔진은 최대 6개 스레드를 사용함.
  • 환경 변수 BWRL_DRAW=1을 설정하면 화면에 모델의 승리 확률 그래프가 표시됨. 기본값은 꺼짐임.
  • 자체 승리 추정치가 약 10초 동안 패배 상태에 고정되면 Pluto는 gg라고 말하고 경기를 떠나며 항복함. 경기 도중 엔진 오류가 발생하면 StarCraft 프로세스를 종료하며, 의도적으로 패배가 아닌 충돌로 처리됨.
  • 같은 설치 환경에서 같은 상대와 두 경기를 병렬로 실행하면 안 됨. 두 경기가 통계 파일을 공유하기 때문이며, 토너먼트 관리자는 이미 이를 방지함. 서로 다른 상대와의 병렬 경기는 가능함.
  • 일반적인 프레임당 55ms 제한을 적용하는 토너먼트 관리자 환경에서는 40ms 예산을 사용함. 예산에 프레임 한 주기를 더한 시간 안에 단계가 끝나면 프레임당 비용은 해당 주기를 넘지 않으며, 초과분은 다음 단계의 프레임 하나가 길어지는 데만 반영됨.
  • 이 설정에서도 시간 초과가 발생하는 하드웨어에서는 BWRL_STRADDLE=1을 설정할 수 있음. 이때 DLL은 프레임을 예산보다 길게 잡지 않으며, 늦은 결정은 이후 프레임으로 밀림. 이는 대회에서의 동작 방식이며 봇의 결정 빈도는 낮아짐.
  • BWRL_FRAME_BUDGET_MS=<ms>로 두 모드의 프레임 예산을 변경할 수 있음.