Uczenia maszynowe dla ubogich. Od trenowania modelu do dedykowanej usługi. Część 2

    No Comments

    W poprzednim wpisie starałem się pokazać, jak  w prosty sposób uruchomić model uczenia maszynowego do klasyfikacji zdjęć.

    Przygotowanie modelu odbyło się w aplikacji https://www.customvision.ai/

    Do uruchomienia gotowego modelu  w postaci REST API wykorzystałem darmową piaskownicę https://labs.play-with-docker.com/.

    Każda z tych usług ma swoje ograniczenia. Tak pierwsza pozwala na budowę jedynie dwóch modelu w planie darmowym. Tak druga ma czasowe ograniczenie do czterech godzin działania. Na początek to może wystarczyć, ale postanowiłem zająć się drugą częścią, czyli uruchomieniem gotowego modelu uczenia maszynowego w chmurze publicznej Azure. Wykorzystam dwie usługi ACR (Azure Container Registry) i ACI (Azure Container Instances).  Wdrożenie odbędzie się przy wykorzystaniu poleceń cli, albo z poziomu Visual Studio Code, albo z poziomu Azure Cloud Shell. Nie będzie potrzeby instalacji narzędzi typu Docker for Windows.

    Będziemy głównie wykorzystywać linię komend, od czasu do czasu spoglądając w Portal.

    Na początku definiujemy globalne zmienne

    Tworzymy prywatny rejestr ACR w ramach grupy zasobów ACR_GROUP. W tym przypadku nazwałem ją rg-machinelearning. Zasoby zostaną umieszczone w jednej lokalizacji northeurope  ( Dublin w Irlandii). Rejestr zasobów zostanie nazwany djkormoacrml , a utworzona instancja aplikacji djkormoaciml.

     

    Wszelkie zasoby, będą celowo umieszczone w jednej grupie. W ten sposób łatwiej się zarządza kosztami. Dodatkowo dzięki ustawieniu domyślnej nazwy grupy i domyślnej lokalizacji nie musimy przy budowie usług podawać

    Na początku pobieramy z publicznego repozytorium na Githubie kod naszej aplikacji i umieszczamy na dysku lokalnym (lub na dysku Cloud Shella). W tej wersji skryptu wykorzystałem laptop z Windows 7.

    Tak wygląda konfiguracja naszej aplikacji zawarta w pliku Dockerfile. Więcej szczegółów można znaleźć w pierwszej części artykułu.

    Tworzymy nasz rejestr obrazków, na potrzeby tego demo wystarczy najtańsza wersja (Basic). Pozwala ona na umieszczenie zbioru obrazów od łącznej pojemności nie przekraczającej 10GB. To repozytorium otrzymuje wpis w DNS $ACR_NAME.azurecr.io

    Uchomienie nslookup po zdbudowaniu rejestru…

    Rozpoczynamy budowę naszego rejestru, zanim umieścimy w nim jakikolwiek obraz.

    Uruchamiamy proces budowy naszego obrazu, potrwa to do około dwóch minut. Świeżo przygotowany obraz zostanie umieszczony w prywatnym repozytorium ACR.. Jako nazwę obrazu przyjąłem ai-customvision , a po : umieszczam numer wersji, w tym przypadku v1. Zawartość pliku Dockerfile  zawiera przepis z jakich komponentów i w jakiej kolejności  będzie przebiegał proces. Kod uruchamiamy w bieżącym katalogu (stąd kropka po nazwie obrazu).

    Informacje zwracane przez ostanie polecenie:

    Jak widać, obraz może być zaktualizowany, wylistowany, usunięty, odczytany i zapisany.
    Istnieje też możliwość zbudowania obrazu bez umieszczania go w repozytorium. Wystarczy dodać

    w linii poleceń.

    Po zbudowaniu naszego obrazu i umieszczeniu w prywatnym repozytorium ACR przyszedł czas na uruchomienie jednej instancji naszej aplikacji. Wykorzystamy do tego ACI (Azure Container Instances) .

    Aplikacja jest dostępna pod adresem http://ai-customvision.northeurope.azurecontainer.io, ważne by dodać parametr –dns-name-label, inaczej będziemy skazani na wygenerowany przez Azure numer IP, Usługa będzie pracować na porcie 80. Wykorzystane jest REST API i metoda POST. Wystawiony zostanie publiczny adres IP Do pobrania obrazu z ACR potrzebne są odpowiednie uprawnienia. Dlatego też przekazywana jest para zmiennych $ACR_USERNAME i $ACR_PASSWORD. Pilnujmy  tych poświadczeń, istnieje możliwość ponownego wygenerowania, co jest zresztą zalecaną praktyką. Tego typu dane nie powinny nigdy znaleźć się w repozytorium kodu.

    Wykorzystaliśmy do tej pory dwie usługi umieszczone w jednej grupie zasobów. Dobrze widać to z poziomu Portalu.

    To samo możemy obejrzeć, do czego zachęcam, z poziomu linii komend:

    Wynik w postaci tabeli (-o table)

    Widok instancji z poziomu Portalu

    Nadeszła pora, by zweryfikować, czy nasz program działa, tak jak został zaprojektowany.

    Przetestujemy naszą uruchomioną aplikację przez API REST, wykorzystując curl i przygotowane w repozytorium Gituba zdjęcia.

    Pliki ze zdjęciami znajdują się w podkatalogu images.

    Zwracane rezultaty są w formacie JSON.

    Jeden z obrazów (horse1) został błędnie sklasyfikowany jako pies i to na dodatek z prawdopodobieństwem 100%. Czy można coś z tym zrobić ? Można, ale to temat na kolejne wpisy autora.

    Pamiętajmy o ostatniej linii, która usuwa wszelkie zasoby w obrębie grupy. Usługi w chmurze są ulotne, pamiętajmy o tym, że jeśli nie są potrzebne, nie powinny być aktywne, gdyż z reguły generują niepotrzebne koszty.
    Tutaj użyłem wersji bez potwierdzania (-y) i czekania aż się zakończy proces (–no-wait).

    Poniżej pełny kod skryptu umieszczony w repozytorium.

     

    Literatura:

    https://markheath.net/post/build-container-images-with-acr

     

     

    Dodaj komentarz

    Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *