개요
OpenAI gym은 강화학습 알고리즘들을 비교하고 테스트할 수 있는 환경을 제공해주는 도구입니다.
가장 기본적인 카트폴 예제부터 벽돌 깨기 게임이면서 아타리의 고전 게임인 브레이크아웃까지 OpenAI gym은 여러가지 환경을 제공해줍니다.
이번 포스팅에서는 이 OpenAI gym의 설치 방법과 오류 해결 방법을 알아보고 이를 통해서 가상환경의 필요성도 간단히 알아보도록 하겠습니다.
OpenAI gym 설치
저희는 gym을 로컬환경에 설치할 수도 있고 가상환경에 설치할 수 있습니다.
로컬환경에 설치한다는 것은 내가 사용하고 있는 PC에 설치한다는 것이고 가상환경에 설치한다는 것은 독립적인 공간을 만들어 설치한다는 뜻입니다.
가상환경의 필요성에 대해서는 글 아래에서 설명하도록 하겠습니다.
로컬환경에 설치
로컬환경에 gym을 설치한다면 간단하게 Anaconda Prompt에서 <pip install gym>을 입력하면 됩니다.
pip install gym
가상환경에 설치
- 가상환경 생성
conda create -n gym python=3.6 anaconda
위를 입력하면 파이썬 3.6 버전의 gym이라는 아나콘다 가상환경이 만들어집니다. 'gym'은 가상환경 이름으로 자신이 원하는 이름으로 입력해도 무방합니다.
- 가상환경 활성화
# windows
conda activate gym
# mac
source activate gym
가상환경을 생성했다면 활성화시켜주면 됩니다. 자신이 쓰는 운영체제에(windows나 mac) 맞게 입력해주시면 됩니다.
가상환경을 활성화시키면 위와 같이 기본 base에서 gym으로 바뀐 것을 확인할 수 있습니다.
- gym 설치하기
pip install gym
이제 자신이 만든 가상환경에 gym을 설치해주면 끝이 납니다.
gym이 잘 설치되었는지 확인하기 위해서 간단한 카트폴 예제를 불러보았습니다.
import gym
env = gym.make('CartPole-v1')
env.reset()
for _ in range(1000):
env.render()
env.step(env.action_space.sample()) # take a random action
env.close()
실행 결과 아래 그림과 같이 카트폴 예제가 잘 실행되는 것을 확인할 수 있습니다.
OpenAI gym에 대한 자세한 정보와 지원하는 다양한 환경에 대해서는 아래 링크에서 확인하실 수 있습니다.
https://gymnasium.farama.org/
에러 해결
이제 설치된 gym을 이용해서 카트폴에 적용된 DQN 알고리즘을 실행시켜보았습니다. 하지만 아래와 같은 에러가 뜨게 되었죠.
state의 size가 2라서 (1,4)로 shape가 불가능하기 때문에 발생한 에러입니다.
분명 카트폴에서의 state는 <카트의 수평선 상의 위치 $x$와 속도 $\dot{x}$ 그리고 폴의 수직선으로부터 기운 각도 $θ$와 각속도 $\dot{θ}$>로 size가 4일텐데 2로 출력되는 것이 이상합니다.
구글링 결과 gym의 버전 문제라는 것을 알 수 있었습니다.
import gym
print(gym.__version__)
위의 코드로 gym의 버전을 알아보면 0.26.2라는 것을 알 수 있습니다.
위의 그림에서 알 수 있듯이 0.26.2 버전의 gym에서는 env.reset()의 반환값이 튜플 형태의 (obs, info) ← (obs는 환경에 대해 얻은 관찰값, info는 환경의 정보)이기 때문에 size가 2로 출력되었던 것입니다.
DQN 알고리즘 코드는 gym이 0.16.0 버전임을 가정하고 작성한 코드이기 때문에 버전을 낮춰주면 env.reset()의 반환값이 obs만 있기 때문에 에러를 해결할 수 있습니다.
pip install gym==0.16.0
Anaconda Prompt 창에 위를 입력하여 gym의 버전을 낮춰주면 코드가 잘 실행되는 것을 확인할 수 있습니다.
가상환경의 필요성
우리는 위의 에러를 통해서 코드 별로 요구하는 개발환경이 다르다는 것을 알 수 있습니다.
어떤 코드 A는 gym의 버전이 0.26.2일 때 정상적으로 작동하는 코드라면 또 다른 코드 B는 DQN 알고리즘처럼 0.16.0 버전이어야만 정상적으로 작동할 수 있다는 것이죠.
만약에 우리가 로컬환경에서 gym을 설치한다면 둘 중 하나의 코드만 실행시킬 수 있습니다. A를 실행시키다가 B를 실행시킬려면 gym의 버전을 낮춰주어야 하죠.
이렇게 필요한 package들의 버전이 다른 두 코드를 실행시킬 때 저희는 코드에 따라 package들의 버전을 올렸다가 낮춰야하는 번거러운 경우가 발생합니다. package의 종류가 많다면 더욱 더 시간이 낭비되겠죠.
이런 문제점을 막기 위해 만든 것이 바로 가상환경입니다. 가상환경을 만들고 가상환경 안에 자신이 돌릴 코드가 필요로 하는 package를 설치한다면 저희는 환경만 바꿔주는 것만으로 두 코드를 문제없이 실행시킬 수 있습니다.
가상환경의 활용하고 vs code와 연결하는 방법 등은 다음에 기회가 되면 설명하도록 하겠습니다. 감사합니다~!