TensorRT 6.xxx — Dərin Öyrənmə Modelləri üçün Yüksək Performanslı Nəticə (Obyektin Aşkarlanması və Seqmentasiyası)

TensorRT 6.xxx — Dərin Öyrənmə Modelləri üçün Yüksək Performanslı Nəticə (Obyektin Aşkarlanması və Seqmentasiyası)
Yalnız ilk dəfə ağrıyır!

Hamıya salam! Hörmətli dostlar, bu məqalədə mən anbar əsasında TensorRT və RetinaNet istifadə təcrübəmi bölüşmək istəyirəm. github.com/aidonchuk/retinanet-examples (bu, rəsmi repo çəngəlidir NVIDIA, bu, optimallaşdırılmış modellərdən ən qısa müddətdə istehsalda istifadə etməyə başlamağa imkan verəcək). İcma kanallarında mesajlar arasında sürüşdürün ods.aiTensorRT-dən istifadə ilə bağlı suallar alıram və onlar əsasən özlərini təkrarlayırlar, ona görə də yazmaq qərarına gəldim mümkün qədər tam TensorRT, RetinaNet, Unet və Docker əsasında sürətli nəticə çıxarmaq üçün bələdçi.

Tapşırıqın təsviri

Tapşırığı bu şəkildə formalaşdırmağı təklif edirəm: verilənlər dəstini etiketləməli, RetinaNet/Unet şəbəkəsini Pytorch 1.3+ üzərində öyrətməli, əldə edilən çəkiləri ONNX-ə çevirməli, sonra onları TensorRT mühərrikinə çevirməli və bütün prosesi Docker-də, tercihen Ubuntu 18 və ARM (Jetson)* arxitekturasında çox arzuolunandır, beləliklə mühitin əl ilə yerləşdirilməsini minimuma endirir. Son nəticə yalnız RetinaNet/Unet-i ixrac etmək və təlim etmək üçün deyil, həm də bütün lazımi avadanlıqlarla birlikdə təsnifat və seqmentasiya sistemlərinin tam inkişafı və təlimi üçün hazır bir konteyner olacaq.

Mərhələ 1. Ətraf mühitin hazırlanması

Qeyd etmək vacibdir ki, bu yaxınlarda mən masaüstü kompüterimdə, eləcə də DevBox-da hər hansı kitabxanaların istifadəsini və yerləşdirilməsindən tamamilə imtina etmişəm. Yaratmalı və quraşdırmalı olduğum yeganə şeylər Python virtual mühiti və deb paketindən Cuda 10.2 (və ya sadəcə NVIDIA sürücüsüdür).

Tutaq ki, təzə quraşdırmısınız Ubuntu 18. Gəlin cuda 10.2 (deb) versiyasını quraşdıraq. Quraşdırma prosesi haqqında ətraflı məlumat verməyəcəyəm, rəsmi sənədlər kifayətdir.

İndi docker quraşdıraq, docker quraşdırma təlimatını asanlıqla tapmaq olar, burada bir nümunə var www.digitalocean.com/community/tutorials/docker-ubuntu-18-04-1-ruVersiya 19+ artıq mövcuddur – gəlin onu quraşdıraq. Docker-dən sudo olmadan istifadə etmək imkanını aktivləşdirməyi unutmayın; daha rahat olar. Hər şey qurulduqdan sonra aşağıdakıları edin:

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

Və hətta rəsmi depoya baxmaq lazım deyil. github.com/NVIDIA/nvidia-docker.

İndi biz git clone edirik github.com/aidonchuk/retinanet-examples.

Getmək üçün bir az daha. Docker-dən Nvidia şəkli ilə istifadə etməyə başlamaq üçün NGC Cloud-da qeydiyyatdan keçməli və daxil olmalıyıq. Bura daxil olun. ngc.nvidia.com, qeydiyyatdan keçin və NGC Cloud-a daxil olduqdan sonra ekranın yuxarı sol küncündə SETUP üzərinə klikləyin və ya bu linki izləyin ngc.nvidia.com/setup/api-key"Açar yarat" düyməsini basın. Mən onu yadda saxlamağı məsləhət görürəm, əks halda növbəti dəfə ziyarət etdiyiniz zaman onu bərpa etməli olacaqsınız və buna görə də yeni avtomobilə yerləşdirərkən bu prosesi təkrarlamalı olacaqsınız.

edək:

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

Sadəcə istifadəçi adını kopyalayın. Baxın, ətraf mühitin yerləşdirildiyini düşünün!

Addım 2: Docker Konteynerinin qurulması

İşimizin ikinci mərhələsində biz Docker-i quracağıq və onun daxili hissələri ilə tanış olacağıq.
Retina-examples layihəsinə nisbətən kök qovluğa keçək və işə başlayaq

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

Biz Docker-i ona cari istifadəçini ötürməklə qururuq—bu, cari istifadəçinin hüquqları ilə quraşdırılmış VOLUME-a nəsə yazmaq fikrindəsinizsə, bu çox faydalıdır, əks halda köklənməli olacaqsınız və əziyyət çəkəcəksiniz.

Docker qurarkən, gəlin Docker faylını nəzərdən keçirək:

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"]

Mətndən də göründüyü kimi, bütün sevimli kitabxanalarımızı götürürük, retinanet-i tərtib edirik və işləmək rahatlığı üçün bəzi əsas alətləri əlavə edirik. Ubuntu və OpenSSH serverini konfiqurasiya edin. Birinci sətir, NGC Cloud girişini yaratdığımız və Pytorch1.3, TensorRT6.xxx və detektorumuz üçün CPP mənbə kodunu tərtib etməyə imkan verən bir sıra digər kitabxanaları ehtiva edən NVIDIA görüntüsünü miras alır.

Addım 3: Docker Konteynerinin işə salınması və sazlanması

Konteyner və inkişaf mühitinin əsas istifadə vəziyyətinə keçək. Əvvəlcə Nvidia Docker proqramını işə salaq. Qaçış:

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

Konteynerə indi ssh vasitəsilə daxil olmaq mümkündür. @localhost. Uğurlu işə salındıqdan sonra layihəni PyCharm-da açın. Sonra, açın

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

1 addım
TensorRT 6.xxx — Dərin Öyrənmə Modelləri üçün Yüksək Performanslı Nəticə (Obyektin Aşkarlanması və Seqmentasiyası)

2 addım
TensorRT 6.xxx — Dərin Öyrənmə Modelləri üçün Yüksək Performanslı Nəticə (Obyektin Aşkarlanması və Seqmentasiyası)

3 addım
TensorRT 6.xxx — Dərin Öyrənmə Modelləri üçün Yüksək Performanslı Nəticə (Obyektin Aşkarlanması və Seqmentasiyası)

Ekran görüntülərində olduğu kimi hər şeyi seçirik,

Interpreter -> /opt/conda/bin/python

— Python3.6-da ln olacaq və

Sync folder -> /workspace/retinanet

Bitir düyməsini basın, indeksləşdirməni gözləyin və budur, mühit istifadəyə hazırdır!

Vacib !!! İndeksləmədən dərhal sonra Retinanet üçün tərtib edilmiş faylları Docker-dən çəkin. Layihənin kökündəki kontekst menyusundan [Retinanet] seçin.

Deployment->Download

Bir fayl və iki qovluq görünəcək: build, retinanet.egg-info və _С.so

TensorRT 6.xxx — Dərin Öyrənmə Modelləri üçün Yüksək Performanslı Nəticə (Obyektin Aşkarlanması və Seqmentasiyası)

Əgər layihəniz belə görünürsə, o zaman mühit bütün lazımi faylları görür və biz RetinaNet-i öyrətməyə hazırıq.

Addım 4. Məlumatları etiketləyin və detektoru məşq edin

İşarələmə üçün mən əsasən istifadə edirəm supervise.ly — gözəl və rahat alət; Bu yaxınlarda bir sıra səhvlər düzəldildi və o, özünü əhəmiyyətli dərəcədə yaxşılaşdırmağa başladı.

Tutaq ki, siz verilənlər bazasını qeyd edib onu endirmisiniz, lakin siz onu birbaşa RetinaNet-ə yükləyə bilməzsiniz, çünki o, mülkiyyət formatındadır. Bunun üçün onu COCO-ya çevirməliyik. Dönüşüm aləti burada yerləşir:

markup_utils/supervisly_to_coco.py

Nəzərə alın ki, skriptdəki Kateqoriya nümunədir və siz öz kateqoriyanızı daxil etməlisiniz (fon kateqoriyasını əlavə etməyə ehtiyac yoxdur)

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

Orijinal deponun müəllifləri nədənsə aşkar etmək üçün COCO/VOC-dan başqa bir şey öyrətməyəcəyinizə qərar verdilər, ona görə də mənbə faylını bir az redaktə etməli oldum.

retinanet/dataset.py

Sevimli artırmalarınızı buraya əlavə edin albumentations.readthedocs.io/en/latest Və COCO-dan sərt kodlu kateqoriyaları silin. Böyük təsvirlərdə kiçik obyektlər axtarırsınızsa, kiçik məlumat dəstinə sahibsinizsə və heç bir şey işləmirsə, ancaq başqa vaxt daha çox işləmirsinizsə, böyük aşkarlama sahələrini kəsmək də mümkündür.

Ümumiyyətlə, qatar döngəsi də zəifdir, ilkin olaraq yoxlama məntəqələrini saxlamadı, hansısa dəhşətli planlaşdırıcıdan istifadə etdi və s. Amma indi sizə lazım olan tək şey onurğa sütununu seçmək və yerinə yetirməkdir.

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

parametrləri ilə:

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

Konsolda siz görəcəksiniz:

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

Parametrlərin tam spektrini araşdırmaq üçün nəzər yetirin

retinanet/main.py

Ümumiyyətlə, onlar aşkarlama üçün standartdır və onların təsviri var. Məşq edin və nəticələri gözləyin. Nəticə nümunəsini burada görə bilərsiniz:

retinanet/infer_example.py

və ya əmri işlədin:

/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

Repozitoriyada artıq Focal Loss və quraşdırılmış bir neçə onurğa sütunu var və özünüzü əlavə etmək də asandır

retinanet/backbones/*.py

Cədvəldə müəlliflər bəzi xüsusiyyətləri təqdim edirlər:

TensorRT 6.xxx — Dərin Öyrənmə Modelləri üçün Yüksək Performanslı Nəticə (Obyektin Aşkarlanması və Seqmentasiyası)

Torchvision-dan götürülmüş ResNeXt50_32x4dFPN və ResNeXt101_32x8dFPN onurğa sütunu da var.
Ümid edirəm ki, biz aşkarlamanı bir az anladıq, lakin siz mütləq rəsmi sənədləri oxumalısınız ixrac və giriş rejimlərini başa düşmək.

Addım 5. Resnet kodlayıcısı ilə Unet modellərinin ixracı və nəticə çıxarması

Diqqət etdiyiniz kimi, Dockerfile seqmentləşdirmə üçün kitabxanalar, xüsusən də gözəl lib. github.com/qubvel/segmentation_models.pytorchUnet paketində nəticə çıxarmaq və PyTorch yoxlama nöqtələrini TensorRT mühərrikinə ixrac etmək nümunələri var.

Unet-ə bənzər modelləri ONNX-dən TensoRT-ə ixrac edərkən əsas problem sabit Upsample ölçüsünü təyin etmək və ya ConvTranspose2D-dən istifadə etmək ehtiyacıdır:

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

ONNX-ə ixrac edərkən bu çevrilmə avtomatik həyata keçirilə bilər, lakin bu problem TensorRT-nin 7-ci versiyasında artıq həll olunub və bizim yalnız qısa bir gözləməmiz qalıb.

Nəticə

Docker-dən istifadə etməyə başlayanda onun vəzifələrim üçün performansına şübhə edirdim. Mənim bölmələrimdən biri hazırda bir neçə kamera tərəfindən yaradılan kifayət qədər çox şəbəkə trafikinə malikdir.

TensorRT 6.xxx — Dərin Öyrənmə Modelləri üçün Yüksək Performanslı Nəticə (Obyektin Aşkarlanması və Seqmentasiyası)

İnternetdəki müxtəlif testlər şəbəkənin qarşılıqlı əlaqəsi və VOLUME-də qeyd üçün nisbətən böyük yükü, üstəlik naməlum və qorxulu GIL-i göstərdi və çərçivəni çəkdiyindən, sürücünün işləməsi və şəbəkə üzərindən kadr ötürülməsi rejimdə atom əməliyyatlarıdır. çətin real vaxt, şəbəkə gecikmələri mənim üçün çox vacibdir.

Amma hər şey yaxşı oldu =)

P.S. Qalan yalnız seqmentasiya və istehsal üçün sevimli qatar döngənizi əlavə etməkdir!

təşəkkürlər

Camaata təşəkkürlər ods.ai, onsuz inkişaf etmək mümkün deyil! çox sağ olun. n01z3Məni DL ilə məşğul olmağa ruhlandıran, əvəzsiz məsləhətlərinə və qeyri-adi peşəkarlığına görə!

İstehsalda optimallaşdırılmış modellərdən istifadə edin!

TensorRT 6.xxx — Dərin Öyrənmə Modelləri üçün Yüksək Performanslı Nəticə (Obyektin Aşkarlanması və Seqmentasiyası) Aurorai, MMC

Mənbə: www.habr.com

DDoS mühafizəsi, VPS VDS serverləri olan saytlar üçün etibarlı hostinq alın 🔥 DDoS qorunması, VPS VDS serverləri ilə etibarlı veb sayt hostinqi alın | ProHoster