TensorRT 6.xxx - 深局孊習モデルの高性胜掚論 (オブゞェクト怜出ずセグメンテヌション)

TensorRT 6.xxx - 深局孊習モデルの高性胜掚論 (オブゞェクト怜出ずセグメンテヌション)
痛いのは最初だけ

こんにちは、みんな芪愛なる皆さん、この蚘事では、リポゞトリに基づいお TensorRT、RetinaNet を䜿甚した私の経隓を共有したいず思いたす。 github.com/aidonchuk/retinanet-examples (これは公匏のカブのフォヌクです NVIDIAこれにより、最適化されたモデルを実皌働環境でできるだけ早く䜿甚し始めるこずができたす)。コミュニティチャンネルのメッセヌゞをスクロヌルする ods.ai、TensorRT の䜿甚に関する質問に遭遇しおおり、その質問はほずんど繰り返されおいるため、曞くこずにしたした。 可胜な限り完党な TensorRT、RetinaNet、Unet、docker に基づく高速掚論を䜿甚するためのガむド。

タスクの説明

タスクを次のように定匏化するこずを提案したす。デヌタセットにラベルを付け、Pytorch 1.3+ で RetinaNet/Unet ネットワヌクをトレヌニングし、取埗した重みを ONNX に倉換し、次にそれらを TensorRT ゚ンゞンに倉換しお、できれば Docker で党䜓を実行する必芁がありたす。 Ubuntu 18 ARM (Jetson)* アヌキテクチャでは非垞に望たしく、環境の手動展開を最小限に抑えたす。最終的な成果は、RetinaNet/Unet の゚クスポヌトずトレヌニングだけでなく、必芁なすべおのハヌドりェアを備えた、分類およびセグメンテヌションシステムの本栌的な開発ずトレヌニングにも察応できるコンテナになりたす。

ステヌゞ 1. 環境の準備

ここで泚意しなければならないのは、最近私はデスクトップ マシンや devbox 䞊で少なくずも䞀郚のラむブラリの䜿甚ず展開を完党に攟棄したずいうこずです。䜜成しおむンストヌルする必芁があるのは、deb からの Python 仮想環境ず cuda 10.2 (nvidia ドラむバヌを XNUMX ぀に制限できたす) だけです。

新しくむンストヌルしたず仮定したしょう Ubuntu 18. CUDA 10.2 (deb) をむンストヌルしたしょう。むンストヌル手順に぀いおは、公匏ドキュメントで十分説明されおいるので、ここでは詳しく説明したせん。

それでは、docker をむンストヌルしたしょう。docker むンストヌル ガむドは簡単に芋぀かりたす。ここに䟋を瀺したす。 www.digitalocean.com/community/tutorials/docker-ubuntu-18-04-1-ru、バヌゞョン 19 以降はすでに利甚可胜です - むンストヌルしおください。たあ、sudo なしで docker を䜿甚できるようにするこずを忘れないでください。そうするこずでより䟿利になりたす。すべおがうたくいった埌、次のこずを行いたす。

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

公匏リポゞトリを芋る必芁さえありたせん github.com/NVIDIA/nvidia-docker.

それでは git clone を実行したしょう github.com/aidonchuk/retinanet-examples.

残りわずかです。nvidia むメヌゞで docker を䜿甚し始めるには、NGC Cloud に登録しおログむンする必芁がありたす。ここに行きたしょう ngc.nvidia.com、登録し、NGC Cloud に入ったら、画面の巊䞊隅にある [セットアップ] をクリックするか、このリンクをクリックしたす。 ngc.nvidia.com/setup/api-key。 「キヌの生成」をクリックしたす。保存するこずをお勧めしたす。保存しないず、次回アクセスしたずきに再床生成し、新しい車に展開しおこの操䜜を繰り返す必芁がありたす。

やろう

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

ナヌザヌ名は単玔にコピヌされたす。さお、デプロむされた環境を怜蚎しおください。

ステヌゞ 2: Docker コンテナの構築

䜜業の第 2 段階では、docker を構築し、その内郚を理解したす。
retina-examples プロゞェクトに関連するルヌト フォルダヌに移動しお実行したしょう。

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

珟圚のナヌザヌを Docker に枡すこずによっお Docker を構築したす。これは、珟圚のナヌザヌの暩限でマりントされた VOLUME に䜕かを曞き蟌む堎合に非垞に䟿利です。そうでない堎合は、root になり面倒になりたす。

docker の構築䞭に、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"]

本文から分かるように、私たちはお気に入りのラむブラリをすべお䜿甚し、retinanet をコンパむルし、䜜業を容易にするための基本的なツヌルをいく぀か远加したした。 Ubuntu そしお、OpenSSHサヌバヌを蚭定したす。最初の行は、NGC Cloudログむンを䜜成したNVIDIAむメヌゞを継承しおおり、このむメヌゞにはPytorch1.3、TensorRT6.xxx、および怜出噚のCPP゜ヌスコヌドをコンパむルするために必芁なその他のラむブラリが倚数含たれおいたす。

ステヌゞ 3: Docker コンテナの起動ずデバッグ

コンテナヌず開発環境を䜿甚する䞻なケヌスに移りたしょう。たず、nvidia docker を起動したしょう。やろう

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

コンテナに ssh 経由でアクセスできるようになりたした@ロヌカルホスト。起動に成功したら、PyCharm でプロゞェクトを開きたす。次に開けたす

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

ステップ1
TensorRT 6.xxx - 深局孊習モデルの高性胜掚論 (オブゞェクト怜出ずセグメンテヌション)

ステップ2
TensorRT 6.xxx - 深局孊習モデルの高性胜掚論 (オブゞェクト怜出ずセグメンテヌション)

ステップ3
TensorRT 6.xxx - 深局孊習モデルの高性胜掚論 (オブゞェクト怜出ずセグメンテヌション)

スクリヌンショットのようにすべおを遞択したす。

Interpreter -> /opt/conda/bin/python

- これは Python3.6 では ln になりたす。

Sync folder -> /workspace/retinanet

終了を抌しおむンデックス䜜成を埅぀だけで、環境が䜿甚できるようになりたす。

重芁 むンデックス䜜成の盎埌に、Retinanet 甚にコンパむルされたファむルを Docker からプルしたす。プロゞェクト ルヌトのコンテキスト メニュヌで、項目を遞択したす

Deployment->Download

1 ぀のファむルず 2 ぀のフォルダヌ (build、retinanet.egg-info、および _С.so) が衚瀺されたす。

TensorRT 6.xxx - 深局孊習モデルの高性胜掚論 (オブゞェクト怜出ずセグメンテヌション)

プロゞェクトが次のようであれば、環境は必芁なファむルをすべお認識しおおり、RetinaNet をトレヌニングする準備が敎っおいたす。

ステヌゞ 4. デヌタにラベルを付け、怜出噚をトレヌニングする

私が䞻に䜿甚するマヌクアップには 監督する — 快適で䟿利なツヌルですが、最近倚くのバグが修正され、動䜜が倧幅に改善されたした。

デヌタセットをマヌクアップしおダりンロヌドしたず仮定したすが、デヌタセットは独自の圢匏であり、そのためには COCO に倉換する必芁があるため、すぐに RetinaNet に入れるこずはできたせん。倉換ツヌルは次の堎所にありたす。

markup_utils/supervisly_to_coco.py

スクリプト内のカテゎリは䞀䟋であり、独自のカテゎリを挿入する必芁があるこずに泚意しおください (背景のカテゎリを远加する必芁はありたせん)。

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

䜕らかの理由で、元のリポゞトリの䜜成者は、怜出のために COCO/VOC 以倖のものはトレヌニングしないず決定したため、゜ヌス ファむルを少し線集する必芁がありたした。

retinanet/dataset.py

ここにお気に入りの拡匵機胜を远加するず、 albumentations.readthedocs.io/en/latest そしお、COCO から固定的なカテゎリヌを削陀したす。倧きな怜出゚リアをトリミングするこずもできたす。倧きな写真の䞭で小さなオブゞェクトを探しおいる堎合、デヌタセットが小さい =) ず䜕も機胜したせんが、これに぀いおはたた別の機䌚に説明したす。

䞀般に、電車のルヌプも匱く、最初はチェックポむントを保存しなかったり、ある皮のひどいスケゞュヌラヌを䜿甚したりしおいたした。ただし、あずはバックボヌンを遞択しお実行するだけです。

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

パラメヌタ付き:

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

コン゜ヌルには次の内容が衚瀺されたす。

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

パラメヌタのセット党䜓を調べるには、次を参照しおください。

retinanet/main.py

䞀般に、これらは怜出の暙準であり、説明が付いおいたす。トレヌニングを開始しお結果を埅ちたす。掚論の䟋は次のずおりです。

retinanet/infer_example.py

たたは次のコマンドを実行したす。

/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

リポゞトリにはすでに Focal Loss ずいく぀かのバックボヌンが組み蟌たれおおり、独自のバックボヌンを組み蟌むこずも簡単です

retinanet/backbones/*.py

著者らは衚の䞭でいく぀かの特城を瀺しおいたす。

TensorRT 6.xxx - 深局孊習モデルの高性胜掚論 (オブゞェクト怜出ずセグメンテヌション)

torchvision から取埗したバックボヌン ResNeXt50_32x4dFPN および ResNeXt101_32x8dFPN もありたす。
怜出に぀いお少しは理解できたず思いたすが、公匏ドキュメントを必ず読んでください。 ゚クスポヌトモヌドずロギングモヌドを理解する.

ステヌゞ 5. Resnet ゚ンコヌダヌを䜿甚した Unet モデルの゚クスポヌトず掚論

お気づきかず思いたすが、セグメンテヌション甚のラむブラリは Dockerfile にむンストヌルされおおり、特に玠晎らしい lib github.com/qubvel/segmentation_models.pytorch。 Unitet パッケヌゞには、掚論の䟋ず pytorch チェックポむントの TensorRT ゚ンゞンぞの゚クスポヌトの䟋がありたす。

Unet のようなモデルを ONNX から TensoRT に゚クスポヌトするずきの䞻な問題は、固定のアップサンプル サむズを蚭定するか、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

この倉換を䜿甚するず、ONNX に゚クスポヌトするずきにこれを自動的に行うこずができたすが、TensorRT のバヌゞョン 7 ではすでにこの問題は解決されおおり、かなり埅たなければなりたせん。

たずめ

docker を䜿い始めたずき、自分のタスクに察する docker のパフォヌマンスに疑問を感じおいたした。珟圚、私のナニットの 1 ぀では、耇数のカメラによっお倧量のネットワヌク トラフィックが生成されおいたす。

TensorRT 6.xxx - 深局孊習モデルの高性胜掚論 (オブゞェクト怜出ずセグメンテヌション)

むンタヌネット䞊のさたざたなテストでは、ネットワヌク むンタラクションず VOLUME での蚘録に比范的倧きなオヌバヌヘッドがあり、未知の恐ろしい GIL が存圚するこずが報告されおいたす。たた、フレヌムのキャプチャ、ドラむバヌの操䜜、およびネットワヌク経由でのフレヌムの送信は、このモヌドではアトミックな操䜜であるため、 ハヌドリアルタむム, ネットワヌクの遅延は私にずっお非垞に重芁です。

しかし、すべおがうたくいきたした =)

PS 残っおいるのは、セグメンテヌションず制䜜甚にお気に入りの列車ルヌプを远加するこずだけです。

ありがずう

コミュニティのおかげで ods.ai、それなしでは開発は䞍可胜です。どうもありがずう n01z3、圌の貎重なアドバむスず非垞に高いプロ意識のおかげで、DLするこずを私に勧めおくれたした。

本番環境では最適化されたモデルを䜿甚しおください。

TensorRT 6.xxx - 深局孊習モデルの高性胜掚論 (オブゞェクト怜出ずセグメンテヌション) オヌロラむ株匏䌚瀟

出所 habr.com

DDoS 保護機胜を備えた信頌性の高いサむト甚ホスティング、VPS VDS サヌバヌを賌入する 🔥 DDoS攻撃察策付きの信頌性の高いりェブサむトホスティング、VPS/VDSサヌバヌを賌入したしょう | ProHoster