인공지능 공부

unity barracuda 개념잡기

DualQuaternion 2023. 7. 24. 17:54

https://docs.unity3d.com/Packages/com.unity.barracuda@1.0/manual/GettingStarted.html

 

Getting started with Barracuda | Barracuda | 1.0.4

Getting started with Barracuda This guide provides a brief overview on how to use Barracuda and run neural networks in Unity. Barracuda is an inference library. It allows you to execute a pre-trained neural network in Unity. To integrate Barracuda into you

docs.unity3d.com

원문은 위와 같다.

 

1. 바라쿠다 시작하기

이 가이드는 바라쿠다를 어떻게 사용하는지와 유니티에서 뉴럴 네트워크를 실행을 어떻게 하는 지에 대한 간단한 오버뷰를 제시한다.

 

바라쿠다는 inference library이다. 바라쿠다는 유니티 내에서 미리 학습된 NN을 실행할 수 있게 해준다. 바라쿠다를 프로젝트에 연도하기 위해서는 다음과 같은 과정을 거친다.

 

 1) 파이토치, 텐서플로우, 케라스 프레임워크 등에서 ONNX 파일 포맷으로 NN을 출력한다.

 2) .onnx 파일을 프로젝트에 추가한다. 그냥 에셋 처럼 추가하면 된다.

 3) 에셋으로부터 모델을 로드한다.

 4) inference engine을 생성한다.
 5) 모델을 실행한다.

 6) 결과를 활용한다.

 

2. 사용자 NN 로드하기

학습된 모델을 로드하는 건 두가지 단계로 구분된다.

 1) 외부 툴에서 ONNX 포맷으로 학습된 모델을 익스포트한다. 

 2) ONNX 에셋을 바라쿠다로 임포트 한다.

 

ONNX 모델을 로드하기 위해서는 .onnx 파일을 프로젝트의 asset 폴더에 넣어줘야 한다. 그러면 이 파일은 NNModel 타입의 에셋으로 인식된다. 

 

임포트 과정을 마치고 나면, 스크립트에서 바로 에셋에 접근할 수 있다.

public NNModel modelAsset;

이 과정은 사용자가 에디터 UI에서 특정한 에셋을 할당할 수 있게 해준다.

 

model은 에셋 wrapper다. 에셋 wrapper는 모델을 바이너리 포맷으로 저장한다. 로드하고 컴파일하여 런타임 모델로 만드는 과정은 아래 코드를 통해 수행된다.

 

public NNModel modelAsset;
private Model m_RuntimeModel;

void Start()
{   
    m_RuntimeModel = ModelLoader.Load(modelAsset);
}    

 

3. 뉴럴 네트워크 실행하기

 

추론 엔진(Worker) 생성하기 

 바라쿠다 엔진으로의 핵심 인터페이스는 IWorker라고 불린다. 하나의 worker는 모델을 실행가능한 작업으로 나누고, 작업들을 GPU나 CPU로 분배한다. 

var worker = WorkerFactory.CreateWorker(<WorkerFactory.Type>, m_RuntimeModel); 

모델 작동시키기

 모델을 로드했고, IWorker 인터페이스도 만들었다면, 사용자는 모델을 작동할 수 있다. 사용자는 Tensor object만을 넣어줄 수도 있고, 딕셔너리의 이름과 Tesnfor 쌍을 입력할 수도 있다.

 

 싱글 인풋 시나리오는 다음 형태의 코드를 가진다. 

Tensor input = new Tensor(batch, height, width, channels); 
    worker.Execute(input);

 NN이 멀티 인풋을 필요로 한다면 인풋 네임을 키로 하는 Dictionary를 이용하면 된다. 그때의 코드는 다음과 같다. 

    var inputs = new Dictionary<string, Tensor>();
    inputs[name1] = new Tensor(batch, height1, width1, channels1);
    inputs[name2] = new Tensor(batch, height2, width2, channels2);
    worker.Execute(inputs);

모델 실행이나, 텐서의 구성등에 대해서는 원문의 링크를 참고하자.

 

4. 결과 가져오기

 

만약 싱글 아웃풋 모델이라면 worker.PeekOutput을 쓰면 된다. 그렇지 않으면 아웃풋 이름을 제시해야 한다.

Tensor output = m_Worker.PeekOutput(outputName);

노트: worker.PeekOutput이 완전히 데이터를 복사하는게 아니고, 레퍼런싱만 해주는 작업임을 기억해야 한다.  

 

추가로 모든 텐서 인풋을 수동으로 해제해줘야 한다.