Deep Q Network, 마린으로 미네랄 채취하기
실습 준비물
- IntelliJ ( or PyCharm)
- Python3
- 스타크래프트2 정식버전 구입! 혹은 체험판도 가능하다고 합니다.
- 끈기와 오기
- 강철 멘탈
- GIT
- 튜토리얼 진행은 Mac 환경 기준으로 하겠습니다.
이번 포스팅부터는 무려 스타크래프트2 강화학습 구현 방법에 대한 연재를 시작하겠습니다.
벌써부터 가슴이 둑은둑은합니다.
Atari가 아니라, SCV와 마린으로 강화학습을 공부할 수 있다니- 꿈만 같군요 ㅋㅋㅋ
저도 배우는 사람으로써, 겸손하게 튜토리얼을 작성하도록 하겠습니다 :)
오늘 구동시켜볼 강화학습 예제는 바로 Deep Q-Network를 활용한 미네릴 채취 강화학습입니다.
Train 스크립트를 돌리면, 대략 이렇게 움직이며 학습을 합니다!
이번 포스팅 1편에서 다룰 내용은 아래와 같습니다.
1) pysc2 설치하기
2) pysc2-examples [Star]와 [Fork] 누르기
3) pysc2-examples git clone 받기
4) minimaps 맵 파일 다운받기
5) Tensorflow, baselines pip 라이브러리 설치
6) IntelliJ ( or PyCharm )로 프로젝트 열기
7) 강화학습 트레이닝 실행
8) 학습된 에이전트로 게임 플레이하기
가장 먼저, pysc2 라이브러리를 설치해보겠습니다. 정말 쉽습니다.
터미널에서 아래 명령어를 입력하시면 됩니다. Python3 으로 할거니 pip3 명령어를 사용합니다.
pip3 install pysc2
그럼 설치가 완료됩니다.
우선, 저의 예제 github 레포지토리에 접속하겠습니다.
https://github.com/chris-chris/pysc2-examples
가장 중요한 스텝입니다. [Star] 버튼을 누르세요! ㅋㅋㅋ
그리고 [Fork] 버튼을 누릅니다!
자 이제, 제 예제 프로젝트를 clone 해보시겠습니다.
터미널에서 아래 명령어를 입력합니다.
git clone https://github.com/chris-chris/pysc2-examples
그러면 pysc2-examples 라는 폴더가 생성되었을 것입니다.
우리가 강화학습으로 돌려볼 마린으로 미네랄을 채취하는 미니맵을 다운받아서 StartCraft II/Maps 폴더 아래에 저장해둬야 합니다.
https://github.com/deepmind/pysc2/releases/download/v1.0/mini_games.zip
저는 Mac 유저인데, 제가 저장한 위치는 아래와 같습니다.
/Applications/StarCraft II/Maps/mini_games
Win 유저는 StartCraft II 가 깔린 폴더 아래 StartCraft II/Maps/mini_games에 저장하시면 됩니다.
Linux 유저는 ~/StarCraft II/Maps/mini_games 폴더에 저장하세요
이 프로젝트를 위해 필요한 라이브러리가 더 있습니다.
바로 Google의 Tensorflow와 OpenAI의 baselines 라이브러리 입니다. 간단합니다.
pip3 install tensorflow
pip3 install baselines
Deep Q-Network 구현체 레퍼런스 코드를 OpenAI의 baselines를 사용하였기에 baselines 라이브러리가 필요합니다. 그리고 baselines가 tensorflow를 기반으로 동작하기에 Tensorflow 도 설치합니다.
제가 본 구현체 중에 OpenAI의 baselines가 제일 코드가 아름답더라구요- 그래서 이걸 스타크래프트 II env에 이식했습니다 :)
사실 이 글을 읽으시는 분들은 대부분 Tensorflow 정도는 설치하셨을 거라 생각합니다 :)
사실 그냥 아래 명령어를 치기만 하면 강화학습 트레이닝이 시작됩니다.
python3 train_mineral_shards.py
그런데, 저는 뭐가 되었든 IDE(Integrated Development Environment) 환경에서 코드를 실행시키기를 추천드립니다. 왜냐하면, 바로 디버깅을 하면서 제가 코드를 설명드릴 예정이기 때문이죠 :) 저는 지금 IntelliJ로 실행시키고 있습니다.
IntelliJ 혹은 PyCharm을 실행합니다. 그리고 우리가 git clone 으로 받은 pysc2-examples폴더를 열겠습니다.
그리고 프로젝트의 기본 SDK를 먼저 설정해보겠습니다.
[File > Project Structure] 메뉴를 선택합니다.
그리고 Module SDK 에서 Python3 SDK를 선택합니다. 없으면 [New...] 버튼 클릭해서 본인 컴퓨터의 Python3 실행파일을 찾아서 선택해주세요.
7) 강화학습 트레이닝 실행
그리고 이제 트레이닝을 실행시킵니다.
train_mineral_shards.py 파일을 오른쪽 클릭한 후 [Run 'train_mineral_shards'] 메뉴를 클릭합니다.
그러면 이렇게 스타크래프트 II 가 실행되면서 로그가 콘솔에 찍히기 시작합니다.
콘솔에 찍히는 로그를 간단히 설명드리겠습니다.
steps는 마린에게 명령을 보낸 횟수라고 보시면 됩니다.
episodes는 게임을 몇판째 했는지 적어두는 카운트입니다.
mean 100 episode reward는 최근 100판에서 reward 평균입니다.
mean 100 episode min... 은 최근 100판에서 수집한 미네랄의 평균 갯수입니다.
% time spent exploring은 Exploration & Exploit에서 Exploring을 몇 퍼센트의 비율로 수행하는 지 뜻하는 값입니다.
Exploration & Exploit 개념을 모르시는 분은 홍콩과기대 김성훈 교수님의
모두를 위한 RL 강좌를 들어보시기 바랍니다 :)
https://www.youtube.com/playlist?list=PLlMkM4tgfjnKsCWav-Z2F-MMFRx-2gMGG
현재 train 스크립트는 2천만 번 step을 수행한 후 끝내도록 했습니다.
(엄청 오래걸립니다. 혹시 짧게 끝내고 싶으시면, 50만 회 정도로만 설정하세요.)
8) 학습된 에이전트로 게임 플레이하기
학습을 모두 수행하면 저는 학습된 모델을 sc2_mineral_shards_20mil.pkl 파일에 저장하도록 코딩했습니다.
act.save("sc2_mineral_shards_20mil.pkl")
이렇게 학습된 모델을 실제로 써보고 싶으면, enjoy 스크립트를 실행하면 됩니다. :)
enjoy_mineral_shards.py 파일을 오른쪽 클릭한 후 [Run 'enjoy_mineral_shards'] 메뉴를 클릭하면 학습 없이 단순히 게임을 플레이하는 에이전트가 실행됩니다.
이렇게 일단 강화학습이 작동되게 하고 실행하는 법을 1편에서 다루어보았습니다.
향후 튜토리얼에서는
- 이 학습이 어떻게 이루어지고 있는지 이해하기
- 스타크래프트 II API에는 어떤 데이터가 담겨 있는지 이해하기
- 학습이 가능하도록 만들기 위해 제가 어떤 삽질을 했는지
- Deep Q-Network : OpenAI baselines 코드 스텝바이스텝 이해해보기
- 마린과 저그의 소규모 전투 강화학습으로 싸워보기 도전
이런 내용들을 다루어드리도록 하겠습니다.
아래 이미지들은 향후 튜토리얼에서 다룰 이미지 중 일부입니다. ㅎㅎ