Jorldy
Kakao Enterprise
내용 출처#1 : https://github.com/kakaoenterprise/JORLDY
내용 출처#2 : https://github.com/Unity-Technologies/ml-agents
Jorldy 장점
Unity ML-Agents를 이용하시면서.... 알고리즘 코드 작성에 어려움을 겪으실 경우 카카오엔터프라이즈의 jorldy를 사용하여 해결할 수 있습니다!!! Jorldy에 새로운 ML-Agents 환경을 추가해보도록 하겠습니다. 본 포스팅은 mlagents 예제 중 하나인 3D_Ball을 Jorldy에서도 사용할 수 있도록 셋팅하고, ddpg 알고리즘을 사용해보도록 하겠습니다. Jorldy는 기본적으로 다음 환경을 지원합니다. Release를 보니 12월 23일부터 mujoco를 지원하네요!

Jorldy의 core를 보면 제공하고 있는 mlagents 환경을 확인하실 수 있습니다.

환경으로는 RL_KOREA에서 주관한 챌린지인 DroneDelivery 그리고 책 텐서플로와 유니티 ML-Agents로 배우는 강화학습에서 보았던 Pong 환경이 내재되어 있습니다. JORLDY의 뜻 (Join Our Reinforcement Learning framework for Developing Yours)과 같이 저만의 환경을 만들고 강화학습을 해보기 위한 Custom Enviroments의 첫 단계로 Unity ML-Agents의 예제 중 가장 널리 알려진(?) 3D_Ball 환경을 만들어 보도록 하겠습니다.
3D Ball 빌드하기
지난 포스트 Unity ML-Agents 2.1.0 개발환경 설치하기 글에서, Build를 위한 모든 준비과정을 끝났습니다. 새로 프로젝트를 만드시고 프로젝트 명을 Ball로 설정해주세요!

Jorldy의 requirements.txt 문서를 보면, mlagents 버전을 알 수 있습니다. mlagents-envs=0.26.0은 Unity 2021 버전부터 지원이 됨으로, 혹시 모를 호환성 문제를 피하기 위해 에이더 버전은 2021.2.x로 설정하였습니다.
프로젝트 이름은 간단하고 편한 Ball로 작성해주시길 바랍니다.
mlagents-envs==0.26.0 //mlagents 2.0버전
프로젝트에서 Assets/ML-Agents/Examples/3DBall/Scenes/3DBall 실행하시면 다음과 같은 화면을 볼 수 있습니다.

여기서 주의! 일반적인 Python API의 경우 하나의 에이전트의 에피소드가 종료될 시 환경 전체가 Reset 됩니다. 즉 저희가 보고 있는 12개의 공 중 단 하나라도 먼저 에피소드가 종료될 경우 학습 중인 공인 모든 공의 환경이 Reset 됩니다. 자세한 내용은 다음 포스팅에서 다루도록 하겠습니다. 아무튼! 이를 방지하기 위해 1개의 Ball을 제외하고는 모두 삭제하겠습니다.

Ctrl+Shift+B를 입력하여 Build Setting을 실행합니다.

Add Open Scenes을 누르고 우측 하단의 Build를 눌러주시면 됩니다. 경로는 우선 편한 곳에 지정해주세요!

다음과 같이 탐색기에 나타나면, Build 파일 준비는 끝입니다. 저는 바탕화면에 Ball 이라는 폴더를 만들어서 빌드하였습니다.
Jorldy Custom -ENV Settings
Custom Environment의 내용은 Jorldy/jorldy/core/env/README.md를 참고하여 작성되었습니다.

이미 jorldy에서 mlagent를 이용하기 때문에 별도로 작성하지는 않았습니다. 하지만 저는 개인적으로 no_graphic이 아닌 graphic을 써서 학습을 시키는 것이 심리적으로 안정이되기 때문에....(?) graphic 옵션만 수정하도록 하겠습니다.
jorldy/core/env 폴더에 들어가신 후 mlagent.py를 실행합니다. 저는 VS를 사용하고 있습니다. def __init__ 부분을 보시면 env와 관련된 코드를 확인하실 수 있습니다.

기존에는 no_graphics=no_graphics로 되어있지만 해당 부분을 위의 그림과 같이 False로 수정합니다.
이 후 jorldy/core/env/mlagents 폴더로 이동합니다. 기존에 DroneDelivery, Hopper, Pong 환경이 있지만 여기에 Ball이라는 폴더를 만들어줍니다. 이 후 사용 OS에 맞춰서 하위 폴더를 하나 더 만들어줍니다. 저는 Windows를 사용함으로써 Windows로 생성하였습니다.
이 과정을 해주지 않을 경우 def match_build() 함수와 관련해서 오류가 발생하게 됩니다. Mac(Darwin)은 Mac Linux는 Linux로 작성해주시면 됩니다.
jorldy/core/env/mlagent.py를 실행시킵니다. 여기에 Class를 추가합니다 저는 아래와 같이 코드를 작성하였습니다.
class BallMLAgent(_MLAgent):
def __init__(self, **kwargs):
env_name = "Ball"
super(BallMLAgent, self).__init__(env_name, **kwargs)
self.state_size = 8
self.action_size = 2
self.action_type = "continuous"
state_size, action_size, action_type의 경우 아래의 mlagents 환경 Docs를 참고하여 작성하였습니다.

직접 환경을 만드셨을 경우, 직접 설정해주셨을테니 해당 값을 넣어주시면 됩니다.Vis_obs 즉 시각적 관측을 이용하실 경우, 코드작성에 어려움을 겪으신다면 맨 밑 DroneDeliveryMLAgent에 작성된 코드를 참고하면 좋을 것 같습니다 class DroneDeliveryMLAgent(_MLAgent): 부분
이 후 이전에 빌드한 모든 파일을 jorldy/core/env/mlagents/Ball/Windows에 넣어줍니다. 경로가 헷갈리신다면 아래 사진을 참고해주세요

Jorldy Custom - Config Settings
jorldy/config/ddpg 폴더로 들어가주세요. 0.10.0 기준 4개의 config 파일이 있습니다. 이 중 hopper_mlagent.py를 복사하여 붙여넣고 이름을 ball_mlagent.py로 바꿔주세요. 이 후 파이썬 파일을 실행합니다. 3번째 줄에 있는 env의 name을 아래와 같이 ball_mlagent로 수정합니다.

Batch 와 Buffer를 수정하셔도 좋지만 너무 간단한 환경이라 수정하지 않았습니다. Hyperparameter 관련해서는 추후에 정리해서 별도로 포스팅하겠습니다.
cd jorldy (예: cd C:\Users\pnltoen\Desktop\jorldy\jorldy)
python single_train.py --config=config.ddpg.ball_mlagent
위의 커맨드로 학습을 시작합니다. 아래와 같이 출력되면 정상입니다.

최종적으로 학습이 잘 시작 되는 것을 확인할 수 있습니다.

앗...! 여기서!!! 잠깐... 아마 위 움짤을 보신다면 엥? 그럼 원래 유니티 ML-Agents 예제는 공이 12개였는데... Python API를 사용하면 1개로 손해 아닌가요? 라고 의구심이 생기실 수 있습니다. 이는 mlagents의 --num-envs와 같이 num_workers로 해결할 수 있습니다. 관련한 상세내용은 다음 포스팅에 작성하도록 하겠습니다.
댓글