TensorRT 6.x.x.x — inferencĂ« me performancĂ« tĂ« lartĂ« pĂ«r modelet e mĂ«simit tĂ« thellĂ« (Object Detection dhe Segmentation)

TensorRT 6.x.x.x — inferencĂ« me performancĂ« tĂ« lartĂ« pĂ«r modelet e mĂ«simit tĂ« thellĂ« (Object Detection dhe Segmentation)
Kjo është e dhimbshme vetëm herën e parë!

Përshëndetje të gjithëve! Të dashur miq, në këtë artikull dua të ndaja përvojën time duke përdorur TensorRT, RetinaNet nga depoja github.com/aidonchuk/retinanet-examples (kjo është një fork i depozitës zyrtare nga nvidia, që do të lejojë të filloni të përdorni modelet e optimizuara në prodhim në një kohë të shkurtër). Ndërsa rrotulloni mesazhet në kanalet e komunitetit ods.ai, përballlem me pyetje rreth përdorimit të TensorRT, dhe në shumicën e rasteve pyetjet përsëriten, prandaj vendosa të shkruaj një udhëzues sa më të plotë rreth përdorimit të inferencës së shpejtë të bazuar në TensorRT, RetinaNet, Unet dhe docker.

Përshkrimi i detyrës

Hapi 1. Përgatitja e mjedisit

Këtu është e rëndësishme të theksoj se kohët e fundit kam tërhequr tërësisht nga përdorimi dhe shpërndarja e ndonjë biblioteke në makinat desktop, ashtu si edhe në devbox. E vetmja gjë që duhet të krijohet dhe instalohet është një ambient virtual python dhe cuda 10.2 (mund të mjaftohet me një drejtues nvidia) nga deb.

Le të supozojmë se keni një Ubuntu 18 të sapoinstaluar. Do ta instalojmë cuda 10.2 (deb), nuk do të ndalem te procesi i instalimit, dokumentacioni zyrtar është mjaft i mjaftueshëm.

Tani do të instalojmë docker, udhëzimi për instalimin e docker-it mund të gjendet lehtësisht, ja një shembull

www.digitalocean.com/community/tutorials/docker-ubuntu-18-04-1-sq , tashmĂ« Ă«shtĂ« nĂ« versionin 19+ – e instalojmĂ«. Dhe mos harroni ta bĂ«ni tĂ« mundur pĂ«rdorimin e docker pa sudo, kĂ«shtu do tĂ« jetĂ« mĂ« e lehtĂ«. Pas pĂ«rfundimit, bĂ«jmĂ« kĂ«shtu: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.listsudo apt-get update && sudo apt-get install -y nvidia-container-toolkit sudo systemctl restart docker

Dhe madje nuk ka nevojë të shikoni në depozitat zyrtare

github.com/NVIDIA/nvidia-docker Tani bëjmë git clone.

Tani tani bëjmë git clone github.com/aidonchuk/retinanet-examples.

Nuk ka mbetur shumë për të filluar të përdorni docker me imazhin nvidia, na nevojitet të regjistrohemi në NGC Cloud dhe të kyçemi. Shkoni këtu ngc.nvidia.com, regjistrohemi dhe pasi hyjmë në NGC Cloud, klikoni SETUP në këndin e majtë lart të ekranit ose kaloni përmes këtij linku ngc.nvidia.com/setup/api-key. Klikoni "gjeneroni çelësin". E rekomandoj ta ruani, përndryshe herën tjetër kur vizitoni do t'ju duhet ta gjeneroni sërish dhe, si pasojë, kur instaloni në një pajisje të re, të përsërisni këtë operacion.

Të realizojmë:

docker login nvcr.io
Username: $oauthtoken
Password:  - çelësi i gjeneruar

Username thjesht e kopjojmë. Ja, tani mund të themi se ambienti është instaluar!

Hapi 2. Ndërtimi i enës docker

Në hapin e dytë të punës sonë ne do të ndërtojmë docker dhe do të njohim brendësitë e tij.
Do të kalojmë në folderin rrënjë në lidhje me projektin retina-examples dhe do të ekzekutojmë

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

Ne po ndĂ«rtojmĂ« docker duke kaluar pĂ«rdoruesin aktual — kjo Ă«shtĂ« shumĂ« e dobishme nĂ«se do tĂ« shkruani diçka nĂ« VOLUME tĂ« montuar me tĂ« drejtat e pĂ«rdoruesit aktual, ndryshe do tĂ« jetĂ« root dhe e dhimbshme.

Ndërsa docker po ndërtohet, le të studiojmë 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"]

Si mund të shihet nga teksti, ne marrim të gjitha libraritë tona të preferuara, kompilojmë retinanet, shtojmë disa mjete bazë për lehtësimin e punës me Ubuntu dhe konfigurim të serverit openssh. Rreshti i parë është pikërisht trashëgimia e imazhit nvidia, për të cilin bëmë login në NGC Cloud dhe që përmban Pytorch1.3, TensorRT6.x.x.x dhe një sërë librarish të tjera që lejojnë kompilimin e burimeve cpp të detektorëve tanë.

Hapi 3. Nisja dhe debugimi i kontejnerit docker

Të kalojmë në rastin kryesor të përdorimit të kontejnerit dhe ambientit të zhvillimit, së pari do të nisnim nvidia docker. Të ekzekutojmë:

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

Tani kontejneri është i aksesueshëm përmes ssh @localhost. Pas nisjes me sukses, hapim projektin në PyCharm. Më pas hapim

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

Hapi 1
TensorRT 6.x.x.x — inferencĂ« me performancĂ« tĂ« lartĂ« pĂ«r modelet e mĂ«simit tĂ« thellĂ« (Object Detection dhe Segmentation)

Hapi 2
TensorRT 6.x.x.x — inferencĂ« me performancĂ« tĂ« lartĂ« pĂ«r modelet e mĂ«simit tĂ« thellĂ« (Object Detection dhe Segmentation)

Hapi 3
TensorRT 6.x.x.x — inferencĂ« me performancĂ« tĂ« lartĂ« pĂ«r modelet e mĂ«simit tĂ« thellĂ« (Object Detection dhe Segmentation)

Zgjidhim gjithçka si në screenshotet,

Interpreter -> /opt/conda/bin/python

— kjo do tĂ« jetĂ« ln nĂ« Python3.6 dhe

Sync folder -> /workspace/retinanet

Shtypim finish, presim indeksimin, dhe ça, ambienti Ă«shtĂ« gati pĂ«r t’u pĂ«rdorur!

E RËNDËSISHME!!! MenjĂ«herĂ« pas indeksimit, tĂ« nxjerrim nga docker skedarĂ«t e kompiluar pĂ«r Retinanet. NĂ« menunĂ« kontekstuale nĂ« rrĂ«njĂ«n e projektit do tĂ« zgjidhim opsionin

Deployment->Download

Do të shfaqet një skedari dhe dy mapa build, retinanet.egg-info dhe _Х.so

TensorRT 6.x.x.x — inferencĂ« me performancĂ« tĂ« lartĂ« pĂ«r modelet e mĂ«simit tĂ« thellĂ« (Object Detection dhe Segmentation)

Nëse projekti juaj duket kështu, atëherë ambienti sheh të gjitha skedarët e nevojshëm dhe ne jemi gati për trajnim të RetinaNet.

Hapi 4. Shënojmë të dhënat dhe trajnojmë detektorin

PĂ«r shĂ«nimin unĂ« zakonisht pĂ«rdor supervise.ly — njĂ« mjet i kĂ«ndshĂ«m dhe i lehtĂ« pĂ«r t'u pĂ«rdorur, nĂ« kohĂ«t e fundit kanĂ« rregulluar shumĂ« probleme dhe tani funksionon ndjeshĂ«m mĂ« mirĂ«.

Supozoni se keni shënuar datasetin dhe e keni shkarkuar, por nuk mund ta vendosni menjëherë atë në RetinaNet tonë, sepse është në formatin e tij dhe për këtë na nevojitet ta konvertojmë atë në COCO. Mjeti për konvertim ndodhet në:

markup_utils/supervisly_to_coco.py

Kujdes, se kategoria në skritp është shembuj dhe ju nevojitet të fusni tuajat (nuk duhet të shtoni kategorinë sfond)

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

Autorët e depozitës origjinale për një arsye ose tjetër vendosën se nuk do të trajnonit asgjë përveç COCO/VOC për detektimin, prandaj ishte e nevojshme të redaktohej pak skedari i burimit

retinanet/dataset.py

Dhe shtuar këtu augmentimet tona të preferuara albumentations.readthedocs.io/en/latest dhe të hiqni kategoritë e ngurta nga COCO. Gjithashtu, ka mundësi të prishni zona të mëdha të detektimit, nëse po kërkoni objekte të vogla në imazhe të mëdha, keni një dataset të vogël =), dhe nuk po funksionon asgjë, por për këtë do flasim ndonjëherë tjetër.

Në përgjithësi, cikli i train është gjithashtu i dobët, fillimisht nuk ruante checkpointet, përdorte një scheduler të tmerrshëm etj. Por tani ju ka mbetur vetëm të zgjidhni backbone-in dhe të kryeni.

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

me parametrat:

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

Në konsol do të shihni:

Përgatitja e modelit...
     model: RetinaNet
  shtyllë mbështetje: ResNet18FPN
   klasa: 2, ankorat: 9
Nivel optimizimi i zgjedhur O0: Trajnimi i pastër FP32.

Parazgjedhjet për këtë nivel optimizimi janë:
enabled                : E vërtetë
opt_level              : O0
cast_model_type        : torch.float32
patch_torch_functions  : False
keep_batchnorm_fp32    : Asnjë
master_weights         : False
loss_scale             : 1.0
Përpunimi i përjashtimeve të përdoruesit (kwargs shtesë që nuk janë None)...
Pasi të përpunohen përjashtimet, mundësitë e optimizimit janë:
enabled                : E vërtetë
opt_level              : O0
cast_model_type        : torch.float32
patch_torch_functions  : False
keep_batchnorm_fp32    : Asnjë
master_weights         : False
loss_scale             : 128.0
Përgatitja e dataset-it...
    ngarkues: pytorch
    rregullimi: [1024, 1280], max: 1280
    pajisja: 4 gpu
    grupi: 4, saktësia: e përzierë
Trajnimi i modelit për 20000 iteracione...
[    1/20000] humbja fokale: 0.95619, humbja e kutisë: 0.51584, 4.042s/4-grup (fw: 0.698s, bw: 0.459s), 1.0 im/s, lr: 0.0001
[   12/20000] humbja fokale: 0.76191, humbja e kutisë: 0.31794, 0.187s/4-grup (fw: 0.055s, bw: 0.133s), 21.4 im/s, lr: 0.0001
[   24/20000] humbja fokale: 0.65036, humbja e kutisë: 0.30269, 0.173s/4-grup (fw: 0.045s, bw: 0.128s), 23.1 im/s, lr: 0.0001
[   36/20000] humbja fokale: 0.46425, humbja e kutisë: 0.23141, 0.178s/4-grup (fw: 0.047s, bw: 0.131s), 22.4 im/s, lr: 0.0001
[   48/20000] humbja fokale: 0.45115, humbja e kutisë: 0.23505, 0.180s/4-grup (fw: 0.047s, bw: 0.133s), 22.2 im/s, lr: 0.0001
[   59/20000] humbja fokale: 0.38958, humbja e kutisë: 0.25373, 0.184s/4-grup (fw: 0.049s, bw: 0.134s), 21.8 im/s, lr: 0.0001
[   71/20000] humbja fokale: 0.37733, humbja e kutisë: 0.23988, 0.174s/4-grup (fw: 0.049s, bw: 0.125s), 22.9 im/s, lr: 0.0001
[   83/20000] humbja fokale: 0.39514, humbja e kutisë: 0.23878, 0.181s/4-grup (fw: 0.048s, bw: 0.133s), 22.1 im/s, lr: 0.0001
[   94/20000] humbja fokale: 0.39947, humbja e kutisë: 0.23817, 0.185s/4-grup (fw: 0.050s, bw: 0.134s), 21.6 im/s, lr: 0.0001
[  105/20000] humbja fokale: 0.37343, humbja e kutisë: 0.20238, 0.182s/4-grup (fw: 0.048s, bw: 0.134s), 22.0 im/s, lr: 0.0001
[  116/20000] humbja fokale: 0.19689, humbja e kutisë: 0.17371, 0.183s/4-grup (fw: 0.050s, bw: 0.132s), 21.8 im/s, lr: 0.0001
[  128/20000] humbja fokale: 0.20368, humbja e kutisë: 0.16538, 0.178s/4-grup (fw: 0.046s, bw: 0.131s), 22.5 im/s, lr: 0.0001
[  140/20000] humbja fokale: 0.22763, humbja e kutisë: 0.15772, 0.176s/4-grup (fw: 0.050s, bw: 0.126s), 22.7 im/s, lr: 0.0001
[  148/20000] humbja fokale: 0.21997, humbja e kutisë: 0.18400, 0.585s/4-grup (fw: 0.047s, bw: 0.144s), 6.8 im/s, lr: 0.0001
 Precision mesatare (AP) @[ IoU=0.50:0.95 | zona=   të gjithë | maxDets=100 ] = 0.52674
 Precision mesatare (AP) @[ IoU=0.50      | zona=   të gjithë | maxDets=100 ] = 0.91450
 Precision mesatare (AP) @[ IoU=0.75      | zona=   të gjithë | maxDets=100 ] = 0.35172
 Precision mesatare (AP) @[ IoU=0.50:0.95 | zona= e vogël | maxDets=100 ] = 0.61881
 Precision mesatare (AP) @[ IoU=0.50:0.95 | zona=mesatare | maxDets=100 ] = -1.00000
 Precision mesatare (AP) @[ IoU=0.50:0.95 | zona= e madhe | maxDets=100 ] = -1.00000
 Thirrja mesatare     (AR) @[ IoU=0.50:0.95 | zona=   të gjithë | maxDets=  1 ] = 0.58824
 Thirrja mesatare     (AR) @[ IoU=0.50:0.95 | zona=   të gjithë | maxDets= 10 ] = 0.61765
 Thirrja mesatare     (AR) @[ IoU=0.50:0.95 | zona=   të gjithë | maxDets=100 ] = 0.61765
 Thirrja mesatare     (AR) @[ IoU=0.50:0.95 | zona= e vogël | maxDets=100 ] = 0.61765
 Thirrja mesatare     (AR) @[ IoU=0.50:0.95 | zona=mesatare | maxDets=100 ] = -1.00000
 Thirrja mesatare     (AR) @[ IoU=0.50:0.95 | zona= e madhe | maxDets=100 ] = -1.00000
Ruajtja e modelit: 148

Për të studiuar të gjithë grupin e parameterëve shikoni

retinanet/main.py

Në përgjithësi, ato janë standarde për detektimin dhe kanë përshkrim. Aktivizoni trajnimin dhe prisni rezultatet. Një shembull të inferencës mund ta shihni në:

retinanet/infer_example.py

ose ekzekutoni komandën:

/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

Në repository tashmë është e integruar Focal Loss dhe disa backbone, si dhe lehtë mund të shtohen të tuat.

retinanet/backbones/*.py

Në tabelë autorët japin disa karakteristika:

TensorRT 6.x.x.x — inferencĂ« me performancĂ« tĂ« lartĂ« pĂ«r modelet e mĂ«simit tĂ« thellĂ« (Object Detection dhe Segmentation)

Gjithashtu, ka backbone ResNeXt50_32x4dFPN dhe ResNeXt101_32x8dFPN, të marrë nga torchvision.
Shpresoj se kemi zbërthyer disi detekimin, por është thelbësore të lexoni dokumentacionin zyrtar për të kuptuar modalitetet e eksportit dhe regjistrimit.

Hapi 5. Eksporti dhe inferenca e modeleve Unet me enkodues Resnet

Si ndoshta keni vënë re, në Dockerfile ishin instaluar bibliotekat për segmentimin dhe veçanërisht biblioteka e shkëlqyer github.com/qubvel/segmentation_models.pytorch. Në paketën unet mund të gjeni shembuj të inferencës dhe eksportit të kontrolleve pytorch në engine TensorRT.

Problemi kryesor gjatë eksportit të modeleve Unet-like nga ONNX në TensoRT është nevoja për të caktuar një madhësi fikse Upsample ose për të përdorur ConvTranspose2D:

import torch.onnx.symbolic_opset9 si onnx_symbolic
        def upsample_nearest2d(g, input, output_size):
            # Aktualisht, TRT 5.1/6.0 ONNX Parser nuk mbështet të gjitha operacionet ONNX
            # që nevojiten për të mbështetur formulimin dinamik të upsampling
            # Këtu e kemi hardkoduar shkallën=2 si një zgjidhje përkohësore
            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

Me këtë transformim mund ta bëni këtë automatikisht gjatë eksportit në ONNX, por në versionin 7 të TensorRT këtë problem e zgjidhën, dhe na mbetet të presim pak.

Përfundim

Kur fillova të përdor docker, kisha dyshime për performancën e tij për detyrat e mia. Në një nga agregatët e mi tani ka një trafik të madh rrjeti i shkaktuar nga disa kamera.

TensorRT 6.x.x.x — inferencĂ« me performancĂ« tĂ« lartĂ« pĂ«r modelet e mĂ«simit tĂ« thellĂ« (Object Detection dhe Segmentation)

Testet e ndryshme në hapësirat e internetit flisnin për një overhead relativisht të lartë në ndërveprimin në rrjet dhe shënimin në VOLUME, plus gjithashtu GIL-in e panjohur dhe frikshëm, dhe duke qenë se shkrepja e kadrave, funksionimi i driver-it dhe transmetimi i kadrave në rrjet janë operacione atomike në modalitetin hard real-time, vonesat në rrjet për mua janë shumë kritike.

Por gjithçka doli mirë =)

P.S. Duhet të shtoni ciklin tuaj të preferuar të trajnimit për segmentimin dhe në prodhim!

Faleminderit

Faleminderit komunitetit ods.ai, pa të nuk është e mundur të zhvillohem! Një falënderim i madh n01z3, i cili më inkurajoi të merrem me DL, për këshillat e tij të çmuara dhe profesionalizmin e jashtëzakonshëm!

Përdorni modele të optimizuara në prodhim!

TensorRT 6.x.x.x — inferencĂ« me performancĂ« tĂ« lartĂ« pĂ«r modelet e mĂ«simit tĂ« thellĂ« (Object Detection dhe Segmentation) Aurorai, llc

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster