Closed jungae-park closed 2 years ago
오케이 정애야. 잘 발견했네. 요약하면 tx2 의 경우 jetpack 이 설치가 되어이지 않았었고, 그렇다보니 추론시에 gpu 를 제대로 사용하지 않고 있었다는 걸로 예상된다는거지? 혹시 이전 실험을 할때 gpu 사용량등을 확인한적이 있을까? 만약 없었다면 지금 환경에서 jetpack 이 설치된 tx2 에서 gpu 사용량 측정, 설치안된 tx1 에서 gpu 사용량 측정을 해서 비교해보면 좋겠다.
tx1 이 그런 상황이라면 굳이 어렵게 설치하지 않아도 괜찮을것 같아. tx2 가 있기도 하고, tx2 로 측정을 해보고 추가로 필요할것 같으면 진행해보자.
다음 궁금한점은 jetpack 이 어떤 기능을 제공해주는거야? jetpack 이 gpu 에서 추론을 실행하기 위해서 반드시 필요한 장치라면 왜 이전에 jetpack 설치없이 tx2 에서 추론 진행시 아무런 에러가 안났을까? 추론 코드에서 명시적으로 gpu 를 사용하는 부분은 없는건가?
네 맞습니다. tx1,tx2 장비가 jetpack이 설치되어 있지 않아 추론시 gpu를 제대로 사용하고 있지 않았습니다. JetPack은 Jeston 전용 OS이고 애플리케이션을 동작하기 위해 필요한 라이브러리를 포함하고 있습니다. (cuda, cudnn,opencv 등) 그런데, tx1과 tx2 장비의 경우는 예전에 출시된 장비이기도하여 필수로 포함되어 설치되는 라이브러리가 다른 장비에 비해 적은 것 같습니다. 이전에는 추론 코드에 gpu 장치를 확인하고 메모리를 할당하여 실행하였는데,
gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus:
tf.config.experimental.set_virtual_device_configuration(gpus[0],
[tf.config.experimental.VirtualDeviceConfiguration(memory_limit=0.18*1024)])
이때 추론시 에러가 나지 않아 gpu를 제대로 잘 사용하고 있다고 생각하였으나 아니였던 것 같습니다. 그래서 이전 실험을 할때 gpu를 사용하면서 추론을 했는지 기록 해놓은 메시지가 있는지 찾아보았는데 없었습니다.
jetpack이 설치된 tx2에서 모델 별 배치 추론을 하며 메트릭 결과값을 정리하면서 jetpack이 설치된 tx2에서 gpu 사용량과 jetpack이 설치되지 않은 tx1에서 gpu 사용량을 측정해서 비교해보겠습니다. 그리고 필요시 tx1 장비에 jetpack 설치를 고려해보겠습니다.
오케이 정애야. tx1 에 설치는 낮은 우선순위로줘도 좋을것 같아. 위의 코드를 보면 if gpus 구문이 있는데, 가능하면 디버깅문을 추가해서 해당 if 문이 실행되는지 else 파트가 실행되는지 보는것도 좋겠다. 우선은 tx2 는 jetpack 설치, tx1 은 설치 X 로 해서 원인 분석 및 성능파악을 하면 좋겠다.
확인 결과
gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus:
tf.config.experimental.set_virtual_device_configuration(gpus[0],
[tf.config.experimental.VirtualDeviceConfiguration(memory_limit=0.18*1024)])
print("with-gpu")
else:
print("without-gpu")
tx1 장비의 경우 위의 코드에서 else 문으로 빠져 gpu를 사용하지 않고 추론을 진행
Skipping registering GPU devices...
without-gpu
***** TF-FP32 matric *****
user_batch_size = 1
accuracy = 0.93
model_load_time = 61.15291976928711
dataset_load_time = 1.7593188285827637
inference_time = 220.19881081581116
inference_time(avg) = 0.21863467693328859
IPS = 3.5321810499471633
IPS(inf) = 4.57383985937934
root@nvidia-tx1:~# dpkg -l | grep cuda
ii nvidia-l4t-cuda 32.6.1-20210726122000 arm64 NVIDIA CUDA Package
tx2 장비의 경우 위의 코드에서 if문으로 실행되어 gpu를 사용하면서 추론을 진행
2022-10-06 13:18:44.121148: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1872] Adding visible gpu devices: 0
with-gpu
2022-10-06 13:18:47.867572: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1418] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 184 MB memory) -> physical GPU (device: 0, name: NVIDIA Tegra X2, pci bus id: 0000:00:00.0, compute capability: 6.2)
***** TF-FP32 matric *****
user_batch_size = 1
accuracy = 0.93
model_load_time = 59.350929975509644
dataset_load_time = 1.6182050704956055
inference_time = 99.85338973999023
inference_time(avg) = 0.09817882633209228
IPS = 6.21802806517774
IPS(inf) = 10.185495563141847
root@nvidia-tx2:~# dpkg -l | grep cuda
ii cuda-command-line-tools-10-2 10.2.460-1 arm64 CUDA command-line tools
ii cuda-compiler-10-2 10.2.460-1 arm64 CUDA compiler
ii cuda-cudart-10-2 10.2.300-1 arm64 CUDA Runtime native Libraries
ii cuda-cudart-dev-10-2 10.2.300-1 arm64 CUDA Runtime native dev links, headers
ii cuda-cuobjdump-10-2 10.2.300-1 arm64 CUDA cuobjdump
ii cuda-cupti-10-2 10.2.300-1 arm64 CUDA profiling tools runtime libs.
ii cuda-cupti-dev-10-2 10.2.300-1 arm64 CUDA profiling tools interface.
ii cuda-documentation-10-2 10.2.300-1 arm64 CUDA documentation
ii cuda-driver-dev-10-2 10.2.300-1 arm64 CUDA Driver native dev stub library
ii cuda-gdb-10-2 10.2.300-1 arm64 CUDA-GDB
ii cuda-libraries-10-2 10.2.460-1 arm64 CUDA Libraries 10.2 meta-package
ii cuda-libraries-dev-10-2 10.2.460-1 arm64 CUDA Libraries 10.2 development meta-package
ii cuda-memcheck-10-2 10.2.300-1 arm64 CUDA-MEMCHECK
ii cuda-nvcc-10-2 10.2.300-1 arm64 CUDA nvcc
ii cuda-nvdisasm-10-2 10.2.300-1 arm64 CUDA disassembler
ii cuda-nvgraph-10-2 10.2.300-1 arm64 NVGRAPH native runtime libraries
ii cuda-nvgraph-dev-10-2 10.2.300-1 arm64 NVGRAPH native dev links, headers
ii cuda-nvml-dev-10-2 10.2.300-1 arm64 NVML native dev links, headers
ii cuda-nvprof-10-2 10.2.300-1 arm64 CUDA Profiler tools
ii cuda-nvprune-10-2 10.2.300-1 arm64 CUDA nvprune
ii cuda-nvrtc-10-2 10.2.300-1 arm64 NVRTC native runtime libraries
ii cuda-nvrtc-dev-10-2 10.2.300-1 arm64 NVRTC native dev links, headers
ii cuda-nvtx-10-2 10.2.300-1 arm64 NVIDIA Tools Extension
ii cuda-samples-10-2 10.2.300-1 arm64 CUDA example applications
ii cuda-toolkit-10-2 10.2.460-1 arm64 CUDA Toolkit 10.2 meta-package
ii cuda-tools-10-2 10.2.460-1 arm64 CUDA Tools meta-package
ii cuda-visual-tools-10-2 10.2.460-1 arm64 CUDA visual tools
ii graphsurgeon-tf 8.0.1-1+cuda10.2 arm64 GraphSurgeon for TensorRT package
ii libcudnn8 8.2.1.32-1+cuda10.2 arm64 cuDNN runtime libraries
ii libcudnn8-dev 8.2.1.32-1+cuda10.2 arm64 cuDNN development libraries and headers
ii libcudnn8-samples 8.2.1.32-1+cuda10.2 arm64 cuDNN documents and samples
ii libnvinfer-bin 8.0.1-1+cuda10.2 arm64 TensorRT binaries
ii libnvinfer-dev 8.0.1-1+cuda10.2 arm64 TensorRT development libraries and headers
ii libnvinfer-doc 8.0.1-1+cuda10.2 all TensorRT documentation
ii libnvinfer-plugin-dev 8.0.1-1+cuda10.2 arm64 TensorRT plugin libraries
ii libnvinfer-plugin8 8.0.1-1+cuda10.2 arm64 TensorRT plugin libraries
ii libnvinfer-samples 8.0.1-1+cuda10.2 all TensorRT samples
ii libnvinfer8 8.0.1-1+cuda10.2 arm64 TensorRT runtime libraries
ii libnvonnxparsers-dev 8.0.1-1+cuda10.2 arm64 TensorRT ONNX libraries
ii libnvonnxparsers8 8.0.1-1+cuda10.2 arm64 TensorRT ONNX libraries
ii libnvparsers-dev 8.0.1-1+cuda10.2 arm64 TensorRT parsers libraries
ii libnvparsers8 8.0.1-1+cuda10.2 arm64 TensorRT parsers libraries
ii nvidia-container-csv-cuda 10.2.460-1 arm64 Jetpack CUDA CSV file
ii nvidia-container-csv-cudnn 8.2.1.32-1+cuda10.2 arm64 Jetpack CUDNN CSV file
ii nvidia-container-csv-tensorrt 8.0.1.6-1+cuda10.2 arm64 Jetpack TensorRT CSV file
ii nvidia-cuda 4.6-b199 arm64 NVIDIA CUDA Meta Package
ii nvidia-l4t-cuda 32.6.1-20210916210945 arm64 NVIDIA CUDA Package
ii python3-libnvinfer 8.0.1-1+cuda10.2 arm64 Python 3 bindings for TensorRT
ii python3-libnvinfer-dev 8.0.1-1+cuda10.2 arm64 Python 3 development package for TensorRT
ii tensorrt 8.0.1.6-1+cuda10.2 arm64 Meta package of TensorRT
ii uff-converter-tf 8.0.1-1+cuda10.2 arm64 UFF converter for TensorRT package
두 장비에서 추론 진행 하였을 때, tx2 장비에서 추론 성능이 더 좋은 것을 확인
두 장비의 차이점은 jetpack 설치 유무이고, jetpack이 설치될 때 cuda, cudnn과 관련된 라이브러리가 같이 설치되면서 gpu 접근 및 사용에 영향을 미치고 있는 것으로 추정됨
따라서 tx1 장비에 gpu 접근 및 사용에 필요한 라이브러리가 설치되어 있지 않아 gpu를 사용하려면 설치가 필요해보이며, cuda/cudnn 관련 라이브러리가 설치되어 있는지 확인하였을 때 제대로 설치가 되어 있지 않음을 확인
오케이 정애야 잘 확정했다. TX1 는 상대적으로 이전 모델이기도 하니 이제부터는 TX2 위주로 실험 결과를 정리하고 분석하는게 어떨가 싶어.
네 교수님 그럼 tx2 장비 위주로 실험 결과를 정리하고 분석해보겠습니다.
각 edge 장비 재설치 후 gpu에 접근을 하며 추론하는지 확인을 하던 중에 중요한 사실을 놓치고 있어 보고드립니다.
xavier,nano는 재설치를 진행하면 jetpack을 같이 설치해주어 cuda, cudnn이 설치되고 별다른 조치 없이 gpu에 접근이 가능하였고, 추론 하여 결과 metric을 정리하였었습니다. 그러나 다른 장비들과 달리 tx1, tx2 장비는 재설치 후 jetpack이 자동으로 설치되지 않아 gpu에 접근하지 못하고 있었던 사실을 확인하였습니다.
그래서 tx1 장비에 추가로 jetpack을 수동으로 설치 후, gpu에 접근 가능한 것을 확인하여 추론을 해보았는데 결과가 이전과 많이 달랐습니다.
[이전 실험 결과]
[현재 재설치 및 jetpack 추가 설치 후 실험 결과]
성능 차이가 확실히 달라졌으며, 기존 실험 결과를 분석하는 과정에서 세 번째 라인의 의미처럼 tx1,tx2 장비보다 nano 장비의 flops가 낮지만 IPS 값이 높은 이유가 설명이 되지 않았고 이상하였는데 tx1,tx2 장비가 gpu에 제대로 접근을 하지 못해 생긴 것으로 판단됩니다.
다시 mobilenet v1 모델 추론 결과를 살펴보니 nano 장비보다 tx2의 아키텍처와 장비 스펙의 Flops이 더 좋은 만큼 성능 결과도 그에 맞게 달라진 것을 확인하여 다른 모델들도 배치 추론을 다시하여 metric 결과 값을 수정하려고 합니다.
한 가지 문제점은 tx1 장비의 경우도 jetpack을 수동으로 설치해주어 cuda,cudnn을 통해 gpu에 접근 및 추론이 가능하도록 해야하는데, tx1 장비는 이미 내장되어 있는 disk 용량이 16GB로 jetpack을 추가로 설치하기에 용량이 부족합니다. 그래서 외장 sd card (128GB)를 붙여 root에 설치되는 라이브러리를 외장 sd card에 설치하고 라이브러리 PATH를 변경시켜 사용하도록 시도해보고 있습니다.
그래서 아래와 같이 작업을 해보려고 합니다.