MMCV에서 사용되는 pretrained model 주소 알아내는 방법

공대생의 팁 2023. 11. 5. 13:34

 

 mmsegmenataion으로 모델을 학습하는 과정에서 가끔씩 난처한 상황을 맞이하는 경우가 있습니다. 아래와 같이 소스코드 내부를 살펴보았을 때 Pretrained 모델이 경로로 설정되어 있는데 만약 pretrained=None로 설정을 할 경우 모델 학습이 전혀 진행되지 않는 경우가 발생합니다.

 

1
2
3
4
5
model = dict(
    data_preprocessor=data_preprocessor,
    pretrained='pretrain/vit_base_patch16_224.pth',
    text_encoder=dict(dataset_name='voc'),
    decode_head=dict(num_classes=20))
cs

 

이 문제를 근본적으로 해결할 수 있는 방법은 해당 Pretrained 모델을 다운로드 받아 사용하는 것인데 mmsegmentation 공식 사이트에서는 해당 내용을 찾기가 어려웠습니다. 혹시나 싶어 구글에 'openmmlab vit_base_patch16_224.pth'와 같이 mmsegmenatation에 국한하지 않고 openmmlab 전체에서 해당 사전학습 모델을 찾을 수 있는지 검색해 보았습니다.

 

 

검색 결과 뭔가 힌트가 될 만한 주소가 얼핏 보이는 것이 확인되어 아래와 같이 검색을 시도해보았고...

 

https://download.openmmlab.com/mmaction/recognition/timesformer/vit_base_patch16_224.pth

 

다행히도 해당 Weight 모델이 다운로드 되는 것을 확인하였습니다.

 

 

300x250

Windows 환경에서 MMDeploy로 TensorRT 구동(Python, C++)

프로그래밍 팁 2023. 10. 31. 13:31

 

 대다수의 AI 개발은 Linux 환경에서 이루어지다 보니 Linux환경에서 개발된 오픈소스 라이브러리를 Windows에서 사용하기 위해서는 Windows의 환경에 맞추어 설정을 해야하는 번거로움이 발생하곤 합니다. 사내 자체 개발이 목적이라면 Linux를 사용하는 것이 큰 문제가 되지 않을 수 있으나 고객사에서 Windows 환경에서의 사용을 원한다면 사실상 소스코드를 처음부터 설계한다는 각오를 해야 하기 때문에 개발에 많은 시간이 소요되는 안타까운 사례들이 있습니다.

 

 OpenMMLab에서 공개된 오픈소스 라이브러리인 MMCV는 Linux 환경은 물론, Windows에서도 프로그램이 구동될 수 있도록 지원을 해주고 있습니다. 덕분에 Linux 천하의 Vision AI 개발 환경에서 Windows 운영체제 환경에 맞추어 사용할 수 있는 AI 모델을 개발할 수 있어 개발자의 입장에서 보았을 때 막대한 개발 시간이 소요되는 경우를 막을 수 있습니다. 

 

 이번 포스팅에서는 MMCV로 개발된 딥러닝 모델을 MMDeploy로 경량화한 다음, 개발한 딥러닝 모델이 Windows 환경에서 보다 빠르게 구동될 수 있도록 만드는 과정에 대해 다루어보도록 하겠습니다.

 

※MMDeploy는 OpenMMLab에서 공개한 라이브러리(MMDetection, MMSegmentation 등)를 실제 동작환경에서 경량화 및 가속화를 도와주는 라이브러리입니다. MMDeploy에 대해 자세한 내용은 아래의 포스팅을 참조 바랍니다.

 

인공지능 모델 최적화 배포 라이브러리 - MMDeploy

연구 단계에서의 인공지능 모델 설계는 일반적인 환경 내에서 개발하고 성능을 분석할 때는 별 문제가 없다가도 막상 실제 특정 환경에서 적용을 시도해보려 하면 모델 구동 시간이 상당히 오

elecs.tistory.com

 

 1. 버전 맞추기

 

 2023년 4월 6일 OpenMMLab 2.0 방식의 최신 소스코드 구조가 적용된 MMDeploy 1.0 버전이 공개었습니다. 자신이 개발한 버전에 따라 해당 버전의 MMDeploy를 설정합니다. 본 예제에서는 MMSegmentation 0.30.0, MMDeploy 0.14.0 버전을 기준으로 작성하였습니다.

 

 

git clone https://github.com/open-mmlab/mmdeploy.git
git fetch --all --tags
git checkout tags/v0.14.0

 

2. MMDeploy 설치

 

 

Github를 통해 MMDeploy 소스코드 다운로드를 수행한 다음 MMDeploy을 사용하기 위해 필요한 pip 패키지들을 설치합니다.

pip install mmdeploy==0.14.0 mmdeploy-runtime==0.14.0 mmdeploy-runtime-gpu==0.14.0


3. MMPretrain(구 MMClassification) 설치

설치하시는 MMDeploy 버전이 1.x일 경우 MMPretrain을 설치합니다.

pip install mmpratrain


설치하시는 MMDeploy 버전이 0x.일 경우 MMClassification을 설치해주세요

pip install mmcls



4. ONNX 설치



MMDeploy는 MMCV로 개발된 딥러닝 모델을 ONNX로 변환한 다음 TensorRT로 변환하는 방식으로 2단계 변환을 수행합니다. 다음과 같이 ONNX를 설치합니다. 먼저 pip로 ONNX 패키지를 설치한 다음

 

pip install onnxruntime==1.8.1


다음으로 아래의 Github 사이트를 통해 onnxruntime 소스코드를 다운로드 받습니다.
https://github.com/microsoft/onnxruntime/releases/

 

Releases · microsoft/onnxruntime

ONNX Runtime: cross-platform, high performance ML inferencing and training accelerator - microsoft/onnxruntime

github.com




5. Nvidia 라이브러리 설치(CUDA, cuDNN, TensorRT)



자신의 환경에 맞는 버전의 CUDA, cuDNN, TensorRT를 설치합니다. cuDNN과 TensorRT 설치를 위해 Nvidia 계정이 필요합니다.
 
CUDA Toolkit >= 11.1
https://developer.nvidia.com/cuda-toolkit-archive/

 

CUDA Toolkit Archive

Previous releases of the CUDA Toolkit, GPU Computing SDK, documentation and developer drivers can be found using the links below. Please select the release you want from the list below, and be sure to check www.nvidia.com/drivers for more recent production

developer.nvidia.com



cuDNN >= 8.2.1.0
https://developer.nvidia.com/cudnn/

 

CUDA Deep Neural Network

cuDNN provides researchers and developers with high-performance GPU acceleration.

developer.nvidia.com



TensorRT >= 8.2.3.0
https://developer.nvidia.com/tensorrt-getting-started/

 

TensorRT - Get Started

Learn more about NVIDIA TensorRT and check out the latest codes and tutorials.

developer.nvidia.com


6. OpenCV 설치


Image Processing 과정에서 주로 사용되는 OpenCV 라이브러리를 설치합니다.
Python만 사용하실 예정이신 분은 pip를 통해 설치합니다.
pip install opencv-python

C++ 환경에서 TensorRT를 사용하고자 하시는 분은 OpenCV 공식 사이트에서 Runtime 라이브러리를 설치해줍니다. Windows 환경에서 설치하기 위해서는 아래의 사이트를 참조하여 설치해주시기 바랍니다.

https://hello-bryan.tistory.com/29

 

[OpenCV 설치] Windows OpenCv 설치

OpenCV 설치 Windows OpenCV OpenCV 공식 홈페이지로 갑니다. https://opencv.org 상단 메뉴의 RELEASES 를 클릭하고 원하는 버전의 Win Pack 을 클릭하여 다운로드 페이지로 이동합니다. 광고가 겁나많은 다운로드

hello-bryan.tistory.com



7. 환경변수 설정


위의 과정을 통해 설치하였던 onnxruntime, CUDA, cuDNN, TensorRT 라이브러리를 환경변수 Path에 등록합니다. 또한, CUDA_PATH의 환경변수 또한 다음과 같이 등록해주시기 바랍니다.



8. Pycuda 설치


Python에서 CUDA 병령 컴퓨팅 API를 수행할 수 있도록 해주는 pycuda를 설치합니다. 만약 설치 과정에서 실패하는 경우 위 6번 과정에서 설치한 라이브러리 환경변수 설정에서 잘못된 경우가 있을 수 있으므로 한 번 더 확인해보시기 바랍니다.

pip install pycuda

 


9. MMDeploy SDK 설치


Github에 공개된 MMDeploy의 release 라이브러리 탭에서 자신에게 맞는 버전을 선택 후 Assets에서 SDK를 다운로드 받습니다. 여기서는 "mmdeploy-0.14.0-windows-amd64-cuda11.3.zip"을 다운로드 합니다.

https://github.com/open-mmlab/mmdeploy/tags/

 

GitHub - open-mmlab/mmdeploy: OpenMMLab Model Deployment Framework

OpenMMLab Model Deployment Framework. Contribute to open-mmlab/mmdeploy development by creating an account on GitHub.

github.com


C++ 환경에서 사용하고자 하시는 경우 SDK를 폴더에 압축해제 하신 다음 Powershell을 실행하여 아래의 경로로 이동해주세요.
mmdeploy-0.14.0-windows-amd64-cuda11.3\example\cpp\build
위 경로로 이동한 다음 C++ SDK를 빌드합니다.

> cmake .. -DMMDeploy_DIR="mmdeploy-0.14.0-windows-amd64-cuda11.3\lib\cmake\mmdeploy" -DTENSORRT_DIR="TensorRT 설치 경로" -DONNXRUNTIME_DIR="onnxruntime 설치 경로" -DOpenCV_DIR="opencv\build\x64\vc15\lib"
> cmake --build . --config Release


10. Model 변환

지금까지 TensorRT를 사용하기 위해 구동 환경에서 MMDeploy를 적용하는 방법에 대해 설명드렸습니다. 이제 본격적으로 자신이 개발한 Model을 배포 환경에서 구동할 수 있도록 변환하는 단계를 진행해보도록 하겠습니다.

Python 소스코드를 아래와 같이 작성한 다음 실행합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from mmdeploy.apis import torch2onnx
from mmdeploy.apis .tensorrt import onnx2tensorrt
from mmdeploy.backend.sdk.expert_info import export2SDK
import os
 
img = '테스트하고자 하는 이미지 경로'
work_dir = 'TensorRT 변환 모델 저장 폴더 경로'
save_file = 'end2end.onnx'
deploy_cfg = 'mmdeploy/configs/mmseg/segmentation_tensorrt-fp16_static-512x512.py'
model_cfg = 'mmseg/자신이 학습한 모델의 설정.py'
model_checkpoint = '변환하고자 하는 모델.pth'
device = 'cuda'
 
# 1. convert model to IR(onnx)
torch2onnx(img, work_dir, save_file, deploy_cfg, model_cfg, model_checkpoint, device)
 
# 2. convert IR to tensorrt
onnx_model = os.path.join(work_dir, save_file)
save_file = 'end2end.engine'
model_id = 0
onnx2tensorrt(work_dir, save_file, model_id, deploy_cfg, onnx_model, device)
 
# 3. extract pipeline info for sdk use (dump-info)
export2SDK(deploy_cfg, model_cfg, work_dir, pth=model_checkpoint, device=device)
cs


위의 소스코드를 실행하시면 work_dir 폴더에 다음과 같은 파일들이 생성된 것을 확인하실 수 있습니다.

deploy.json
detail.json
end2end.engine
end2end.onnx
pipeline.json


11. Inference 코드 구현


이제 여러분들이 개발한 딥러닝 모델이 TensorRT로 변환된 것을 확인하였습니다. TensorRT 최적화 모델을 아래와 같이 실행할 수 있습니다.

- python
> python MMDEPLOY/mmdeploy/tools/deploy.py MMDEPLOY/mmdeploy/configs/mmseg/segmentation_tensorrt-int8_static-512x512.py MMSEGMENTATION/configs/모델 설정 파일.py 학습한 모델.engine "데모 이미지.jpg" --device cuda:0

> python MMDEPLOY/demo/python/image_segmentation.py cuda "work_dir 경로" "데모이미지 경로.jpg"

 

 

- C++
> MMDeployDIR/example/cpp/build/release/image_segmentation.exe cuda "work_dir 경로" "데모이미지 경로.jpg"

이제 여러분들도 MMDeploy를 통해 경량화돤 모델이 배포 환경에 맞추어 실행 속도가 굉장히 향상된 것을 확인하실 수 있습니다.


- 참고자료

https://mmdeploy.readthedocs.io/en/v0.14.0/get_started.html#installation 

 

Get Started — mmdeploy 0.14.0 documentation

Get Started MMDeploy provides useful tools for deploying OpenMMLab models to various platforms and devices. With the help of them, you can not only do model deployment using our pre-defined pipelines but also customize your own deployment pipeline. Introdu

mmdeploy.readthedocs.io

https://mmdeploy.readthedocs.io/en/v0.14.0/02-how-to-run/prebuilt_package_windows.html

 

How to use prebuilt package on Windows10 — mmdeploy 0.14.0 documentation

Docs > How to use prebuilt package on Windows10 以中文阅读 Shortcuts

mmdeploy.readthedocs.io

 

300x250

Android에서 Glib 사용하기(NDK)

안드로이드 2023. 9. 10. 11:51


 최근 안드로이드 태블릿을 사용하게 되면서 일상에 많은 변화를 체험하고 있습니다. 휴대폰에 비해 압도적으로 큰 화면 덕분에 장거리 이동시 유튜브 영상 시청을 하거나, 블루투스 키보드를 연결하여 노트북 대용으로 업무를 수행할 수 있고, 통신사 USIM칩을 삽입하면 장소에 구애받지 않고 어디서든 인터넷을 사용할 수 있어 Wi-Fi를 찾아다니며 인터넷 연결을 해야 했던 노트북에 비해 상당한 편리함을 느끼고 있습니다.

 최근에 영상 활용 프로그램을 개발하고 있어 노트북을 자주 들고 다니는데, 이참에 안드로이드 태블릿으로 업무를 수행하면 좀 더 편하게 다닐 수 있을 것이라 생각되어 안드로이드 앱으로 내가 필요한 기능을 구현해보기로 하였습니다.

 

 처음엔 안드로이드도 Linux 기반이어서 Linux PC에서 개발하였던 프로그램을 쉽게 설계할 수 있을 것이라 생각하고 덤볐는데 예상치 못한 난관을 (예상대로) 겪고 있습니다. NDK를 처음 사용하다보니 생각보다 공부할게 많고...

 

 언제나 그랬듯이 좌충우돌 하며 NDK에 대해 공부했던 내용들을 정리해보고자 합니다. Linux 환경에서 자주 사용되는 Glib를 Android NDK 환경에서 사용할 수 있도록 라이브러리를 컴파일 하는 방법에 대해 살펴보도록 하겠습니다.

 

※개발환경
운영체제: Ubuntu22.04(WSL2)
Android버전: API21
NDK버전: r25c

 

 

1. Android NDK 설치

 

 안드로이드 공식 사이트에서 NDK를 다운로드 받습니다. 다음으로 폴더 압축을 푼 다음 .bashrc에 NDK폴더 경로를 PATH 환경변수에 추가해줍니다.

NDK 다운로드  |  Android NDK  |  Android Developers

NDK 다운로드 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 개발 플랫폼에 맞는 NDK 패키지를 선택합니다. NDK 최신 버전의 변경사항 및 이전 버전에 관한 정

developer.android.com

 

export PATH=NDK경로:$PATH

 
 

2. 개발환경 구축

 

 Android NDK 개발환경 구축을 위해 필요한 패키지들을 설치합니다.

 

$ sudo apt install meson ninja openjdk-19-jdk 

 

3. Glib 사용을 위한 라이브러리 다운로드

 

Glib 라이브러리는 아래 사이트에서 다운로드 합니다. (glib-2.77.2 기준)
https://gitlab.gnome.org/GNOME/glib/-/releases/2.77.2

 

Glib 라이브러리를 사용하기 위해서는 아래의 패키지들이 먼저 준비되어 있어야 합니다.

 

Libiconv
http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.17.tar.gz

 

Gettext
http://ftp.gnu.org/pub/gnu/gettext/gettext-0.21.tar.gz

 

4. Configure 환경 구성 및 컴파일

 

 다운로드한 라이브러리를 Android 기기에서 동작할 수 있도록 컴파일 하기 위해 Configure 환경에 맞게 설정을 해주어야 합니다. 아래의 스크립트를 자신의 환경에 맞추어 작성합니다.

 

# env.sh

#컴파일된 패키지가 설치될 경로
export PREFIX=/home/user/Android
#라이브러리 경로
export LIBDIR=$PREFIX/lib
#include 경로
export INCLUDEDIR=$PREFIX/include
#pkg-config 경로
export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig
#Build가 진행되는 HOST기기 정보
export BUILD_SYS=x86_64-linux-gnu
#적용하고자 하는 최소 안드로이드 버전. 21부터 aarch64(ARMv8) 지원
export ANDROID_API=21
#NDK 내부에 위치한 sysroot 경로
export SYSROOT=NDK설치경로/toolchains/llvm/prebuilt/linux-x86_64/sysroot/
export TOOLCHAIN=NDK설치경로/toolchains/llvm/prebuilt/linux-x86_64/

#안드로이드 기기의 아키텍처
export TARGET=aarch64-linux-android     #ARMv8
#export TARGET=armv7a-linux-androideabi #ARMv7
#export TARGET=i686-linux-android       #32비트
#export TARGET=x86_64-linux-android     #64비트

export AR=$TOOLCHAIN/bin/llvm-ar
export CC=$TOOLCHAIN/bin/$TARGET$ANDROID_API-clang
export AS=$TOOLCHAIN/bin/llvm-as
export CXX=$TOOLCHAIN/bin/$TARGET$ANDROID_API-clang++
export LD=$TOOLCHAIN/bin/ld
export RANLIB=$TOOLCHAIN/bin/llvm-ranlib
export STRIP=$TOOLCHAIN/bin/llvm-strip

export LD_LIBRARY_PATH=$LIBDIR
export CFLAGS="-fPIC -I$INCLUDEDIR"
export CXXFLAGS="-fPIC -I$INCLUDEDIR"
export LDFLAGS="-fPIC -pie -L$LD_LIBRARY_PATH"
export LIBS="-L$LD_LIBRARY_PATH"

export PKG_CONFIG=/usr/bin/pkg-config
export PKG_CONFIG_PATH=$LIBDIR/pkgconfig

 

 환경 구성 스크립트 작성이 완료되었다면 이제 본격적으로 라이브러리를 크로스컴파일 해보겠습니다. 먼저 libiconv 라이브러리를 크로스컴파일합니다.

 

. ./env.sh

cd libiconv-1.17/
./configure --host=$TARGET \
	--prefix=$PREFIX \
	--enable-static

make -j8
make install

 

다음으로 Gettext 라이브러리를 크로스컴파일 합니다.

 

. ./env.sh

cd gettext-0.21/
./configure --host=$TARGET \
	--prefix=$PREFIX \
	--enable-static

make -j8
make install

 

5. Glib 크로스컴파일을 위한 meson 환경 구성 및 컴파일


Glib을 사용하기 위해 필요한 라이브러리 설치가 완료되었다면 Glib를 크로스컴파일 합니다. Glib는 meson 컴파일 환경을 제공하고 있어 아래와 같이 cross_file.txt 파일을 작성하여 적용하실 수 있습니다. 

[constants]
arch = 'aarch64-linux-android'
android_ndk = 'NDK 경로/toolchains/llvm/prebuilt/linux-x86_64/bin/'
outdir = '라이브러리 설치 경로/'

[binaries]
ar = 'NDK 경로/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar'
c = 'NDK 경로/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang'
as = 'NDK 경로/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar'
cpp = 'NDK 경로/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang++'
ranlib = 'NDK 경로/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ranlib'
strip = 'NDK 경로/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip'
ld = 'NDK 경로/toolchains/llvm/prebuilt/linux-x86_64/bin/ld'
objcopy = 'NDK 경로/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-objcopy'
pkgconfig = '/usr/bin/pkg-config'

[properties]
sys_root = 'NDK 경로/toolchains/llvm/prebuilt/linux-x86_64/sysroot'
pkg_config_lib_dir = '라이브러리 설치 경로/lib/pkgconfig'

[host_machine]
system = 'android'
cpu_family = 'aarch64'
cpu = 'aarch64'
endian = 'little'

[built-in options]
prefix = '라이브러리 설치 경로/'
c_args = ['-fPIC','-I/라이브러리 설치 경로/include']
cpp_args = ['-fPIC','-I/라이브러리 설치 경로/include']
c_link_args = ['-fPIE','-L/안드로이드 설치 경로/lib']

pkg_config_path = '/안드로이드 설치 경로/lib/pkgconfig'

default_library = 'static'

 
cross_file.txt 파일이 준비되었다면 컴파일 및 설치를 진행합니다.

# . ./env.sh
cd glib-2.77.2
meson build --cross-file cross_file.txt
cd build
ninja
ninja install

 

6. 안드로이드 프로젝트에 적용하기 

 
라이브러리 설치 경로에 Glib 라이브러리 파일이 만들어진 것을 확인하실 수 있습니다. 만들어진 Glib 라이브러리 파일을 자신의 NDK 프로젝트에 삽입하시면 안드로이드 앱으로 Glib를 실행할 수 있습니다.

 

참고자료

GitHub - edaplayer/android-ndk-harfbuzz

Contribute to edaplayer/android-ndk-harfbuzz development by creating an account on GitHub.

github.com

 

Cross-compile GLib for Android — MobileInsight Official Website

First get the source code for gettext 0.18.3 $ wget http://ftp.gnu.org/pub/gnu/gettext/gettext-0.18.3.tar.gz $ tar zxvf gettext-0.18.3.tar.gz To compile gettext-0.18.3, a patch must be applied. In gettext-tools/src/msginit.c, change line 1088 from fullname

mobileinsight.net

 

Cross-compile GLib for Android · Nosce Te Ipsum

Cross-compile GLib for Android 17 Jul 2016 Prepare cross-compile environment Update: You may now use Android NDK r15c and beyond. I have made an all-in-one script repo at my GitHub repo First, you need to have Android NDK r10e installed, which can be downl

zwyuan.github.io

 

300x250