이번 포스팅은 deepstream 6.0을 이용한 PYTHON 예제를 실행 할 수 있는 환경을 docker에서 구성하는 과정을 담는다.
분명 하라는 instruction에서 하라는 대로 했지만 실패 해서 이 문서 저문서를 참고해 환경 구성에 성공했다.
deepstream 이 뭔지가 궁금한 분들은 아래 페이지를 읽어 보도록 하자. 내가 설명 하는 것 보다는 nvidia의 설명을 그대로 읽는게 더 도움이 될것 같다.
deepstream: https://developer.nvidia.com/deepstream-sdk
실패의 경험으로 부터 찾은 성공 방법이 누군가에게 도움이 되길 바란다.
목표:
deepstream 6.0 docker 이미지에 python 예제를 실행 할수 있도록 deepstream-python-apps을 바인딩
deepstream 6.0부터는 python binding이 기본 제공이 안된다고 한다.
그래서 python api 를 바인딩하고 예제를 돌려 봄으로서 정상적으로 binding 된것을 확인하는게 목표이다.
환경
나는 jetson nano에 도커를 이용해 환경을 구성했다.
host 환경
hardware: jetson nano
jetpack: 4.6(r32.6.1)
cudnn:8.2.1
cuda: 10.2
위 호스트 환경에서 deepstream-l4t docker이미지를 다운 받아 python 예제 실행을 위해 python binding을 진행했다.
docker version: 20.10.2, build 20.10.2-0ubuntu1~18.0.2
base image: nvcr.io/nvidia/deepstream-l4t:6.0-samples
아래 명령으로 받을 수있다.
docker pull nvcr.io/nvidia/deepstream-l4t:6.0-samples
성공적으로 python 바인딩을 빌드 하기 위해 나는 호스트와 컨테이너(docker container)내부에서 필요 라이브러리나 패키지를 설치 했다.
따라서 호스트 사이드에서한 작업과 컨테이너 내부에서 한 작업을 각 섹션에서 설명한다.
Host side
호스트에서 가장 먼저 한일은 nvidia-l4t-gstreamer를 설치 하는 것이었다.
(사실 이과정이 정확히 필요한지는 모르겠다. 아래 실패 사례의 기록에서 보면 gst-python 빌드 과정에서 gst/gst.h를 찾을수 없다는 에러가 발생해 그걸 해결하는 과정에서 이걸 설치 하게되었다. 혹 이게 필요 없는 과정이라면 댓글로 알려주시면 참 고맙겠습니다.)
우선 vi나 vim으로 아래 파일을 열고
vi /etc/apt/sources.list.d/nvidia-l4t-apt-source.list
아래 두 문장을 파일에 쓰고 저장한다.
이때 두번째 줄에 'jetson/t210'이라고 적은 부분이 있는데 't210' 은 jetson nano를 지칭하는 platform 구분자이다. tx2나 xavier는 다른 플렛폼 구분자를 써줘야 한다.
deb https://repo.download.nvidia.com/jetson/common r32.6 main
deb https://repo.download.nvidia.com/jetson/t210 r32.6 main
그리고 나서 아래 명령 실행한다.
apt update
실행 시 아래와 같은 에러를 마주 치는 경우가 있다.
Err:1 https://repo.download.nvidia.com/jetson/common r32.6 InRelease
The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 0D296FFB880FB004
Err:2 https://repo.download.nvidia.com/jetson/t210 r32.6 InRelease
The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 0D296FFB880FB004
Hit:4 http://ports.ubuntu.com/ubuntu-ports bionic-updates InRelease
Hit:5 http://ports.ubuntu.com/ubuntu-ports bionic-backports InRelease
Hit:6 http://ports.ubuntu.com/ubuntu-ports bionic-security InRelease
Reading package lists... Done
W: GPG error: https://repo.download.nvidia.com/jetson/common r32.6 InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 0D296FFB880FB004
E: The repository 'https://repo.download.nvidia.com/jetson/common r32.6 InRelease' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.
W: GPG error: https://repo.download.nvidia.com/jetson/t210 r32.6 InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 0D296FFB880FB004
E: The repository 'https://repo.download.nvidia.com/jetson/t210 r32.6 InRelease' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.
위 에러를 해결 하기 위해 나는 아래와 같은 명령을 입력했다. repo에 접근 하기 위한 public key를 받아 오라는 명령이다.
apt-key adv --fetch-key https://repo.download.nvidia.com/jetson/jetson-ota-public.asc
위 명령으로 에러를 해결하고 난후 'apt update' 명령은 아래 처럼 에러 없이 수행된다.
Hit:1 http://ports.ubuntu.com/ubuntu-ports bionic InRelease
Get:2 https://repo.download.nvidia.com/jetson/common r32.6 InRelease [2555 B]
Hit:3 http://ports.ubuntu.com/ubuntu-ports bionic-updates InRelease
Get:4 https://repo.download.nvidia.com/jetson/t210 r32.6 InRelease [2547 B]
Hit:5 http://ports.ubuntu.com/ubuntu-ports bionic-backports InRelease
Hit:6 http://ports.ubuntu.com/ubuntu-ports bionic-security InRelease
Get:7 https://repo.download.nvidia.com/jetson/common r32.6/main arm64 Packages [17.4 kB]
Get:8 https://repo.download.nvidia.com/jetson/t210 r32.6/main arm64 Packages [9493 B]
업데이트가 끝나면 목표로 처음 목표 였던 nvidia-l4t-gstreamer를 설치 한다.
sudo apt install --reinstall nvidia-l4t-gstreamer
Inside docker
도커를 실행 하기 위해 내가 사용한 명령 및 옵션은 아래와 같다.
docker
컨테이너 내부에서도 가장 먼저 한일은 gstreamer관련 툴, 라이브러리, 패키지 등을 설치하는 것이다.
host side에서 nvidia-l4t-gstreamer를 설치 한 것과 같은 이유로 gst-python을 빌드 하는 과정에서
gst/gst.h 와 관련된 에러가 나오는데 이 문제를 해결하기 위한 방법이다.
검색을 한참 해보고 nvidia측에서 한 답변과 인터넷의 똑똑한 분들이 추천한 방법들을 많이 시도해 봤지만
내 경우에 그 제안들은 해결방법이 아니었기 때문에 아래 문서를 보고 gstreamer와 관련된 걸 전부다 설치 했다.
최소한의 설치로 이 문제를 해결하면 edge device의 특성상 disk space를 아낄 수 있겠지만 시간 관계상 급한데로 전부 설치 했다.
GStreamer-1.0 Installation and Setup
위와 같은 이유로 나는 아래 명령을 컨테이너 내부에서 실행해 gstreamer와 관련된 패키지들을 설치 했다.
apt-get update
apt-get install gstreamer1.0-tools gstreamer1.0-alsa \
gstreamer1.0-plugins-base gstreamer1.0-plugins-good \
gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly \
gstreamer1.0-libav
apt-get install libgstreamer1.0-dev \
libgstreamer-plugins-base1.0-dev \
libgstreamer-plugins-good1.0-dev \
libgstreamer-plugins-bad1.0-dev
그리고 아래 패키지들도 추가로 설치 했다. (나는 이걸 컨테이너 내부에서 설치했는데 nvidia 측에서는 이건 host에 설치해야 하는 거고 docker 옵션 중 --runtime nvidia 를 사용 하면 아래 명령으로 설치한 것들이 container에 자동으로 마운트 되는 구조라고 한다. )
apt install libssl1.0.0 libgstreamer1.0-0 libgstrtspserver-1.0-0 libjansson4=2.11-1
그리고 나서 아래 link의 안내를 따라 진행했다.
link:https://github.com/NVIDIA-AI-IOT/deepstream_python_apps/tree/master/bindings
apt install -y git python-dev python3 python3-pip python3.6-dev python3.8-dev cmake g++ build-essential \
libglib2.0-dev libglib2.0-dev-bin python-gi-dev libtool m4 autoconf automake
cd /opt/nvidia/deepstream/deepstream-6.0/sources
git clone https://github.com/NVIDIA-AI-IOT/deepstream_python_apps.git
cd deepstream_python_apps
git submodule update --init
Installing Gst-python
cd 3rdparty/gst-python/
./autogen.sh
make
make install
Building the bindings
cd deepstream_python_apps/bindings
mkdir build
cd build
cmake ..
make
이러고 나니 이렇게 에러 없이 빌드를 성공할 수 있었다.
예제 실행
위 설명에서 build bindings 까지 성공하고 나면 아래 그림 처럼 build 폴더내에 'pyds.so' 파일이 생성된다.
생성된 pyds.so 파일은 /opt/nvidia/deepstream/deepstream-6.0/lib 에 복사 해줘야 한다.
아래 명령에서 나는 상대 경로를 사용했다. pyds.so 파일이 최종적으로 위치 해야 하는 곳에 복사만 해주면 된다.
cp pyds.so ../../../../lib/
# 또는
# cp pyds.so /opt/nvidia/deepstream/deepstream-6.0/lib
만약 pyds.so 파일을 저 위치에 복사 하지 않으면 아래와 같은 에러 메시지를 보게 될 것이다.
내가 실제로 봤다... 저거 복사하라는 말은 instruction에서 못봤는데...
Traceback (most recent call last):
File “deepstream_test_1_usb.py”, line 29, in
import pyds
ModuleNotFoundError: No module named ‘pyds’
pyds.so 복사 하고 난 후 python 예제가 실행 되는 지 확인 하기 위해 아래 파일을 실행했다.
example path : /opt/nvidia/deepstream/deepstream-6.0/sources/deepstream_python_apps/apps/deepstream-test1-usbcam
cd /opt/nvidia/deepstream/deepstream-6.0/sources/deepstream_python_apps/apps/deepstream-test1-usbcam
python3 deepstream_test_1_usb.py /dev/video0
예제를 실행 하고 나면 gstreamer warning이 마구 발생하며 꼭 실행이 안될 것 처럼 log가 나온다.
하지만 실행은 된다.
아래는 실행 화면 인다. 아이패드로 유재석 씨 사진을 띄워 카메라 앞에 두니 사람으로 인식하는 모습을 볼 수 있다.
이렇게 deepstream 6.0 python예제를 실행 시키는 방법을 알아 봤다.
이제 예제 코드를 분석해 sdk 사용법을 파악 한 후 본 프로젝트 개발을 시작해야겠다.
아래는 첫 시도에서 실패 했던 과정에 대한 기록이다.
down load deepstream 6.0-l4t sample container:
docker pull nvcr.io/nvidia/deepstream-l4t:6.0-samples
앞으로의 내용은 거의 아래 link를 따라 한것 인데 나는 이걸 따라 해서 실패 했다. 그래서 이 문서 저문서를 참고해 성공한 방법이 위 포스팅 내용이었다.
python binding installation
apt-get install python-gi-dev
export GST_LIBS="-lgstreamer-1.0 -lgobject-2.0 -lglib-2.0"
export GST_CFLAGS="-pthread -I/usr/include/gstreamer-1.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include"
apt-get install python3-dev libpython3-dev
apt-get install libtool m4 automake
apt install libgstreamer1.0-dev
git clone https://github.com/GStreamer/gst-python.git
cd gst-python
git checkout 1a8f48a
./autogen.sh PYTHON=python3
./configure PYTHON=python3
make
make install
위 명령을 실행 시키다 보면 아래와 같은 에러가 발생한다.
libtoolize: error: One of these is required:
libtoolize: gm4 gnum4 m4
libtoolize: error: Please install GNU M4, or 'export M4=/path/to/gnu/m4'.
그래서 아래 패키지를 설치해줬다.
apt-get install libtool m4 automake
설치후 다시 gst-python 을 빌드하면 다시 아래와 같은 error가 발생한다.
정확히는 './autogen.sh PYTHON=python3' 명령 실행 후 발생한다.
checking for headers required to compile python extensions... not found
configure: error: could not find Python headers
configure failed
그래서 아래 명령을 통해 필요한 패키지들을 설치
apt-get install python3-dev libpython3-dev
그리고 나면 './autogen.sh PYTHON=python3' 명령은 무사히 넘어 갈수 있다.
그러나 './configure PYTHON=python3' 실행시 문제의 아래 error가 발생한다.
make[3]: Entering directory '/opt/nvidia/gst-python/gi/overrides'
CC _gi_gst_la-gstmodule.lo
gstmodule.c:31:10: fatal error: gst/gst.h: No such file or directory
#include <gst/gst.h>
^~~~~~~~~~~
compilation terminated.
위 에러에 대한 해결 방법을 검색 하면 아래 페이지를 볼 수 있다. 하지만 시는데로 해도 문제가 해결되지 않아 나는 위에서 열거한 그 많은 gstreamer 관련 패키지를 모두 설치 한것이다....
link:https://forums.developer.nvidia.com/t/no-such-file-or-directory-include-gst-gst-h/156423/6
apt-get install libgstreamer1.0-dev libjson-glib-dev
여기 까지가 실패했던 첫번째 시도의 내용이다.
그리고 container를 종료 하고 인터넷을 열심히 검색해 이문서 저문서의 내용을 종합해 python bindings 빌드에 성공한 내용이 이번 포스팅의 내용이다.
'jetson' 카테고리의 다른 글
[jetson nano] edge device에서 FastMOT inference (0) | 2022.01.23 |
---|---|
[jetson nano] pyinstaller 이용 실행파일 만들기 (0) | 2022.01.18 |
[jetson nano] opencv 4.5.1 설치 (0) | 2022.01.15 |
[Jetson nano] docker를 이용한 개발 환경 세팅 (4) | 2022.01.15 |
jetson nano 조립 및 세팅 (0) | 2022.01.10 |