Хувирсан сүлжээг багасгах Жеди техник - тайрах

Хувирсан сүлжээг багасгах Жеди техник - тайрах

Таны өмнө дахин объект илрүүлэх ажил байна. Нэн тэргүүний зорилт бол зөвшөөрөгдөх нарийвчлалтай ажиллах хурд юм. Та YOLOv3 архитектурыг аваад цааш нь сургана. Нарийвчлал (mAp75) 0.95-аас их байна. Гэхдээ гүйлтийн хурд бага хэвээр байна. Новш.

Өнөөдөр бид квантчлалыг тойрч гарах болно. Мөн зүсэлтийн доор бид харах болно Загвар тайрах - Нарийвчлалыг алдагдуулахгүйгээр дүгнэлтийг хурдасгахын тулд сүлжээний илүүдэл хэсгүүдийг тайрах. Хаана, хэр их, яаж тайрах нь тодорхой. Үүнийг гараар хэрхэн яаж хийх, хаана автоматжуулж болохыг олж мэдье. Төгсгөлд нь керагийн агуулах байдаг.

Танилцуулга

Өмнө нь ажиллаж байсан Перм дэх Макроскоп дээр би нэг зуршилтай болсон - алгоритмын гүйцэтгэлийн хугацааг үргэлж хянах. Сүлжээний ажиллах хугацааг үргэлж хангалттай шүүлтүүрээр шалгана уу. Ихэвчлэн хамгийн сүүлийн үеийн үйлдвэрлэл нь энэ шүүлтүүрийг давдаггүй бөгөөд энэ нь намайг Pruning-д хүргэсэн.

Тайрах нь дээр яригдаж байсан хуучин сэдэв юм Стэнфордын лекцүүд 2017 онд. Гол санаа нь янз бүрийн зангилааг арилгах замаар нарийвчлалыг алдагдуулахгүйгээр бэлтгэгдсэн сүлжээний хэмжээг багасгах явдал юм. Энэ нь дажгүй сонсогдож байгаа ч би түүний хэрэглээний талаар ховор сонсдог. Магадгүй хэрэгжилт хангалтгүй, орос хэл дээрх нийтлэл байхгүй, эсвэл хүн бүр үүнийг ноу-хау тайрах гэж үзээд чимээгүй байна.
Гэхдээ үүнийг салгая

Биологийн тухай товч мэдээлэл

Deep Learning нь биологиас гаралтай санаануудыг авч үзэхэд би дуртай. Тэд хувьслын нэгэн адил итгэж болно (ReLU нь маш төстэй гэдгийг та мэдэх үү тархинд нейрон идэвхжүүлэх үйл ажиллагаа?)

Загвар тайрах үйл явц нь бас биологитой ойрхон байдаг. Энд байгаа сүлжээний хариу үйлдлийг тархины уян хатан чанартай харьцуулж болно. Номонд хэд хэдэн сонирхолтой жишээ бий. Норман Доидж:

  1. Зөвхөн нэг хагастай төрсөн эмэгтэйн тархи алга болсон хагасын үйл ажиллагааг гүйцэтгэхийн тулд өөрийгөө дахин програмчилжээ.
  2. Тэр залуу тархиныхаа харааг хариуцдаг хэсгийг бууджээ. Цаг хугацаа өнгөрөхөд тархины бусад хэсгүүд эдгээр үүргийг гүйцэтгэсэн. (бид давтахыг оролдоогүй)

Үүний нэгэн адил та загвараасаа зарим сул эргэлтийг хасч болно. Хамгийн сүүлчийн арга бол үлдсэн багцууд нь зүссэн хэсгийг солиход тусална.

Та Transfer Learning-д дуртай юу эсвэл эхнээс нь суралцаж байна уу?

Нэгдүгээр сонголт. Та Yolov3 дээр Transfer Learning ашигладаг. Retina, Mask-RCNN эсвэл U-Net. Гэхдээ ихэнх тохиолдолд COCO шиг 80 объектын ангиллыг таних шаардлагагүй байдаг. Миний практикт бүх зүйл 1-2-р ангид хязгаарлагддаг. Энд 80 ангид зориулсан архитектур илүүдэхгүй гэж таамаглаж болно. Энэ нь архитектурыг жижиг болгох шаардлагатайг харуулж байна. Түүгээр ч барахгүй урьдчилж бэлтгэсэн жингээ алдахгүйгээр хиймээр байна.

Хоёрдугаар сонголт. Магадгүй танд маш их өгөгдөл, тооцоолох нөөц байгаа эсвэл зүгээр л супер захиалгат архитектур хэрэгтэй. хамаагүй. Гэхдээ та сүлжээг эхнээс нь сурч байна. Ердийн журам бол өгөгдлийн бүтцийг харж, хэт их хүч чадалтай архитектурыг сонгох, давтан сургалтаас завсардсан хүмүүсийг түлхэх явдал юм. Би 0.6 сургууль завсардсаныг харсан, Карл.

Аль ч тохиолдолд сүлжээг багасгаж болно. Урам зоригтой. Одоо хөвч тайрах гэж юу болохыг олж мэдье

Ерөнхий алгоритм

Бид багцуудыг устгаж болно гэж шийдсэн. Энэ нь маш энгийн харагдаж байна:

Хувирсан сүлжээг багасгах Жеди техник - тайрах

Аливаа эвдрэлийг арилгах нь сүлжээнд стресстэй байдаг бөгөөд энэ нь ихэвчлэн алдааны хэмжээг нэмэгдүүлэхэд хүргэдэг. Нэг талаас, алдааны энэ өсөлт нь бид эргэлтийг хэрхэн зөв арилгаж байгаагийн үзүүлэлт юм (жишээлбэл, их хэмжээний өсөлт нь бид буруу зүйл хийж байгааг харуулж байна). Гэхдээ бага зэрэг өсөлт нь нэлээд зөвшөөрөгдөхүйц бөгөөд ихэвчлэн жижиг LR бүхий дараагийн хөнгөн нэмэлт сургалтаар арилдаг. Нэмэлт сургалтын алхам нэмнэ үү:

Хувирсан сүлжээг багасгах Жеди техник - тайрах

Одоо бид Learning<->Pruning гогцоогоо хэзээ зогсоохыг хүсч байгаагаа тодорхойлох хэрэгтэй. Сүлжээг тодорхой хэмжээ, хурд болгон багасгах шаардлагатай үед энд чамин сонголтууд байж болно (жишээлбэл, хөдөлгөөнт төхөөрөмжүүдийн хувьд). Гэсэн хэдий ч хамгийн түгээмэл сонголт бол алдаа нь хүлээн зөвшөөрөгдөх хэмжээнээс өндөр болох хүртэл мөчлөгийг үргэлжлүүлэх явдал юм. Нөхцөл нэмэх:

Хувирсан сүлжээг багасгах Жеди техник - тайрах

Тиймээс алгоритм тодорхой болно. Устгасан эргэлтийг хэрхэн тодорхойлохыг олж мэдэхэд л үлддэг.

Устгасан багцуудыг хайх

Бид зарим эвдрэлийг арилгах хэрэгтэй. Урагшлах, хэнийг ч "буудах" нь үр дүнтэй боловч муу санаа юм. Гэхдээ та толгойтой тул арилгахын тулд "сул" эргэлтийг сонгохыг бодож, оролдож болно. Хэд хэдэн сонголт байна:

  1. Хамгийн бага L1-хэмжих буюу бага_магнитудын_тайрах. Жижиг жинтэй эргэлтүүд нь эцсийн шийдвэр гаргахад бага хувь нэмэр оруулдаг гэсэн санаа
  2. Дундаж ба стандарт хазайлтыг харгалзан үзсэн хамгийн бага L1 хэмжүүр. Бид түгээлтийн мөн чанарын үнэлгээг нэмж өгдөг.
  3. Гүйлгээний эвдрэлийг далдлах, эцсийн нарийвчлалд хамгийн бага нөлөөлдөгийг оруулахгүй. Ач холбогдолгүй эргэлтийг илүү нарийвчлалтай тодорхойлох, гэхдээ маш их цаг хугацаа, нөөц шаардсан.
  4. Бусад

Сонголт бүр нь амьдрах эрхтэй бөгөөд хэрэгжүүлэх өөрийн гэсэн онцлогтой. Энд бид хамгийн бага L1 хэмжигдэхүүнтэй сонголтыг авч үзье

YOLOv3-д зориулсан гарын авлагын процесс

Анхны архитектур нь үлдэгдэл блокуудыг агуулдаг. Гэхдээ тэд гүн гүнзгий сүлжээний хувьд хичнээн сайхан байсан ч бидэнд зарим талаар саад болно. Хэцүү тал нь та эдгээр давхаргууд дахь өөр өөр индексүүдтэй эвлэрүүллийг устгах боломжгүй юм.

Хувирсан сүлжээг багасгах Жеди техник - тайрах

Тиймээс бид эвлэрүүллийг чөлөөтэй устгах боломжтой давхаргуудыг сонгоцгооё:

Хувирсан сүлжээг багасгах Жеди техник - тайрах

Одоо ажлын мөчлөгийг байгуулъя:

  1. Идэвхжүүлэлтийг байршуулж байна
  2. Хэр их тайрахаа бодож байна
  3. Тайрах
  4. LR=10e-1-тэй 4 эрин үеийг сурах
  5. Туршилт хийх

Гүйлгээг буулгах нь тодорхой алхамд хэр их хэсгийг арилгах боломжтойг тооцоолоход тустай. Буулгах жишээ:

Хувирсан сүлжээг багасгах Жеди техник - тайрах

Бараг хаа сайгүй эргэлтийн 5% нь маш бага L1 нормтой байгааг бид харж байгаа бөгөөд бид тэдгээрийг арилгаж чадна. Алхам бүрт энэ буулгалтыг давтаж, аль давхаргыг, хэдийг нь огтолж болох талаар дүгнэлт хийсэн.

Бүх процессыг 4 үе шаттайгаар гүйцэтгэсэн (RTX 2060 Super-ийн тоо энд болон хаа сайгүй):

Алхам mAp75 Параметрийн тоо, сая Сүлжээний хэмжээ, mb Анхнаасаа, % Ажиллах цаг, ms Хөвч хөндөх нөхцөл
0 0.9656 60 241 100 180 -
1 0.9622 55 218 91 175 Нийт 5%
2 0.9625 50 197 83 168 Нийт 5%
3 0.9633 39 155 64 155 15+ эргэлттэй давхаргын хувьд 400%
4 0.9555 31 124 51 146 10+ эргэлттэй давхаргын хувьд 100%

Нэг эерэг нөлөөг 2-р алхам дээр нэмсэн - багцын хэмжээ 4 нь санах ойд багтах бөгөөд энэ нь нэмэлт сургалтын үйл явцыг ихээхэн хурдасгасан.
4-р шатанд процесс зогссон тул урт хугацааны нэмэлт сургалт ч гэсэн mAp75-ыг хуучин үнэ цэнэд хүргэсэнгүй.
Үүний үр дүнд бид дүгнэлтийг хурдасгаж чадсан 15%, хэмжээг багасгах 35% мөн яг алдахгүй.

Илүү энгийн архитектурт зориулсан автоматжуулалт

Илүү энгийн сүлжээний архитектурын хувьд (нөхцөлт нэмэх, нэгтгэх, үлдэгдэл блокгүйгээр) бүх эргэлтийн давхаргыг боловсруулахад анхаарлаа төвлөрүүлж, эргэлтийг таслах үйл явцыг автоматжуулах бүрэн боломжтой.

Би энэ сонголтыг хэрэгжүүлсэн энд.
Энэ нь маш энгийн: танд зөвхөн алдагдлын функц, оновчтой болгогч, багц үүсгэгч хэрэгтэй:

import pruning
from keras.optimizers import Adam
from keras.utils import Sequence

train_batch_generator = BatchGenerator...
score_batch_generator = BatchGenerator...

opt = Adam(lr=1e-4)
pruner = pruning.Pruner("config.json", "categorical_crossentropy", opt)

pruner.prune(train_batch, valid_batch)

Шаардлагатай бол та тохиргооны параметрүүдийг өөрчилж болно:

{
    "input_model_path": "model.h5",
    "output_model_path": "model_pruned.h5",
    "finetuning_epochs": 10, # the number of epochs for train between pruning steps
    "stop_loss": 0.1, # loss for stopping process
    "pruning_percent_step": 0.05, # part of convs for delete on every pruning step
    "pruning_standart_deviation_part": 0.2 # shift for limit pruning part
}

Нэмж дурдахад стандарт хазайлт дээр суурилсан хязгаарлалтыг хэрэгжүүлдэг. Зорилго нь аль хэдийн "хангалттай" L1 хэмжигдэхүүнтэй эвдрэлийг эс тооцвол хасагдсан хэсгийг хязгаарлах явдал юм.

Хувирсан сүлжээг багасгах Жеди техник - тайрах

Тиймээс бид баруун талынхтай ижил төстэй тархалтаас зөвхөн сул эргэлтийг арилгахыг зөвшөөрч, зүүнтэй ижил төстэй тархалтаас хасахад нөлөөлөхгүй.

Хувирсан сүлжээг багасгах Жеди техник - тайрах

Тархалт хэвийн хэмжээнд ойртох үед тайрах_стандартын_хазайлт_хэсгийн коэффициентийг дараахаас сонгож болно.

Хувирсан сүлжээг багасгах Жеди техник - тайрах
Би 2 сигма гэсэн таамаглалыг санал болгож байна. Эсвэл та энэ функцийг үл тоомсорлож < 1.0 утгыг үлдээж болно.

Гаралт нь нийт туршилтын сүлжээний хэмжээ, алдагдал, сүлжээний ажиллах хугацааны график бөгөөд 1.0 хүртэл хэвийн байна. Жишээлбэл, энд сүлжээний хэмжээг чанараа алдалгүйгээр бараг 2 дахин багасгасан (100 мянган жинтэй жижиг эргэлтийн сүлжээ):

Хувирсан сүлжээг багасгах Жеди техник - тайрах

Гүйлтийн хурд нь хэвийн хэлбэлзэлтэй бөгөөд бараг өөрчлөгдөөгүй хэвээр байна. Үүнд дараах тайлбар бий.

  1. Эргэлтийн тоо нь тохиромжтой (32, 64, 128) байснаас видео картанд тохиромжгүй болж өөрчлөгддөг - 27, 51 гэх мэт. Би энд буруу байж магадгүй, гэхдээ энэ нь нөлөөлсөн байх.
  2. Архитектур нь өргөн биш, гэхдээ тууштай байдаг. Өргөнийг багасгаснаар бид гүнд нөлөөлөхгүй. Тиймээс бид ачааллыг бууруулдаг боловч хурдыг өөрчлөхгүй.

Иймээс сайжруулалтыг гүйлтийн явцад CUDA ачааллыг 20-30%-иар бууруулснаар илэрхийлсэн боловч ажиллах хугацаа багасаагүй байна.

Үр дүн

эргэцүүлье. Бид тайрах 2 сонголтыг авч үзсэн - YOLOv3 (гараараа ажиллах шаардлагатай үед) болон энгийн архитектуртай сүлжээнүүдийн хувьд. Энэ хоёр тохиолдолд сүлжээний хэмжээг багасгах, хурдыг нэмэгдүүлэхийн тулд нарийвчлалыг алдагдуулахгүйгээр хийх боломжтой болохыг харж болно. Үр дүн:

  • Хэмжээг багасгах
  • Хурдасгах гүйлт
  • CUDA ачааллыг бууруулах
  • Үүний үр дүнд байгаль орчинд ээлтэй байдал (Бид тооцоолох нөөцийн ирээдүйн хэрэглээг оновчтой болгодог. Хаа нэгтээ аз жаргалтай байдаг Грета Тунберг)

Хавсралт

  • Тайрах алхмын дараа та тоо хэмжээг нэмж болно (жишээлбэл, TensorRT ашиглан)
  • Tensorflow нь боломжийг олгодог бага_магнитудын_тайрах. Ажилладаг.
  • хадгалах газар Би хөгжихийг хүсч байгаа бөгөөд туслахдаа баяртай байх болно

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх