TensorFlow-teenusega objektide tuvastamise mudeli juurutamine

Objektide tuvastusmudelid on ühed keerukamad süvaõppe mudelid. Nad on võimelised objekte reaalajas lokaliseerima ja klassifitseerima nii piltides kui ka videotes. Kuid mis kasu on mudelist, kui seda ei saa tootmiseks kasutada?

Tänu TensorFlow imelistele poistele on meil saadaval TensorFlow teenus, mis on võimeline tootma meie mudeleid. TensorFlowi teenindamise kohta on mõned tõeliselt head artiklid, nagu näiteks käesolev ja käesolev.

See artikkel keskendub sellele, kuidas saaksime objektide tuvastamise mudeleid konkreetselt TF-i teenindamisega teenindada. Seda motiveerib hea ressursi puudumine veebis, mis selgitaks, kuidas Dockeri abil luua tootmiseks valmis objektide tuvastamise mudeleid ja TF-i teenindavaid keskkondi. Arutleme ka selle üle, kuidas mudelit teenindada ja kuidas kliendile luua skript, et sellele juurde pääseda. Meie arhitektuur näeb välja umbes selline:

Ratta uuesti leiutamise vaimus olen selle õppematerjali jaoks abi otsinud objekti tuvastamise API-s saadaolevatest ressurssidest. Ma eeldan, et olete objekti tuvastamise API TensorFlow-ist klooninud - kuid kui ei, siis toimige järgmiselt.

# Kloonige tensorlfow mudeleid
https://github.com/tensorflow/models.git
CD-mudelid / uurimine / objekti tuvastamine

1. Looge TF-Servingi jaoks valmis tootmismudel

Eeldusel, et olete oma objekti tuvastamise mudeli TensorFlow abil välja koolitanud, salvestatakse kettale järgmised neli faili:

Kettale salvestatud koolitatud mudelifailid

Neid faile saab järeldada otse. Või saame kasutada skripti freeze_graph.py mudeli teisendamiseks külmutatud graafiks, mis koosneb mudeli arhitektuurist ja kaaludest ühes failis. See on kasulik teie kohaliku masina testimisel, kuid ei sobi tootmiskeskkonna jaoks.

Esitamiseks valmis olevate mudelite loomiseks näpistame objektide tuvastamise API Githubis saadaoleva faili exporter.py. Repos saadaval olev skript ei salvesta esitamiseks vajalikke muutujaid. Kasutage originaalse TensorFlow skripti asemel järgmist exporter.py skripti.

Ülaltoodud exporter.py-s on tehtud järgmised muudatused:

  1. Minge meetodile _write_saved_model. See on vajalik, kuna algne pythoni skript ei salvesta muutujaid, mis on vajalikud mudeli teenindamiseks. Nüüd kasutame külmutatud_graafi_faili asemel koolitatud_kontrolli_prefiksit, millel on muutujatena mudeli kaal. (krediiti selle Githubi väljaande jaoks)

2. Muutke helistamisfunktsioon külmutatud_graafi_defist treenitud_kontrolli_punktifiksiks järgmiselt:

3. Kommenteerige kood, mis salvestab failid kettale, mida teenuse ajal ei vajata:

Nüüd olete kõik valmis looma oma mudeli, mida saaks kasutada serveerimiseks. Järgmine kood aitab teil seda saavutada:

Selle koodi selgitus on järgmine:

  1. Igal objekti tuvastamise mudelil on konfiguratsioon, mis tuleb edastada saidile export_model.py. See sisaldab teavet mudelarhitektuuri kohta. Lisateavet leiate sellel lingil.
  2. Meetod get_configs_from_pipeline_file loob konfiguratsioonifailist sõnastiku ja meetod create_pipeline_proto_from_configs loob sellest sõnastikust proto puhverobjekti.
  3. input_checkpoint on koolitatud mudeli tee modelli.ckpt juurde.
  4. model_version_id on täisarv mudeli praegusele versioonile. Seda nõuab TF-teenus mudelite versioonimiseks.
  5. object_detection.exporter salvestab mudeli järgmises vormingus:
Mudel on TF-Servingi kasutamiseks valmis

1 / on mudeli versioon, salvestatud_mudel.pb. See sisaldab mudeli arhitektuuri ja muutujate kataloogis on mudeli kaalud. See mudel on kättetoimetamiseks valmis.

2. Looge Dockeri abil TF-teeninduskeskkond.

Dockeri kohta

Docker on tarkvara tööriist, mis võimaldab teil tarkvara pakkida standardiseeritud üksusteks arendamiseks, saatmiseks ja juurutamiseks. Dockeri konteineri pilt on tarkvarapaketi kerge, eraldiseisev, käivitatav pakett, mis sisaldab kõike selle käivitamiseks vajalikku: koodi, käitusaega, süsteemi tööriistu, süsteemiteeke, sätteid.

Lühidalt, Docker võimaldab meil eraldada teie rakenduse ja selle sõltuvused eraldiseisvas paketis, mida saab kasutada igal pool ja igal ajal, ilma et peaksite muretsema koodi ja süsteemi sõltuvuste installimise pärast.

TensorFlow teenindamiseks dokkuri kasutamise motivatsioon on see, et saame konteineri saata pilve peal sõitmiseks ja oma teenuse hõlpsaks muutmiseks, ilma et peaksime uuesti ühtegi sõltuvust installima.

TensorFlow teenindamise ametlik dokumentatsioon kirjeldab, kuidas seda lähtekoodist ehitada. See on hea, kuid minul (ja suurel osal kogukonnal) oli probleeme dokumendi konteinerisse kompileerimisega. Nii et läheme siin sammud ükshaaval üle.

  1. Ehitage konteiner ametliku doki pildi abil

Eeldusel, et olete klooninud TensorFlow ametliku esitusrepo vastavalt viimases osas kirjeldatule, saate doki pildi luua järgmiselt:

# Liikuge dokkerifailide kataloogi
cd ./serving/tensorflow_serving/tools/docker/
# Kujutise loomine (CPU)
doki ehitamine - tõmbamine -t $ KASUTAJA / tensorflow-serveerimine-devel-cpu -f Dockerfile.devel.
või
# Kujutise loomine (GPU)
doki ehitamine - tõmbamine -t $ KASUTAJA / tensorflow-serveerimine-devel-gpu -f Dockerfile.devel-gpu.

Enne dokkimismahuti käivitamist suurendage dokkimisrakenduse eelistuste jaotises konteineri jaoks saadaolevat mälu (10–12 GB-ni) ja CPU-sid (kuni 4–6). TensorFlow-teeninduse loomine on mälumahukas protsess ja vaikeparameetrid ei pruugi töötada. Kui see on valmis, saate konteineri käivitada nii:

[Protsessori jaoks]
doki käitamine -p-9000: 9000 $ KASUTAJA / tensorflow-serveerimine-devel-cpu / bin / bash
või
[GPU jaoks]
doki käitamine -p-9000: 9000 $ KASUTAJA / tensorflow-serveerimine-devel-gpu / bin / bash

Mahutis tehke järgmist:

[Protsessori jaoks]
# Kloonige konteinerisse TensorFlow teenindav Github repo
git clone --recurse-submodules https://github.com/tensorflow/serving
cd serveerimine / tensorflow
# TensorFlow seadistamine
./konfigureerimine
CD ..
# Ehitage TensorFlow teenust
sarapuu ehitamine -c opt --copt = -msse4.1 --copt = -msse4.2 tensorflow_serving / ...
või
[GPU jaoks]
# TensorFlow teenindav Githubi repo on juba konteineris olemas #, nii et te ei pea uuesti kloonima
# Seadistage TensorFlow CUDA-ga, nõustudes (-y) -
# with_CUDA_support lipuga
cd serveerimine / tensorflow
./konfigureerimine
# Looge TensorFlow serveerimine koos CUDA-ga
sarapuu ehitamine -c opt --copt = -msse4.1 --copt = -msse4.2 --copt = -mavx --copt = -mavx2 --copt = -mfma --copt = -O3 --copt = / usr / local / cuda tensorflow_serving / ...

Koostamisprotsess võib sõltuvalt hostisüsteemist ja doki konfiguratsioonist võtta kuni tund. Kui ehitamine on vigadeta lõpule jõudnud, saate proovida, kas mudeliserver töötab:

bazel-bin / tensorflow_serving / model_servers / tensorflow_model_server

Väljund peaks välja nägema umbes selline:

Lipud:
--port = 8500 int32 port, mida kuulata
--enable_batching = false bool võimaldab pakkimist
--batching_parameters_file = "" Kui string pole tühi, lugege ascii BatchingParameters protobufi lisatud failinimest ja kasutage vaikesätete asemel sisalduvaid väärtusi.
--model_config_file = "" Kui string pole tühi, lugege ascii ModelServerConfig protobufi kaasasolevast failinimest ja teenige selles failis olevaid mudeleid. Seda konfiguratsioonifaili saab kasutada mitme teenindatava mudeli ja muude täpsustatud parameetrite, sealhulgas vaikesätetega versioonipoliitika määratlemiseks. (Kui kasutatakse, siis - mudeli_nimi, - mudeli_baasi_rada eiratakse.)
- mudeli_nimi = "vaikimisi" mudeli stringi nimi (eiratakse, kui - model_config_faili lipp on seatud
--model_base_path = "" stringi tee eksportimiseks (eiratakse, kui - mudeli_konfiguratsiooni_faili lipp on seatud, muidu nõutav)
--file_system_poll_wait_seconds = 1 int32 intervall sekundites failisüsteemi iga küsitluse vahel uue mudeli versiooni jaoks
--tensorflow_session_parallelism = 0 int64 Tensorflow seansi käitamiseks kasutatavate lõimede arv. Automaatselt konfigureeritud vaikimisi. Pange tähele, et seda suvandit eiratakse, kui --platform_config_file on tühi.
--platform_config_file = "" Kui string pole tühi, lugege ascii PlatformConfigMap protobuf kaasasolevast failinimest ja kasutage selle platvormi konfiguratsiooni Tensorflow platvormi asemel. (Kui seda kasutatakse, ignoreeritakse --enable_batching.)

Teie teeninduskeskkond on nüüd kasutamiseks valmis. Väljuge konteinerist ja kinnitage konteineri muudatused pildi jaoks. Saate seda teha nii:

  • Konteinerist väljumiseks vajutage nuppu [Cltr-p] + [Cltr-q]
  • Leidke konteineri ID:
# Leidke konteineri ID
dokk ps
KONTEINERI ID PILDIKOMAND LOODUD STAATUSSAADMETE NIMED
  • Kinnitage muudatused:
# Kinnitage muudatused
[Protsessori jaoks]
dokk pühendub $ {CONTAINER ID} $ USER / tensorflow-serveerimine-devel-cpu
või
[GPU jaoks]
dokk pühendub $ {CONTAINER ID} $ USER / tensorflow-serves-devel-gpu
  • Sisestage konteiner uuesti:
doki käivitamine $ {CONTAINER ID} / bin / bash

Märkus. Selleks, et TensorFlow teeninduskonteiner saaks teie hostisüsteemi GPU-dele juurde pääseda, peate oma süsteemi installima nvidia-docker ja käitama konteinerit järgmiselt:

nvidia-doki dokk run -it -p 9000: 9000 $ KASUTAJA / tensorflow-serveerimine-devel-gpu / bin / bash

Seejärel saate nvidia-smi cmd abil kontrollida GPU kasutamist konteineris.

Eelnevalt ehitatud Dockeri pildid

Nagu ma olen näinud paljudes Githubi küsimustes (vt ressursse), ei suuda inimesed TensorFlow-i teenust dokis kokku panna. Nii et mul on eelkonstrueeritud dokkide pildid nii CPU kui ka GPU toe jaoks.

Need leiate minu Docker Hubi lehelt või saate pilte alla tõmmata järgmiselt:

[Protsessori jaoks]
doki tõmmake gauravkaila / tf_serving_cpu
või
[GPU jaoks]
doki tõmmake gauravkaila / tf_serving_gpu

3. Kliendi loomine, et taotleda Dockeri konteineris töötavat mudeliserverit testpildi järeldamiseks

GRPC (Google Remote Procedure Call) ja protokollipuhvrite kiire sissejuhatus

gRPC (Google'i Remote Procedure Call) on Google'i HTTP2-mähisega RPC-protokoll. See võimaldab arvutis töötaval kliendil arvutivõrgu kaudu juurde pääseda kaugarvutile ja helistada selle kaugarvuti funktsioonile, nagu oleks see funktsioon kliendil kohalik.

TensorFlow-teenindamine kasutab seda protokolli järelduste tegemiseks mudelite jaoks. Ametliku dokumentatsiooni kohaselt

GRPC-s saab kliendirakendus otse erinevas masinas asuvas serverirakenduses meetodeid helistada otsekui kohalik objekt, muutes hajutatud rakenduste ja teenuste loomise hõlpsamaks.
gRPC arhitektuur

GRPC-server on siin meie dokkide konteiner, mis töötab TensorFlow-teenindamise teenust, ja meie klient on pütonis, kes nõuab seda teenust järelduste tegemiseks. Selles artiklis kirjeldatakse, kuidas RPC töötab väga struktureeritud viisil.

gRPC kasutab protokollipuhvreid struktureeritud andmete seerialiseerimiseks, samuti parameetrite määratlemiseks ja sissenõutavate meetodite vastuste tagastamiseks. See on keele- ja platvormneutraalne. Sellel on struktureeritud keel, mis seejärel kompileerib transpordi serialiseerimiskoodi teie valitud keelde, mis teie projekti kaasatakse. See edastab andmeid binaarses vormingus, mis on vanade heade JSON ja XML-iga võrreldes väiksem ja kiirem.

Kliendi loomine

TensorFlow teenindamistaotlus võib olla üks kolmest tüübist:

  1. Klassifikatsioon: kasutab klassifikatsiooni RPC API, mis aktsepteerib sisendtensorit (nt pilti) ja väljastab klassi ja hinde.
  2. Prognoosimine ja regressioon: kasutab ennustus RPC API-d, mis võtab vastu sisendtensorid (nt pilt) ja väljastab mitu tenorit, näiteks (objekti tuvastamiseks) piiravad_kastid, klassid, hinded jne.

Kuna siinne probleem on ennustusprobleem, kasutame me ennustus RPC API-d. Selleks vajame ennustatava protobufi kättesaadavust TensorFlow teenindavas githubis ja peame need teisendama oma keelespetsiifiliseks koodiks (nt Python).

Saate seda ise teha või lihtsat teed ja laadige python-failid sellest githubi repost alla. Me kasutame seda protobufi objekti oma kliendis ennustamistaotluse loomiseks.

Prognoosimise RPC kliendi mall

Stub on kooditükk, mida kasutatakse parameetrite teisendamiseks kaugprotseduurikõne (RPC) ajal. Kuna klient ja server asuvad erinevates aadressiruumides, tuleb klient serverist (ja vastupidi) saadetud parameeter teisendada, et kaugserveri arvuti tajuks RPC-d kui kohaliku funktsiooni kutset. Siin kasutatud tükk on kood, mis genereeritakse eelkirjeldatud protobufist.

TensorFlow teenindamise teenuse käivitamine

Nagu eelmises osas kirjeldati, töötab meie TensorFlow teenindav teenus dokkerkonteineris, mille pordid on välismaailmale avatud. Kui doki pilt on saadaval, saab konteineri käivitada järgmiselt:

$ docker run -it -d -P - name tf_serving_cpu -p 3000: 3000 gauravkaila / tf_serving_cpu

Siin on port 3000 maailmale avatud ja klient saab selle pordi kaudu juurdepääsu TensorFlow teenindavale teenusele. Ekspordi esimeses osas loodud mudelkataloog konteineri sees olevasse kausta:

$ dokker cp / tee / mudelisse tf_serving_cpu: / tee / sihtkohta / sihtkohta

Teenuse käitamiseks liikuge konteinerisse ja alustage:

# Liikuge kätteandvasse kataloogi
$ cd esitamine /
# Alustage teenust
$ bazel-bin / tensorflow_serving / model_servers / tensorflow_model_server
--port = 3000
--mudeli_nimi = obj_det
--mudeli_baasi_rada = / tee / sihtkohta / sihtkohta &> obj_det &

Veenduge, et mudeli_nimi lipul oleks sama nimi, nagu klient on määranud. Väljund on sisse logitud obj_det. Kui kõik läks hästi, näete tippimisel järgmist väljundit:

$ saba -f obj_det
tensorflow_serving / model_servers / main.cc: 288] ModelServer töötab 0.0.0.0:3000…

Mudelit pakutakse ja see on meie kliendi poolt kasutamiseks valmis.

Kujutlege testpiltide piirdekaste

Objektide tuvastamise mudeli eesmärk on visualiseerida pildil asuvate objektide piirdekarbid. Lõpliku pildi visualiseerimiseks koos piiravate kastidega kasutame faili visualization_utils.py TensorFlow objekti tuvastamise API-st.

Üksikutele väljunditele pääseb tulemuse kaudu ligi järgmiselt:

lahtrid = tulemus.väljundid ['tuvastuse_kastid']. float_val
klassid = tulemus.väljundid ['tuvastuse_klassid']. float_val
hinded = tulemus.väljundid ['tuvastamise_tulemused']. float_val

See tagastab protobufi objektid, mida saab sisestada faili visualization_utils.py:

image_vis = vis_util.visualize_boxes_and_labels_on_image_array (
    {input_image},
    np.reshape (kastid, [100,4]),
    np.squeeze (klassid) .astype (np.int32),
    np.squeeze (hinded),
    kategooria_indeks,
    use_normalized_coordinates = Tõsi,
    rea paksus = 8)

Lõpliku kliendi skript näeb välja selline:

Lõplik väljund

Kella proovipildi saatmisel peaks meie lõppväljund välja nägema umbes selline. Märkus: siin kasutatud mudel on kiirem RCNN, mis on eelnevalt koolitatud COCO andmestikul, mille klassi number 85 vastab kellaajale.

väljundid {
võti: tuvastusboksid
väärtus {
tüüp: DT_FLOAT
tensor_shape {
hämar {
suurus: 1
}
hämar {
suurus: 300
}
hämar {
suurus: 4
}
}
float_val: 0,24750074744224548
float_val: 0,17159424722194672
float_val: 0,9083144068717957
float_val: 0.797699511051178
väljundid {
võti: "tuvastamise_klassid"
väärtus {
tüüp: DT_FLOAT
tensor_shape {
hämar {
suurus: 1
}
hämar {
suurus: 300
}
}
float_val: 85,0
väljundid {
võti: "tuvastamise_tulemused"
väärtus {
tüüp: DT_FLOAT
tensor_shape {
hämar {
suurus: 1
}
hämar {
suurus: 300
}
}
float_val: 0.9963208436965942

Mida me oleme saavutanud

Alustasime objekti tuvastamise kasutamise juhtumiga, et näidata TensorFlow teenindamise võimsust. Ekspordisime oma koolitatud mudeli vormingusse, mida eeldab TensorFlow teenindamine, koostasime TFkeri teenindamise Dockeri abil ja lõime kliendiskripti, mis võib mudeliserverilt järeldada.

Mida tulevik hoiab?

  1. Kasutades seda juhtumit mallina, saame TensorFlow-teenust kasutada muude ennustus- ja klassifitseerimismudelite teenindamiseks.
  2. Kiiremate järelduste tegemiseks saame kasutada TensorFlow GPU-versiooni.
  3. Saame oma teenust laiendada, juurutades mitu TFK-teenust pakkuvat dokkimiskonteinerit.
  4. Sisestatud pilte saab pakkimise asemel pakkida ühe pildi asemel.

Ressursid

  1. TensorFlow objektide tuvastamise API
  2. See vinge blogi TF-teenindamise kohta

Githubi väljaanded:

  • https://github.com/tensorflow/serving/issues/542
  • https://github.com/tensorflow/serving/issues/590
  • https://github.com/tensorflow/serving/issues/410
  • https://github.com/tensorflow/serving/issues/672
  • https://github.com/tensorflow/serving/issues/659

Autori kohta: Gaurav on masinaõppimise insener Accenture'i peamises teadus- ja innovatsioonikeskuses The Dock, Iirimaal Dublinis. Tema huvide hulka kuulub mastabeeritava süvaõppe süsteemide ehitamine arvutinägemise rakenduste jaoks. Lisateavet leiate saidilt gauravkaila.com