유니티 머신 러닝 Unity ML Agents 기초 세팅
2022. 8. 24. 19:49ㆍUnity/ML Agents
"본 글은 엔픽셀 인턴쉽 중 작성한 문서로서 회사의 허락을 받아 공개합니다."
글쓸이 : 김태균
머신러닝을 우리 게임에?!
ML-Agent 개발환경 설정(Window OS) 설치 참고
릴리즈 19 기반으로 작성되었습니다. 가상 환경에서 구동하는 것을 제안합니다. 본 문서 또한 가상환경 세팅을 포함하고 있습니다.
- 아나콘다 설치
- pip 업그레이드 (conda prompt 실행 후)
python -m pip install --upgrade pip
- ML agent 모듈 다운로드 - 스크롤 내려서 Releases 19 Downloads 클릭
- 가상 환경 구축
- 파이썬이 컴퓨터에 설치되어 있지 않은 경우
conda create -n mltest pyrhon=3.7 conda activate mltest
- 파이썬이 컴퓨터에 설치되어 있는 경우(파이썬 3.7에서만 돌아가기 때문)
conda create -n downgrade python=3.7 anaconda conda activate downgrade
- Mlagent 모듈 설치 경로로 이동 cd ...
- 가상 환경 세팅
pip3 install torch~=1.7.1 -f https://download.pytorch.org/whl/torch_stable.html pip3 install -e ./ml-agents-envs pip3 install -e ./ml-agents
- 설치 확인
$ mlagents-learn
유니티 프로젝트 설정
- package manager - git으로 패키지 add
- package manager - Input System 패키지 다운로드
- package manager - disk로 add - mlagnet 모듈 폴더로 이동 - com.unity.ml-agents.extensions 이동 - json 파일 import
시작
- 실험 세팅, 움직일 객체(Agent_1)만 Rigidbody 생성
- Agent_1 Scripts 생성
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.MLAgents;
using Unity.MLAgents.Actuators;
using Unity.MLAgents.Sensors;
public class Agent_Control : Agent
{
Rigidbody rBody;
public Transform Target;
void Start()
{
rBody = GetComponent<Rigidbody>();
}
public override void OnEpisodeBegin()
{
if(this.transform.localPosition.y < 0)
{
this.rBody.angularVelocity = Vector3.zero;
this.rBody.velocity = Vector3.zero;
this.transform.localPosition = new Vector3(0, 0.5f, 0);
}
Target.localPosition = new Vector3(Random.value * 8 - 4 , 0.5f, Random.value * 8 - 4);
} //에피소드(학습단위)가 시작할때마다 호출
public override void CollectObservations(VectorSensor sensor)
{
sensor.AddObservation(Target.localPosition);
sensor.AddObservation(this.transform.localPosition);
sensor.AddObservation(rBody.velocity.x);
sensor.AddObservation(rBody.velocity.z);
} //환경 정보를 관측 및 수집해 정책 결정을 위해 브레인에 전달하는 메소드 - 인스펙터 space size 조절 (예시는 3+3+1+1)
public float forceMultiplier = 10;
public override void OnActionReceived(ActionBuffers actions)
{
Vector3 controlSignal = Vector3.zero;
controlSignal.x = actions.ContinuousActions[0];
controlSignal.z = actions.ContinuousActions[1];
rBody.AddForce(controlSignal * forceMultiplier);
//Rewards
float distanceToTarget = Vector3.Distance(this.transform.localPosition, Target.localPosition);
if(distanceToTarget < 1.42f)
{
SetReward(1.0f);
EndEpisode();
}
else if(this.transform.localPosition.y < 0)
{
EndEpisode();
}
}//브레인(정책)으로 부터 전달 받은 행동을 실행하는 메소드
}
- 인스펙터 설정
- space size 조절(데이터 차원의 합)
- Behavior Name 설정
- 타겟 transform 입력
- Decsion Requester 컴포넌트 추가(연속적인 움직임의 경우)
실행
- Hyperparameter 조정: 모듈 폴더의 config - ppo - basic.yaml 수정 참고 자료
behaviors: RollerBall: trainer_type: ppo hyperparameters: batch_size: 10 buffer_size: 100 learning_rate: 0.0003 beta: 0.005 epsilon: 0.2 lambd: 0.99 num_epoch: 3 learning_rate_schedule: linear network_settings: normalize: false hidden_units: 128 num_layers: 2 vis_encode_type: simple reward_signals: extrinsic: gamma: 0.99 strength: 1.0 keep_checkpoints: 5 max_steps: 100000 time_horizon: 64 summary_freq: 10000
- 실행 - Mean Reward가 높아질 수록 의도대로 교육 되고 있는 것
mlagents-learn config/ppo/basic.yaml --run-id=myRB0
모델 생성
- 폴더의 results - runid 폴더 이동 - onnx파일 유니티 assets으로 이동
- agent 인스펙터의 Behavior Parameters - Model에 연결
- 끝
작성 완료
- 유니티 머신 러닝 Unity ML Agents 기초 세팅