0. ML-Agents란?

원문


The Unity Machine Learning Agents Toolkit (ML-Agents) is an open-source project that enables games and simulations to serve as environments for training intelligent agents. We provide implementations (based on PyTorch) of state-of-the-art algorithms to enable game developers and hobbyists to easily train intelligent agents for 2D, 3D and VR/AR games. Researchers can also use the provided simple-to-use Python API to train Agents using

 

지능형 에이전트를 훈련하는 환경, 파이토치 기반이며 간단한 API를 사용하여 에이전트를 훈련시킬 수 있는 툴킷

 

 


1. 유니티 설치

유니티 공식 사이트에서 유니티 허브 다운로드 후 유니티 허브를 통해 유니티 설치

만약 install이 진행되지 않는다면 보안 프로그램을 종료 후 설치해 볼 것 

https://unity.com/kr/download

 

창의적인 프로젝트 시작 및 Unity Hub 다운로드 | Unity

간단한 3단계로 Unity를 다운로드하고 전 세계적으로 가장 큰 인기를 누리는 2D/3D 멀티플랫폼 경험 및 게임 제작용 개발 플랫폼을 사용하세요.

unity.com


2. ML-Agents 다운로드

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

 

GitHub - Unity-Technologies/ml-agents: The Unity Machine Learning Agents Toolkit (ML-Agents) is an open-source project that enab

The Unity Machine Learning Agents Toolkit (ML-Agents) is an open-source project that enables games and simulations to serve as environments for training intelligent agents using deep reinforcement ...

github.com

 

ML-Agents gitHub에서 소스를 다운로드 현재 최신버전인 2.2.를 사용하였다.

 

다운로드 후 작업할 디렉토리에 압축 해제

 


3. Anaconda, Python, learn-ml

3-1. Anaconda

다른 프로젝트의 python과 충돌하지 않도록 가상환경을 사용하며, 사용하기 위해 Anaconda를 사용.

공식 사이트에서 아나콘다 설치

https://docs.anaconda.com/anaconda/install/

 

Installing Anaconda Distribution — Anaconda documentation

 

docs.anaconda.com

 

설치 확인

 

 

3-2. python 설치

ML-Agents의 Docs > Installation을 확인하면 권장 python 버전을 확인 할수 있다.

권장 버전은 3.10.12로 python을 설치

 

각각 설치, 가상환경 목록 조회, 가상환경 활성화

conda create -n mlagent-3.10.12 python=3.10.12

conda env list

conda activate mlagent-3.10.12

 

 

 

파이썬에서 학습에 사용할 mlagents 설치, 문서 권장 설치 버전인 1.1.0, 설치후 pip list로 라이브러리 설치 확인

 

pip install mlagents==1.1.0

pip list


4. Unity에 ML-Agents 플러그인 적용

4-1. ML-Agents의 예제 프로젝트 Import

유니티 허브 > add > add project from disk > {압축해제한 경로}\ml-agents-release_22\ml-agents-release_22\Project

 

좌측 탐색기에서 Asset > Example > Scene > 3DBall 선택

 

4-2. ML-Agents 플러그인 적용

unity > 상단의 window 메뉴 > package manager 클릭 > 상단의 + > install package from disk > 압축해제 폴더 이동 >
com.unity.ml-agents, com.unity.ml-agents.extension 파일의 package.json 파일 선택

 

 


 

5. 빌드

File > build profile > scene List에 3DBall 확인 > Build


6. 학습

6-1. mlagent-learn

아나콘다 가상 python에서 설치한 mlagent를 사용하여 학습진행.

 

--env 옵션은 build한 Unity의 파일, env옵션 없이 진행한다면 Unity의 재생 버튼을 사용하여 학습 가능

mlagents-learn {yaml파일} --env={build한 exe 파일} --run-id={결과 저장할 폴더 이름}

# ml-agents 압축 푼 경로에서 
mlagents-learn config/ppo/3DBall.yaml --env=../../build_project01/3DBall.exe --run-id=test04

 

 

 

6-2. 결과파일

{압축해제 경로}/results/{run-id}

*.onnx 파일이 학습시킨 모델.

 

6-3. 적용

모델을 아래에 Drag 혹은 복사 붙여넣기.

 

적용할 Agent 클릭 후 모델에 Drag > 저장 후 재생 


 

 

 

 

참고 사이트

 

 

Spring Integration Overview

스프링 인티그레이션의 핵심 개념과 메인 컴포넌트 소개

godekdls.github.io

 

Main Component

스프링 인테그레이션은 파이프 필터 모델로 작성되며 구성은 “파이프”, “필터”, “메시지”로 이루어져 있다.


Message

스프링 인테그레이션에서 사용되는 데이터를 의미하며 사용하는 데이터를 감싼 래퍼(wrapper)이다.
즉 Message와 같은 wrapper형식으로 사용한다.


Message Channel(Pipe)

메세지 채널은 Pipe의 역할을 하며 Message를 Filter로 전달하는 역할을 한다.
메시지를 전달하는 프로듀서 채널, 메시지를 받아가는 컨슈머 채널이 ****분리되어 있어 채널간 인터셉터 등을 사용 할 수 있다.

Message Channel Interface

  • MessageChannel
  • PollableChannel
  • SubscribeChannel

Message Channel Impliment

위의 메시지 인터페이스를 구현한 구연체들이 존재한다.

  • publishSubscribeChannel: 전달받은 Message를 자신을 구독한 모든 Handler에게 전달한다.
  • QueueChannel: Point to Point로 해당 채널의 컨슈머가 여럿 있더라도 하나의 컨슈머에 전달한다.
  • 큐가 가득차면 send 메소드를 호출 시 sender를 블록킹한다*.
  • 큐가 비어있다면 recevie호출이 블록킹 된다.*
  • PriorityChannel: 큐 채널은 First -In-First-Out을 따르지만 PriorityChannel은 메시지마다 우선순위를 부여할 수 있다.
  • RendezvousChannel: receive를 호출 하기 전까지 sender를 블록한다.
  • DirectChannel: point-to-pint로 동작하며 PollableChannel을 구현한것이 아닌 SubscribeChannel을 구현하였기에 메시지를 직접 Handdlrt에 전달한다.
    Poller방식이 아니기 때무에 스레드를 스케줄링 하지 않아 오버헤드가 없기 때문에 Spring Integration의 디폴트 채널이다.
    구독하고 있는 MessageHandler를 호출하는 일을 메시지 디스페처에 위임한다.
  • ExcutorChannel: DirectChannel과 같지만 MessageHandler를 호출하는 디스패치 수행을 TastExcutor에게 위임한다는 것이다.
  • FlusMessageChannel: 리액티브 구독자가 온맨드로 컨슘해갈 수 있도록 전달받은 메시지를 변경하는 채널

MessageEndpoint(Filter)

Filter는 메시지를 컨슘하는 모든 구성요소를 말한다.

Message Transformer

메시지의 내용 및 구성요소를 변환하고 수정한 메시지를 반환하는 일을 한다.
Ex) Byte를 String으로 변환한다던지.

MessageFilter

메시지 필터는 해당 메시지를 다른 채널로 전달할지 말지를 결정한다. 필터에서는 간단한 boolean 테스트 메소드가 있으면 된다. Ex) header 값에 따른 전달 여부 판단.

MessageRouter

메시지 라우터는 해당 메시지를 여러 채널중 분기처리를 할 때 사용된다.
Ex) 콜 시작 메시지 → callStartChannel, 콜 종료 메시지 → callEndChannel

Spliter

입력 받은 메시지를 여러 메시지로 분할하는 역할을 담당하며 일반적으로 “복합”페이로드를 세분화하여 여러 메시지로 나누는데 사용한다.

Aggregator

Spliter와 반대로 여러 메시지를 하나의 메시지로 통합할 때 사용된다.

ServiceActivator

서비스 인스턴스를 메시지 시스템에 연결하기 위한 범용 엔드포인트이다. 입력 채널을 반드시 구성해야하며 반환할 수 있는 경우 출력 체널도 지정할 수 있다.

ChannelAdeptor

채널 어뎁터는 메시지 채널을 다른 시스템이나 전송 구성요소에 연결해주는 엔드포인트다. 어뎁터는 인바운드와 아웃바운드로 구성된다.


간단한 예제

https://github.com/Kmmanki/spring_integration_study_1

 

GitHub - Kmmanki/spring_integration_study_1

Contribute to Kmmanki/spring_integration_study_1 development by creating an account on GitHub.

github.com

해당 예제는 pythonSender - Spring Integration - pythonReceiver 로 구성되어 있으며

 

python과 Integration은 TCP 소켓으로 연결한다.

python sender에서 1 이라는 입력을 주면 spring integration에서 1 > 2 메시지를 만들어 pythonReceiver 전달하고 pythonReceiver 는 전달 받은 메시지에 > 3을 붙여 1 > 2 > 3을 만들어 integration으로 reply한다. integration은 전달받은 1 > 2 > 3에 > 4를 붙여 1 > 2 > 3 > 4를 다시 reply하여 sender로 전송한다.

 

예제코드 도식화

 

 

 

정보처리기사


Tensorflow Developer


SQLD


 

// Online C++ compiler to run C++ program online
#include <iostream>
using namespace std;

template <typename T>
void pointerSwitch(T* a, T* b){
    // a의 주소 b의 주소를 받음음
    T tmp = *a; // 입력 받은 인수가 주소이기 때문에 값으로 변환

    *a = *b;
    *b = tmp;
}

template <typename T>
void referenceSwitch(T& a, T& b) {
    T tmp = a;
    a = b;
    b = tmp;
}

int main() {
    int a = 10;
    int b = 20;
    cout << *&a;

    cout << "a는" << a << "\n";
    cout << "b는" << b << "\n";    
    cout << "pointer switch \n" ;    
    
    pointerSwitch(&a, &b);
    
    cout << "a는" << a << "\n";
    cout << "b는" << b << "\n";  
    cout << "reference switch \n" ;
    
    referenceSwitch(a, b);
    
    cout << "a는" << a << "\n";
    cout << "b는" << b << "\n"; 
    return 0;
}

 

 

10a는10
b는20
pointer switch 
a는20
b는10
reference switch 
a는10
b는20

'기타 > 기타의 기타' 카테고리의 다른 글

Unity와 ML-Agents 1차 Unity와 ML-Agent 설치  (0) 2025.01.17
Spring Integration 컴포넌트 간단정리  (0) 2024.03.25
자격증 정리  (0) 2023.12.28
JVM Runtime Data Area  (1) 2023.12.23

+ Recent posts