
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 (din hija furketta tan-nevew uffiċjali minn , li se jippermettilek tibda tuża mudelli ottimizzati fil-produzzjoni kemm jista 'jkun malajr). Scrolling permezz ta 'messaġġi fil-kanali tal-komunità , 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 , 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 .
Issa ejja nagħmlu git clone .
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 , 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 . 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:latestIl-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

Pass 2

Pass 3

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/retinanetAħ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->DownloadSe jidhru fajl wieħed u żewġ folders: build, retinanet.egg-info u _С.so

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 — 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.pyJekk 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.pyBilli żżid iż-żidiet favoriti tiegħek hawn 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.pyb'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: 148Biex tesplora s-sett kollu ta 'parametri, ħares
retinanet/main.pyB'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.pyjew 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/*.pyFit-tabella l-awturi jagħtu xi karatteristiċi:

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ħ . 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.

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à , mingħajrha huwa impossibbli li tiżviluppa! Grazzi ħafna , li ħeġġiġni nagħmel DL, għall-pariri imprezzabbli u l-professjonalità estrema tiegħu!
Uża mudelli ottimizzati fil-produzzjoni!
Aurorai, llc
Sors: www.habr.com
