유니티 머신 러닝 Unity ML Agents 기초 세팅

2022. 8. 24. 19:49Unity/ML Agents

"본 글은 엔픽셀 인턴쉽 중 작성한 문서로서 회사의 허락을 받아 공개합니다."

 

 

글쓸이 : 김태균
머신러닝을 우리 게임에?!

ML-Agent 개발환경 설정(Window OS) 설치 참고

릴리즈 19 기반으로 작성되었습니다. 가상 환경에서 구동하는 것을 제안합니다. 본 문서 또한 가상환경 세팅을 포함하고 있습니다.

  1. 아나콘다 설치
  2. pip 업그레이드 (conda prompt 실행 후)
python -m pip install --upgrade pip
  1. ML agent 모듈 다운로드 - 스크롤 내려서 Releases 19 Downloads 클릭
  2. 가상 환경 구축
  • 파이썬이 컴퓨터에 설치되어 있지 않은 경우
  • conda create -n mltest pyrhon=3.7 conda activate mltest
  • 파이썬이 컴퓨터에 설치되어 있는 경우(파이썬 3.7에서만 돌아가기 때문)
  • conda create -n downgrade python=3.7 anaconda conda activate downgrade
  1. Mlagent 모듈 설치 경로로 이동 cd ...
  2. 가상 환경 세팅
  3. 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
  4. 설치 확인
  5. $ mlagents-learn

유니티 프로젝트 설정

  1. package manager - git으로 패키지 add
  1. package manager - Input System 패키지 다운로드
  2. package manager - disk로 add - mlagnet 모듈 폴더로 이동 - com.unity.ml-agents.extensions 이동 - json 파일 import

시작

  1. 실험 세팅, 움직일 객체(Agent_1)만 Rigidbody 생성
  1. 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();
        }

    }//브레인(정책)으로 부터 전달 받은 행동을 실행하는 메소드




}
  1. 인스펙터 설정
  • space size 조절(데이터 차원의 합)
  • Behavior Name 설정
  • 타겟 transform 입력
  • Decsion Requester 컴포넌트 추가(연속적인 움직임의 경우)

실행

  1. Hyperparameter 조정: 모듈 폴더의 config - ppo - basic.yaml 수정 참고 자료
  2. 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
  3. 실행 - Mean Reward가 높아질 수록 의도대로 교육 되고 있는 것
  4. mlagents-learn config/ppo/basic.yaml --run-id=myRB0

모델 생성

  1. 폴더의 results - runid 폴더 이동 - onnx파일 유니티 assets으로 이동
  2. agent 인스펙터의 Behavior Parameters - Model에 연결

작성 완료

  • 유니티 머신 러닝 Unity ML Agents 기초 세팅