Search Unity

이제 머신 한 대에서 여러 개의 Unity 시뮬레이션을 실행하여 훈련 속도를 높일 수 있도록 Unity ML-Agents 툴킷의 새로운 업데이트를 출시했습니다. 이번 업그레이드를 통해 게임 개발자는 심층 강화 학습(DRL, Deep Reinforcement Learning) 알고리즘의 훈련 속도를 상당히 개선하여 캐릭터의 행동을 만들어 낼 수 있게 되었습니다.

이 글에서는 버블 슈팅 게임 스누피 팝(Snoopy Pop)의 고난도 레벨을 플레이할 수 있도록 에이전트를 훈련시킨 유니티와 유니티 파트너사 JamCity와의 협업에 관하여 살펴보겠습니다. Unity ML-Agents 툴킷 v0.8을 활용한 결과, 단일 머신에서 에이전트가 레벨 하나를 플레이하는 속도를 이전보다 7.5배 높일 수 있었습니다. 뿐만 아니라 유니티와 JamCity는 머신 한 대에 그치지 않고 여러 머신으로 훈련 범위를 확장하여 여러 레벨을 동시에 훈련시키는 기술도 연구하고 있습니다.

Unity ML-Agents 툴킷처음 출시된 이래로 유니티는 게임 개발자가 심층 강화 학습(DRL)을 활용하여 플레이 가능한 캐릭터(PC)와 플레이 불가능한 캐릭터(NPC)의 행동을 발전시킬 수 있도록 지원하는 데 주안점을 두었습니다. 이전에 유니티에서는 물리 기반 애니메이션을 사용하여 퍼포(Puppo)를 컨트롤하기 위한 정책(policy)을 학습하는 데 DRL이 어떻게 활용될 수 있는지 소개한 적이 있습니다. 하지만 실제 게임은 복잡하고, DRL 알고리즘은 많은 연산을 필요로 하며, 학습을 위해서는 많은 양의 게임플레이 데이터가 필요합니다. 대부분의 DRL 연구에서는 학습 속도를 크게 높이기 위해 게임플레이 데이터를 빠르게 생성할 수 있는, 아주 가벼운 게임을 활용하지만, 실제 게임은 보통 속도로 실행해야 하거나 속도 향상을 제한하는 등의 제약 사항이 있는 경우가 많습니다. 그래서 유니티는 개발자가 가장 손쉽게 이용할 수 있는 계산 플랫폼인 로컬 개발 머신을 이용하여 훈련을 개선하는 데 집중했습니다.

DRL을 사용하여 새로운 행동을 만들어 내는 작업은 에이전트가 관찰한 것을 행동에 연결(mapping)시키는 것, 즉 정책을 구현한 신경망의 가중치를 학습하는 것입니다. 학습은 하나 이상의 시뮬레이션 인스턴스에서 정책을 실행하고 그 결과를 사용하여 에이전트의 보상을 극대화하는 방식으로 가중치를 업데이트함으로써 이루어집니다. 정책이 평가되는 인스턴스가 많을수록 훈련은 더 빨리 완료됩니다. 여기서는 멀티 코어 머신에서 Unity의 다중 동시 인스턴스를 통해 더 빠르게 학습시키는 기능을 소개해보겠습니다. 유니티는 JamCity스누피 팝 게임 팀과 협력하여 실제 게임으로 에이전트를 학습시키는 데 있어서 멀티 코어 머신 활용이 얼마나 중요한지 보여드렸습니다. v0.8에서 개선된 기능을 적용한 Unity 시뮬레이션 16개를 활용하여 쉬운 레벨에서는 5.5배, 어려운 레벨에서는 최대 7.5배나 훈련 속도를 개선할 수 있습니다. 일반적으로, 레벨이나 게임이 더 복잡할수록 다중 Unity 시뮬레이션 활용을 통한 효과는 더 많이 느낄 수 있습니다.

이번 Unity ML-Agents 툴킷 업데이트에서 개선된 기능을 통해 개발 머신의 리소스를 충분히 활용할 수 있으며 Google 클라우드 플랫폼과 같은 클라우드 공급업체의 멀티 코어 머신을 활용하여 훈련 속도를 크게 높일 수 있습니다. 또한 훈련 범위를 여러 머신으로 확장시켜 스누피 팝의 복수의 레벨을 동시에 해결할 수 있는 단일 정책을 학습할 수 있도록 내부 인프라를 테스트 및 구축하고 있습니다. 아래의 동영상은 난이도가 점점 상승하는 스누피 팝의 레벨을 플레이하는 훈련된 단일 에이전트를 보여줍니다.

 

 

 

 

 

 

 

 

 

 

 

스누피 팝의 여러 레벨을 플레이하는 훈련된 단일 에이전트

ML-Agents 툴킷과 스누피 팝

스누피 팝은 JamCity에서 제작한 버블 슈팅 게임입니다. 스누피 팝에서 플레이어는 우드스톡(Woodstock)과 새들을 버블을 터뜨려 구출해야 합니다. 플레이어는 버블을 특정 각도에서 발사하거나 발사 전 버블의 컬러를 바꿀 수 있습니다. 버블이 같은 종류에 붙어 3개 이상 합쳐지면 이 묶음은 터져버리면서 버블 안에 갇혀 있던 새가 구출되고 플레이어는 점수를 얻습니다. 보드에 있는 모든 새가 구출되면 플레이어는 해당 레벨을 완료합니다. 반대로, 새를 모두 구출하기 전에 가방 안에 있는 버블을 모두 사용하면 플레이어가 패배합니다. 이 게임에서 목표는 에이전트가 플레이어처럼 게임을 플레이하고 가능한 한 가장 높은 레벨에 도달하도록 훈련시키는 것입니다.

스누피는 우드스톡과 그의 친구들이 갇혀 있는 버블을 터트려야 합니다.

에이전트는 ML-Agents 툴킷을 사용하여 게임 상태를 보여주는 관찰(observation) 결과를 수신하고, 이 결과에 따라 행동을 수행하여 정책을 실행합니다. DRL을 사용하여 스누피 팝 게임 레벨을 해결하려면 먼저 이러한 관찰 및 행동뿐만 아니라, 정책에서 극대화하려는 보상 함수(reward function)를 정의해야 합니다. 관찰의 결과로, 에이전트는 게임 보드와 이 보드에 있는 버블의 저해상도(84×84) 버전을 받습니다. 그런 다음 에이전트는 21가지 다양한 각도에서 버블을 발사할지 아니면 그 전에 버블을 교체할지를 선택합니다. 버블이 발사되어 다른 버블에 닿으면(닿지 않아도 됨), 에이전트는 점수를 얻고 새를 구출하며 승리했을 때 보상을 얻습니다. 또한 버블을 발사할 때와(에이전트의 빠른 레벨 해결 목표),게임에 질 경우 음의 보상(Negative rewards)을 줍니다.

스누피 팝에서 관찰, 행동 및 보상의 정의

시각적 관찰(visual observation)은 넓은 행동 공간에서 스누피 팝의 레벨 통과를 어렵게 합니다. 간단한 레벨에서는 에이전트가 효과적인 정책을 학습하기 위해 80,000회 이상의 행동이 필요했습니다. 레벨 난이도가 높아지면서 50만회 이상의 행동이 필요할 수 있습니다.

또한 이 게임은 물리(Physics)를 사용하여 버블의 튕김과 다른 버블과의 충돌 방식을 시뮬레이션하기 때문에 게임의 역학(dynamics)을 크게 변경하지 않고서는 타임스케일(timescale)을 바꾸기가 쉽지 않습니다. 거기다가 타임스케일을 5배만 늘려도 초당 약 2회의 행동만을 획득할 수 있습니다. 이는 간단한 레벨을 공략하는 데 11시간 이상이 걸리고 더 어려운 레벨은 수일이 걸릴 수 있다는 의미입니다. 따라서 머신의 리소스를 최대한 활용하기 위해 동시에 실행되는 여러 개의 Unity 시뮬레이션을 실행함으로써 데이터 수집 프로세스를 확장하는 것이 중요합니다.

스누피 팝의 다중 동시 인스턴스 실행

스누피 팝 단일 인스턴스는 높일 수 있는 속도가 제한되어 있지만, 멀티 코어 프로세서를 이용하면 단일 머신에서 여러 인스턴스를 실행할 수 있습니다. 게임의 플레이가 각각 독립되어 있으므로 훈련 데이터 수집을 쉽게 병렬화할 수 있습니다.

 

 

 

 

 

 

 

 

 

 

 

 

각 시뮬레이션이 제공하는 데이터는 공통의 훈련 버퍼에 저장된 후, 더 나은 게임 플레이를 위해 정책을 업데이트하는 트레이너(trainer)에 의해 사용됩니다. 이 새로운 패러다임을 통해 타임스케일이나 게임플레이 메카닉스에 부정적인 영향을 주는 기타 게임 파라미터를 변경할 필요 없이 훨씬 더 많은 데이터를 수집할 수 있습니다. 이는 ML-Agents 툴킷 사용자에게 더 강력한 성능의 훈련을 제공하는 데 필요한 첫 단계라고 생각합니다.

성능 측정 결과

다중 동시 Unity 시뮬레이션 실행의 효용을 설명하기 위해 스누피 팝의 각기 다른 두 레벨(레벨 2와 25)에서의 훈련 시간을 공유합니다. 좀 더 구체적으로 말씀드리면, Unity 시뮬레이션 환경 수를 다양하게 구분하여 훈련 시간을 기록했습니다. 동시 환경을 추가할 때마다 약간의 조정 오버헤드가 발생하기 때문에, 확장할수록 상대적 효과가 감소(수확 체감, Diminishing returns)할 것으로 예상됩니다. 또한 간단한 레벨이나 게임의 경우 Unity 시뮬레이션을 추가해도 성능이 향상되지 않을 수 있습니다. 왜냐하면 추가된 시뮬레이션에서 생성된 게임플레이 데이터가 기존 게임플레이 데이터와 높은 상관관계가 있으므로 결과적으로 훈련 알고리즘을 개선하지 못하기 때문입니다. 요약하자면, 더 많은 Unity 시뮬레이션을 추가할수록 수확체감이 예상되며 체감률은 모델을 훈련하는 레벨 또는 게임의 난이도에 따라 달라집니다.

아래의 첫 번째 그래프는 v0.8 릴리스의 병렬 환경 1개부터 16개까지의 범위 내에서 스누피 팝의 레벨 2를 완료하는 데 소요된 훈련 시간을 보여줍니다. 훈련 프로세스의 무작위성으로 인해 소요 시간이 실행별로 크게 달라질 수 있으므로 3회 실행 후 소요된 시간의 평균값을 기록했습니다. 1개 환경에서 2개 환경으로 확장할 경우 성능이 크게 향상되며, 그 이후부터는 꾸준하지만 준선형(sub-linear) 형태로 16개 환경을 사용할 때 1개 환경보다 5.5 향상되는 것을 알 수 있습니다.

또한 병렬 환경을 이용한 훈련 효과가 스누피 팝의 레벨에서 더 두드러진다는 사실도 알게 되었습니다. 이는 더 어려운 레벨의 경우, 다중 시뮬레이션에서 생성된 환경이 간단한 레벨에 비해 독립적이어서 훈련 프로세스에 도움이 되기 때문입니다. 아래에 스누피 팝 레벨 25에서 v0.8 릴리스의 성능을 비교한 그래프가 있습니다. 16개의 환경을 사용할 때 1개의 환경에 비해 성능이 거의 7.5 향상되었음을 알 수 있습니다.

오늘 릴리스된 ML-Agents 툴킷 v0.8단일 머신에서 다중 동시 Unity 시뮬레이션을 활용한 훈련을 지원합니다. 기존 환경이 있을 경우, ML-Agents 툴킷의 최신 버전으로 업데이트하고 게임을 다시 빌드하기만 하면 됩니다. 업그레이드 후 mlagents-learn 툴의 새로운 옵션에 액세스하여 실행하고자 하는 병렬 환경의 개수를 지정할 수 있습니다. 자세한 내용은 기술 자료를 참조하세요.

기타 업데이트 사항

다중 Unity 시뮬레이션을 실행하는 기능 외에도, 이번 ML-Agents 툴킷 업데이트에는 몇 가지 추가 기능이 포함되어 있습니다.

커스텀 프로토콜 버퍼 메시지

ML을 연구하는 분들은 대부분 기본적으로 포함된 데이터 외에, 파이썬(Python)과 Unity 간에 구조체 데이터(structured data)를 교환할 수 있는 기능이 필요합니다. 이번 릴리스에서 유니티는 개발자가 커스텀 프로토콜 버퍼 메시지를 생성하여 관찰, 행동 또는 초기화 파라미터에 사용할 수 있는 API를 제작했습니다.

 

렌더 텍스처 관찰

카메라를 사용한 시각적 관찰과 더불어 RenderTexture를 사용할 수 있는 기능도 포함했습니다. 이를 통해 2D 스프라이트(Sprite), 웹캠 또는 기타 커스텀 구현과 같이 카메라를 사용하지 않는 방법으로 시각적 관찰을 위한 텍스처를 렌더링할 수 있습니다.

 

2D 레이캐스팅

많은 사용자가 2D 게임에서의 레이 캐스팅(ray casting) 사용에 관해 질문했었습니다. 이번 릴리스에서는 RayPerception을 리팩터링하여 2D 레이 캐스팅에 대한 지원을 추가했습니다(RayPerception2D).

 

파이썬 패키지 분리

mlagents 파이썬 패키지가 2개로 분리되었습니다(mlagents.trainers 및 mlagents.envs). 이를 통해 사용자는 텐서플로(TensorFlow)와 같이 버전 종속 관계를 분리할 수 있고 연구자는 기존 파이썬 설정을 바꾸지 않고 Unity 환경을 더 쉽게 사용할 수 있게 되었습니다.

 

ML-Agents 툴킷 개발에 도움을 주신 분들

Unity ML-Agents 툴킷은 오픈 소스 프로젝트로서 커뮤니티에서 많은 도움을 얻었습니다. 이 릴리스에 포함된 개선 기능을 만드는 데 외부에서 도움주신 분들께 감사의 말씀을 꼭 전하고 싶습니다(@Pyjamads(렌더 텍스처), @Tkggwatson(최적화 개선), @malmaud(커스텀 프로토콜 버퍼 기능) 및 @LeSphax(동영상 레코더), @Supercurious/@rafvasq/@markovuksanovic/@borisneal/@dmalpica(다양한 개선 사항)). 감사합니다.

 

향후 계획

 

이번 Unity ML-Agents 툴킷 릴리스를 통해 여러분은 에이전트를 단일 머신에서 더 빠르게 훈련할 수 있게 되었습니다. 유니티는 이 분야에 대한 투자를 계속하여 단일 머신에서 리소스 사용을 더욱 극대화할 수 있게 해주는 업데이트를 릴리스할 계획입니다.

머신러닝과 게임이 만나는 이 흥미로운 분야에 도전하고 싶으시다면, 유니티에서 진행하는 채용 공고를 확인하시고 지원해주시기 바랍니다.

이번 릴리스에서 제공하는 기능을 사용해 보시고 많은 의견을 주시기 바랍니다. ML-Agents 툴킷과 관련한 의견은 다음의 설문 조사에 참여하고 자유롭게 이메일로 직접 알려주시면 됩니다. 사용 과정에서 발생하는 문제나 질문은 ML-Agents GitHub 이슈 페이지에서 문의해 주시기 바랍니다.

9 코멘트

코멘트 구독

코멘트를 달 수 없습니다.

  1. What’s the actual command to run multiple instances?
    –num-envs=16
    Seems to be the right command but it isn’t working for me.

    1. Hi @willie, yes you are correct. The –num-envs=16 argument should work, except that 16 might be too large if you are not using a really powerful machine. The documentation is here https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Training-ML-Agents.md.

      If you are having trouble running this command, please post an issue on https://github.com/Unity-Technologies/ml-agents/issues, and we will get back to you soon.

    2. Yes –num-envs=16 should be the correct argument. If it doesn’t work for you, please post an issue on https://github.com/Unity-Technologies/ml-agents/issues.

  2. What up with this JamCity logo ADS next to Unity logo?

  3. When documentation will be updated?

  4. How about memory usage when running 16 parallel games?

    1. It depends on how much your Unity executable will consume. In our case we are using a machine with 64GB memory.

    2. It depends on how much memory your Unity executable will take up. In our Snoopy Pop case, we were using a 64GB machine, and more than half of the memory was used.