{"id":916,"date":"2019-03-09T23:19:16","date_gmt":"2019-03-09T22:19:16","guid":{"rendered":"http:\/\/wchmurze.cloud\/?p=916"},"modified":"2019-08-18T14:42:23","modified_gmt":"2019-08-18T12:42:23","slug":"uczenia-maszynowe-dla-ubogich-od-trenowania-modelu-do-dedykowanej-uslugi-czesc-2","status":"publish","type":"post","link":"https:\/\/wchmurze.cloud\/index.php\/2019\/03\/09\/uczenia-maszynowe-dla-ubogich-od-trenowania-modelu-do-dedykowanej-uslugi-czesc-2\/","title":{"rendered":"Uczenia maszynowe dla ubogich. Od trenowania modelu do dedykowanej us\u0142ugi. Cz\u0119\u015b\u0107 2"},"content":{"rendered":"<p>W poprzednim wpisie stara\u0142em si\u0119 pokaza\u0107, jak\u00a0 w prosty spos\u00f3b uruchomi\u0107 model uczenia maszynowego do klasyfikacji zdj\u0119\u0107.<\/p>\n<p>Przygotowanie modelu odby\u0142o si\u0119 w aplikacji <a href=\"https:\/\/www.customvision.ai\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/www.customvision.ai\/<\/a><\/p>\n<p>Do uruchomienia gotowego modelu\u00a0 w postaci REST API wykorzysta\u0142em darmow\u0105 piaskownic\u0119 <a href=\"https:\/\/labs.play-with-docker.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/labs.play-with-docker.com\/<\/a>.<\/p>\n<p>Ka\u017cda z tych us\u0142ug ma swoje ograniczenia. Tak pierwsza pozwala na budow\u0119 jedynie dw\u00f3ch modelu w planie darmowym. Tak druga ma czasowe ograniczenie do czterech godzin dzia\u0142ania. Na pocz\u0105tek to mo\u017ce wystarczy\u0107, ale postanowi\u0142em zaj\u0105\u0107 si\u0119 drug\u0105 cz\u0119\u015bci\u0105, czyli uruchomieniem gotowego modelu uczenia maszynowego w chmurze publicznej Azure. Wykorzystam dwie us\u0142ugi ACR (<a href=\"https:\/\/azure.microsoft.com\/pl-pl\/services\/container-registry\/\" target=\"_blank\" rel=\"noopener noreferrer\">Azure Container Registry<\/a>) i ACI (<a href=\"https:\/\/azure.microsoft.com\/pl-pl\/services\/container-instances\/\" target=\"_blank\" rel=\"noopener noreferrer\">Azure Container Instances<\/a>).\u00a0 Wdro\u017cenie odb\u0119dzie si\u0119 przy wykorzystaniu polece\u0144 cli, albo z poziomu Visual Studio Code, albo z poziomu Azure Cloud Shell. Nie b\u0119dzie potrzeby instalacji narz\u0119dzi typu Docker for Windows.<\/p>\n<p>B\u0119dziemy g\u0142\u00f3wnie wykorzystywa\u0107 lini\u0119 komend, od czasu do czasu spogl\u0105daj\u0105c w Portal.<\/p>\n<p>Na pocz\u0105tku definiujemy globalne zmienne<\/p>\n<pre class=\"\" lang=\"BASH\"># definicja zmiennych globalnych \r\nACR_LOCATION=northeurope \r\nACR_GROUP=rg-machinelearning \r\nACR_NAME=djkormoacrml \r\nACI_NAME=djkormoaciml\r\n<\/pre>\n<p>Tworzymy prywatny rejestr ACR w ramach grupy zasob\u00f3w ACR_GROUP. W tym przypadku nazwa\u0142em j\u0105 <strong>rg-machinelearning<\/strong>. Zasoby zostan\u0105 umieszczone w jednej lokalizacji <strong>northeurope\u00a0<\/strong> ( Dublin w Irlandii). Rejestr zasob\u00f3w zostanie nazwany <strong>djkormoacrml<\/strong> , a utworzona instancja aplikacji <strong>djkormoaciml<\/strong>.<\/p>\n<pre class=\"\" lang=\"BASH\"># katalog w kt\u00f3rym umie\u015bcimy sklonowany kod\r\n\r\nINIT_DIR=c:\/developing\/Azure\/ML\/\r\n\r\ncd $INIT_DIR\r\n\r\n# domyslna lokalizacja\r\naz configure --defaults location=$ACR_LOCATION\r\n\r\n# nowa grupa zasobow\r\naz group create --name $ACR_GROUP\r\n\r\n# domyslna grupa zasobow\r\naz configure --defaults group=$ACR_GROUP\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Wszelkie zasoby, b\u0119d\u0105 celowo umieszczone w jednej grupie. W ten spos\u00f3b \u0142atwiej si\u0119 zarz\u0105dza kosztami. Dodatkowo dzi\u0119ki ustawieniu domy\u015blnej nazwy grupy i domy\u015blnej lokalizacji nie musimy przy budowie us\u0142ug podawa\u0107<\/p>\n<pre lang=\"BASH\">--resource-group rg-grupa --location northeurope<\/pre>\n<p>Na pocz\u0105tku pobieramy z publicznego repozytorium na Githubie kod naszej aplikacji i umieszczamy na dysku lokalnym (lub na dysku Cloud Shella). W tej wersji skryptu wykorzysta\u0142em laptop z Windows 7.<\/p>\n<pre class=\"\" lang=\"BASH\"># klonujemy repozytorium, sprawdzaj\u0105c czy nie istnieje ju\u017c taki katalog\r\n\r\nif [ ! -d $INIT_DIR\/ContainersSamples ]; then\r\n  \r\n  mkdir ssh\r\n  echo \"Nie masz katalogu ContainersSamples\"  \r\n  git clone https:\/\/github.com\/djkormo\/ContainersSamples.git\r\nfi\r\n\r\n# wchodzimy do podkatalogu naszego projektu \r\n\r\ncd ContainersSamples\/Docker\/customvision-ai-cat-dog-horse-sample\/\r\n\r\n# odswiezamy zawartosc repozytorium w ramach gal\u0119zi master \r\ngit checkout master\r\n# pobieramy zawarto\u015b\u0107 repozytorium \r\ngit pull\r\n# weryfikujemy niesp\u00f3jno\u015bci zawarto\u015bci lokalnego i zdalnego repozytorium \r\ngit status\r\n\r\n# zawartosc pliku DockerFile\r\ncat Dockerfile \r\n\r\n<\/pre>\n<p>Tak wygl\u0105da konfiguracja naszej aplikacji zawarta w pliku Dockerfile. Wi\u0119cej szczeg\u00f3\u0142\u00f3w mo\u017cna znale\u017a\u0107 w pierwszej cz\u0119\u015bci artyku\u0142u.<\/p>\n<pre lang=\"DOCKER\">FROM python:3.5\r\n\r\nADD app \/app\r\n\r\nRUN pip install --upgrade pip\r\nRUN pip install -r \/app\/requirements.txt\r\n\r\n# Expose the port\r\nEXPOSE 80\r\n\r\n# Set the working directory\r\nWORKDIR \/app\r\n\r\n# Run the flask server for the endpoints\r\nCMD python app.py\r\n<\/pre>\n<p>Tworzymy nasz rejestr obrazk\u00f3w, na potrzeby tego demo wystarczy najta\u0144sza wersja (Basic). Pozwala ona na umieszczenie zbioru obraz\u00f3w od \u0142\u0105cznej pojemno\u015bci nie przekraczaj\u0105cej 10GB. To repozytorium otrzymuje wpis w DNS <strong>$ACR_NAME.azurecr.io <\/strong><\/p>\n<p>Uchomienie nslookup po zdbudowaniu rejestru&#8230;<\/p>\n<pre lang=\"BASH\">Nieautorytatywna odpowied\u017a:\r\nNazwa: r0213neu.northeurope.cloudapp.azure.com\r\nAddress: 13.69.227.89\r\nAliases: djkormoacrml.azurecr.io\r\nneu.fe.azcr.io\r\nneu-acr-reg.trafficmanager.net\r\n<\/pre>\n<p>Rozpoczynamy budow\u0119 naszego rejestru, zanim umie\u015bcimy w nim jakikolwiek obraz.<\/p>\n<pre class=\"\" lang=\"BASH\"># tworzymy rejestr dla kontenerow \r\naz acr create --name $ACR_NAME --sku Basic \r\n\r\n# wlaczenie konta administratorskiego \r\naz acr update -n $ACR_NAME --admin-enabled true\r\n<\/pre>\n<p>Uruchamiamy proces budowy naszego obrazu, potrwa to do oko\u0142o dw\u00f3ch minut. \u015awie\u017co przygotowany obraz zostanie umieszczony w prywatnym repozytorium ACR.. Jako nazw\u0119 obrazu przyj\u0105\u0142em <strong>ai-customvision<\/strong> , a po : umieszczam numer wersji, w tym przypadku <strong>v1<\/strong>. Zawarto\u015b\u0107 pliku Dockerfile\u00a0 zawiera przepis z jakich komponent\u00f3w i w jakiej kolejno\u015bci\u00a0 b\u0119dzie przebiega\u0142 proces. Kod uruchamiamy w bie\u017c\u0105cym katalogu (st\u0105d kropka po nazwie obrazu).<\/p>\n<pre class=\"\" lang=\"BASH\"># pobranie wygenerowanego u\u017cytkownika i has\u0142a\r\nACR_USERNAME=$ACR_NAME\r\nACR_PASSWORD=$(az acr credential show --name $ACR_NAME --query \"passwords[0].value\")\r\n\r\necho \"$ACR_USERNAME\"\r\necho \"$ACR_PASSWORD\"\r\n\r\n# budujemy obraz kontenerowy  na podstawie zawarto\u015bci pliku Dockerfile w bie\u017c\u0105cym katalogu (.)\r\naz acr build --registry $ACR_NAME --image ai-customvision:v1 .\r\n\r\n\r\n# lista zbudowanych obraz\u00f3w\r\naz acr repository list --name $ACR_NAME --output table\r\n\r\n# szczegoly danego obrazu\r\naz acr repository show -n $ACR_NAME -t ai-customvision:v1\r\n<\/pre>\n<p>Informacje zwracane przez ostanie polecenie:<\/p>\n<pre lang=\"JSON\">{\r\n  \"changeableAttributes\": {\r\n    \"deleteEnabled\": true,\r\n    \"listEnabled\": true,\r\n    \"readEnabled\": true,\r\n    \"writeEnabled\": true\r\n  },\r\n  \"createdTime\": \"2019-03-09T21:29:56.021222Z\",\r\n  \"digest\": \"sha256:656234a912ca0b613f57b4504a92395402ca650d89428a173bfb91b41e5b7f30\",\r\n  \"lastUpdateTime\": \"2019-03-09T21:29:56.021222Z\",\r\n  \"name\": \"v1\",\r\n  \"signed\": false\r\n}\r\n<\/pre>\n<p>Jak wida\u0107, obraz mo\u017ce by\u0107 zaktualizowany, wylistowany, usuni\u0119ty, odczytany i zapisany.<br \/>\nIstnieje te\u017c mo\u017cliwo\u015b\u0107 zbudowania obrazu bez umieszczania go w repozytorium. Wystarczy doda\u0107<\/p>\n<pre> --no-push<\/pre>\n<p>w linii polece\u0144.<\/p>\n<p>Po zbudowaniu naszego obrazu i umieszczeniu w prywatnym repozytorium ACR przyszed\u0142 czas na uruchomienie jednej instancji naszej aplikacji. Wykorzystamy do tego ACI (Azure Container Instances) .<\/p>\n<pre class=\"\" lang=\"BASH\">az container create --resource-group $ACR_GROUP \\\r\n    --name $ACI_NAME \\\r\n    --image $ACR_NAME.azurecr.io\/ai-customvision:v1 \\\r\n    --cpu 2 --memory 4 \\\r\n    --registry-login-server $ACR_NAME.azurecr.io \\\r\n    --dns-name-label ai-customvision \\\r\n    --ports 80 \\\r\n    --ip-address=Public \\\r\n    --registry-username $ACR_USERNAME \\\r\n    --registry-password $ACR_PASSWORD\r\n<\/pre>\n<p>Aplikacja jest dost\u0119pna pod adresem http:\/\/ai-customvision.northeurope.azurecontainer.io, wa\u017cne by doda\u0107 parametr &#8211;dns-name-label, inaczej b\u0119dziemy skazani na wygenerowany przez Azure numer IP, Us\u0142uga b\u0119dzie pracowa\u0107 na porcie 80. Wykorzystane jest REST API i metoda POST. Wystawiony zostanie publiczny adres IP Do pobrania obrazu z ACR potrzebne s\u0105 odpowiednie uprawnienia. Dlatego te\u017c przekazywana jest para zmiennych $ACR_USERNAME i $ACR_PASSWORD. Pilnujmy\u00a0 tych po\u015bwiadcze\u0144, istnieje mo\u017cliwo\u015b\u0107 ponownego wygenerowania, co jest zreszt\u0105 zalecan\u0105 praktyk\u0105. Tego typu dane nie powinny nigdy znale\u017a\u0107 si\u0119 w repozytorium kodu.<\/p>\n<p>Wykorzystali\u015bmy do tej pory dwie us\u0142ugi umieszczone w jednej grupie zasob\u00f3w. Dobrze wida\u0107 to z poziomu Portalu.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-941\" src=\"http:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/03\/rg-ml-widok.png\" alt=\"\" width=\"1371\" height=\"399\" srcset=\"https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/03\/rg-ml-widok.png 1371w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/03\/rg-ml-widok-300x87.png 300w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/03\/rg-ml-widok-768x224.png 768w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/03\/rg-ml-widok-1024x298.png 1024w\" sizes=\"(max-width: 1371px) 100vw, 1371px\" \/><\/p>\n<p>To samo mo\u017cemy obejrze\u0107, do czego zach\u0119cam, z poziomu linii komend:<\/p>\n<pre lang=\"BASH\"># lista zasob\u00f3w umieszczony w  danej grupie zasob\u00f3w\r\naz resource list --resource-group  $ACR_GROUP -o table\r\n<\/pre>\n<p>Wynik w postaci tabeli (-o table)<\/p>\n<pre lang=\"BASH\">Name          ResourceGroup       Location     Type                                         Status\r\n------------  ------------------  -----------  -------------------------------------------  --------\r\ndjkormoaciml  rg-machinelearning  northeurope  Microsoft.ContainerInstance\/containerGroups\r\ndjkormoacrml  rg-machinelearning  northeurope  Microsoft.ContainerRegistry\/registries\r\n<\/pre>\n<p>Widok instancji z poziomu Portalu<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-946\" src=\"http:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/03\/aci_ml_example.png\" alt=\"\" width=\"1377\" height=\"537\" srcset=\"https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/03\/aci_ml_example.png 1377w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/03\/aci_ml_example-300x117.png 300w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/03\/aci_ml_example-768x300.png 768w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/03\/aci_ml_example-1024x399.png 1024w\" sizes=\"(max-width: 1377px) 100vw, 1377px\" \/><\/p>\n<p>Nadesz\u0142a pora, by zweryfikowa\u0107, czy nasz program dzia\u0142a, tak jak zosta\u0142 zaprojektowany.<\/p>\n<p>Przetestujemy nasz\u0105 uruchomion\u0105 aplikacj\u0119 przez API REST, wykorzystuj\u0105c curl i przygotowane w repozytorium Gituba zdj\u0119cia.<\/p>\n<p>Pliki ze zdj\u0119ciami znajduj\u0105 si\u0119 w podkatalogu images.<\/p>\n<pre class=\"\" lang=\"BASH\"># aplikacja dost\u0119pna pod adresem \r\n# http:\/\/ai-customvision.northeurope.azurecontainer.io:80\r\n\r\n# testowanie\r\nclear\r\n# koty\r\ncurl -X POST http:\/\/ai-customvision.northeurope.azurecontainer.io\/image -F imageData=@images\/cat1.jpg\r\ncurl -X POST http:\/\/ai-customvision.northeurope.azurecontainer.io\/image -F imageData=@images\/cat2.jpg\r\n\r\n# psy\r\ncurl -X POST http:\/\/ai-customvision.northeurope.azurecontainer.io\/image -F imageData=@images\/dog1.jpg\r\ncurl -X POST http:\/\/ai-customvision.northeurope.azurecontainer.io\/image -F imageData=@images\/dog2.jpg\r\n\r\n# konie\r\ncurl -X POST http:\/\/ai-customvision.northeurope.azurecontainer.io\/image -F imageData=@images\/horse1.jpg\r\ncurl -X POST http:\/\/ai-customvision.northeurope.azurecontainer.io\/image -F imageData=@images\/horse2.jpg\r\n\r\n<\/pre>\n<p>Zwracane rezultaty s\u0105 w formacie JSON.<\/p>\n<pre class=\"\" lang=\"JSON\">$ curl -X POST http:\/\/ai-customvision.northeurope.azurecontainer.io\/image -F imageData=@images\/cat1.jpg\r\n{\r\n  \"created\": \"2019-03-09T22:05:31.011407\",\r\n  \"id\": \"\",\r\n  \"iteration\": \"\",\r\n  \"predictions\": [\r\n    {\r\n      \"boundingBox\": null,\r\n      \"probability\": 1.0,\r\n      \"tagId\": \"\",\r\n      \"tagName\": \"cat\"\r\n    }\r\n  ],\r\n  \"project\": \"\"\r\n}\r\n\r\n$ curl -X POST http:\/\/ai-customvision.northeurope.azurecontainer.io\/image -F imageData=@images\/cat2.jpg\r\n{\r\n  \"created\": \"2019-03-09T22:05:36.650195\",\r\n  \"id\": \"\",\r\n  \"iteration\": \"\",\r\n  \"predictions\": [\r\n    {\r\n      \"boundingBox\": null,\r\n      \"probability\": 1.0,\r\n      \"tagId\": \"\",\r\n      \"tagName\": \"cat\"\r\n    }\r\n  ],\r\n  \"project\": \"\"\r\n}\r\n\r\n$ # psy\r\n\r\n$ curl -X POST http:\/\/ai-customvision.northeurope.azurecontainer.io\/image -F imageData=@images\/dog1.jpg\r\n{\r\n  \"created\": \"2019-03-09T22:05:42.647791\",\r\n  \"id\": \"\",\r\n  \"iteration\": \"\",\r\n  \"predictions\": [\r\n    {\r\n      \"boundingBox\": null,\r\n      \"probability\": 1.0,\r\n      \"tagId\": \"\",\r\n      \"tagName\": \"dog\"\r\n    }\r\n  ],\r\n  \"project\": \"\"\r\n}\r\n\r\n\r\n$ curl -X POST http:\/\/ai-customvision.northeurope.azurecontainer.io\/image -F imageData=@images\/dog2.jpg\r\n{\r\n  \"created\": \"2019-03-09T22:05:49.057433\",\r\n  \"id\": \"\",\r\n  \"iteration\": \"\",\r\n  \"predictions\": [\r\n    {\r\n      \"boundingBox\": null,\r\n      \"probability\": 1.0,\r\n      \"tagId\": \"\",\r\n      \"tagName\": \"dog\"\r\n    }\r\n  ],\r\n  \"project\": \"\"\r\n}\r\n\r\n\r\n$ # konie\r\n\r\n$ curl -X POST http:\/\/ai-customvision.northeurope.azurecontainer.io\/image -F imageData=@images\/horse1.jpg\r\n{\r\n  \"created\": \"2019-03-09T22:05:54.683635\",\r\n  \"id\": \"\",\r\n  \"iteration\": \"\",\r\n  \"predictions\": [\r\n    {\r\n      \"boundingBox\": null,\r\n      \"probability\": 1.0,\r\n      \"tagId\": \"\",\r\n      \"tagName\": \"dog\"\r\n    }\r\n  ],\r\n  \"project\": \"\"\r\n}\r\n\r\n\r\n$ curl -X POST http:\/\/ai-customvision.northeurope.azurecontainer.io\/image -F imageData=@images\/horse2.jpg\r\n{\r\n  \"created\": \"2019-03-09T22:06:00.648413\",\r\n  \"id\": \"\",\r\n  \"iteration\": \"\",\r\n  \"predictions\": [\r\n    {\r\n      \"boundingBox\": null,\r\n      \"probability\": 0.0015334499767050147,\r\n      \"tagId\": \"\",\r\n      \"tagName\": \"dog\"\r\n    },\r\n    {\r\n      \"boundingBox\": null,\r\n      \"probability\": 0.9984666109085083,\r\n      \"tagId\": \"\",\r\n      \"tagName\": \"horse\"\r\n    }\r\n  ],\r\n  \"project\": \"\"\r\n}\r\n\r\n\r\n<\/pre>\n<p>Jeden z obraz\u00f3w (horse1) zosta\u0142 b\u0142\u0119dnie sklasyfikowany jako pies i to na dodatek z prawdopodobie\u0144stwem 100%. Czy mo\u017cna co\u015b z tym zrobi\u0107 ? Mo\u017cna, ale to temat na kolejne wpisy autora.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-904\" src=\"http:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/03\/horse1.jpg\" alt=\"\" width=\"480\" height=\"300\" srcset=\"https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/03\/horse1.jpg 480w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/03\/horse1-300x188.jpg 300w\" sizes=\"(max-width: 480px) 100vw, 480px\" \/><\/p>\n<p>Pami\u0119tajmy o ostatniej linii, kt\u00f3ra usuwa wszelkie zasoby w obr\u0119bie grupy. Us\u0142ugi w chmurze s\u0105 ulotne, pami\u0119tajmy o tym, \u017ce je\u015bli nie s\u0105 potrzebne, nie powinny by\u0107 aktywne, gdy\u017c z regu\u0142y generuj\u0105 niepotrzebne koszty.<br \/>\nTutaj u\u017cy\u0142em wersji bez potwierdzania (-y) i czekania a\u017c si\u0119 zako\u0144czy proces (&#8211;no-wait).<\/p>\n<pre lang=\"BASH\"># usuwamy zasoby w ramach calej grupy \r\naz group delete --name $ACR_GROUP --no-wait -y\r\n\r\n<\/pre>\n<p>Poni\u017cej pe\u0142ny <a href=\"https:\/\/github.com\/djkormo\/ContainersSamples\/blob\/master\/Docker\/customvision-ai-cat-dog-horse-sample\/ACR_ACI_cats_dogs_horses.azcli\" target=\"_blank\" rel=\"noopener noreferrer\">kod<\/a> skryptu umieszczony w repozytorium.<\/p>\n<p>&nbsp;<\/p>\n<p>Literatura:<\/p>\n<p><a href=\"https:\/\/markheath.net\/post\/build-container-images-with-acr\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/markheath.net\/post\/build-container-images-with-acr<\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>W poprzednim wpisie stara\u0142em si\u0119 pokaza\u0107, jak\u00a0 w prosty spos\u00f3b uruchomi\u0107 model uczenia maszynowego do klasyfikacji zdj\u0119\u0107. Przygotowanie modelu odby\u0142o si\u0119 w aplikacji https:\/\/www.customvision.ai\/ Do uruchomienia gotowego modelu\u00a0 w postaci REST API wykorzysta\u0142em darmow\u0105 piaskownic\u0119 https:\/\/labs.play-with-docker.com\/. Ka\u017cda z tych us\u0142ug &hellip; <a href=\"https:\/\/wchmurze.cloud\/index.php\/2019\/03\/09\/uczenia-maszynowe-dla-ubogich-od-trenowania-modelu-do-dedykowanej-uslugi-czesc-2\/\">Continued<\/a><\/p>\n","protected":false},"author":1,"featured_media":1068,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[15,23,3,6],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.13 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Uczenia maszynowe dla ubogich. Od trenowania modelu do dedykowanej us\u0142ugi. Cz\u0119\u015b\u0107 2 - W chmurze o chmurze i nie tylko<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/wchmurze.cloud\/index.php\/2019\/03\/09\/uczenia-maszynowe-dla-ubogich-od-trenowania-modelu-do-dedykowanej-uslugi-czesc-2\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Uczenia maszynowe dla ubogich. Od trenowania modelu do dedykowanej us\u0142ugi. Cz\u0119\u015b\u0107 2 - W chmurze o chmurze i nie tylko\" \/>\n<meta property=\"og:description\" content=\"W poprzednim wpisie stara\u0142em si\u0119 pokaza\u0107, jak\u00a0 w prosty spos\u00f3b uruchomi\u0107 model uczenia maszynowego do klasyfikacji zdj\u0119\u0107. Przygotowanie modelu odby\u0142o si\u0119 w aplikacji https:\/\/www.customvision.ai\/ Do uruchomienia gotowego modelu\u00a0 w postaci REST API wykorzysta\u0142em darmow\u0105 piaskownic\u0119 https:\/\/labs.play-with-docker.com\/. Ka\u017cda z tych us\u0142ug &hellip; Continued\" \/>\n<meta property=\"og:url\" content=\"https:\/\/wchmurze.cloud\/index.php\/2019\/03\/09\/uczenia-maszynowe-dla-ubogich-od-trenowania-modelu-do-dedykowanej-uslugi-czesc-2\/\" \/>\n<meta property=\"og:site_name\" content=\"W chmurze o chmurze i nie tylko\" \/>\n<meta property=\"article:published_time\" content=\"2019-03-09T22:19:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-08-18T12:42:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/03\/machine_learning.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"738\" \/>\n\t<meta property=\"og:image:height\" content=\"415\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"djkormo\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Napisane przez\" \/>\n\t<meta name=\"twitter:data1\" content=\"djkormo\" \/>\n\t<meta name=\"twitter:label2\" content=\"Szacowany czas czytania\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/wchmurze.cloud\/index.php\/2019\/03\/09\/uczenia-maszynowe-dla-ubogich-od-trenowania-modelu-do-dedykowanej-uslugi-czesc-2\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/wchmurze.cloud\/index.php\/2019\/03\/09\/uczenia-maszynowe-dla-ubogich-od-trenowania-modelu-do-dedykowanej-uslugi-czesc-2\/\"},\"author\":{\"name\":\"djkormo\",\"@id\":\"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323\"},\"headline\":\"Uczenia maszynowe dla ubogich. Od trenowania modelu do dedykowanej us\u0142ugi. Cz\u0119\u015b\u0107 2\",\"datePublished\":\"2019-03-09T22:19:16+00:00\",\"dateModified\":\"2019-08-18T12:42:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/wchmurze.cloud\/index.php\/2019\/03\/09\/uczenia-maszynowe-dla-ubogich-od-trenowania-modelu-do-dedykowanej-uslugi-czesc-2\/\"},\"wordCount\":784,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323\"},\"articleSection\":[\"Azure\",\"konteneryzacja\",\"Machine Learning\",\"Python\"],\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/wchmurze.cloud\/index.php\/2019\/03\/09\/uczenia-maszynowe-dla-ubogich-od-trenowania-modelu-do-dedykowanej-uslugi-czesc-2\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/wchmurze.cloud\/index.php\/2019\/03\/09\/uczenia-maszynowe-dla-ubogich-od-trenowania-modelu-do-dedykowanej-uslugi-czesc-2\/\",\"url\":\"https:\/\/wchmurze.cloud\/index.php\/2019\/03\/09\/uczenia-maszynowe-dla-ubogich-od-trenowania-modelu-do-dedykowanej-uslugi-czesc-2\/\",\"name\":\"Uczenia maszynowe dla ubogich. Od trenowania modelu do dedykowanej us\u0142ugi. Cz\u0119\u015b\u0107 2 - W chmurze o chmurze i nie tylko\",\"isPartOf\":{\"@id\":\"https:\/\/wchmurze.cloud\/#website\"},\"datePublished\":\"2019-03-09T22:19:16+00:00\",\"dateModified\":\"2019-08-18T12:42:23+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/wchmurze.cloud\/index.php\/2019\/03\/09\/uczenia-maszynowe-dla-ubogich-od-trenowania-modelu-do-dedykowanej-uslugi-czesc-2\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/wchmurze.cloud\/index.php\/2019\/03\/09\/uczenia-maszynowe-dla-ubogich-od-trenowania-modelu-do-dedykowanej-uslugi-czesc-2\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/wchmurze.cloud\/index.php\/2019\/03\/09\/uczenia-maszynowe-dla-ubogich-od-trenowania-modelu-do-dedykowanej-uslugi-czesc-2\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/wchmurze.cloud\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Uczenia maszynowe dla ubogich. Od trenowania modelu do dedykowanej us\u0142ugi. Cz\u0119\u015b\u0107 2\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/wchmurze.cloud\/#website\",\"url\":\"https:\/\/wchmurze.cloud\/\",\"name\":\"W chmurze o chmurze i nie tylko\",\"description\":\"W chmurze o chmurze i nie tylko\",\"publisher\":{\"@id\":\"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/wchmurze.cloud\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pl-PL\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323\",\"name\":\"djkormo\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/wchmurze.cloud\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/14a901b808871fa98086ae259c45d646?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/14a901b808871fa98086ae259c45d646?s=96&d=mm&r=g\",\"caption\":\"djkormo\"},\"logo\":{\"@id\":\"https:\/\/wchmurze.cloud\/#\/schema\/person\/image\/\"},\"url\":\"https:\/\/wchmurze.cloud\/index.php\/author\/djkormo\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Uczenia maszynowe dla ubogich. Od trenowania modelu do dedykowanej us\u0142ugi. Cz\u0119\u015b\u0107 2 - W chmurze o chmurze i nie tylko","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/wchmurze.cloud\/index.php\/2019\/03\/09\/uczenia-maszynowe-dla-ubogich-od-trenowania-modelu-do-dedykowanej-uslugi-czesc-2\/","og_locale":"pl_PL","og_type":"article","og_title":"Uczenia maszynowe dla ubogich. Od trenowania modelu do dedykowanej us\u0142ugi. Cz\u0119\u015b\u0107 2 - W chmurze o chmurze i nie tylko","og_description":"W poprzednim wpisie stara\u0142em si\u0119 pokaza\u0107, jak\u00a0 w prosty spos\u00f3b uruchomi\u0107 model uczenia maszynowego do klasyfikacji zdj\u0119\u0107. Przygotowanie modelu odby\u0142o si\u0119 w aplikacji https:\/\/www.customvision.ai\/ Do uruchomienia gotowego modelu\u00a0 w postaci REST API wykorzysta\u0142em darmow\u0105 piaskownic\u0119 https:\/\/labs.play-with-docker.com\/. Ka\u017cda z tych us\u0142ug &hellip; Continued","og_url":"https:\/\/wchmurze.cloud\/index.php\/2019\/03\/09\/uczenia-maszynowe-dla-ubogich-od-trenowania-modelu-do-dedykowanej-uslugi-czesc-2\/","og_site_name":"W chmurze o chmurze i nie tylko","article_published_time":"2019-03-09T22:19:16+00:00","article_modified_time":"2019-08-18T12:42:23+00:00","og_image":[{"width":738,"height":415,"url":"https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/03\/machine_learning.jpeg","type":"image\/jpeg"}],"author":"djkormo","twitter_card":"summary_large_image","twitter_misc":{"Napisane przez":"djkormo","Szacowany czas czytania":"7 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/wchmurze.cloud\/index.php\/2019\/03\/09\/uczenia-maszynowe-dla-ubogich-od-trenowania-modelu-do-dedykowanej-uslugi-czesc-2\/#article","isPartOf":{"@id":"https:\/\/wchmurze.cloud\/index.php\/2019\/03\/09\/uczenia-maszynowe-dla-ubogich-od-trenowania-modelu-do-dedykowanej-uslugi-czesc-2\/"},"author":{"name":"djkormo","@id":"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323"},"headline":"Uczenia maszynowe dla ubogich. Od trenowania modelu do dedykowanej us\u0142ugi. Cz\u0119\u015b\u0107 2","datePublished":"2019-03-09T22:19:16+00:00","dateModified":"2019-08-18T12:42:23+00:00","mainEntityOfPage":{"@id":"https:\/\/wchmurze.cloud\/index.php\/2019\/03\/09\/uczenia-maszynowe-dla-ubogich-od-trenowania-modelu-do-dedykowanej-uslugi-czesc-2\/"},"wordCount":784,"commentCount":0,"publisher":{"@id":"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323"},"articleSection":["Azure","konteneryzacja","Machine Learning","Python"],"inLanguage":"pl-PL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/wchmurze.cloud\/index.php\/2019\/03\/09\/uczenia-maszynowe-dla-ubogich-od-trenowania-modelu-do-dedykowanej-uslugi-czesc-2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/wchmurze.cloud\/index.php\/2019\/03\/09\/uczenia-maszynowe-dla-ubogich-od-trenowania-modelu-do-dedykowanej-uslugi-czesc-2\/","url":"https:\/\/wchmurze.cloud\/index.php\/2019\/03\/09\/uczenia-maszynowe-dla-ubogich-od-trenowania-modelu-do-dedykowanej-uslugi-czesc-2\/","name":"Uczenia maszynowe dla ubogich. Od trenowania modelu do dedykowanej us\u0142ugi. Cz\u0119\u015b\u0107 2 - W chmurze o chmurze i nie tylko","isPartOf":{"@id":"https:\/\/wchmurze.cloud\/#website"},"datePublished":"2019-03-09T22:19:16+00:00","dateModified":"2019-08-18T12:42:23+00:00","breadcrumb":{"@id":"https:\/\/wchmurze.cloud\/index.php\/2019\/03\/09\/uczenia-maszynowe-dla-ubogich-od-trenowania-modelu-do-dedykowanej-uslugi-czesc-2\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/wchmurze.cloud\/index.php\/2019\/03\/09\/uczenia-maszynowe-dla-ubogich-od-trenowania-modelu-do-dedykowanej-uslugi-czesc-2\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/wchmurze.cloud\/index.php\/2019\/03\/09\/uczenia-maszynowe-dla-ubogich-od-trenowania-modelu-do-dedykowanej-uslugi-czesc-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/wchmurze.cloud\/"},{"@type":"ListItem","position":2,"name":"Uczenia maszynowe dla ubogich. Od trenowania modelu do dedykowanej us\u0142ugi. Cz\u0119\u015b\u0107 2"}]},{"@type":"WebSite","@id":"https:\/\/wchmurze.cloud\/#website","url":"https:\/\/wchmurze.cloud\/","name":"W chmurze o chmurze i nie tylko","description":"W chmurze o chmurze i nie tylko","publisher":{"@id":"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/wchmurze.cloud\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pl-PL"},{"@type":["Person","Organization"],"@id":"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323","name":"djkormo","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/wchmurze.cloud\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/14a901b808871fa98086ae259c45d646?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/14a901b808871fa98086ae259c45d646?s=96&d=mm&r=g","caption":"djkormo"},"logo":{"@id":"https:\/\/wchmurze.cloud\/#\/schema\/person\/image\/"},"url":"https:\/\/wchmurze.cloud\/index.php\/author\/djkormo\/"}]}},"_links":{"self":[{"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/posts\/916"}],"collection":[{"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/comments?post=916"}],"version-history":[{"count":27,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/posts\/916\/revisions"}],"predecessor-version":[{"id":1070,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/posts\/916\/revisions\/1070"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/media\/1068"}],"wp:attachment":[{"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/media?parent=916"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/categories?post=916"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/tags?post=916"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}