엔비디아 TAO Toolkit 결과 모델을 다양한 엣지 장치에서 실행하기 위한 LaunchX 연동 방법

Hoin Na
CoS Tech Part Manager, Nota AI

 

소개

AI 모델에 있어 실시간 처리, 비용 효율성, 보안의 중요성이 커지면 엣지 AI에 대한 수요가 폭발적으로 증가하고 있습니다. 이에 따라 AI 모델을 다양한 엣지 장치에 배포하려는 노력이 활발해지고 있습니다. 엣지에서 AI 모델의 성능을 최적화하려면 각 장치에 맞게 모델을 최적화하고 간소화해야 합니다. 그러나 장치마다 요구되는 모델 프레임워크와 데이터 유형이 다르기 때문에, 어떤 장치가 우수한 성능을 발휘하는지를 검증하는 과정에 상당한 시간과 자원이 필요합니다. LaunchX는 AI 모델의 변환과 벤치마크 결과를 제공하는 솔루션으로, 다양한 반도체 회사의 장치에 맞춰AI 모델을 변환하고 그 벤치마크 결과를 확인할 수 있는 서비스를 제공합니다.

TAO Toolkit은 엔비디아에서 개발한 오픈 소스 AI 모델 최적화 도구로, Tensorflow와 PyTorch 기반 모델의 AI 모델의 학습과 최적화를 더 쉽게 진행할 수 있도록 설계되었습니다. 초기에는 TAO Toolkit으로 최적화된 모델을 엔비디아 Jetson 장치에서만 사용할 수 있었지만, 버전 5.0이 출시되면서 ONNX 모델로 내보내는 기능이 추가되어 이제 엔비디아 장치뿐만 아니라 다른 장치에서도 TAO 최적화 모델을 배포할 수 있게 되었습니다.

LaunchX_Nvidia Tao Toolkit

그림 1. 엔비디아 TAO Toolkit 구성도입니다. (TAO Toolkit | 엔비디아 Developer)

LaunchX는 개방형 신경망 교환(이하 ONNX) 모델을 각 장치와 호환되는 모델 프레임워크로 변환하는 기능을 제공합니다. 이를 통해 사용자는 TAO로 최적화된 모델을 LaunchX를 사용하여 다양한 장치에서 벤치마크 결과를 확인할 수 있습니다. 또한, 파이썬을 기반으로 타겟 장치에 맞게 AI 모델을 최적화하는 파이넷츠프레소(PyNetsPresso)를 사용하면 몇 줄의 코드만으로 LaunchX를 쉽게 사용할 수 있습니다.

LaunchX_Nvidia Tao Toolkit

그림 2LaunchX 입니다.

엔비디아 장치 이외에도 TAO 최적화 모델을 배포하기 위해, 우리는 파이넷츠프레소를 활용 LaunchX를 TAO Tooklit 파이프라인과 연동했습니다.

연동 과정은 다음과 같은 단계로 진행되었습니다 :

  1. TAO Toolkit을 사용하여 사전 학습된 MobilenetV2(TF1) 기반 모델을 얻은 후, Pascal VOC 데이터셋을 활용하여 학습, 가지치기, 평가 과정을 진행합니다.

  2. 최적화된 TAO 모델을 ONNX 형식으로 내보냅니다.

  3. 내보낸 ONNX TAO 모델을 파이넷츠프레소를 사용하여 LaunchX에서 지원하는 여러 장치에 업로드하고 벤치마크 결과를 확인합니다.

TAO Toolkit 설치 및 환경 설정

TAO Toolkit을 사용하기 전에 순서대로 진행해야 할 내용은 다음과 같습니다 :

  • 시작 페이지에서 하드웨어 요구 사항을 확인합니다.

  • Docker, 엔비디아 Container ToolkitNGC CLI를 설치합니다.

  • 엔비디아 NGC 계정에 가입한 후, NGC API Key를 발급받습니다.

  • Docker 레지스트리 nvcr.io에 로그인합니다. 사용자명은 $oauthtoken이고, 비밀번호는 발급받은 NGC API Key입니다.

  • TAO Toolkit을 설치합니다.

!ngc registry resource download-version nvidia/tao/tao-getting-started:5.1.0 --dest ./
cd ./getting_started_v5.1.0

TAO Model Zoo에서 사전 학습된 모델 가져오기

엔비디아는 Model Zoo를 통해 다양한 모델을 쉽게 다운로드할 수 있도록 제공하고 있어, 사용자가 TAO Toolkit에서 Model Zoo의 모델들을 편리하게 활용할 수 있습니다. 아래 명령어를 사용하여 사전 학습된 분류 모델을 쉽게 검색할 수 있습니다.

!ngc registry model list nvidia/tao/pretrained_classification:*

우리는 MobilenetV2를 기반 모델로 선택하고 아래 명령어를 사용하여 다운로드했습니다.

!ngc registry model download-version nvidia/tao/pretrained_classification:mobilenet_v2 --dest $LOCAL_EXPERIMENT_DIR/pretrained_mobilenet_v2


TAO Toolkit으로 최적화된 ONNX 모델 얻기

tao-getting-started_v5.1.0/notebooks/tao_launcher_starter_kit/classification_tf1/tao_voc/classification.ipynb 에 제공된 Jupyter Notebook을 사용하여 TAO Toolkit을 통해 모든 최적화 과정을 쉽게 실행할 수 있었습니다. Pascal VOC 데이터셋으로 학습을 진행했으며, 주요 코드 변경 없이 프로세스를 완료할 수 있었습니다. 각 단계에 대한 명확한 설명이 TAO Toolkit에서 기본으로 제공하는 Jupyter Notebook에 잘 문서화되어 있어, 모델 학습, 가지치기, 평가 및 내보내기를 간편하게 실행할 수 있었습니다. 또한, TAO Toolkit 5.0.0 버전 업데이트 이후 지원된 ONNX형식의 최적화된 모델을 얻을 수 있었습니다.

파이넷츠프레소를 사용하여 ONNX 모델 업로드 및 벤치마크 결과 얻기

LaunchX는 웹 애플리케이션 환경을 제공하며, 사용자는 ONNX모델을 드래그 앤 드롭 방식으로 쉽게 업로드하고 타겟 장치에 맞게 변환한 후 벤치마크 결과를 확인할 수 있습니다. 그러나 TAO Toolkit에서 제공하는 Jupyter Notebook에서 LaunchX를 사용하려면 웹 브라우저를 활용해야 하는 불편함이 있습니다. 이를 해결하기 위해, 파이넷츠프레소를 활용하여 Jupyter Notebook 내에서 LaunchX의 기능을 직접 활용할 수 있도록 했습니다. 파이넷츠프레소는 Python Package Index (PyPI)에 등록된 파이썬 패키지로, 설치하기 전에 Python 3.8 이상의 버전이 필요합니다.

!pip install netspresso==1.1.7

PyNetsPresso를 사용하기 전에, 넷츠프레소(NetsPresso®) 홈페이지에 회원가입을 해야 합니다. 이후 아래 섹션에 로그인할 때 회원가입 시 사용한 이메일과 비밀번호가 필요합니다.

import os

os.environ["NETSPRESSO_EMAIL"] = YOUR_EMAIL
os.environ["NETSPRESSO_PASSWORD"] = YOUR_PASSWORD
!mkdir -p $LOCAL_EXPERIMENT_DIR/np_converted

그런 다음, 파이넷츠프레소를 활용하여 ONNX 형식으로 내보낸 TAO 모델을 변환합니다. TAO에서 내보낸 모델을 파이넷츠프레소에 업로드한 후, 원하는 장치에 맞게 모델 프레임워크을 변환할 수 있습니다. 지원되는 모델 프레임워크과 장치는 아래와 같습니다.

import os
from netspresso.launcher import ModelConverter, ModelFramework, DeviceName

converter = ModelConverter(email=os.environ["NETSPRESSO_EMAIL"], password=os.environ["NETSPRESSO_PASSWORD"])
model_path = os.path.join(os.environ['LOCAL_EXPERIMENT_DIR'], "experiment_dir_final/mobilenetv2_classification_tf1.onnx")
output_path = os.path.join(os.environ['LOCAL_EXPERIMENT_DIR'], "np_converted/mobilenetv2_classification_tf1.tflite")
model = converter.upload_model(model_path)
conversion_task = converter.convert_model(
    model=model,
    input_shape=model.input_shape,
    target_framework=ModelFramework.TENSORFLOW_LITE,
    target_device_name=DeviceName.RASPBERRY_PI_4B,
    wait_until_done=True
)
converter.download_converted_model(conversion_task, dst=output_path)

!ls -rlt $LOCAL_EXPERIMENT_DIR/np_converted/

모델 변환이 완료되면, PyNetsPresso를 활용하여 원하는 장치의 벤치마크 결과를 얻을 수 있습니다.

import os
from netspresso.launcher import ModelBenchmarker, DeviceName

benchmarker = ModelBenchmarker(email=os.environ["NETSPRESSO_EMAIL"], password=os.environ["NETSPRESSO_PASSWORD"])
model_path = os.path.join(os.environ['LOCAL_EXPERIMENT_DIR'], "np_converted/mobilenetv2_classification_tf1.tflite")
model = benchmarker.upload_model(model_path)
benchmark_task = benchmarker.benchmark_model(
    model=model,
    target_device_name=DeviceName.RASPBERRY_PI_4B,
    wait_until_done=True
)
print("Latency(ms):", benchmark_task.latency / 1000)
print("CPU Memory Footprint(MB):", benchmark_task.memory_footprint_cpu)

LaunchX를 통해 TAO 모델로 수행한 여러 벤치마크 결과

LaunchX_Nvidia Tao Toolkit

그림 3. LaunchX를 사용한 MobilenetV2(TF1) 모델의 다양한 장치에서의 벤치마크 결과를 비교한 것입니다.

또한, TAO Toolkit의 Model Zoo를 활용해 여러 사전 학습된 모델을 LaunchX로 다양한 장치에서 벤치마크했습니다.

LaunchX_Nvidia Tao Toolkit

결론

위 결과에서 알 수 있듯이, TAO Toolkit으로 생성된 최적화된 AI 모델은 호환되는 모델 프레임워크로 변환할 수 있으며, 파이넷츠프레소를 활용해 다양한 장치에서 벤치마크 결과를 쉽게 확인할 수 있습니다. 현재 LaunchX는 라즈베리 파이보드, 엔비디아 Jetson 시리즈, 인텔 Xeon, 르네사스 RA8D1, 알리프 Ensemble DevKit Gen2에 대한 벤치마크 결과를 제공합니다. 또한, LaunchX는 위 벤치마크 결과에 언급된 장치 외에도 여러 회사의 다양한 엣지 장치에 대한 서비스도 지원할 예정입니다. 다양한 장치에서 AI 모델을 안정적으로 배포하려면 매우 정교한 최적화 기술이 필요합니다. 노타AI 연구팀은 다양한 모델을 여러 장치에 안정적으로 배포할 수 있도록 기술 지원을 강화하기 위해 노력하고 있습니다. LaunchX에서 추가로 지원될 장치들과 새롭게 선보일 기능들에 대해 많은 기대 부탁드립니다!

 

이 연구에 대해 추가로 궁금한 사항이 있으시면 아래 이메일 주소로 언제든지 문의해 주세요: 📧 contact@nota.ai.

AI 최적화 기술에 관심이 있으시면 저희 웹사이트 🔗 netspresso.ai.를 방문해 보세요.

Previous
Previous

축약된 LLM: 대형 언어 모델을 위한 간단한 깊이 가지치기 방법

Next
Next

모바일 AI의 혁신 : 실시간 성능 향상을 위해 넷츠프레소로 의미론적 분할 모델을 가속하는 방법