Objektintunnistusmallin käyttöönotto TensorFlow-palvelun kanssa

Objektintunnistusmallit ovat joitain hienostuneimmista syvän oppimisen malleista. He kykenevät paikallistamaan ja luokittelemaan kohteita reaaliajassa sekä kuvissa että videoissa. Mutta mikä hyöty on mallista, jos sitä ei voida käyttää tuotantoon?

TensorFlow-loistavien kaverien ansiosta meillä on TensorFlow-tarjoilu, joka pystyy palvelemaan mallejamme tuotannossa. On joitain todella hyviä artikkeleita TensorFlow-palvelemisesta, jotta pääset alkuun, kuten tämä ja tämä.

Tässä artikkelissa keskitytään siihen, kuinka voimme palvella objektintunnistusmalleja erityisesti TF-palvelun kanssa. Sitä motivoi hyvän verkkoresurssin puute, joka selittäisi kuinka tuotantoon valmiita esineiden havaitsemismalleja ja TF-palvelevia ympäristöjä luodaan Dockerin avulla. Keskustelemme myös mallin palvelemisesta ja asiakaspuolen komentosarjan luomisesta mallin käyttämiseksi. Arkkitehtuurimme näyttää tältä:

Koska en ole keksinyt pyörää uudelleen, olen ottanut apua tämän opetusohjelman objektien havaitsemisliittymän resursseista. Oletan, että olet kloonannut kohteiden havaitsemisliittymän TensorFlowista - mutta jos ei, tee seuraava:

# Klooni tensorlfow-mallit repo
https://github.com/tensorflow/models.git
cd-mallit / tutkimus / objekti_tunnistus

1. Luo tuotantovalmis malli TF-palvelemiseen

Olettaen, että olet kouluttanut kohteiden tunnistusmallin TensorFlow-sovelluksen avulla, seuraavat neljä tiedostoa on tallennettu levylle:

Koulutetut mallitiedostot tallennetaan levylle

Näitä tiedostoja voidaan käyttää päätelmiin suoraan. Tai voimme käyttää freeze_graph.py-skriptiä mallin muuntamiseksi jäädytetyksi kuvaajaksi, joka koostuu malliarkkitehtuurista ja painoista yhdessä tiedostossa. Tämä on hyödyllinen testaamiseen paikallisella koneella, mutta ei sovellu tuotantoympäristöön.

Luodaksi valmiita malleja, jotka ovat valmiita palvelemaan, muokkaamme objektintunnistusliittymän Githubissa olevaa exporter.py-tiedostoa. Alkuperäinen käsikirjoitus, joka on saatavissa repossa, ei tallenna tarjoamiseen tarvittavia muuttujia. Käytä seuraavaa exporter.py-skriptiä alkuperäisen TensorFlow-komennon sijasta.

Edellä olevaan viejä.pyyn on tehty seuraavat muutokset:

  1. Vaihda _write_saved_model -menetelmään. Tämä vaaditaan, koska alkuperäinen python-skripti ei tallenna muuttujia, joita tarvitaan mallin palvelemiseen. Nyt jäädytetyn_kuva_def: n käytön sijasta käytämme koulutettua_tarkistamispistettä, joka on mallin painot muuttujina. (hyvitykset tähän Github-numeroon)

2. Muuta kutsutoiminto jäädytetystä_kuva_def: stä koulutettuksi_tarkistuspisteeksi]:

3. Kommentoi koodi, joka tallentaa tiedostot levylle, jota ei tarvita palvelun aikana:

Nyt olet kaikki valmis luomaan mallin, jota voidaan käyttää tarjoiluun. Seuraava koodi voi auttaa sinua saavuttamaan tämän:

Tässä on selitys koodille:

  1. Jokaisella esineiden havaitsemismallilla on kokoonpano, joka on siirrettävä osoitteeseen export_model.py. Tämä koostuu malliarkkitehtuuria koskevista tiedoista. Lisätietoja tästä linkistä.
  2. Get_configs_from_pipeline_file -menetelmä luo sanakirjan määritystiedostosta, ja create_pipeline_proto_from_configs-menetelmä luo proto-puskuriobjektin tästä sanakirjasta.
  3. input_checkpoint on polku malliin.ckpt koulutetusta mallista.
  4. model_version_id on kokonaisluku mallin nykyiselle versiolle. Tätä edellyttää TF-palveleminen mallien versioinnille.
  5. object_detection.exporter tallentaa mallin seuraavassa muodossa:
Malli valmis käytettäväksi TF-Servingissä

1 / on malliversio, tallennettu_malli.pb. Se sisältää malliarkkitehtuurin, ja muuttujat-hakemistossa on mallin painot. Tämä malli on valmis tarjoiltavaksi.

2. Luo TF-palvelinympäristö Dockerin avulla.

Tietoja Dockerista

Docker on ohjelmistotyökalu, jonka avulla voit pakata ohjelmistot vakioituihin yksiköihin kehittämistä, lähettämistä ja käyttöönottoa varten. Docker-säilökuva on kevyt, itsenäinen, suoritettava paketti ohjelmistotiedostoa, joka sisältää kaiken, mitä tarvitaan sen suorittamiseen: koodin, ajonaikaisen järjestelmän, työkalut, järjestelmäkirjastojen, asetukset.

Lyhyesti sanottuna, Docker antaa meille eristää sovelluksesi ja sen riippuvuudet itsenäisessä paketissa, jota voidaan käyttää missä ja milloin tahansa, ilman että sinun on huolehdittava koodi- ja järjestelmäriippuvuuksien asentamisesta.

Motivoitumme käyttämään telakkaa TensorFlow-tarjoamiseen on, että voimme lähettää kontin toimimaan pilvellä ja helposti skaalaamaan palvelumme ilman, että tarvitsemme mitään riippuvuuksia uudelleen.

TensorFlow-palvelun virallisessa dokumentaatiossa kuvataan, kuinka se rakennetaan lähteestä. Se on hyvä, mutta minulla (ja suurella osalla yhteisöä) oli ongelmia kääntämällä sitä telakointiastiaan. Joten siirrymme vaiheiden yli yksi kerrallaan täällä.

  1. Rakenna säilö virallisen telakoitsijakuvan avulla

Olettaen, että olet kloonannut virallisen TensorFlow-palvelevan repon viimeisessä osassa kuvatulla tavalla, voit luoda telakoitsijakuvan seuraavasti:

# Siirtyä satamalaitteiden tiedostojen hakemistoon
cd ./palvelut/tensorflow_serving/tools/docker/
# Luo kuva (CPU)
docker build --pull -t $ USER / tensorflow-serves-devel-cpu -f Dockerfile.devel.
tai
# Luo kuva (GPU)
docker build --pull -t $ USER / tensorflow-serves-devel-gpu -f Dockerfile.devel-gpu.

Ennen kuin aloitat telakointisäiliön, lisää säilön käytettävissä oleva muisti (arvoon 10–12 Gt) ja suorittimiin (arvoon 4–6) telakointisovelluksen asetukset -osiossa. TensorFlow-palvelemisen rakentaminen on muistia vaativa prosessi, ja oletusparametrit eivät ehkä toimi. Kun olet valmis, voit aloittaa säilön seuraavasti:

[CPU: lle]
telakka-ajo -p-9000: 9000 $ KÄYTTÄJÄ / tensorflow-tarjoileva-devel-cpu / bin / bash
tai
[GPU: lle]
telakka-ajo -p-9000: 9000 $ KÄYTTÄJÄ / tensorflow-tarjoileva-devel-gpu / bin / bash

Suorita seuraavat asiat astiassa:

[CPU: lle]
# Klooni TensorFlow palveleva Githubin repo astiaan
git clone --cursse-submodules https://github.com/tensorflow/serving
cd tarjoilu / tensorflow
# Määritä TensorFlow
./configure
cd ..
# Rakenna TensorFlow-tarjoilua
ruutukehys -c opt --copt = -msse4.1 --copt = -msse4.2 tensorflow_serving / ...
tai
[GPU: lle]
# TensorFlow-palveleva Github repo on jo läsnä säilytysastiassa #, joten sitä ei tarvitse kloonata uudelleen
# Määritä TensorFlow CUDA: n avulla hyväksymällä (-y) -
# with_CUDA_support lippu
cd tarjoilu / tensorflow
./configure
# Rakenna TensorFlow palvelemaan CUDA: n kanssa
ruutukehys -c opt --copt = -msse4.1 --copt = -msse4.2 --copt = -mavx --copt = -mavx2 --copt = -mfma --copt = -O3 --copt = / usr / local / cuda tensorflow_serving / ...

Kokoonpanoprosessi voi viedä jopa tunnin riippuen isäntäjärjestelmästä ja telakointiasetuksista. Kun rakennus on valmis ilman virheitä, voit testata, onko mallipalvelin käynnissä:

Bazel-bin / tensorflow_serving / model_servers / tensorflow_model_server

Lähdön tulisi näyttää noin:

Liput:
--port = 8500 int32 -portti kuunnellaksesi
--enable_batching = false bool mahdollistaa eräajon
--batching_parameters_file = "" Jos merkkijono ei ole tyhjä, lue ascii BatchingParameters protobuf toimitetusta tiedostonimestä ja käytä mukana olevia arvoja oletusarvojen sijasta.
--model_config_file = "" Jos merkkijono ei ole tyhjä, lue ascii ModelServerConfig -protobuf mukana toimitetusta tiedostonimestä ja palvele mallit kyseisessä tiedostossa. Tätä konfigurointitiedostoa voidaan käyttää määrittämään useita palveltavia malleja ja muita edistyneitä parametreja, mukaan lukien ei-oletusversiokäytäntö. (Jos käytetään, mallin_nimi, - mallin_pohjapolku jätetään huomioimatta.)
--mall_name = "oletus" mallin merkkijono (jätetään huomioimatta, jos --model_config_file lippu on asetettu
--model_base_path = "" merkkijonopolku vietäväksi (jätetään huomioimatta, jos - mallin_määritys_tiedoston lippu on asetettu, muuten vaaditaan)
--file_system_poll_wait_seconds = 1 int32-aika sekunneissa tiedostojärjestelmän jokaisen kyselyn välillä uuden malliversion yhteydessä
--tensorflow_session_parallelism = 0 int64 Tensorflow-istunnon suorittamiseen käytettävien ketjujen lukumäärä. Automaattinen konfiguroitu oletuksena. Huomaa, että tätä asetusta ei huomioida, jos --platform_config_file ei ole tyhjä.
--platform_config_file = "" Jos merkkijono ei ole tyhjä, lue ascii PlatformConfigMap protobuf mukana toimitetusta tiedostonimestä ja käytä kyseistä alustakonfiguraatiota Tensorflow-alustan sijasta. (Jos käytössä, --enable_batching jätetään huomioimatta.)

Palveleva ympäristösi on nyt valmis käytettäväksi. Poistu säilöstä ja sitoa muutokset kuvaan. Voit tehdä tämän näin:

  • Poistu säiliöstä painamalla [Cltr-p] + [Cltr-q]
  • Etsi kontin tunnus:
# Etsi kontin tunnus
telakka ps
CONTAINER ID IMAGE COMMAND LUOKITTU TILAUOROSTEN NIMET
  • Hyväksy muutokset:
# Sitoudu muutoksiin
[CPU: lle]
satamalaite sitoutuu $ {CONTAINER ID} $ USER / tensorflow-tarjoileva-kehitys-cpu
tai
[GPU: lle]
satamalaite sitoutuu $ {CONTAINER ID} $ USER / tensorflow-tarjoileva-kehitys-gpu
  • Anna säiliö uudelleen:
telakoitsija suorittaa $ {CONTAINER ID} / bin / bash

Huomaa: Jotta TensorFlow-palveleva säilö voi käyttää isäntäjärjestelmän GPU: ita, sinun on asennettava nvidia-docker järjestelmään ja suoritettava säilö seuraavasti:

nvidia-telakka-telakka run -it -p 9000: 9000 $ KÄYTTÄJÄ / tensorflow-tarjoileva-devel-gpu / bin / bash

Tämän jälkeen voit tarkistaa GPU-käytön säilön sisällä nvidia-smi-cmd: llä.

Esivalmistettuja Docker-kuvia

Kuten olen nähnyt useissa Github-kysymyksissä (katso resurssit), ihmiset eivät pysty kääntämään TensorFlow-palvelua telakalla. Joten minulla on valmiiksi rakennettuja telakointikuvia sekä CPU- että GPU-tuelle.

Löydät ne Docker Hub -sivulta tai voit vetää kuvat alas seuraavasti:

[CPU: lle]
telakan veto gauravkaila / tf_serving_cpu
tai
[GPU: lle]
telakan veto gauravkaila / tf_serving_gpu

3. Asiakkaan luominen pyytämään Docker-säilössä olevaa mallipalvelinta päästämään testikuvaan

Pika esittely gRPC: hen (Google Remote Procedure Call) ja protokollapuskuriin

gRPC (Googlen etäkäyttökutsu) on Googlen HTTP2-kääritty RPC-protokolla. Tämän avulla tietokoneella toimiva asiakas voi käyttää etätietokonetta tietokoneverkon kautta ja kutsua kyseisen etätietokoneen ”toiminto” ikään kuin toiminto olisi paikallinen asiakkaalle.

TensorFlow-palveleminen käyttää tätä protokollaa palvelemaan malleja päätelmien tekemiseksi. Virallisten asiakirjojen mukaan

GRPC: ssä asiakassovellus voi kutsua menetelmiä suoraan palvelimesovellukseen toisella koneella kuin se olisikin paikallinen objekti, mikä helpottaa hajautettujen sovellusten ja palveluiden luomista.
gRPC-arkkitehtuuri

GRPC-palvelin on täällä telakointikontinamme, joka käyttää TensorFlow-palvelevaa palvelua, ja asiakkaamme on pythonissa, joka pyytää tätä palvelua päätelmään. Tässä artikkelissa kuvataan, kuinka RPC toimii hyvin jäsennellyllä tavalla.

gRPC käyttää protokollapuskureita strukturoidun datan sarjakuvaamiseen samoin kuin parametrien määrittämiseen ja palautettavien vastausten palautettaville menetelmille. Se on kieli- ja alusta-neutraalia. Sillä on jäsennelty kieli, joka sitten kääntää kuljetus-sarjanumerokoodin valitsemallesi kielelle, joka sisällytetään projektiisi. Se lähettää tietoja binaarimuodossa, joka on pienempi ja nopeampi kuin vanha hyvä JSON ja XML.

Asiakkaan luominen

TensorFlow-palvelupyyntö voi olla yksi kolmesta tyypistä:

  1. Luokittelu: Käyttää luokituksen RPC-sovellusliittymää, joka hyväksyy tulotenssorin (esim. Kuvan) ja tuottaa luokan ja pistemäärän.
  2. Ennustaminen ja regressio: Käyttää ennustus RPC-sovellusliittymää, joka hyväksyy tulosignaalin (esim. Kuvan) ja tuottaa useita tenoreita, kuten (esineiden havaitsemiseksi) rajaavat_laatikot, luokat, pisteet jne.

Koska käsiteltävänä oleva ongelma on ennustusongelma, käytämme ennustus RPC-sovellusliittymää. Tätä varten tarvitsemme ennustavan protobufin, joka on saatavana TensorFlow-palvelevassa githubissa, ja meidän on muunnettava ne kielikohtaiseksi koodiksi (ts. Python).

Voit tehdä tämän itse tai siirtyä helposti ja ladata python-tiedostot tästä github-repo-tiedostosta. Käytämme tätä protobuf -objektia ennustepyynnön luomiseen asiakkaaseemme.

Ennuste RPC-asiakkaan malli

Stub on koodipala, jota käytetään parametrien muuntamiseen etäproseduuripuhelun (RPC) aikana. Koska asiakas ja palvelin istuvat eri osoitealueissa, asiakkaalta palvelimelle lähetetty parametri (ja päinvastoin) on muunnettava siten, että etäpalvelintietokone havaitsee RPC: n paikallisena toimintopuheluna. Tässä käytetty tynkä on ennusteprotobufista generoitu koodi, kuten yllä on kuvattu.

TensorFlow-palvelupalvelun käynnistäminen

Kuten edellisessä osassa on kuvattu, TensorFlow-palveleva palvelumme toimii satamalaatikossa, jonka portit ovat avoinna ulkomaailmalle. Jos oletetaan, että telakoitsijakuva on käytettävissä, säilö voidaan käynnistää tällä tavalla:

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

Täällä portti 3000 on avoin maailmalle ja asiakas voi käyttää TensorFlow-palvelevaa palvelua tämän portin kautta. Vie ensimmäisessä osassa luotu mallihakemisto säilön sisällä olevaan kansioon:

$ docker cp / polku / malliin tf_serving_cpu: / polku / kohteeseen / kohde

Palvelun suorittamiseksi siirrä säilöön ja aloita:

# Siirry tarjoilu- / hakemistoon
CD-levyjen tarjoaminen /
# Käynnistä palvelu
$ bazel-bin / tensorflow_serving / model_servers / tensorflow_model_server
--port = 3000
--model_name = obj_det
--mall_base_path = / polku / kohteeseen / dest &> obj_det &

Varmista, että mallinimen lipulla on sama nimi kuin asiakkaassa. Tulos on kirjautunut sisään obj_det. Jos kaikki meni hyvin, näet seuraavan tulosteen kirjoittaessasi:

$ tail -f obj_det
tensorflow_serving / model_servers / main.cc: 288] Suoritetaan ModelServeriä 0.0.0.0:3000…

Malli palvelee ja on valmis asiakkaan käytettäväksi.

Visualisoi testikuvien rajaamisruudut

Objektintunnistusmallin tarkoituksena on visualisoida kuvassa sijaitsevien kohteiden raja-laatikot. Käytämme visualisointi_utils.py-tiedostoa TensorFlow-objektien havaitsemisliittymästä lopullisen kuvan visualisoimiseksi rajaavilla ruuduilla.

Voimme käyttää yksittäisiä tuotoksia tuloksesta seuraavasti:

laatikot = tulos.lähdöt ['tunnistus_laatikot']. kelluva_valo
luokat = tulos.ulostulot ['havainnointiluokat']. kelluva_valo
pisteet = tulos.lähdöt ['havainnointitulokset']. float_val

Tämä palauttaa protobuf-objektit, jotka voidaan syöttää visualization_utils.py-tiedostoon:

image_vis = vis_util.visualize_boxes_and_labels_on_image_array (
    {Input_image},
    np.reshape (laatikot, [100,4]),
    np.squeeze (luokat) .astype (np.int32),
    np.squeeze (tulokset),
    category_index,
    use_normalized_coordinates = true,
    line_thickness = 8)

Lopullisen asiakkaan käsikirjoitus näyttää tältä:

Lopullinen tulos

Lähettämällä testikuvan kellosta, lopputuloksemme pitäisi näyttää tällaiselta. Huomaa: Tässä käytetty malli on nopeampi RCNN, esiopetettu COCO-tietoaineistossa, jonka luokan numero 85 vastaa kelloa.

tuotokset {
avain: ”havaitsemislaatikot”
arvo {
tyyppi: DT_FLOAT
tensor_shape {
himmeä {
koko: 1
}
himmeä {
koko: 300
}
himmeä {
koko: 4
}
}
kelluva_valinta: 0,24750074744224548
float_val: 0,17159424722194672
kelluva_valinta: 0.9083144068717957
kelluva_valinta: 0.797699511051178
tuotokset {
avain: "tunnistusluokat"
arvo {
tyyppi: DT_FLOAT
tensor_shape {
himmeä {
koko: 1
}
himmeä {
koko: 300
}
}
kelluva_valinta: 85,0
tuotokset {
avain: "havainnointitulokset"
arvo {
tyyppi: DT_FLOAT
tensor_shape {
himmeä {
koko: 1
}
himmeä {
koko: 300
}
}
kelluva_valinta: 0.9963208436965942

Mitä olemme saavuttaneet

Aloitimme esineiden havaitsemisen käyttötapauksella TensorFlow-tarjoamisen tehokkuuden osoittamiseen. Viemme koulutetun mallimme muotoon, jota TensorFlow-palveleminen odottaa, koonnimme TF-palvelemisen Dockerilla ja loimme asiakaskomentosarjan, joka voi pyytää mallipalvelinta päättelemään.

Mitä tulevaisuus pitää yllä?

  1. Käyttämällä tätä käyttötapaa mallina, voimme käyttää TensorFlow-palvelemista palvelemaan muita ennustus- ja luokittelumalleja.
  2. Voimme hyödyntää TensorFlow-palvelun GPU-versiota saavuttamaan nopeamman päättelyn.
  3. Voimme skaalata palvelumme ottamalla käyttöön useita telakkakontteja, jotka käyttävät TF-palvelevaa palvelua.
  4. Voit erotella syöttökuvia sen sijaan, että lähettäisit yhden kuvan pyyntöä kohti.

voimavarat

  1. TensorFlow-objektien havaitsemisliittymä
  2. Tämä mahtava blogi TF-palvelemisesta

Github antaa:

  • 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

Tietoja kirjoittajasta: Gaurav on koneoppimisinsinööri The Dock, Accenture -yrityksen pää- ja tutkimuskeskuksessa Dublinissa, Irlannissa. Hänen kiinnostuksen kohteisiinsa kuuluu skaalautuvien syväoppimisjärjestelmien rakentaminen tietokonevisiosovelluksiin. Löydä lisää osoitteesta gauravkaila.com