상세 컨텐츠

본문 제목

딥러닝 추론

AI

by cepiloth 2021. 4. 23. 11:27

본문

728x90
반응형
20210423-선행조사.pptx
4.47MB

딥러닝에 두 가지 단계

딥러닝(Deep Learning)을 크게 두 가지의 단계로 구분한다면 학습 단계추론 단계로 나눌 수 있다. 학습 단계에서는 알고리즘이 새로운 모델을 생성하거나 또는 사전에 학습된 모델을 특정 애플리케이션에 맞게 변형하고 모델이 파라미터들을 학습하도록 한다. 추론 단계에서는 학습된 파라미터에 기반해서 새로운 데이터에 대해서 예측이나 판단을 한다.

추론과 상용화

2010년부터 딥러닝 솔루션이 다양하게 개발되었다. 흔히 많이 들어온 TensorFlow, Keras, PyTorch 등이 있다. 아래 그림은 연도별 개발된 딥러닝 솔루션이다. 현재는 AI 오픈소스 개발 툴에서의 춘추전국시대라고 할 수 있다.


많은 딥러닝 솔루션이 있지만 광대한 모델의 크기를 양자화(압축)하는 기법은 아직 미비한 상태이다. 현재까지 학계에서는 정확도에만 관심이 있으며, 모델의 크기(용량)에는 크게 관심이 없다. 하지만 상용화 입장에서 모델의 크기는 매우 중요하다. 기본적으로 훈련된 모델을 양자화를 하게 되면 정확도는 낮아진다. 용량과 정확도는 TRADE-OFF 관계이며 적절한 밸런스가 필요하다.

많은 개발자들은 배포를 위해 고민을 하게 되어있지만 여러 딥러닝 모델들을 통합하는 정책은 통합되지 않았다. 여러 기업은 자신의 솔루션을 이용해서 개발을 유도하고 있다.

딥러닝 솔루션별 모델 종류

딥러닝 솔루션별 생성하는 모델의 구성요소(확장자)가 다르다.

Model Extension
Caffe* Models .caffemodel
Tensorflow* models .pb
Tensorflow* Light .tiflite
ONNX* models .onnx
Kaldi* models .nnet

딥러닝 모델의 통합

딥러닝 모델별 통합관리하기 위해서 Amazon Web Services, Microsoft, Facebook 및 기타 여러 파트너가 ONNX를 지원을 하기 시작했다. ONNX라는 모델로 Open Neural Network Exchange (ONNX)는 딥 러닝 모델을 나타내는 데 사용하는 열린 포맷이다.

생성 예) 딥러닝 라이브러리들은 모델을 ONNX 모델로 변환 저장 기능을 제공한다.


마이크로소프트 Azure 를 통한 ONNX 사용 예시

AZURE에서는 ONNX 모델을 바로 사용할 수 있다.
출처 - docs.microsoft.com/ko-kr/azure/machine-learning/concept-onnx

OpenVINO 통한 ONNX 사용 예시

OpenVINO 에서는 ONNX 모델을 Model Optimizer를 통해 IR포맷으로 변환을 해야 사용이 가능하다.
출처 - docs.openvinotoolkit.org/latest/openvino_docs_MO_DG_prepare_model_convert_model_Convert_Model_From_ONNX.html

AWS Deep Learning AMI 예시

출처 - docs.aws.amazon.com/ko_kr/dlami/latest/devguide/onnx.html

TensorRT 예시

출처 - docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.htmlwww.edge-ai-vision.com/2020/04/speeding-up-deep-learning-inference-using-tensorflow-onnx-and-tensorrt/

OpenVINO에서 Model Optimizer 사용법

OpenVINO toolkit Window 10 설치 아티클로 OpenVINO의 환경설정을 사전에 설치되어 있다고 가정한다. TensorFlow, Caffe, MXNet, ONNX 등을 통해 생성된 모델을 OpenVINO에서 사용하기 위해서 Model Optimizer를 통하여 IR(Intermediate Representation) 형식으로 변환이 필요하다.

< 모델 변환 전체 흐름 >

Model Optimizer 환경 구성

[OpenVINO 설치경로]/deployment_tools/model_optimizer/install_prerequisites directory and run:

커맨드창에서 install_prerequisites.bat 입력

딥러닝 솔루션별로 환경 설정을 하기 위해서는 각 Framework를 설치해야 한다.

[OpenVINO 설치경로]/deployment_tools/model_optimizer/install_prerequisites directory and run: OpenVINO 설치로 경로로 이동하여 아래 프레임 워크를 설치한다.
Framework install
Caffe* install_prerequisites_caffe.bat
Tensorflow* install_prerequisites_tf.bat
Tensorflow2* install_prerequisites_tf2.bat
MXNet* install_prerequisites_mxnet.bat
ONNX* install_prerequisites_onnx.bat

딥러닝 프레임워크가 모두 설치되어 있다면 아래 절차를 따른다.

1. Configure the Model Optimizer for TensorFlow : TensorFlow was used to train your model 2. Freeze the TensorFlow model :If your model is not already frozen or skip this step and use the instruction to a convert a non-frozen model 3. Convert a TensorFlow model : To produce an optimized Intermediate Representation(IR) of the model based on the trained network topology, weight, and biases values. Test the model in the Intermediate Representation format using the Inference Engine in the target environment via provided sample applications.

전체 소스 코드를 보려면 아래 더보기 클릭

더보기
#pip 명령으로 환경 구성 sudo apt-get install python-tk #mxnet 을 및 추가 패키지 설정 pip3 install --user mxnet pip3 install --user matplotlib pip3 install --user scikit-image #아래 리파지토리에를 clone 한다. git clone https://github.com/zhaw/neural_style #아래 경로에서 vgg19.params 모델을 받는다. https://github.com/dmlc/web-data/raw/master/mxnet/neural-style/model/vgg19.params #https://github.com/zhaw/neural_style clone 된 리파지토리로 이동하여 fast_mrf_cnn 폴더로 이동한다. cd ./fast_mrf_cnn #symbol.py 내용을 수정한다. def decoder_symbol(): data = mx.sym.Variable('data') data = mx.sym.Convolution(data=data, num_filter=256, kernel=(3,3), pad=(1,1), stride=(1, 1), name='deco_conv1') #mx.sym.Variable('data') -> decoder_symbol_with_vgg(vgg_symbol) 변경 def decoder_symbol_with_vgg(vgg_symbol): data = mx.sym.Convolution(data=vgg_symbol, num_filter=256, kernel=(3,3), pad=(1,1), stride=(1, 1), name='deco_conv1') #make_image.py 을 수정한다. decoder = symbol.decoder_symbol() -> decoder = symbol.decoder_symbol_with_vgg(vgg_symbol) #아래 코드를 추가한다 args = mx.nd.load('%s_decoder_args.nd'%model_prefix) auxs = mx.nd.load('%s_decoder_auxs.nd'%model_prefix) arg_dict.update(args) #args=args -> args=arg_dict 로 변경 self.deco_executor = decoder.bind(ctx=mx.cpu(), args=args, aux_states=auxs) -> self.deco_executor = decoder.bind(ctx=mx.cpu(), args=arg_dict, aux_states=auxs) # decoder.bind() 함수의 모든 mx.gpu 코드를 mx.cpu 로 변경한다. #OpenVINO 에서 사용하기 위해서 model 데이터를 저장하기 위한 코드를 추가한다. self.vgg_executor._symbol.save('{}-symbol.json'.format('vgg19')) self.deco_executor._symbol.save('{}-symbol.json'.format('nst_vgg19')) #여기까지가 vgg19.param 모델을 GPU 에서 CPU 로 사용하기 위한 전처리 단계이다.


정상적으로 구성하였다면은 아래와 같이 전처리 모델이 구성된다.

Model Optimizer를 통하여 IR 포맷을 구성하는 방법

#새로운 디렉토리를 생성한다. mkdir nst_model #앞서 생성된 모델을 모두 복사한다. cp nst_vgg19-symbol.json nst_model cp vgg19-symbol.json nst_model cp ../vgg19.params nst_model/vgg19-0000.params cp models/13_decoder_args.nd nst_model cp models/13_decoder_auxs.nd nst_model #앞서 구성된 모델을 통하여 IR 을 생성한다. python3 mo.py --input_symbol <path/to/nst_model>/nst_vgg19-symbol.json --framework mxnet --output_dir <path/to/output_dir> --input_shape [1,3,224,224] --nd_prefix_name 13_decoder --pretrained_model <path/to/nst_model>/vgg19-0000.params

OpenVINO에서 사용하는 IR 포맷이 완성된 화면이다.

현재까지의 과정은 MXNet 프레임워크에서 만든 모델을 IR 만드는 과정이다.

추론 엔진을 통한 실행

OpenVINO Sample Application을 통한 이며 앞서 만든 IR 포맷인 nst_vgg19-symbol.xml을 사용한다.

원본 STYLE TRANSFER 적용된 그림

< VGG19 중 특정 이미지 스타일만 학습되어 있는 결과 >

결론

다양한 딥러닝 프레임워크가 존재하고 이를 활용하는 범위는 매우 넓다. NVIDA, INTEL, MICROSOFT, FACEBOOK, AMAZONE, GOOGLE 등 여러 기업에서 각 회사에서 개발된 제품을 장려하고 있다.
사전조사에는 OpenVINO를 사용하여서 진행하려고 하였으나 INTEL 계열 CPU에서만 동작하는 단점과 NVIDIA에서 만든 TensorRT 또한 x86에서만 Python, C++ 두 언어를 지원하고, 그 외의 H/W 플랫폼에서는 C++ 만 지원한다.
이 기종의 환경에서 모두 지원하기는 최적화 관점에서 장단점이 있다. 처음부터 모든 플랫폼을 지원하는 것은 어렵다고 판단하고 모바일에서 추론 엔진을 활용할 수 있는 엔진인 TensorFlow Lite로 방향성을 잡도록 한다.

참고문헌

https://www.kosen21.org/info/gtbReport/gtbReportDetail.do?articleSeq=GTB_0000000000115536
https://www.hanbit.co.kr/channel/category/category_view.html?cms_code=CMS5151815805
https://www.itworld.co.kr/news/129659
https://docs.openvinotoolkit.org/latest/index.html
https://developer.nvidia.com/tensorrt
https://onnx.ai/
https://aws.amazon.com/ko/machine-learning/amis/

728x90
반응형

관련글 더보기

댓글 영역