Jorldy
Kakao Enterprise
내용 출처#1 : https://github.com/kakaoenterprise/JORLDY
내용 출처#2 : https://github.com/Unity-Technologies/ml-agents
이전 포스팅
이전 포스트에서 3D_Ball 예제를 Jorldy에 구현하였습니다. 하지만 아래와 같이 12개의 에이전트를 빌드하여 Importing할 경우, 하나의 에이전트만 학습이 종료되어도 모든 환경이 리셋되는 상황이 발생하였습니다.
훈련과정을 자세히 보시면, 아직 훈련 중인 에이전트가 있음에도 불구하고 전체 환경이 리셋됩니다. 이 경우 자연스럽게 학습에 Noise가 발생하게 됩니다. 간단하게 설명드리기 위해서 3D_Ball의 Agent 스크립트를 보도록 하겠습니다.
agent 스크립트에 따라 잘 학습 즉 최적의 행동을 택하고 있음에도 에피소드가 끝나 보상에 Noise가 발생하는 것입니다. 상태 전이 확률로 생각하기에...는 그저 환경의 문제가 맞습니다. 따라서 본 문제를 해결하기 위해 이전 포스트에서는 하나의 에이전트만 남기고 모두 삭제하였습니다. 사실 제가 이전에 생각한 아이디어는 다음과 같습니다.
각각의 Local Enviroment를 reset 하는 함수를 못찾겠네... 그럼 모든 에이전트가 학습을 종료하면 어떨까?
근데 이 경우 시간적 측면에서 학습이 비효율적으로 변하지 않을까?
자료조사를 진행해본 결과 2019년에 비슷한 질문이 있었지만 명확한 해답이 존재하지 않았습니다. (URL : Check if all agents are done (3DBall) #3091) 이를 해결하기 위해 이번 시간에는 Distributed Reinforcement Learning를 하는 방법을 Jorldy 그리고 ML-Agents 모두 정리해보았습니다.
Jorldy
해당 부분 작성에 앞서 Jorldy 개발에 참여하고 계신 민규식님과 이현호님께서 본 포스팅 작성에 많은 도움을 주신점 정말 감사드립니다.
Jorldy Github/Docs/Distributed_Architecture.md에 보면 학습환경에 대한 세부내용이 작성되어 있습니다.
Single의 경우, 본 포스팅에서는 다루지 않습니다.이 외에 Sync와 Async Distributed Reinforcement Learning이 있습니다. 각각의 Workflow는 다음과 같습니다.
내용이 잘 설명되어 있으니, Docs를 읽어보시는 것을 추천드립니다. Jorldy에서 Distributed를 사용하는 방법은 간단합니다. 기존 single_train.py를 아래와 같이 원하는 파일로 변경하시면 됩니다. (이전에 공부했었는데 추후 다시 공부 후 정리해서 추가하기!)
cd jorldy (예: cd C:\Users\pnltoen\Desktop\jorldy\jorldy)
python sync_distributed_train.py --config=config.ddpg.ball_mlagent //또는
python async_distributed_train_train.py --config=config.ddpg.ball_mlagent
추가적으로 숙지하셔야 할 내용이 있습니다. Config 파일을 보면 다음과 같이 Distributed setting이 있습니다.
batch_size는 위에 있는데 distributed_batch_size는 또 뭐지...? 라고 생각하실 수 있습니다. 이는 sync 또는 async를 사용할 때 쓰는 distributed 전용 batch size입니다. 따라서 single로 학습할 경우 distributed_batch_size는 어떠한 학습에 영향도 미치지 않습니다. 마찬가지로 sync 또는 async로 학습할 경우 batch_size가 아닌 distributed_batch_size를 사용하게 됩니다. 제일 하단부에 있는 num_workers를 조정하여 실행시킬 환경의 개수를 조절할 수 있습니다.
이때! 위의 work flow와 같이 num_workers + 1의 환경이 실행됩니다. 예로 num_workers를 1로 설정할 시, 총 2개의 환경이 실행됩니다. 이 후 각각의 실행 환경은 main process 그리고 manage process를 담당하게 됩니다. 이 때 manage process의 경우 에이전트가 환경을 평가할 때만 실행되기에 중간에 멈춰있는 것처럼 보이는 현상이 발생합니다. 평가 주기를 조절하기 위해서는 print_period 값을 조절하시면 됩니다. 현재 위의 사진에는 10000steps 마다 평가가 진행되는 것으로 설정되어 있습니다.
Unity ML-Agents
다중 환경 생성 방법 (Multiple Training Area)
3D_Ball 예제와 같은 방법입니다. 하나의 환경에서 복사 붙여넣기를 통해 여러 환경을 만듭니다. 사실 이 방법은 적용이 힘든 상황이 많습니다. 아래 그림과 같이, 환경을 층으로 쌓는 방법도 가능합니다. 다만 앞서 말씀드린 것과 같이 Python API를 사용할 경우, 사용 방법이 어렵다는 단점이 있습니다.
-커맨드 사용 방법 (--num-envs)
ML-Agents의 경우 간단하게 커맨드로 Distributed를 할 수 있습니다. 기존의 경우 아래와 같은 명령어로 ML-Agents 학습을 진행하였습니다. 여기서 --num-envs=3와 같이 명령어를 입력할 경우, 3개의 환경이 실행됩니다.
주의 : --num-envs의 경우 env 경로를 설정하지 않을시 사용이 불가능합니다!
mlagents-learn --env='env_path' --config='config_path' --run-id='pnltoen' --num-envs=3
Ctrl+Shift+Esc를 통해 확인해보았습니다. 3개를 실행했을 경우 CPU를 23% 사용하네요. 본인의 컴퓨터 사양에 맞춰서, --num-envs 개수를 정해주시면 됩니다. 당연하게도 개수가 오를경우 CPU 사용이 오르고 경험적으로 CPU 사용량 80% 부터는 속도가 현저히 감소합니다. 추가적으로 학습자체가 안될 수 있으니 적당한 개수의 환경을 설정하시기를 권장드립니다.
(optional) 같은 환경을 병렬 학습시키는 것이 아닌, 별도의 환경을 학습시키실 수도 있습니다. 이 경우 --base-port 명령어를 통해 학습이 가능합니다. 아래 예시를 참고해주세요.
mlagents-learn --env='env_path' --config='config_path' --run-id='pnltoen' --base-port=5004
--base-port의 경우 5005가 default 값입니다. 따라서 다른 환경 또한 학습을 하고자 할 경우 5005가 아닌 포트를 입력해주시길 바랍니다. Drone Challenge를 하면서 얻은 경험에 따르면 일반적으로 2개의 서로 다른 환경을 동시에 학습할 경우 2개의 환경 모두 각각을 실행했을 때 보다 학습 속도 부분에서 60~70%의 성능하락을 보였습니다.
마치며
지금까지 ML-Agents의 Low Level Python API를 Jorldy를 이용하여 쉽게 사용할 수 있도록 사용방법에 대해 다뤄보았습니다. 저도 그렇지만, 알고리즘을 직접 작성하고 사용하는 방법은... 사실 많이 두려웠습니다. 하지만 제 포스트를 통해 많은 분들이 mlagents를 쉽게 다루시고 많은 창작물을 만드시기를 기원합니다!!ㅎㅎ
댓글