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

     

     

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

    2 komentarze

    Jeden z pierwszych  moich wpisów na blogu dotyczył  uczenia maszynowego według wujka Google.

    Od tego czasu pojawiły się nowe usługi , które znacznie ułatwiają rozpoczęcie pracy z modelami uczenia maszynowego.

    Postanowiłem przybliżyć jedną z usług Microsoftu, którą można przetestować za darmo.

    https://www.customvision.ai/

     

    Spróbujmy przygotować model, który potrafi klasyfikować zdjęcia. Na zdjęciach będziemy rozpoznawać różne zwierzęta.

    Serwis wymaga zalogowania się na konto Microsoft, ja wykorzystałem swój LiveID.

    Po zalogowaniu tworzymy nowy projekt:

     

    Wypełniamy nazwę projektu, jego opis, projekt typu klasyfikatora (Classification) i typ klasyfikacji (MultiClass). W ten sposób każdy z obrazów będzie otagowany jedną cechą. Jako domenę użyłem (General compact). Ustawienie modelu jako przenośnego będzie ważne dla dalszej części naszej przygody, gdy będziemy eksportować gotowy model.

    Jako zbioru treningowego dla trzech kategorii (kot, pies, koń) użyłem zdjęć z poniższych adresów:

    a) psy i koty

    https://www.floydhub.com/fastai/datasets/cats-vs-dogs/2/train

    b) konie:

    https://jamie.shotton.org/work/data.html

    Dla każdego z gatunków zwierząt załadowałem odpowiednio po sto zdjęć. To jest nasz zbiór treningowy, który zawiera trzysta przypadków oznakowanych “cat”, “dog” lub “horse”. Ten zbiór zawiera poprawnie przypisane otagowanie i jest bazą do przygotowania modelu uczenia maszynowego, który będzie potrafił odpowiedzieć na pytanie: Czy na zdjęciu (którego model nie zna, gdyż nie ma go w bazie treningowej) jest widoczny kot, pies, czy koń? Budujemy klasyfikator, który jest jednym z głównych algorytmów uczenia nadzorowanego. To my dostarczamy bazę wiedzy i w niej zawieramy cechę, która jest dla modelu prawdą.

    Po załadowaniu wszystkich zdjęć przystępujemy do trenowania danych.

    Parametrami tak wytrenowanego modelu są precyzja (precision) i czułość (recall).

    Co oznaczają te dwie liczby?

    Zacznijmy od tego czym jest  macierz pomyłek

    Image result for "macierz pomyłek"

    Na obrazie pokazano macierz pomyłek dla modelu uproszczonego do dwóch stanów.

    Załóżmy, że na zdjęciu może być kot (prawda, T(rue)) lub nie-kot (fałsz, F(false)). Nasz model predykcyjny wykrywa, tylko te dwa przypadki.

    Mamy cztery możliwości:

    1. Na zdjęciu jest kot, model wykrywa kota, mamy przypadek TP (True Positive)
    2. Na zdjęciu jest nie-kot, model wykrywa nie-kota, mamy przypadek TN (True Nagative)
    3. Na zdjęciu jest kot, model wykrywa nie-kota, mamy przypadek FN (False Negative)
    4. Na zdjęciu jest nie-kot, model wykrywa nie-kota, mamy przypadek  FP (False Positive)

    Precision (precyzja) to iloraz -> TP/(TP+FP)

    Recall (czułość)  to iloraz TP/(TP+FN)

    Po przygotowaniu wytrenowanego modelu możemy go wyeksportować. Mamy kilka możliwości, możemy zapisać go do rozwoju na urządzeniach mobilnych (iOS lub Android). Najciekawszą opcją jest, moim zdaniem możliwość, która kryje się pod nazwa DF (Dockerfile) .

    Model raz nauczony można też w prosty sposób testować na nowych zdjęciach. Te nowe zdjęcia mogą być kolejnym wsadem, który rozbudowuje naszą bazę wiedzy dla danych treningowych.  Pamiętajmy, że proces uczenia ma często cykliczny charakter.

    Pobieramy spakowany kod aplikacji w Pythonie, która wykorzystuje jako silnik uczenia maszynowego TensorFlow, serwerem www jest Flask.

    Częścią takiej aplikacji nie jest żadne ze zdjęć, które były używane w procesie uczenia modelu. Zapisywany jest jedynie plik, który zawiera konfigurację całego modelu zapisanego w formacie danego silnika. W tym przypadku jest to TensorFlow, a plik nosi nazwę model.pb.

    Zawartość pliku Dockerfile

    Najważniejsze pliki znajdują się w katalogu app

    app.py – główny kod aplikacji

    labels.txt – lista możliwych oznaczeń dla zdjęcia

    cat
    dog
    horse

    model.pb –  zapisane parametry wytrenowanego modelu w TensorFlow
    predict.py – kod w Pythonie obsługujący model uczenia maszynowego

    requirements.txt – lista modułów, które są potrzebne do działania aplikacji

    tensorflow==1.5.0
    pillow==5.0.0
    numpy==1.14.1
    flask==0.12.3

    Całość aplikacji umieściłem  na moim koncie na Githubie.

    Ciekawostką jest to, że po dodaniu projektu do repozytorium pojawia się informacja o potencjalnym problemie z bezpieczeństwem takiej aplikacji:

    djkormo,

    We found a potential security vulnerability in a repository for which you have been granted security alert access.

    @djkormo djkormo/ContainersSamples
    Known moderate severity security vulnerability detected in flask < 0.12.3 defined in requirements.txt.
    requirements.txt update suggested: flask ~> 0.12.3.
    Always verify the validity and compatibility of suggestions with your codebase.

     

    Trudno, jedna usługa Microsoftu generuje kod, a druga usługa Microsoftu uznaje go za niebezpieczny. Prawdziwa moc synergii.

    Po poprawieniu kodu zgodnie z sugestią, komunikat znika.

    Przykładowy kod umieściłem w repozytorium githuba.

    https://github.com/djkormo/ContainersSamples/tree/master/Docker/customvision-ai-cat-dog-horse-sample

    Spróbujmy zbudować z gotowego projektu REST API, które po załadowaniu na wejściu dowolnego zdjęcia, będzie w stanie odpowiedzieć na pytanie, czy znajduje się na nim jedno z trzech gatunków zwierząt.

    Wykorzystam do tego darmową piaskownicę

    https://labs.play-with-docker.com/

     

    Serwis wymaga założenia konta  w publicznym repozytorium DockerHuba.

    Po podaniu naszych poświadczeń pojawia się przycisk start

    Piaskownica wyłączy się sama po czterech godzinach. Pamiętajmy, aby nie trzymać tam poufnych i wrażliwych danych.

    Naciskamy przycisk +Add New Instance i uruchamiany nasz wirtualny kontener.

    Na początek klonujemy repozytorium z githuba

    Operacja wklejania to skrót klawiszowy Shift+Insert
    Operacja kopiowania to skrót klawiszowy Control+Insert

    Wchodzimy do odpowiedniego podkatalogu. To repozytorium zawiera też inne aplikacje.

    Zawartość wnętrza tego katalogu

    Rozpoczynamy proces budowy kontenera.

    Po krótkiej chwili następuje zbudowanie obrazu aplikacji.

    Konfiguracja tego procesu jest zapisana w pliku Dockerfile.

    Krótki opis dla osób, które nigdy nie korzystały z technologii konteneryzacji.

    Najpierw pobierany jest z repozytorium DockerHub obraz bazowy python:3.5.

    FROM python:3.5

    Dodawana jest zawartość katalogu app z hosta do katalogu app kontenera

    ADD app /app

    Instalowana jest aktualizacja oprogramowania do kontroli pakietów w Pythonie.

    RUN pip install –upgrade pip

    Instalowane są pakiety do Pythona zawarte w pliku  requirements.txt.

    RUN pip install -r /app/requirements.txt

    Port 80 zostaje udostępniony z kontenera do hosta.

    EXPOSE 80

    Ustalany jest katalog roboczy aplikacji w kontenerze.

    WORKDIR /app

    Uruchamiane jest polecenie, dzięki któremu  powstaje serwer www na udostępnionym wcześniej porcie 80.

    CMD python app.py

    Po zbudowaniu obrazu możemy uruchomić aplikację

    Podczas uruchamiania aplikacji wskazujemy jej nazwę customvision-ai:v1, mapowaniu portu kontenera (80) na port hosta (33000), flaga -d oznacza odłączenie się od kontenera. Będzie on uruchomiony niejako w tle.

    Nad oknem terminala pojawia się port, który został wystawiony po uruchomieniu aplikacji w kontenerze. W naszym przypadku jest to port 33000.

    Po uruchomieniu aplikacji możemy sprawdzić, czy usługa działa. Pamiętamy, że aplikacja ma pobrać zdjęcie i określić, czy jest na nim pies, kot czy koń.

    W katalogu images umieściłem sześć zdjęć. Żadne z nich nie było wykorzystywane podczas trenowania modelu.

    Do testowania modelu wykorzystałem polecenie curl. Aplikacja wystawia punkt końcowy (endpoint) pod adresem http://127.0.0.1:33000/image. Wykorzystywany jest  POST.

     

    Bystre oko zauważy, że  jeden z koni został sklasyfikowany z prawdopodobieństwem 100% jako pies.

    Literatura:

    https://pl.wikipedia.org/wiki/Tablica_pomy%C5%82ek

    https://github.com/djkormo/ContainersSamples/tree/master/Docker/customvision-ai-cat-dog-horse-sample

    Mała aktualizacja,  wygląda na to że serwis będzie wkrótce zamknięty. Kolejna część o tematyce ML w przygotowaniu

     

     

    Uczenie maszynowe według wujka Google

    No Comments

    Część pierwsza poradnika Google w zakresie uczenia maszynowego (Machine Learning)

    Budowa pierwszego modelu predykcyjnego w kilku liniach kodu

    Odpowiednik pierwszego programu “hello world” w C.

    Co my tu właściwie mamy ?
    Kawałek kodu w języku Python z zaimportowanym pakietem scikit-learn.
    Dokonujemy klasyfikacji i próbujemy przewidzieć na podstawie wartości dwóch cech owocu (wagi i gładkości powierzchni), czy jest on jabłkiem czy pomarańczą.
    Pod spodem jest drzewo decyzyjne, które pozwala na budowę modelu predykcyjnego.

    Uczenie maszynowe – pierwsza recenzja

    No Comments

    Wydawałoby się ze rozwiązania chmurowe Azure i książki drukowane to dwa różne światy. Producenci usług udostępniają obszerną dokumentację w sieci, pojawiają się nowe usługi , poprawiane są istniejące, a świat drukarski biegnie swoim tempem.
    Z takim właśnie niepokojem zabrałem się do lektury książki Marcina Szeligi “Data Science i uczenie maszynowe” wydawnictwa PWN.
    Co możemy znaleźć w środku? Dowiedziałem się czym jest uczenie maszynowe, obejrzałem przykłady i zbudowałem pierwsze modele, opublikowałem je w formie serwisów webowych.
    Już w pierwszym rozdziale mam do czynienia z przykładowym eksperymentem z dziedziny marketingu. Kolejne rozdziały poświęcono temu, co w praktyce zawiera najwięcej czasu, przynajmniej podczas pierwszych iteracji budowy modelu, mam na myśli mozolną pracę z danymi źródłowymi. Z jakimi typami zmiennych mam do czynienia, jak je uzupełniać, jak je dyskretyzować, jak normalizować, jak eliminować wartości odstające. Znalazłem też podstawy statystyki, bez której nie da się dobrze rozumieć i odczytać informacji zawartych w danych i korelacji między nimi, a co więcej pokazano, jak je weryfikować wizualnie na przykładzie klasycznego kwartetu Ascombe.
    Nie zapomniano też o procesie wzbogacania danych, prognozowaniu ,szeregach czasowych i redukcji wymiarów (PCA).
    Opisano główne techniki uczenia maszynowego, takie jak klasyfikacja, regresja, analiza skupień, rekomendowanie i prognozowanie. Każdy z rozdziałów zawiera odpowiednią liczbę przykładów w stosunku do części teoretycznej.
    Proces budowy i testowania modelu jest cykliczny i często uzyskana jego jakość jest o wiele mniejsza niż spodziewana. Na szczęście rozdział dziesiąty przedstawia metody oceny i poprawy jakości uzyskanych modeli, to rozdział dla tych, którzy przeczytawszy książkę skończyli ją na rozdziale dziewiątym i pełni zapału zabrali się za budowę własnego rozwiązania.
    Z książki korzystałem w praktyce podczas realizacji programu Microsoft Professional Program for Data Science. Dotyczyło to zakresu kursów: DAT203.1x Data Science Essentials, DAT203.2x Principles of Machine Learning, DAT203.3x Applied Machine Learning i końcowego DAT102x Microsoft Professional Capstone : Data Science. Zapewniam, że nie raz do niej sięgnąłem.
    Jeżeli dopiero zaczynasz przygodę z platformą Azure w zakresie uczenia maszynowego, to ta książka jest dla ciebie. Jeśli myślisz, ze po jej przeczytaniu wiesz już wszystko, to się mylisz, to jest dopiero początek drogi w poznawaniu fascynującej wiedzy, która jest nie jest nowym obszarem, ale od kilku lat pojawiają się narzędzia, która znacznie upraszczają i automatyzują budowę modeli predykcyjnych.
    Jednym z nich jest Azure Machine Learning. Dzięki tej usłudze próg wejścia znacznie się zmniejszył. Możemy zbudować pierwsze modele za pomocą interfejsu graficznego bez z jednej linii kodu (!). Co więcej, budowa serwisu webowego, za pomocą którego nasz model komunikuje się na zewnątrz też została mocno uproszczona i producent przygotował szablony w C# , języku R i arkusze Excela.
    Książka Marcina Szeligi jest nie tylko doskonałym uzupełnieniem dokumentacji Microsoftu i warto do niej wracać w kolejnych iteracjach wraz ze wzrostem nabytej wiedzy, ale również pozwala na usystematyzowanie wiedzy, która w dokumentacji producenta jest bardziej rozmyta.
    To czego mi brakuje, to krótkie wprowadzenie do języka R, ale ze względu na powszechną dostępność poradników , nie powinno to być problemem podczas przyswajania wiedzy.

    https://ksiegarnia.pwn.pl/Data-Science-i-uczenie-maszynowe,706763082,p.html

    Categories: Machine Learning, R