TensorRT 6.xxx - inferenza ta' prestazzjoni għolja għal mudelli ta' tagħlim profond (Sejbien u Segmentazzjoni tal-Oġġetti)

TensorRT 6.xxx - inferenza ta' prestazzjoni għolja għal mudelli ta' tagħlim profond (Sejbien u Segmentazzjoni tal-Oġġetti)
Iweġġa' biss l-ewwel darba!

Hi kollha! Għeżież ħbieb, f'dan l-artikolu nixtieq naqsam l-esperjenza tiegħi tal-użu ta' TensorRT, RetinaNet ibbażat fuq ir-repożitorju github.com/aidonchuk/retinanet-examples (din hija furketta tan-nevew uffiċjali minn Nvidia, li se jippermettilek tibda tuża mudelli ottimizzati fil-produzzjoni kemm jista 'jkun malajr). Scrolling permezz ta 'messaġġi fil-kanali tal-komunità ods.ai, Qed niltaqa' ma' mistoqsijiet dwar l-użu ta' TensorRT u l-aktar il-mistoqsijiet qed jirrepetu, għalhekk iddeċidejt li nikteb kompluta kemm jista’ jkun Gwida għall-użu ta' inferenza mgħaġġla bbażata fuq TensorRT, RetinaNet, Unet u docker.

Deskrizzjoni tal-kompitu

Nipproponi li nifformulaw il-kompitu b'dan il-mod: irridu nittikkettaw id-dataset, inħarrġu n-netwerk RetinaNet/Unet fuq Pytorch 1.3+, nikkonvertu l-piżijiet miksuba għal ONNX, imbagħad nikkonvertuhom għall-magna TensorRT u nħaddmu kollox f'Docker, preferibbilment fuq Ubuntu 18 u mixtieq ħafna fuq l-arkitettura ARM (Jetson)*, u b'hekk jimminimizza l-iskjerament manwali tal-ambjent. Ir-riżultat aħħari se jkun kontenitur lest mhux biss għall-esportazzjoni u t-taħriġ ta' RetinaNet/Unet, iżda wkoll għall-iżvilupp sħiħ u t-taħriġ ta' sistemi ta' klassifikazzjoni u segmentazzjoni, bil-ħardwer kollu meħtieġ.

Stadju 1. Tħejjija tal-ambjent

Huwa importanti li ninnota hawnhekk li reċentement abbandunajt kompletament l-użu u l-iskjerament ta 'mill-inqas xi libreriji fuq magna desktop, kif ukoll fuq devbox. L-unika ħaġa li għandek toħloq u tinstalla hija l-ambjent virtwali python u cuda 10.2 (tista' tillimita lilek innifsek għal sewwieq wieħed nvidia) minn deb.

Ejja nassumu li għandek waħda li għadha kif ġiet installata Ubuntu 18. Ejja ninstallaw cuda 10.2 (deb). Mhux se nidħol fid-dettall dwar il-proċess tal-installazzjoni, id-dokumentazzjoni uffiċjali hija biżżejjed.

Issa ejja ninstallaw docker, il-gwida tal-installazzjoni tad-docker tista 'tinstab faċilment, hawn eżempju www.digitalocean.com/community/tutorials/docker-ubuntu-18-04-1-ru, il-verżjoni 19+ hija diġà disponibbli - installaha. Ukoll, tinsiex li tagħmilha possibbli li tuża docker mingħajr sudo, ikun aktar konvenjenti. Wara li kollox ħadem, nagħmlu dan:

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker

U lanqas m'għandekx għalfejn tħares lejn ir-repożitorju uffiċjali github.com/NVIDIA/nvidia-docker.

Issa ejja nagħmlu git clone github.com/aidonchuk/retinanet-examples.

Fadal ftit ftit, sabiex tibda tuża docker b'immaġni nvidia, ikollna bżonn nirreġistraw ma 'NGC Cloud u illoggjaw. Ejja mmorru hawn ngc.nvidia.com, irreġistra u wara li nidħlu ġewwa NGC Cloud, ikklikkja SETUP fir-rokna ta' fuq tax-xellug tal-iskrin jew segwi din il-link ngc.nvidia.com/setup/api-key. Ikklikkja "iġġenera ċavetta". Nirrakkomanda li ssalvaha, inkella l-ħin li jmiss li żżur ser ikollok terġa 'tiġġeneraha u, għaldaqstant, tiskjeraha fuq karozza ġdida u rrepeti din l-operazzjoni.

Ejja nagħmlu:

docker login nvcr.io
Username: $oauthtoken
Password: <Your Key> - сгенерированный ключ

L-isem tal-utent huwa sempliċement ikkupjat. Ukoll, ikkunsidra l-ambjent skjerat!

Stadju 2: Bini tal-kontenitur docker

Fit-tieni stadju tax-xogħol tagħna, aħna se nibnu docker u jiffamiljarizzaw ruħhom mal-intern tiegħu.
Ejja mmorru fil-fowlder ta ' l-għerq fir-rigward tal-proġett retina-eżempji u tesegwixxi

docker build --build-arg USER=$USER --build-arg UID=$UID --build-arg GID=$GID --build-arg PW=alex -t retinanet:latest retinanet/

Nibnu docker billi ngħaddu l-utent attwali fih - dan huwa utli ħafna jekk tikteb xi ħaġa fuq VOLUME immuntat bid-drittijiet tal-utent attwali, inkella jkun għerq u uġigħ.

Waqt li docker qed jibni, ejja neżaminaw id-Dockerfile:

FROM nvcr.io/nvidia/pytorch:19.10-py3

ARG USER=alex
ARG UID=1000
ARG GID=1000
ARG PW=alex
RUN useradd -m ${USER} --uid=${UID} && echo "${USER}:${PW}" | chpasswd

RUN apt-get -y update && apt-get -y upgrade && apt-get -y install curl && apt-get -y install wget && apt-get -y install git && apt-get -y install automake && apt-get install -y sudo && adduser ${USER} sudo
RUN pip install git+https://github.com/bonlime/pytorch-tools.git@master

COPY . retinanet/
RUN pip install --no-cache-dir -e retinanet/
RUN pip install /workspace/retinanet/extras/tensorrt-6.0.1.5-cp36-none-linux_x86_64.whl
RUN pip install tensorboardx
RUN pip install albumentations
RUN pip install setproctitle
RUN pip install paramiko
RUN pip install flask
RUN pip install mem_top
RUN pip install arrow
RUN pip install pycuda
RUN pip install torchvision
RUN pip install pretrainedmodels
RUN pip install efficientnet-pytorch
RUN pip install git+https://github.com/qubvel/segmentation_models.pytorch
RUN pip install pytorch_toolbelt

RUN chown -R ${USER}:${USER} retinanet/

RUN cd /workspace/retinanet/extras/cppapi && mkdir build && cd build && cmake -DCMAKE_CUDA_FLAGS="--expt-extended-lambda -std=c++14" .. && make && cd /workspace

RUN apt-get install -y openssh-server && apt install -y tmux && apt-get -y install bison flex && apt-cache search pcre && apt-get -y install net-tools && apt-get -y install nmap
RUN apt-get -y install libpcre3 libpcre3-dev && apt-get -y install iputils-ping

RUN mkdir /var/run/sshd
RUN echo 'root:pass' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed 's@sessions*requireds*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile
CMD ["/usr/sbin/sshd", "-D"]

Kif tistgħu taraw mit-test, nieħdu l-libreriji favoriti tagħna kollha, nikkompilaw retinanet, u nżidu xi għodod bażiċi biex ikun faċli li taħdem magħhom. Ubuntu u kkonfigura s-server OpenSSH. L-ewwel linja tirretti l-immaġni NVIDIA li għaliha ħloqna l-login tal-NGC Cloud u li fiha Pytorch1.3, TensorRT6.xxx, u għadd ta' libreriji oħra li jippermettulna nikkompilaw il-kodiċi tas-sors tas-CPP għad-ditekter tagħna.

Stadju 3: Tnedija u Debugging tal-Kontenitur Docker

Ejja ngħaddu għall-każ ewlieni tal-użu tal-kontenitur u l-ambjent tal-iżvilupp; l-ewwel, ejja nniedu nvidia docker. Ejja nagħmlu:

docker run --gpus all --net=host -v /home/<your_user_name>:/workspace/mounted_vol -d -P --rm --ipc=host -it retinanet:latest

Il-kontenitur issa huwa aċċessibbli permezz ta' ssh @localhost. Wara tnedija b'suċċess, iftaħ il-proġett f'PyCharm. Imbagħad niftħu

Settings->Project Interpreter->Add->Ssh Interpreter

Pass 1
TensorRT 6.xxx - inferenza ta' prestazzjoni għolja għal mudelli ta' tagħlim profond (Sejbien u Segmentazzjoni tal-Oġġetti)

Pass 2
TensorRT 6.xxx - inferenza ta' prestazzjoni għolja għal mudelli ta' tagħlim profond (Sejbien u Segmentazzjoni tal-Oġġetti)

Pass 3
TensorRT 6.xxx - inferenza ta' prestazzjoni għolja għal mudelli ta' tagħlim profond (Sejbien u Segmentazzjoni tal-Oġġetti)

Aħna nagħżlu kollox bħal fil-screenshots,

Interpreter -> /opt/conda/bin/python

- dan se jkun ln f'Python3.6 u

Sync folder -> /workspace/retinanet

Aħna nagħfas il-finitura, nistennew l-indiċjar, u dak hu, l-ambjent huwa lest għall-użu!

IMPORTANTI!!! Immedjatament wara l-indiċjar, iġbed il-fajls ikkumpilati għal Retinanet minn docker. Fil-menu tal-kuntest fl-għerq tal-proġett, agħżel l-oġġett

Deployment->Download

Se jidhru fajl wieħed u żewġ folders: build, retinanet.egg-info u _С.so

TensorRT 6.xxx - inferenza ta' prestazzjoni għolja għal mudelli ta' tagħlim profond (Sejbien u Segmentazzjoni tal-Oġġetti)

Jekk il-proġett tiegħek jidher bħal dan, allura l-ambjent jara l-fajls kollha meħtieġa u aħna lesti li nħarrġu RetinaNet.

Stadju 4. Ittikketta d-dejta u ħarreġ id-ditekter

Għall-markup nuża prinċipalment jissorvelja.ly — għodda pjaċevoli u konvenjenti, reċentement ġew irranġati mazz ta 'bugs u saret ruħha aħjar b'mod sinifikanti.

Ejja nassumu li mmarkajt is-sett tad-dejta u niżżiltu, iżda mhux se tkun tista 'tpoġġih immedjatament fir-RetinaNet tagħna, peress li huwa fil-format tiegħu stess u għal dan irridu naqilbuh għal COCO. L-għodda ta 'konverżjoni tinsab fi:

markup_utils/supervisly_to_coco.py

Jekk jogħġbok innota li l-Kategorija fl-iskript hija eżempju u trid daħħal tiegħek (m'hemmx għalfejn iżżid il-kategorija tal-isfond)

categories = [{'id': 1, 'name': '1'}, 
                  {'id': 2, 'name': '2'}, 
                  {'id': 3, 'name': '3'},
                  {'id': 4, 'name': '4'}] 

Għal xi raġuni, l-awturi tar-repożitorju oriġinali ddeċidew li ma tħarreġ xejn ħlief COCO/VOC għall-iskoperta, għalhekk kellhom jeditjaw ftit il-fajl tas-sors.

retinanet/dataset.py

Billi żżid iż-żidiet favoriti tiegħek hawn albumentations.readthedocs.io/en/latest u aqta 'kategoriji hard-wired minn COCO. Huwa wkoll possibbli li taqsam żoni kbar ta 'skoperta, jekk qed tfittex oġġetti żgħar fi stampi kbar, għandek sett ta' data żgħir =), u xejn ma jaħdem, iżda aktar fuq dak ħin ieħor.

B'mod ġenerali, il-linja tal-ferrovija hija wkoll dgħajfa, inizjalment ma ssejvjax punti ta 'kontroll, użat xi tip ta' scheduler terribbli, eċċ. Imma issa kull ma għandek tagħmel hu li tagħżel is-sinsla u tesegwixxi

/opt/conda/bin/python retinanet/main.py

b'parametri:

train retinanet_rn34fpn.pth
--backbone ResNet34FPN
--classes 12
--val-iters 10
--images /workspace/mounted_vol/dataset/train/images
--annotations /workspace/mounted_vol/dataset/train_12_class.json
--val-images /workspace/mounted_vol/dataset/test/images_small
--val-annotations /workspace/mounted_vol/dataset/val_10_class_cropped.json
--jitter 256 512
--max-size 512
--batch 32

Fil-console se tara:

Initializing model...
     model: RetinaNet
  backbone: ResNet18FPN
   classes: 2, anchors: 9
Selected optimization level O0:  Pure FP32 training.

Defaults for this optimization level are:
enabled                : True
opt_level              : O0
cast_model_type        : torch.float32
patch_torch_functions  : False
keep_batchnorm_fp32    : None
master_weights         : False
loss_scale             : 1.0
Processing user overrides (additional kwargs that are not None)...
After processing overrides, optimization options are:
enabled                : True
opt_level              : O0
cast_model_type        : torch.float32
patch_torch_functions  : False
keep_batchnorm_fp32    : None
master_weights         : False
loss_scale             : 128.0
Preparing dataset...
    loader: pytorch
    resize: [1024, 1280], max: 1280
    device: 4 gpus
    batch: 4, precision: mixed
Training model for 20000 iterations...
[    1/20000] focal loss: 0.95619, box loss: 0.51584, 4.042s/4-batch (fw: 0.698s, bw: 0.459s), 1.0 im/s, lr: 0.0001
[   12/20000] focal loss: 0.76191, box loss: 0.31794, 0.187s/4-batch (fw: 0.055s, bw: 0.133s), 21.4 im/s, lr: 0.0001
[   24/20000] focal loss: 0.65036, box loss: 0.30269, 0.173s/4-batch (fw: 0.045s, bw: 0.128s), 23.1 im/s, lr: 0.0001
[   36/20000] focal loss: 0.46425, box loss: 0.23141, 0.178s/4-batch (fw: 0.047s, bw: 0.131s), 22.4 im/s, lr: 0.0001
[   48/20000] focal loss: 0.45115, box loss: 0.23505, 0.180s/4-batch (fw: 0.047s, bw: 0.133s), 22.2 im/s, lr: 0.0001
[   59/20000] focal loss: 0.38958, box loss: 0.25373, 0.184s/4-batch (fw: 0.049s, bw: 0.134s), 21.8 im/s, lr: 0.0001
[   71/20000] focal loss: 0.37733, box loss: 0.23988, 0.174s/4-batch (fw: 0.049s, bw: 0.125s), 22.9 im/s, lr: 0.0001
[   83/20000] focal loss: 0.39514, box loss: 0.23878, 0.181s/4-batch (fw: 0.048s, bw: 0.133s), 22.1 im/s, lr: 0.0001
[   94/20000] focal loss: 0.39947, box loss: 0.23817, 0.185s/4-batch (fw: 0.050s, bw: 0.134s), 21.6 im/s, lr: 0.0001
[  105/20000] focal loss: 0.37343, box loss: 0.20238, 0.182s/4-batch (fw: 0.048s, bw: 0.134s), 22.0 im/s, lr: 0.0001
[  116/20000] focal loss: 0.19689, box loss: 0.17371, 0.183s/4-batch (fw: 0.050s, bw: 0.132s), 21.8 im/s, lr: 0.0001
[  128/20000] focal loss: 0.20368, box loss: 0.16538, 0.178s/4-batch (fw: 0.046s, bw: 0.131s), 22.5 im/s, lr: 0.0001
[  140/20000] focal loss: 0.22763, box loss: 0.15772, 0.176s/4-batch (fw: 0.050s, bw: 0.126s), 22.7 im/s, lr: 0.0001
[  148/20000] focal loss: 0.21997, box loss: 0.18400, 0.585s/4-batch (fw: 0.047s, bw: 0.144s), 6.8 im/s, lr: 0.0001
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.52674
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.91450
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.35172
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.61881
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.00000
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = -1.00000
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.58824
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.61765
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.61765
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.61765
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.00000
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = -1.00000
Saving model: 148

Biex tesplora s-sett kollu ta 'parametri, ħares

retinanet/main.py

B'mod ġenerali, huma standard għall-iskoperta, u għandhom deskrizzjoni. Ibda t-taħriġ u stenna għar-riżultati. Eżempju ta' inferenza jista' jidher fi:

retinanet/infer_example.py

jew mexxi l-kmand:

/opt/conda/bin/python retinanet/main.py infer retinanet_rn34fpn.pth 
--images /workspace/mounted_vol/dataset/test/images 
--annotations /workspace/mounted_vol/dataset/val.json 
--output result.json 
--resize 256 
--max-size 512 
--batch 32

Ir-repożitorju diġà għandu Telf Fokali u diversi sinsla mibnija, u huwa wkoll faċli li tintegra tiegħek stess

retinanet/backbones/*.py

Fit-tabella l-awturi jagħtu xi karatteristiċi:

TensorRT 6.xxx - inferenza ta' prestazzjoni għolja għal mudelli ta' tagħlim profond (Sejbien u Segmentazzjoni tal-Oġġetti)

Hemm ukoll sinsla ResNeXt50_32x4dFPN u ResNeXt101_32x8dFPN, meħuda minn torchvision.
Nispera li dehret ftit is-sejbien, imma definittivament għandek taqra d-dokumentazzjoni uffiċjali sabiex dan tifhem l-esportazzjoni u l-modi tal-qtugħ.

Stadju 5. Esportazzjoni u inferenza ta 'mudelli Unet b'encoder Resnet

Kif probabilment innotajt, libreriji għas-segmentazzjoni ġew installati fid-Dockerfile, u b'mod partikolari l-lib mill-isbaħ github.com/qubvel/segmentation_models.pytorch. Fil-pakkett unitet tista 'ssib eżempji ta' inferenza u esportazzjoni ta 'punti ta' kontroll pytorch għall-magna TensorRT.

Il-problema ewlenija meta jiġu esportati mudelli li jixbħu lil Unet minn ONNX għal TensoRT hija l-ħtieġa li jiġi stabbilit daqs Upsample fiss jew tuża ConvTranspose2D:

import torch.onnx.symbolic_opset9 as onnx_symbolic
        def upsample_nearest2d(g, input, output_size):
            # Currently, TRT 5.1/6.0 ONNX Parser does not support all ONNX ops
            # needed to support dynamic upsampling ONNX forumlation
            # Here we hardcode scale=2 as a temporary workaround
            scales = g.op("Constant", value_t=torch.tensor([1., 1., 2., 2.]))
            return g.op("Upsample", input, scales, mode_s="nearest")

        onnx_symbolic.upsample_nearest2d = upsample_nearest2d

Billi tuża din it-trasformazzjoni, tista 'tagħmel dan awtomatikament meta tesporta lejn ONNX, iżda diġà fil-verżjoni 7 ta' TensorRT din il-problema ġiet solvuta, u rridu nistennew pjuttost ftit.

Konklużjoni

Meta bdejt nuża docker, kelli dubji dwar il-prestazzjoni tiegħu għall-kompiti tiegħi. Waħda mill-unitajiet tiegħi bħalissa għandha ħafna traffiku tan-netwerk iġġenerat minn diversi kameras.

TensorRT 6.xxx - inferenza ta' prestazzjoni għolja għal mudelli ta' tagħlim profond (Sejbien u Segmentazzjoni tal-Oġġetti)

Diversi testijiet fuq l-Internet indikaw overhead relattivament kbir għall-interazzjoni tan-netwerk u r-reġistrazzjoni fuq il-VOLUME, flimkien mal-GIL mhux magħruf u terribbli, u peress li jinqabad frejm, it-tħaddim tas-sewwieq u t-trażmissjoni tal-qafas fuq in-netwerk hija operazzjoni atomika fil-mod iebes f'ħin reali, id-dewmien tan-netwerk huwa kritiku ħafna għalija.

Imma kollox irriżulta tajjeb =)

P.S. Li jibqa 'huwa li żżid il-linja tal-ferrovija favorita tiegħek għas-segmentazzjoni u l-produzzjoni!

Grazzi

Grazzi lill-komunità ods.ai, mingħajrha huwa impossibbli li tiżviluppa! Grazzi ħafna n01z3, li ħeġġiġni nagħmel DL, għall-pariri imprezzabbli u l-professjonalità estrema tiegħu!

Uża mudelli ottimizzati fil-produzzjoni!

TensorRT 6.xxx - inferenza ta' prestazzjoni għolja għal mudelli ta' tagħlim profond (Sejbien u Segmentazzjoni tal-Oġġetti) Aurorai, llc

Sors: www.habr.com

Ixtri hosting affidabbli għal siti bi protezzjoni DDoS, servers VPS VDS 🔥 Ixtri hosting ta' websajts affidabbli bi protezzjoni DDoS, servers VPS VDS | ProHoster