forked from tzietkiewicz/aitech-ium
12 KiB
12 KiB
Inżynieria uczenia maszynowego
5. Biblioteki Deep Learning [laboratoria]
Tomasz Ziętkiewicz (2022)
Plan na dziś
Przegląd bibliotek DL:
- Tensorflow
- Pytorch
- Caffe
- Caffe2
- Deeplearning4J
- CNTK (Microsoft Cognitive Toolkit)
- ML.NET
- MXNet
- Porównanie
- Formaty wymiany modeli
Zadanie
Dynamiczne vs statyczne grafy obliczeniowe
- Żeby wytrenować sieć neuronową, musimy skonstruować graf obliczeniowy
- Graf może być:
- statyczny - definiowany raz dla wszystkich danych wejściowych
- dynamiczny - zmienny, w zależności od danych wejściowych
- Zalety grafu dynamicznego:
- bardziej elastyczny i interaktywny - nie musimy kompilować grafu przed jego uruchomieniem
- łatwiejszy w debudowaniu
- Zalety grafu statycznego:
- szybszy - łatwiej zaptymalizować
- przenośny - łatwiej go "wyeksportować" - graf zawiera wszystkie informacje konieczne do inferencji
1. Tensorflow
- www.tensorflow.org
- Open source
- Rozwijana przez google
- Bogaty "ekosystem"
- Napisana w C/C++ i Pythonie
- Liczne interfejsy/bindingi: Python, Java, Javascript (poprzez Tensorflow.js), Go, Rust, Swift
- Łatwy do osadzenia dzięki Tensorflow Lite - runtime dla urządzeń mobilnych (C,C++,Java,Swift, Objective-C)
- "Serwowanie" modeli przez REST API dzięki Tensorflow Serving
- Trenowanie na GPU, TPU. Distributed training
- Statyczny graf obliczeń, ale of wersji 2.0 dostępne "Eager execution", które umożliwia wykonywanie operacji w sieci bez budowania grafu
1.1 Keras
- keras.io
- Wysokopoziomowy interfejs do Tensorflow 2.0
Przykład IRIS w Tensorflow/Keras
https://www.tensorflow.org/tutorials/customization/custom_training_walkthrough
2. PyTorch
- https://pytorch.org/
- Open source (licencja BSD)
- Napisana w Pythonie i C++
- Interfejs w Python (oraz C++)
- Rozwijany przez Facebook jako kontynywacja projektu Torch, napisanego w Lua/C/C++
- Bogaty "ekosystem"
- Dynamiczny graf obliczeń
- Możliwość osadzenia na urządzeniach Android i iOS (Torch mobile)
- Serwowanie modeli przez REST dzięki TorchServe
- Przykład klasyfikacji IRIS w PyTorch: https://www.kaggle.com/aaditkapoor1201/iris-classification-pytorch
3. Caffe
- http://caffe.berkeleyvision.org/
- Rozwijana przez Berkley AI Research
- OpenSource (licencja BSD)
- Napisany w C++
- Interfejs w C++, Python, Matlab
- Używana głównie do ropoznawania obrazów, ale nie tylko
4. Caffe2
- https://caffe2.ai/
- Rozwijana przez Facebook
- zmergowana do repozytorium PyTorch
- Open source
- Głównie zastosowania produkcyjne, w tym modele embedded (Caffe2go)
- PyTorch: łatwość ekspoerymentowania, research. Caffe2: wydajność, urządzenia mobilne
- ONNX jako format wymiany między Caffe2 i PyTorch
5. Deeplearning4J
- aka. DL4J, Deep Learning for Java
- https://deeplearning4j.org/
- Rozwijana przez Eclipse Foundation
- Open source (licencja Apache 2.0)
- Napisana w Javie i C++
- Interfejsy: Java, Scala, Clojure, Kotlin
- Możliość importu modeli Keras
- Przykład klasyfikacji IRIS: https://deeplearning4j.konduit.ai/android/linear-classifier
6. CNTK (Microsoft Cognitive Toolkit)
- https://cntk.azurewebsites.net/
- Rozwijana przez ... Microsoft (Rozwój porzucony w 2019 roku)
- Open source (licencja MIT)
- Napisana w C++
- API: Python, C#, C++
7. ML.NET
- https://dot.net/ml
- Rozwijana przez Microsoft
- Open source (licencja MIT)
- Napisana w C#, C++
- API: .NET, Python (bindingi poprzez NimbusML)
- Przykłady klasyfikacji IRIS:
- Więcej przykładów: https://github.com/dotnet/machinelearning-samples
8. MXNet
- https://mxnet.apache.org/
- Open source (Apache 2.0)
- Rozwijana przez Apache Software Foundation
- Backend napisany w C++
- Iterfejsy: Python (główny) i dodatkowo for Scala, Julia, Clojure, Java, C++, R i Perl
- Możliwość osadzenia na urządzeniach mobilnych dzięki amalgamacji
9. Porównanie
Framework | Autor | Licencja | Język | Interface | Uwagi |
---|---|---|---|---|---|
Tensorflow | Apache 2.0 | C++, Python | C,C++,Python,Java,Javascript | ||
Keras | MIT | Python | Python | Wysokopoziomowy interfejs do Tensorflow | |
Tensorflow JS | Apache 2.0 | Javascript | Javascript | ||
PyTorch | BSD | C++,Python | C,Python, Java | ||
Caffe | BAIR | BSD | C++ | Python,Matlab | |
Caffe2 | BSD | C++ | C++,Python | Od 3 lat (2018) część PyTorch | |
CNTK | Microsoft | MIT | C++ | Python, C++, C# | od 01.2019 nierozwijana |
ML.NET | Microsoft | MIT | C++, C## | .NET, Python | |
MXNet | Apache Foundation | Apache 2.0 | C++, Python | Python, Scala, Julia, Clojure, Java, C++, R i Perl |
9. Formaty wymiany
- większość bibliotek używa innego formatu do zapisu modeli
- istnieją otwarte, uniwersalne formaty zapisu modeli sieci neuronowych, które mają za zadanie umożliwienie dzielenia modeli między bibliotekami
- Lista operacji wspieranych przez formaty nie zawiera wszystkich operacji używanych przez różna biblioteki, dlatego czasami kownwersja do ONNX nie jest w pełni możliwa
- ONNX - Open Neural Network Exchange
- https://onnx.ai/
- utrzymywany przez "społeczność"
- narzędzia umożliwiające konwersję do formatu ONNX modeli z najpopularniejszych bibliotek NN/ML
- modele ONNX mogą być uruchomione (czasami po konwersji) przy pomocy wielu runtimów
- NNEF - Neural Network Exchange Format
- https://www.khronos.org/nnef/
- wspierany przez Khronos Group (Nvidia, ATI, Intel, Sun, ...) - ta sama, która rozwija OpenGL
- konwersja z/do ONNX, Caffe, Caffe2, TensorFlow
Zadanie [22 pkt.]
Termin: 2023-05-12
- Wybierz jeden z frameworków ML (jeden z powyższych, ale może być też inny) i zaimplementuj w nim prostą sieć neuronową rozwiązującą wybrany problem (np regresji lub klasyfikacji) na wybranym na poprzednich zajęciach zbiorze. Możesz wzorować się (lub nawet skopiować) na jednym z tutotoriali do danego frameworka.
- wczytaj dane trenujące z pliku [2 pkt.]
- wytrenuj na nich model [6 pkt.]
- zapisz model do pliku [2 pkt.]
- w osobnym skypcie, przy pomocy zapisanego wcześniej modelu, dokonaj predykcji na danych ze zbioru testującego [8 pkt.]
- zapisz wyniki predykcji zwrócone przez model do pliku (nie metryki, tylko wyniki predykcji, czyli te informacje, które model miał przewidzieć) [2 pkt.]
Uwagi: - wyniki nie są najważniejsze - o ile twój model nie zwraca losowych danych ;)
- nie musisz wnikać głęboko w szczegóły trenowania modelu i inferencji. W tym zadaniu chodzi o poznanie API i praktycznych aspektów
- kod i stworzony model będziemy wykorzystywać na następnych zajęciach
- Dostosuj Dockerfile przygotowany na poprzednich zajęciach tak, żeby móc w zdefiniowanym w nim kontenerze wytrenować i uruchomić sieć przygotowaną w punkcie 1 [2 pkt.]