TensorRT 6.x.x.x — yüksək performanslı infersiya dərin öyrənmə modelləri üçün (Obyekt Tanıma və Seqmentasiya)

TensorRT 6.x.x.x — yüksək performanslı infersiya dərin öyrənmə modelləri üçün (Obyekt Tanıma və Seqmentasiya)
İlk dəfə yalnız ağrılıdır!

Hər kəsə salam! Əziz dostlar, bu məqalədə TensorRT, RetinaNet istifadə etmə təcrübəmi bölüşmək istəyirəm github.com/aidonchuk/retinanet-examples (bu, nvidiatərəfindən rəsmi repodan forkdur, bu da optimallaşdırılmış modelləri qısa müddətdə istehsala daxil etməyə imkan tanıyacaq). Cəmiyyət kanallarında mesajları sürətləndirdikcə ods.aisayəsində TensorRT istifadəsi ilə bağlı suallarla rastlaşıram və əksər suallar təkrar olunur, buna görə də mümkün qədər ətraflı TensorRT, RetinaNet, Unet və docker-a əsaslanan sürətli infersiya istifadə etməklə bağlı bir rəhbərlik yazmağa qərar verdim.

Tapşırığın təsviri

Tapşırığı belə qoymağı təklif edirəm: bizə dataset-ləri işarələmək, Pytorch1.3+ üzərində RetinaNet/Unet şəbəkəsini öyrətmək, əldə edilmiş çəkiləri ONNX formatına çevirmək, daha sonra bunları TensorRT engine-ə çevirmək və bütün bunları docker-da icra etmək lazımdır, üstünlük olaraq Ubuntu 18-də və çoxluqla ARM(Jetson)* arxitekturasında, beləliklə, mühiti əl ilə qurmağı minimuma endirə bilək. Nəticə olaraq, RetinaNet/Unet-i ixrac etməyə və öyrətməyə hazır konteynerə sahib olacağıq, eləcə də tam inkişaf və təsnifat, seqmentasiya öyrənilməsi üçün lazım olan bütün bağlantılarla.

1-ci mərhələ. Mühitin hazırlanması

Burada əhəmiyyətli olan bir şey var ki, son dövrlərdə desktop maşınında hər hansı kitabxanaların istifadə edilməsindən və qurulmasından tamamilə uzaqlaşmışam, həmçinin devbox-da. Yeganə yaradılması və quraşdırılması lazım olan şey — python virtual environment və cuda 10.2-dir (nvidia-nın yalnız bir drayveri ilə kifayətlənmək olar) deb-dən.

Təsəvvür edək ki, sizin yeni quraşdırılmış Ubuntu 18 var. cuda 10.2-ni (deb) quraşdıraq, quraşdırma prosesinə detallı nəzər salmayacağam, rəsmi sənədləri kifayət qədər əhatəlidir.

İndi docker-i quraşdırırıq, docker-in quraşdırılması üzrə rəhbərlik asanlıqla tapıla bilər, budur nümunə www.digitalocean.com/community/tutorials/docker-ubuntu-18-04-1-ru, artıq 19+ versiya mövcuddur — quraşdırırıq. Unutmayın ki, docker-i sudo olmadan istifadə etməyə imkan tanımaq daha rahat olacaq. Hər şey düzgün olduqdan sonra, belə edirik:

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 repoya baxmağa ehtiyac yoxdur github.com/NVIDIA/nvidia-docker.

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

Yalnız bir az qaldı, docker-i nvidia görüntüsü ilə istifadə etməyə başlamaq üçün NGC Cloud-da qeydiyyatdan keçməli və daxil olmalıyıq. Buraya gedirik ngc.nvidia.com, qeydiyyatdan keçiririk və NGC Cloud-a daxil olduqdan sonra ekranın sol üst küncündə SETUP-a basırıq və ya bu keçidə keçirik ngc.nvidia.com/setup/api-keyDüyməni «açar yarat» seçirik. Onu saxlamağı tövsiyə edirəm, əks halda növbəti dəfə ziyarət edərkən onu yenidən yaratmalı olacaqsınız və yeni cihazda bununla bağlı əməliyyatı təkrarlamalısınız.

İcraya keçirik:

docker login nvcr.io
İstifadəçi adı: $oauthtoken
Şifrə:  - yaradılmış açar

İstifadəçi adını sadəcə kopyalayırıq. Beləliklə, ortam artıq yaradılmışdır!

2-ci mərhələ. Docker konteynerinin yığılması

İşimizin ikinci mərhələsində docker yığacağıq və onun daxili strukturu ilə tanış olacağıq.
retina-nümunələri layihəsi ilə bağlı kök qovluğuna keçək və icra edək

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 cari istifadəçini ötürərək yığırıq — bu, montaj olunmuş VOLUME-da cari istifadəçi hüquqları ilə yazmağı planlaşdırdığınızda çox faydalıdır, əks halda root hüquqları olacaq və çətinlik yaranacaq.

Docker yığılarkən, gəlin Dockerfile-ı araşdıraq:

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 görünür ki, sevdiyimiz bütün kitabxanaları alırıq, retinanet-i tərtib edirik, Ubuntu ilə işləmək üçün əsas alətləri əlavə edirik və openssh serverini konfiqurasiya edirik. Birinci sətrin üstündə nvidia obrazının miras alınması ilə bağlıdır, NGC Cloud-da giriş etdiyimiz və Pytorch1.3, TensorRT6.x.x.x və cpp qaynaqlarımızı tərtib etməyə imkan verən çox sayda kitabxana ehtiva edən bir obrazdır.

3-cü mərhələ. Docker konteynerinin işə salınması və debuq edilməsi

Konteyner və inkişaf mühitinin əsas istifadəsinə keçirik, əvvəlcə nvidia docker işə salaq. İcra edirik:

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

İndi konteyner ssh @localhost vasitəsilə əldə edilir. Müvəffəqiyyətlə işə salındıqdan sonra, layihəni PyCharm-da açırıq. Sonra açırıq

Ayarlar->Layihə Tətbiqi->Əlavə->Ssh Tətbiqi

Addım 1
TensorRT 6.x.x.x — yüksək performanslı infersiya dərin öyrənmə modelləri üçün (Obyekt Tanıma və Seqmentasiya)

Addım 2
TensorRT 6.x.x.x — yüksək performanslı infersiya dərin öyrənmə modelləri üçün (Obyekt Tanıma və Seqmentasiya)

Addım 3
TensorRT 6.x.x.x — yüksək performanslı infersiya dərin öyrənmə modelləri üçün (Obyekt Tanıma və Seqmentasiya)

Ekrandakı şəkillərdə olduğu kimi hər şeyi seçirik,

Tərcüməçi -> /opt/conda/bin/python

— bu Python3.6-da ln olacaq və

Sinxronizasiya qovluğu -> /workspace/retinanet

Finiş düyməsini basırıq, indekslənməni gözləyirik, və bununla da mühit istifadəyə hazırdır!

VACİB!!! İndeksləndikdən dərhal sonra docker-dan Retinanet üçün tərtib edilmiş faylları çəkmək lazımdır. Layihənin kökündə kontekst menyusundan seçəcəyik

Deployment->Download

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

TensorRT 6.x.x.x — yüksək performanslı infersiya dərin öyrənmə modelləri üçün (Obyekt Tanıma və Seqmentasiya)

Layihəniz belə görünürsə, deməli mühit bütün lazım olan faylları görür və biz RetinaNet-in öyrənilməsinə hazırıq.

4-cü mərhələ. Veriləri işarələyirik və detector-u öyrənirik

İşarələmə üçün əsasən istifadə etdiyim supervise.ly — xoş və rahat bir alətdir, son dövrlərdə çox sayda səhvləri düzəltdilər və daha yaxşı işləməyə başladı.

Tutaq ki, siz dataset-i işarələdiniz və onu yüklədiniz, lakin dərhal onu RetinaNet-ə yerləşdirmək mümkün olmayacaq, çünki o, öz formatındadır və bunu COCO-ya çevirmək lazım olacaq. Çevirici alət burada yerləşir:

markup_utils/supervisly_to_coco.py

Qeyd edin ki, skriptdə kateqoriya nümunədir və siz öz kateqoriyalarınızı daxil etməlisiniz (background kateqoriyasını əlavə etməyə ehtiyac yoxdur)

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

Mənbə repozitoriyanın müəllifləri nədənsə düşündülər ki, yalnız COCO/VOC üçün öyrənəcəksiniz, buna görə də mən əvvəldən faylı bir az redaktə etməli oldum

retinanet/dataset.py

Burada sevdiyimiz artırmaları əlavə etdik albumentations.readthedocs.io/en/latest və COCO-dan sərt bir şəkildə daxili kateqoriyaları çıxartdım. Əgər böyük şəkillərdə kiçik obyektləri axtarırsınızsa, böyük detektiya sahələrini kəsə bilərsiniz, kiçik bir dataset-iniz var =), və heç nə işləmir, lakin bunun haqqında başqa bir dəfə danışacağıq.

Ümumiyyətlə train loop da zəif idi, əvvəllər nə çeki saxlayırdı, nə də hansısa qorxunc cədvəl istifadə edirdi. Amma indi sizə yalnız backbone seçmək və yerinə yetirmək qalır

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

parametrlərlə:

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 bunu görəcəksiniz:

Model qurulması...
     model: RetinaNet
  backbone: ResNet18FPN
   classes: 2, anchors: 9
Seçilmiş optimallaşdırma səviyyəsi O0:  Saf FP32 təlimi.

Bu optimallaşdırma səviyyəsi üçün standartlar:
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
İstifadəçi əlavələrini (None olmayan əlavə kwargs) emal edir...
Əlavələri emal etdikdən sonra optimallaşdırma seçimləri:
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
Dataset hazırlanır...
    loader: pytorch
    resize: [1024, 1280], max: 1280
    cihaz: 4 gpu
    batch: 4, dəqiqlik: mixed
Model 20000 iterasiya üçün təlim edilir...
[    1/20000] fokal itki: 0.95619, qutu itkisi: 0.51584, 4-batch üçün 4.042s (fw: 0.698s, bw: 0.459s), 1.0 im/s, lr: 0.0001
[   12/20000] fokal itki: 0.76191, qutu itkisi: 0.31794, 0.187s/4-batch (fw: 0.055s, bw: 0.133s), 21.4 im/s, lr: 0.0001
[   24/20000] fokal itki: 0.65036, qutu itkisi: 0.30269, 0.173s/4-batch (fw: 0.045s, bw: 0.128s), 23.1 im/s, lr: 0.0001
[   36/20000] fokal itki: 0.46425, qutu itkisi: 0.23141, 0.178s/4-batch (fw: 0.047s, bw: 0.131s), 22.4 im/s, lr: 0.0001
[   48/20000] fokal itki: 0.45115, qutu itkisi: 0.23505, 0.180s/4-batch (fw: 0.047s, bw: 0.133s), 22.2 im/s, lr: 0.0001
[   59/20000] fokal itki: 0.38958, qutu itkisi: 0.25373, 0.184s/4-batch (fw: 0.049s, bw: 0.134s), 21.8 im/s, lr: 0.0001
[   71/20000] fokal itki: 0.37733, qutu itkisi: 0.23988, 0.174s/4-batch (fw: 0.049s, bw: 0.125s), 22.9 im/s, lr: 0.0001
[   83/20000] fokal itki: 0.39514, qutu itkisi: 0.23878, 0.181s/4-batch (fw: 0.048s, bw: 0.133s), 22.1 im/s, lr: 0.0001
[   94/20000] fokal itki: 0.39947, qutu itkisi: 0.23817, 0.185s/4-batch (fw: 0.050s, bw: 0.134s), 21.6 im/s, lr: 0.0001
[  105/20000] fokal itki: 0.37343, qutu itkisi: 0.20238, 0.182s/4-batch (fw: 0.048s, bw: 0.134s), 22.0 im/s, lr: 0.0001
[  116/20000] fokal itki: 0.19689, qutu itkisi: 0.17371, 0.183s/4-batch (fw: 0.050s, bw: 0.132s), 21.8 im/s, lr: 0.0001
[  128/20000] fokal itki: 0.20368, qutu itkisi: 0.16538, 0.178s/4-batch (fw: 0.046s, bw: 0.131s), 22.5 im/s, lr: 0.0001
[  140/20000] fokal itki: 0.22763, qutu itkisi: 0.15772, 0.176s/4-batch (fw: 0.050s, bw: 0.126s), 22.7 im/s, lr: 0.0001
[  148/20000] fokal itki: 0.21997, qutu itkisi: 0.18400, 0.585s/4-batch (fw: 0.047s, bw: 0.144s), 6.8 im/s, lr: 0.0001
 Orta Dəqiqlik (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.52674
 Orta Dəqiqlik (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.91450
 Orta Dəqiqlik (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.35172
 Orta Dəqiqlik (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.61881
 Orta Dəqiqlik (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.00000
 Orta Dəqiqlik (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = -1.00000
 Orta Recall (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.58824
 Orta Recall (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.61765
 Orta Recall (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.61765
 Orta Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.61765
 Orta Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.00000
 Orta Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = -1.00000
Model saxlanır: 148

Bütün parametr dəstini öyrənmək üçün buraya baxın

retinanet/main.py

Ümumilikdə bunlar standartdır, və onların təsviri var. Təlimi başladın və nəticələri gözlə. İnferens misalını burada görə bilərsiniz:

retinanet/infer_example.py

və ya aşağıdakı əmri yerinə yetirin:

/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

Depozitorun daxilində artıq Focal Loss və bir neçə backbone var, eyni zamanda özlərinə də asanlıqla əlavə edilə bilər

retinanet/backbones/*.py

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

TensorRT 6.x.x.x — yüksək performanslı infersiya dərin öyrənmə modelləri üçün (Obyekt Tanıma və Seqmentasiya)

Həmçinin, ResNeXt50_32x4dFPN və torchvision'dan götürülmüş ResNeXt101_32x8dFPN backbone var.
Ümid edirəm ki, deteksiyaya bir az aydınlıq gətirdik, lakin rəsmi sənədi mütləq oxumaq lazımdır ki, ixrac və loglama rejimlərini başa düşəsiniz.

5-ci mərhələ. Resnet encodera ilə Unet modellərinin ixracı və inferens

Bəlkə də diqqət yetirdiniz, Dockerfile-da seqmentləşmə üçün kitabxanalar quraşdırılıb, xüsusən də möhtəşəm bir lib github.com/qubvel/segmentation_models.pytorch. Unet paketində, PyTorch checkpoint-larının TensorRT-yə ixracı və infirens üçün nümunələr tapa bilərsiniz.

ONNX-dən TensoRT-ə Unet-tipli modellərin ixracı zamanı əsas problem Upsample üçün sabit ölçü təyin etmək və ya ConvTranspose2D-dən istifadə etmək zərurətidir:

import torch.onnx.symbolic_opset9 as onnx_symbolic
        def upsample_nearest2d(g, input, output_size):
            # Hal-hazırda, TRT 5.1/6.0 ONNX Parser bütün ONNX əməliyyatlarını dəstəkləmir
            # dinamik upsampling-i dəstəkləmək üçün lazım olan
            # Burada müvəqqəti həll olaraq ölçüləri 2 olaraq sərt kodlaşdırırıq
            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

Bu çevirmə vasitəsilə bunu avtomatik edə bilərsiniz, lakin TensorRT-nin 7-ci versiyasında bu problemi həll etdilər, az bir müddət gözləməliyik.

Nəticə

Docker istifadə etməyə başladığımda, onun mənim vəzifələrim üçün performansı ilə bağlı şübhələrim var idi. Hazırda biri çox sayda kamera tərəfindən yaradılan böyük şəbəkə trafiği olan bir agregatım var.

TensorRT 6.x.x.x — yüksək performanslı infersiya dərin öyrənmə modelləri üçün (Obyekt Tanıma və Seqmentasiya)

İnternetdə müxtəlif testlər şəbəkə qarşılıqlı əlaqəsi və VOLUME-a yazma üzərində nisbətən böyük bir əlavə yük olduğunu demişdi, üstəlik məlum olmayan və qorxulu GIL, çünki kadr çəkilişi, sürücünün işi və kadrın şəbəkə vasitəsilə ötürülməsi bir atomik əməliyyatdır hard real-time, şəbəkədəki gecikmələr mənim üçün çox kritikdir.

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

P.S. İndi seqmentləşmə üçün sevdiyiniz təlim dövrünü əlavə etməyi unutmayın və istehsalata göndərin!

Təşəkkürlər

İcma üçün ods.ai, onsuz inkişaf etmək mümkün deyil! Çox sağ olun n01z3, məni DL ilə məşğul olmağa sövq etdiyi üçün, onun dəyərli məsləhətləri və əvəzedilməz peşəkarlığı üçün!

Texnologiyanın istehsalında optimallaşdırılmış modellərdən istifadə edin!

TensorRT 6.x.x.x — yüksək performanslı infersiya dərin öyrənmə modelləri üçün (Obyekt Tanıma və Seqmentasiya) Aurorai, llc

Mənbə: habr.com

DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər 🔥 DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər | ProHoster