"automatyzuje również proces wdrażania oprogramowania. Oznacza to, że\n",
"również procedura wdrażania musi zostać wyrażona jako kod\n",
"przechowywany w systemie kontroli wersji.\n",
"\n",
"![img](./obrazy/cd.drawio.png \"Schemat procesu ciągłego wdrażania\")\n",
"\n",
"Ciągła integracja/ciągłe wdrożenie zazwyczaj współwystępuje z metodyką **DevOps**.\n",
"\n",
"CI/CD/DevOps w jednym zdaniu: robię to tak często, że to „nic takiego”.\n",
"\n",
"![img](./obrazy/seul-metro.png \"Przykład — budowa metra, źródło Wikipedia\")\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### CI/CD a uczenie maszynowe\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Dodanie do systemu modułów opartych na uczeniu maszynowym bardzo\n",
"komplikuje proces CI/CD:\n",
"\n",
"- modele uczenia maszynowego (np. sieci neuronowe) powstają na bazie kodu źródłowego odpowiedzialnego za uczenie **i** danych uczących,\n",
"- osobny kod jest odpowiedzialny za inferencję,\n",
"- choć kod odpowiedzialny za uczenie i inferencję w miarę możliwości powinny podlegać standardowej metodologii testowania (np. testy jednostkowe), to ostatecznie testy systemów opartych na uczeniu maszynowym nie mają postaci zerojedynkowej\n",
"- … raczej system może uzyskać lepszy albo gorszy wynik,\n",
"- wdrożenie (a przynajmniej uczenie) wymaga często dużych zasobów obliczeniowych i specjalnego sprzętu (karty graficzne).\n",
"\n",
"Przy czym chcielibyśmy zachować „złote” zasady CI/CD.\n",
"\n",
"Wprowadzenie uczenia maszynowego do oprogramowania na tyle zmienia\n",
"sytuację, że mówi się o **MLOps** zamiast DevOps.\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Proces CI/CD rozszerzony o uczenie maszynowe\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"![img](./obrazy/mlops.drawio.png \"Schemat CI/CD rozszerzony o MLOps\")\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Testowanie systemów opartych na uczeniu maszynowym\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Podobnie jak w wypadku tradycyjnego oprogramowania testowanie modeli\n",
"uczenia maszynowego przyjmuje wiele form:\n",
"\n",
"- testy jednostkowe fragmentu kodu odpowiedzialnego za uczenie i inferencję,\n",
"- testy uczenia i inferencji na spreparowanych danych\n",
" - *corner cases*\n",
" - uczenia „w kółko” na jednym przykładzie (czy funkcja kosztu spada do zera?)\n",
"- testy inferencji na danych „śmieciowych” (czy system jest w stanie „przetrwać” wszystko?)\n",
"- testy efektywności, przepustowości itp.\n",
"- … lecz ostatecznie najistotniejsza jest odpowiedź na pytanie, jak dobry jest wynik na danych zbliżonych do rzeczywistych (**ewaluacja**)\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Ewaluacja\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Rodzaje ewaluacji:\n",
"\n",
"- testy „na ludziach”,\n",
" - testy A/B, analiza zachowania użytkownika\n",
" - ewaluacja **manualna**, np. test MOS (*mean-opinion score*)\n",
"- ewaluacja **automatyczna**\n",
" - ewaluacja według wzoru\n",
" - ewaluacja wyuczana przy użyciu uczenia maszynowego (!)\n",
"\n",
"Ostateczne kryterium ewaluacji: *money in the bank*, a właściwie\n",
"*utility in the bank* (por. aksjomatyczna teoria użyteczności\n",
"sformułowana przez Johna von Neumanna i Oskara Morgensterna).\n",
"\n",
"![img](./obrazy/utility.jpg \"Okładka książki „Theory of Games and Economic Behaviour”\")\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Psychologiczne pułapki oceniania\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- efekt **pierwszeństwa** — *błędy pojawiające się na początku wypracowania oceniane są surowiej niż błędy na końcu wypracowania*\n",
"\n",
"- efekt **świeżości**\n",
"\n",
"- efekt „aureoli” — *mamy skłonność do przypisywania innych pozytywnych cech ludziom atrakcyjnym fizycznie*\n",
"\n",
"- wpływ **nastroju** na ocenianie — *w pochmurne dni ludzie gorzej oceniają stan gospodarki niż w słoneczne*\n",
"Skonfigurujcie minimalne zadanie uczenia maszynowego na dowolnym serwerze ciągłej integracji (Jenkins, GitLabCI, GitHub Actions itp.). Zadanie powinno obejmować wyuczenie prostego modelu i ewaluację.\n",
"\n",
"### Zadanie 2.\n",
"\n",
"Dokonajcie konwersji wybranego zbioru danych do standardu wyzwania [Gonito](https://gitlab.com/filipg/gonito). Zob. [szczegółowe instrukcje odnośnie do tworzenia wyzwania](https://gitlab.com/filipg/geval#preparing-a-gonito-challenge).\n",
"\n",
"### Zadanie 3.\n",
"\n",
"Dopiszcie nowe przypadki testowe dla wybranej metryki ewaluacji w programie [GEval](https://gitlab.com/filipg/geval). Zob. [przykład testów dla nowej metryki](https://gitlab.com/filipg/geval/-/commit/819fbecedc6f744a1a08f21c11067191837f87a2) (od pliku `test/Spec.hs`).\n"