728x90
반응형

이번에는 한 1년전부터 눈여겨 보고 있던 유니티 머신러닝쪽을 건드려 보려고 한다

 

https://github.com/Unity-Technologies/ml-agents

 

Unity-Technologies/ml-agents

Unity Machine Learning Agents Toolkit. Contribute to Unity-Technologies/ml-agents development by creating an account on GitHub.

github.com

 

ML-Agent Clone

글쓰는 현재 시점(2021/5/17) 기준으로 최신 버전은 release 17이다

Release 17의 source로 들어가서 다운로드 해준다

 

git으로 클론하던 Github Desktop으로 하던 ZIP을 받던 상관없다

적당히 폴더를 만들어서 다운로드 해준다

 

명령프롬포트를 관리자 권한으로 열고 ml-agents 폴더로 가서 아래 명령어를 실행한다

pip install -e ml-agents-env
pip install -e ml-agents

 

Python 3.7.x

ML-Agent는 python을 기반으로 동작하기 때문에 python을 설치해주어야 한다

공식문서에 나온대로 3.7.x버전을 설치했다

https://www.python.org/downloads/release/python-379/

 

Python Release Python 3.7.9

The official home of the Python Programming Language

www.python.org

꼭 운영체제에 맞는 걸로 설치하자

보통은 64비트다

왜 난 32비트를 깔아서 3시간동안 삽질을 했을까

 

다음은 명령프롬포트를 관리자 권한으로 열고

아래 명령어들을 차례로 입력한다

curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py
pip install --upgrade pip

설치가 끝났다면 pip3 -V를 통해 잘 설치 되었는지 확인하자

 

PyTorch

PyTorch는 파이썬의 오픈소스 머신 러닝 라이브러리 중 하나이다

 

https://pytorch.org/get-started/locally/

 

PyTorch

An open source machine learning framework that accelerates the path from research prototyping to production deployment.

pytorch.org

 

위 링크에서 명령어를 복사한 뒤 명령 프롬포트에서 실행한다

 

아래 사진과 같이 잘 설치된다

이 부분에서 파이썬 잘못 깔아서 계속 삽질했다

 

여기까지 했다면 아래 명령어를 입력해서 잘되었는지 확인하자

mlagents-learn -h
더보기

D:\Files\Unity\ml-agents>mlagents-learn -h
usage: mlagents-learn [-h] [--env ENV_PATH] [--resume] [--force]
                      [--run-id RUN_ID] [--initialize-from RUN_ID]
                      [--seed SEED] [--inference] [--base-port BASE_PORT]
                      [--num-envs NUM_ENVS] [--debug] [--env-args ...]
                      [--torch] [--tensorflow] [--results-dir RESULTS_DIR]
                      [--width WIDTH] [--height HEIGHT]
                      [--quality-level QUALITY_LEVEL]
                      [--time-scale TIME_SCALE]
                      [--target-frame-rate TARGET_FRAME_RATE]
                      [--capture-frame-rate CAPTURE_FRAME_RATE]
                      [--no-graphics] [--torch-device DEVICE]
                      [trainer_config_path]

positional arguments:
  trainer_config_path

optional arguments:
  -h, --help            show this help message and exit
  --env ENV_PATH        Path to the Unity executable to train (default: None)
  --resume              Whether to resume training from a checkpoint. Specify
                        a --run-id to use this option. If set, the training
                        code loads an already trained model to initialize the
                        neural network before resuming training. This option
                        is only valid when the models exist, and have the same
                        behavior names as the current agents in your scene.
                        (default: False)
  --force               Whether to force-overwrite this run-id's existing
                        summary and model data. (Without this flag, attempting
                        to train a model with a run-id that has been used
                        before will throw an error. (default: False)
  --run-id RUN_ID       The identifier for the training run. This identifier
                        is used to name the subdirectories in which the
                        trained model and summary statistics are saved as well
                        as the saved model itself. If you use TensorBoard to
                        view the training statistics, always set a unique run-
                        id for each training run. (The statistics for all runs
                        with the same id are combined as if they were produced
                        by a the same session.) (default: ppo)
  --initialize-from RUN_ID
                        Specify a previously saved run ID from which to
                        initialize the model from. This can be used, for
                        instance, to fine-tune an existing model on a new
                        environment. Note that the previously saved models
                        must have the same behavior parameters as your current
                        environment. (default: None)
  --seed SEED           A number to use as a seed for the random number
                        generator used by the training code (default: -1)
  --inference           Whether to run in Python inference mode (i.e. no
                        training). Use with --resume to load a model trained
                        with an existing run ID. (default: False)
  --base-port BASE_PORT
                        The starting port for environment communication. Each
                        concurrent Unity environment instance will get
                        assigned a port sequentially, starting from the base-
                        port. Each instance will use the port (base_port +
                        worker_id), where the worker_id is sequential IDs
                        given to each instance from 0 to (num_envs - 1). Note
                        that when training using the Editor rather than an
                        executable, the base port will be ignored. (default:
                        5005)
  --num-envs NUM_ENVS   The number of concurrent Unity environment instances
                        to collect experiences from when training (default: 1)
  --debug               Whether to enable debug-level logging for some parts
                        of the code (default: False)
  --env-args ...        Arguments passed to the Unity executable. Be aware
                        that the standalone build will also process these as
                        Unity Command Line Arguments. You should choose
                        different argument names if you want to create
                        environment-specific arguments. All arguments after
                        this flag will be passed to the executable. (default:
                        None)
  --torch               (Removed) Use the PyTorch framework. (default: False)
  --tensorflow          (Removed) Use the TensorFlow framework. (default:
                        False)
  --results-dir RESULTS_DIR
                        Results base directory (default: results)

Engine Configuration:
  --width WIDTH         The width of the executable window of the
                        environment(s) in pixels (ignored for editor
                        training). (default: 84)
  --height HEIGHT       The height of the executable window of the
                        environment(s) in pixels (ignored for editor training)
                        (default: 84)
  --quality-level QUALITY_LEVEL
                        The quality level of the environment(s). Equivalent to
                        calling QualitySettings.SetQualityLevel in Unity.
                        (default: 5)
  --time-scale TIME_SCALE
                        The time scale of the Unity environment(s). Equivalent
                        to setting Time.timeScale in Unity. (default: 20)
  --target-frame-rate TARGET_FRAME_RATE
                        The target frame rate of the Unity environment(s).
                        Equivalent to setting Application.targetFrameRate in
                        Unity. (default: -1)
  --capture-frame-rate CAPTURE_FRAME_RATE
                        The capture frame rate of the Unity environment(s).
                        Equivalent to setting Time.captureFramerate in Unity.
                        (default: 60)
  --no-graphics         Whether to run the Unity executable in no-graphics
                        mode (i.e. without initializing the graphics driver.
                        Use this only if your agents don't use visual
                        observations. (default: False)

Torch Configuration:
  --torch-device DEVICE
                        Settings for the default torch.device used in
                        training, for example, "cpu", "cuda", or "cuda:0"
                        (default: None)

 

마지막으로 이것까지 해주자

python -m pip install mlagents==0.26.0

 

지금 여기저기서 본것들과 실패한것들이 겹쳐서 안될수도 있다

파이썬 ㄱㅅㄲ

 

아마 될거다...

 

Unity Package Import

이제 유니티에서 새 프로젝트를 만들자

 

Window - Package Manager를 클릭

+ - Add package from disk... 클릭

 

ml-agents를 다운로드 했던 폴더에서

com.unity.ml-agents와 com.unity.ml-agents.extensions의 package.json을 import한다

 

3D ball 예제

ml-agents\Project\Assets에 있는 것들을 유니티에 옮겨주자

 

ML-Agents\Examples\3DBall\Scenes에 있는 3DBall를 열어준다

 

InputSystem 관련 에러가 뜬다면

Package Manager를 통해 Input System를 설치해주면 된다

 

그리고 PushBlockWithInputPlayerController.cs에서

계속 Unity.MLAgents.Extensions에 Input이 없다고 해서 에러가 파일을 삭제해버렸다

문제를 해결할 수 없다면 문제의 원인을 없어버리면 되지...

 

신기하네...

 

이제 학습을 시켜보자

ml-agents를 클론했던 폴더로 가서 아래 명령어를 실행한다

mlagents-learn config/ppo/3DBall.yaml --run-id=first3DBallRun

잠시 후 유니티 로고가 뜨면서

Start training by pressing the Play button in the Unity Editor

가 출력되면 유니티에서 play 버튼을 누른다

 

기본적으로 500,000회의 학습을 진행하며 약 13분정도 걸렸다

 

결과는 ml-agents\result=first3DBallRun에서 .onnx파일을 찾을 수 있다

이 파일을 Project\Assets\ML-Agents\Examples\3DBall\TFModels으로 복사하고

 

3DBall Agent의 model에 넣어준다

 

실행하면 딱히 변화는 없지만 학습은 된거다

 ml-agents\config\ppo에서 3DBall.yaml을 수정해서 학습회수에 따른 모델 여러개를 만들어서 비교하면 될듯 하다

아래 github docs를 참고해서 하면 된다

https://github.com/Unity-Technologies/ml-agents/blob/release_17_docs/docs/Training-Configuration-File.md