NVIDIA Isaac Sim 및 NVIDIA TAO를 활용한 AI 기반 로봇 개발, 배포하기

Reading Time: 7 minutes

로봇은 자동차 제작은 물론, 외과의를 돕고 피자를 배달하는 등 다양한 작업을 자동화할 뿐만 아니라 인간의 작업 속도를 몇 배로 높여줍니다. 또한 AI의 발명으로 주변 환경을 더 잘 인지하고 인간의 개입을 최소화한 조건에서 결정을 내릴 수 있는 훨씬 더 스마트한 로봇을 만들 수 있습니다.

예를 들면 창고에서 적재물을 한 곳에서 다른 곳으로 옮기는 데 사용되는 오토노머스 로봇이 있습니다. 이 로봇은 주변의 여유 공간을 인식하고, 이동 경로 내에 있는 장애물을 감지하고 피하며, 새로운 경로를 지체 없이 선택하기 위해 “즉석”에서 결정을 내려야 합니다.

여기에서 과제가 발생합니다. 이때 과제란 이 환경에서 작동하도록 트레이닝되고 최적화된 AI 모델에 의해 구동되는 애플리케이션을 구축하는 것입니다. 이를 위해서는 방대한 양의 고품질 데이터를 수집하고 애플리케이션을 구동할 수 있는 매우 정확한 AI 모델을 개발해야 합니다. 이는 실험실에서 생산 환경으로 애플리케이션을 이전하는 데 있어 매우 중요한 장벽입니다.

이 게시물에서는 NVIDIA Isaac 플랫폼 및 TAO 프레임워크를 통해 데이터 문제와 모델 생성 문제를 모두 해결할 수 있는 방법을 살펴보고자 합니다. 가상 환경을 만들고 합성 데이터를 생성하기 위해 로보틱스 시뮬레이션 애플리케이션인 NVIDIA Isaac Sim을 사용합니다. NVIDIA TAO Toolkit은 처음부터 트레이닝을 진행하지 않고 일부 데이터만 사용하여 사전 트레이닝된 모델을 미세 조정하는 Transfer Learning 기능이 내장된 로우 코드 AI 모델 개발 솔루션입니다. 그리고 NVIDIA Isaac ROS를 사용하여 최적화된 모델을 로봇에 배포하고 실제 환경에 적용합니다.

Diagram shows an overview of workflow with synthetic data generation using NVIDIA Isaac Sim and training a pretrained model with TAO in a simulated environment, evaluate the results and collect more data if necessary. The model is then pruned and retrained again in the simulated environment. The model then is moved to the next phase where it is fine-tuned on real-world data and eventually deployed. 
그림 1. 실제 사용 사례를 조정하기 위해 NVIDIA Isaac Sim을 사용하여 합성 데이터에서 TAO Toolkit 모델을 트레이닝하는 워크플로우의 개요.

전제 조건

시작하기 전에 트레이닝 및 배포를 위해 다음과 같은 리소스가 있어야 합니다.

  • NVIDIA GPU 드라이버 버전: >470
  • NVIDIA Docker: 2.5.0-1
  • 클라우드 또는 온프레미스의 NVIDIA GPU:
    • NVIDIA A100
    • NVIDIA V100
    • NVIDIA T4
    • NVIDIA RTX 30×0 (NVIDIA Isaac Sim은 NVIDIA RTX 20 시리즈도 지원)
    • NVIDIA Jetson Xavier 또는 Jetson Xavier NX
  • NVIDIA TAO Toolkit: 4.22. 자세한 내용은 TAO Toolkit 빠른 시작 가이드를 참조하세요
  • NVIDIA Isaac Sim 및 Isaac ROS

NVIDIA Isaac Sim을 통한 합성 데이터 생성

이 섹션에서는 NVIDIA Isaac Sim에서 합성 데이터를 생성하는 단계를 간략하게 설명합니다. 합성 데이터는 컴퓨터 시뮬레이션 또는 알고리즘이 생성하는 주석이 포함된 정보입니다. 합성 데이터는 실제 데이터를 획득하기가 어렵거나 비용이 많이 드는 경우의 데이터 문제를 해결하는 데 도움이 될 수 있습니다.

NVIDIA Isaac Sim은 합성 데이터를 생성하는 다음의 세 가지 방법을 제공합니다.

  • Replicator composer
  • Python scripts
  • GUI

이 실험에서는 Python 스크립트를 사용하여 도메인 무작위화로 데이터를 생성하기로 했습니다. 도메인 무작위화는 장면 내 다양한 물체의 위치와 스케일, 시뮬레이션된 환경의 조명, 물체의 색상 및 텍스처 등 시뮬레이션 환경에서 하나의 장면을 정의하는 매개변수에 변화를 줍니다.

해당 장면의 다양한 매개변수들을 동시에 변화시키기 위해 도메인 무작위화를 추가하면 데이터세트 품질이 향상되며, 실제 상황에서 볼 수 있는 다양한 도메인 매개변수에 노출되어 모델의 성능이 향상됩니다.

이 경우, 창고와 작은 방이라는 두 가지 환경을 사용하여 데이터를 트레이닝할 수 있습니다. 다음 단계에는 물리 법칙을 따르는 장면에 물체를 추가하는 과정이 포함됩니다. NVIDIA Isaac Sim의 샘플 개체를 사용했으며, 여기에는 YCB 데이터세트의 일상적인 물체들도 포함됩니다.

Picture of cans, and bottles randomly placed on the floor. Another picture of a box placed underneath the cart along with some additional boxes placed in a warehouse type environment.
그림 2. 단순한 방과 창고 환경의 샘플 시뮬레이션 이미지

NVIDIA Isaac Sim을 설치하고 나면 Isaac Sim 앱 선택기는 python.sh 스크립트가 포함된 폴더에서 열기 옵션을 제공합니다. 이 옵션은 데이터 생성을 위한 스크립트를 실행하는 데 사용됩니다.

나열된 단계에 따라 데이터를 생성합니다.

환경을 선택하고 해당 장면에 카메라를 추가합니다.

def add_camera_to_viewport(self):
  # Add a camera to the scene and attach it to the viewport
  self.camera_rig = UsdGeom.Xformable(create_prim("/Root/CameraRig", "Xform"))
  self.camera = create_prim("/Root/CameraRig/Camera", "Camera")

Semantic ID를 바닥에 추가

def add_floor_semantics(self):
  # Get the floor from the stage and update its semantics
  stage = kit.context.get_stage()
  floor_prim = stage.GetPrimAtPath("/Root/Towel_Room01_floor_bottom_218")
  add_update_semantics(floor_prim, "floor")

해당 장면에 물리효과를 적용하여 개체를 추가:

def load_single_asset(self, object_transform_path, object_path, usd_object):
  # Random x, y points for the position of the USD object 
  translate_x , translate_y = 150 * random.random(), 150 * random.random()
  # Load the USD Object
  try:
      asset = create_prim(object_transform_path, "Xform",
               position=np.array([150 + translate_x, 175 + translate_y, -55]), 
               orientation=euler_angles_to_quat(np.array([0, 0.0, 0]),
               usd_path=object_path)
	# Set the object with correct physics
      utils.setRigidBody(asset, "convexHull", False)

도메인 무작위화 구성 요소를 초기화:

def create_camera_randomization(self):
  #  A range of values to move and rotate the camera       
  camera_tranlsate_min_range, camera_translate_max_range = (100, 100, -58),
                                                            (220, 220, -52)      
  camera_rotate_min_range, camera_rotate_max_range = (80, 0, 0), (85, 0 ,360)

  # Create a Transformation DR Component for the Camera
  self.camera_transform = self.dr.commands.CreateTransformComponentCommand(
                              prim_paths=[self.camera.GetPath()], 
                              translate_min_range=camera_tranlsate_min_range,
                              translate_max_range=camera_translate_max_range,
                              rotate_min_range=camera_rotate_min_range,
                              rotate_max_range=camera_rotate_max_range,
                              duration=0,5).do()

시뮬레이션의 카메라 위치와 속성이 실제 특성과 유사한지 확인합니다. 올바른 여유 공간 분할 마스크를 생성하려면 의미 ID를 바닥에 추가해야 합니다. 앞서 언급했듯이 해당 모델의 sim2real 성능을 지원하기 위해 도메인 무작위화가 적용되었습니다.

NVIDIA Isaac Sim 문서에 제공된 오프라인 데이터 생성 샘플은 스크립트의 시작점입니다. 이 사용 사례에는 하나의 장면에 물리효과를 적용하여 개체를 추가하고, 도메인 무작위화를 업데이트하며, 바닥에 의미를 추가하는 등의 변경 사항이 적용되었습니다. NVIDIA는 데이터세트에 해당 분할 마스크를 사용하여 약 3만 개의 이미지를 생성했습니다.

TAO Toolkit으로 트레이닝, 조정 및 최적화

이 섹션에서는 TAO Toolkit을 사용하여 해당 모델을 생성된 합성 데이터로 미세 조정합니다. 이 작업을 위해 NGC에서 제공하는 UNET 모델을 사용해 실험하기로 했습니다.

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

다음과 같이 데이터, 사양 파일(TAO 사양) 및 실험 디렉터리를 설정합니다.

%set_env KEY=tlt_encode
%set_env GPU_INDEX=0
%set_env USER_EXPERIMENT_DIR=/workspace/experiments
%set_env DATA_DOWNLOAD_DIR=/workspace/freespace_data
%set_env SPECS_DIR=/workspace/specs

The next step is to pick the model.

다음 단계에서는 모델을 선택합니다.

올바르게 사전 트레이닝된 모델 선택

사전 트레이닝된 AI 및 딥 러닝 모델은 대표 데이터세트에 대해 트레이닝되고 가중치와 편향으로 미세 조정된 모델입니다. 처음부터 트레이닝을 진행하지 않고 일부 데이터만 사용한 Transfer Learning을 적용하여 사전 트레이닝된 모델을 쉽고 빠르게 미세 조정할 수 있습니다.

사전 트레이닝된 모델 영역에는 사람, 자동차, 차량 번호판 등의 특정 작업을 수행하는 모델들이 있습니다.

먼저 ResNet10 및 ResNet18 백본이 있는 U-Net 모델을 선택했습니다. 모델에서 얻은 결과는 벽과 바닥이 두 개의 개별 엔터티가 아닌, 실제 데이터에서 단일 엔터티로 병합된 것을 보여주었습니다. 시뮬레이션 이미지에서 모델의 성능이 높은 수준의 정확도를 보였음에도 불구하고 이는 사실이었습니다. 

BackBonePrunedDataset SizeImage SizeTraining Evaluations 
  TrainVal F1 ScoremIoU (%)Epochs 
RN10NO25K4.5K512×51289.280.150 
RN18NO25K4.5K512×51291.183.050 

표 1. TAO용 NGC 플랫폼에서 사용 가능한 여러 가지 사전 트레이닝된 모델에 관한 실험.

레이턴시(FPS)와 정확성의 균형을 관찰하기 위해 다양한 백본과 이미지 크기로 실험했습니다. 표에 열거된 모든 모델은 동일하며(UNET) 백본만 다릅니다. 

Images of a carpeted floor with objects scattered around. The blue areas represent blocked space and the red areas are free space.
그림 3. ResNet18 모델의 예측. (왼쪽) 시뮬레이션 이미지, (오른쪽) 실제 이미지.

실험 결과를 근거로 할 때, 사용 사례에 더 적합한 다른 모델이 필요하다는 것이 분명했습니다. 저희는 NGC 카탈로그에서 사용 가능한 PeopleSemSeg 모델을 선택했습니다. 이 모델은 카메라 높이, 군중 밀도 및 시야 필드(FOV)의 조합으로 구성된 데이터세트가 있는 “사람” 클래스를 위한 500만 개의 물체에 대해 사전 트레이닝되었습니다. 이 모델은 배경과 여유 공간을 두 개의 개별 엔터티로 분할할 수도 있습니다.

동일한 데이터세트로 이 모델을 트레이닝한 후 평균 IOU는 10% 이상 증가했으며 그 결과 나타난 이미지는 바닥과 벽 간에 더 나은 분할을 명확하게 보여줍니다. 

BackBonePrunedDataset SizeImage SizeTraining Evaluations
  TrainVal F1 ScoremIoU (%)Epochs
PeopleSemSegNetNO25K4.5K512×51298.196.450
PeopleSemSegNetNO25K4.5K960×54499.098.150

표 2. 트레이닝 가능한 PeopleSemSegNet 모델을 이용한 실험

Images shows a carpeted floor with objects scattered around.
그림 4. 합성 데이터(왼쪽)와 실제 데이터(오른쪽)가 포함된 PeopleSemSeg TAO 모델에서 Transfer Learning에 대한 예측 결과.

그림 4는 실제 데이터로 PeopleSemSeg 모델을 미세 조정하기 전, 로봇 관점에서의 시뮬레이션 이미지와 실제 이미지의 여유 공간 식별을 보여줍니다. 즉, 순전히 NVIDIA Isaac Sim 데이터에 대해 트레이닝된 모델을 사용한 결과입니다.

핵심 요점은 이 작업을 수행할 수 있는 사전 트레이닝된 모델이 많을 수 있지만 현재 애플리케이션과 가장 가까운 모델을 선택하는 것이 중요하다는 것입니다. 여기서는 TAO의 특수 제작 모델이 유용합니다.

!tao unet train --gpus=1 --gpu_index=$GPU_INDEX \
              -e $SPECS_DIR/spec_vanilla_unet.txt \
              -r $USER_EXPERIMENT_DIR/semseg_experiment_unpruned \
              -m $USER_EXPERIMENT_DIR/peoplesemsegnet.tlt  \
              -n model_freespace \
              -k $KEY 

모델을 트레이닝한 후 검증 데이터에 대한 모델 성능을 평가합니다.

!tao unet evaluate --gpu_index=$GPU_INDEX -e$SPECS_DIR/spec_vanilla_unet.txt \
-m $USER_EXPERIMENT_DIR/semseg_experiment_unpruned/weights/model_freespace.tlt \
    -o $USER_EXPERIMENT_DIR/semseg_experiment_unpruned/ \
    -k $KEY

NVIDIA Isaac Sim 데이터에 대한 모델 성능과 Sim2Sim 검증 성능이 만족스럽다면 해당 모델을 정리합니다.

최소 레이턴시로 이 모델을 실행하려면 대상 GPU에서 실행되도록 모델을 최적화하세요. 이러한 목적을 충족하는 방법에는 다음 두 가지가 있습니다.

  • 정리(Pruning): TAO Toolkit의 정리 기능은 원치 않는 레이어와 뉴런을 자동으로 제거하여 모델의 크기를 효과적으로 줄여줍니다. 정리 중에 손실된 정확도를 복구하려면 모델을 다시 트레이닝해야 합니다.
  • 트레이닝 후 정량화: TAO Toolkit의 또 다른 기능에 속하며 이 기능을 사용하면 모델 크기를 더 줄일 수 있습니다. 이렇게 하면 FP32에서 INT8로 정밀도가 변경되며 정확도를 저하시키지 않고 성능을 높일 수 있습니다.

먼저 모델을 정리(prune)합니다.

!tao unet prune \
    -e $SPECS_DIR/spec_vanilla_unet.txt \
    -m $USER_EXPERIMENT_DIR/semseg_experiment_unpruned/weights/model_freespace.tlt \
    -o $USER_EXPERIMENT_DIR/unet_experiment_pruned/model_unet_pruned.tlt \
     -eq union \
     -pth 0.1 \
     -k $KEY

모델을 다시 트레이닝하고 정리(prune)합니다.

!tao unet train --gpus=1 --gpu_index=$GPU_INDEX \
              -e $SPECS_DIR/spec_vanilla_unet_retrain.txt \
              -r $USER_EXPERIMENT_DIR/unet_experiment_retrain \
              -m $USER_EXPERIMENT_DIR/unet_experiment_pruned/model_unet_pruned.tlt \
              -n model_unet_retrained \
              -k $KEY

정리된(pruned) 모델의 Sim2Sim 검증 성능이 만족스럽다면 다음 단계로 이동하여 실제 데이터를 미세 조정하세요.

!tao unet train --gpus=1 --gpu_index=$GPU_INDEX \
              -e $SPECS_DIR/spec_vanilla_unet_domain_adpt.txt \
              -r $USER_EXPERIMENT_DIR/semseg_experiment_domain_adpt \
              -m $USER_EXPERIMENT_DIR/semseg_experiment_retrain/model_unet_pruned.tlt\
              -n model_domain_adapt \
              -k $KEY 

결과

표 1에는 정리되지 않은 모델과 정리된 모델 간의 결과 요약이 표시됩니다. 배포 목적으로 선택된 최종 정리 후 정량화된 모델은 원래 모델에 비하면 크기가 1/17에 불과하고 NVIDIA Jetson Xavier NX에서 측정 시 원래 모델보다 5배 더 빠른 추론 성능을 제공했습니다.

ModelDatasetTraining Evaluations  Inference Performance
PrunedFine-Tune on
Real World Data
Training SetValidation SetF1 Score (%)mIoU (%)PrecisionFPS
NONOSimSim0.9900.981FP163.9
YESNOSimSim0.9910.982FP1615.29
YESNOSimReal0.6800.515FP1615.29
YESYESRealReal0.9790.960FP1615.29
YESYESRealReal0.9740.959INT820.25

표 3. Sim2Sim 및 Sim2Real의 결과

시뮬레이션 데이터에 대한 트레이닝 데이터세트는 25K 이미지로 구성되는 반면, 미세 조정을 위한 실제 이미지용 트레이닝 데이터는 44개의 이미지로만 구성됩니다. 실제 이미지의 검증 데이터세트는 56개의 이미지로만 구성됩니다. 실제 데이터의 경우, 세 가지 실내 시나리오에서 하나의 데이터세트를 수집했습니다. 모델의 입력 이미지 크기는 960×544입니다. 추론 성능은 NVIDIA TensorRT trtexec 도구를 사용하여 측정됩니다.

Four images showing the results obtained from the model chosen for deployment. The images show clear delineation between the floor, walls, and obstacles directly in front of the robot.
그림 5. 실제 데이터를 미세 조정한 후 로봇에서 얻은 실제 이미지 결과

NVIDIA Isaac ROS를 이용한 배포

이 섹션에서는 트레이닝 및 최적화된 모델을 가져와 Jetson Xavier NX로 구동되는 iRobot의 Create 3 로봇에 NVIDIA Isaac ROS를 사용하여 해당 모델을 배포하는 단계를 보여줍니다. Create 3 로봇과 NVIDIA Isaac ROS 이미지 분할 노드는 모두 ROS2에서 실행됩니다.

이 예시에서는 여유 공간 분할을 배포하기 위해 /isaac_ros_image_segmentation/isaac_ros_unet GitHub 리포지토리를 사용합니다.

Picture of a carpeted floor with objects on it and the same picture using free space identification results.
그림 6. ROS2의 rqt_image_viewer를 사용한 이미지 및 분할 마스크. (왼쪽) Create 3 로봇에 USB 카메라를 사용합니다. (오른쪽) isaac-ros-image-segmentation 노드를 사용합니다.

여유 공간 분할 모델을 사용하려면 /NVIDIA-ISAAC-ROS/isaac_ros_image_segmentation GitHub 리포지토리에서 다음 단계를 수행하세요.

Docker 인터랙티브 작업 공간 만들기:

$isaac_ros_common/scripts/run_dev.sh your_ws

모든 패키지 종속성을 복제:

작업 공간 구축 및 소싱:

$cd /workspaces/isaac_ros-dev
$colcon build && . install/setup.bash

작업 시스템에서 트레이닝된 여유 공간 식별(.etlt) 모델을 다운로드:

$scp <your_machine_ip>:<etlt_model_file_path> <ros2_ws_path>

암호화된 TLT 모델(.etlt)과 형식을 TensorRT 엔진 계획으로 변환합니다. INT8 모델에 대해 다음 명령을 실행합니다.

tao converter -k tlt_encode  \
               -e  trt.fp16.freespace.engine \
               -p input_1,1x3x544x960,1x3x544x960,1x3x544x960 \
               unet_freespace.etlt

Isaac ROS image segmentation의 안내를 따르세요:

  • TensorRT 모델 엔진 파일을 오른쪽 디렉터리에 유지합니다.
  • config.pbtxt를 생성합니다.
  • isaac_ros_unet 시작 파일의 모델 엔진 경로 및 이름을 업데이트합니다.
  • 다음 명령을 다시 빌드하고 실행합니다.
$ colcon build --packages-up-to isaac_ros_unet && . install/setup.bash
$ ros2 launch isaac_ros_unet isaac_ros_unet_triton.launch.py

요약

이 게시물에서는 NVIDIA Isaac Sim의 합성 데이터 생성으로 시작해 TAO Toolkit을 이용한 미세 조정, NVIDIA Isaac ROS를 이용한 모델 배포 등을 포함하는 엔드 투 엔드 워크플로우를 살펴보았습니다.

NVIDIA Isaac Sim과 TAO Toolkit은 모두 AI 프레임워크 복잡성을 추상화하는 솔루션이며, 이들 솔루션을 사용하면 AI 전문 지식이 없더라도 AI 기반 로봇 애플리케이션을 제작하고 배포할 수 있습니다.

/NVIDIA-AI-IOT/robot_freespace_seg_Isaac_TAO GitHub 프로젝트를 풀링하여 이 실험을 시작하세요.

Discuss (0)

Tags

답글 남기기