Compare commits

..

No commits in common. "master" and "master" have entirely different histories.

27 changed files with 1637 additions and 13812 deletions

View File

@ -1,13 +0,0 @@
name: github-actions-hello
on: [push]
jobs:
hello-job:
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v2
- name: Setup Python
uses: actions/setup-python@v2.2.2
with:
python-version: '3.7'
- run: python3 --version

View File

@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "markdown",
"id": "3ae03d8e",
"id": "ac87c554",
"metadata": {},
"source": [
"# Środowisko wykorzystywane na zajęciach"
@ -10,7 +10,7 @@
},
{
"cell_type": "markdown",
"id": "dc65cc30",
"id": "167416f3",
"metadata": {},
"source": [
"Certificat SSL dla strony: https://letsencrypt.org/\n",
@ -57,7 +57,7 @@
{
"cell_type": "code",
"execution_count": null,
"id": "71e2cecc",
"id": "60970c71",
"metadata": {},
"outputs": [],
"source": []
@ -65,7 +65,7 @@
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
@ -79,7 +79,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.4"
"version": "3.9.1"
}
},
"nbformat": 4,

View File

@ -12,7 +12,7 @@
"<div class=\"alert alert-block alert-info\">\n",
"<h1> Inżynieria uczenia maszynowego </h1>\n",
"<h2> 0. <i>Informacje organizacyjne</i> [laboratoria]</h2> \n",
"<h3> Tomasz Ziętkiewicz (2023)</h3>\n",
"<h3> Tomasz Ziętkiewicz (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
@ -43,6 +43,7 @@
"## Przedmiot\n",
"- Kod przedmiotu: 06-DIUMUI0\n",
"- Nazwa: Inżynieria Uczenia Maszynowego\n",
"- WMI UAM 2021\n",
"- Sylabus: Sylabus-AITech-InzynieriaUczeniaMaszynowego.pdf"
]
},
@ -59,13 +60,10 @@
"- stopień naukowy:\tmagister inżynier\n",
"- stanowisko:\tdoktorant\n",
"- [Zakład Sztucznej Inteligencji](https://ai.wmi.amu.edu.pl/pl/)\n",
"- CSI - Centrum Sztucznej Inteligencji, projekt Samsung\n",
"- email: tomasz.zietkiewicz@amu.edu.pl\n",
"<!-- - www: http://tz47965.home.amu.edu.pl/ -->\n",
"- https://git.wmi.amu.edu.pl/AITech/aitech-ium\n",
"- konsultacje: \n",
" - przez MS Teams po wcześniejszym umówieniu\n",
" - pokój B2-36, wtorki 12:00 - 13:00, po wcześniejszym umówieniu"
"- www: http://tz47965.home.amu.edu.pl/\n",
"- https://git.wmi.amu.edu.pl/tzietkiewicz/aitech-ium\n",
"- konsultacje: przez MS Teams, po wcześniejszym umówieniu mailowym lub przez chat"
]
},
{
@ -99,16 +97,15 @@
"3. Ciągła Integracja - Jenkins\n",
"4. Konteneryzacja - Docker\n",
"5. Biblioteki ML\n",
"6. Jenkins pipeline\n",
"7. Hugging Face Hub\n",
"6. Przygotowanie eksperymentu ML\n",
"7. Jenkins pipeline\n",
"8. Kontrola eksperymentów - Sacred\n",
"9. Środowiska wirtualne\n",
"10. Kontrola eksperymentów - MLFlow\n",
"11. Kontrola eksperymentów - DVC\n",
"12. Github Actions\n",
"13. Kubernetes i Kubeflow\n",
"14. Raportowanie wyników w formie publikacji naukowej\n",
"15. Prezentacja publikacji"
"9. Kontrola eksperymentów - MLFlow\n",
"10. Kontrola eksperymentów - DVC\n",
"11. Wizualizacja\n",
"12. Finalizacja projektu\n",
"13. Finalizacja projektu\n",
"14. Podsumowanie"
]
},
{
@ -154,9 +151,7 @@
"## Obecność\n",
"\n",
"Zgodnie z oficjalnymi zasadami obowiązującymi w projekcie AITech, dopuszczalna liczba nieobecności na zajęciach wynosi 3 (obowiązkowa obecność na 80% zajęć).\n",
"Powyżej 3 nieobecności przemiot nie może być zaliczony.\n",
"\n",
"Arkusz z obecnościami 2023: https://uam.sharepoint.com/:x:/s/2023SL06-DIUMUI0LABInynieriauczeniamaszynowego-Grupa11/EWdi4uIh2AVBmlYx-2j4cpgBEDUOWviU1QHUayM98EuuIw?e=fe4uxl"
"Powyżej 3 nieobecności przemiot nie może być zaliczony."
]
}
],
@ -180,7 +175,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.16"
"version": "3.9.1"
},
"slideshow": {
"slide_type": "slide"

View File

@ -12,7 +12,7 @@
"<div class=\"alert alert-block alert-info\">\n",
"<h1> Inżynieria uczenia maszynowego </h1>\n",
"<h2> 1. <i>Wprowadzenie</i> [laboratoria]</h2> \n",
"<h3> Tomasz Ziętkiewicz (2023)</h3>\n",
"<h3> Tomasz Ziętkiewicz (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
@ -115,7 +115,6 @@
"source": [
"## 1.2.1 Systemy ciągłej integracji\n",
" - Jenkins <br/><img style=\"height: 50px;\" src=\"img/ci/jenkins.png\"/>\n",
" - Github Actions <br/><img style=\"height: 50px;\" src=\"img/ci/github-actions.png\"/>\n",
" - Bamboo <br/><img style=\"height: 50px;\" src=\"img/ci/bamboo.png\"/>\n",
" - Circle CI <br/><img style=\"height: 50px;\" src=\"img/ci/circleci.png\"/>\n",
" - Team City <br/><img style=\"height: 50px;\" src=\"img/ci/teamcity.png\"/>\n",
@ -221,7 +220,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.12"
"version": "3.9.1"
},
"slideshow": {
"slide_type": "slide"

View File

@ -12,7 +12,7 @@
"<div class=\"alert alert-block alert-info\">\n",
"<h1> Inżynieria uczenia maszynowego </h1>\n",
"<h2> 2. <i>Dane</i> [laboratoria]</h2> \n",
"<h3> Tomasz Ziętkiewicz (2023)</h3>\n",
"<h3> Tomasz Ziętkiewicz (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
@ -59,11 +59,11 @@
"source": [
"# Źródła danych\n",
"- Gotowe zbiory:\n",
" - Otwarte wyzwania (challenge)\n",
" - Repozytoria otwartych zbiorów danych\n",
" - Dane udostępniane przez firmy\n",
" - Repozytoria zbiorów komercyjnych\n",
" - Dane wewnętrzne (np. firmy)"
" - Otwarte wyzwania (challenge)\n",
" - Repozytoria otwartych zbiorów danych\n",
" - Dane udostępniane przez firmy\n",
" - Repozytoria zbiorów komercyjnych\n",
" - Dane wewnętrzne (np. firmy)"
]
},
{
@ -77,9 +77,9 @@
"# Źródła danych\n",
"- Tworzenie danych:\n",
" - Generowanie syntetyczne\n",
" - np. generowanie korpusów mowy za pomocą TTS (syntezy mowy)\n",
" - Crowdsourcing\n",
" - Data scrapping"
" - Data scrapping\n",
" - Ekstrakcja\n"
]
},
{
@ -92,13 +92,11 @@
"source": [
"## Otwarte wyzwania (shared task / challenge)\n",
"- Kaggle: https://www.kaggle.com/datasets\n",
"- EvalAI: https://eval.ai/\n",
"- Gonito: https://gonito.net/list-challenges - polski (+poznański +z UAM) Kaggle\n",
"- Semeval: https://semeval.github.io/ - zadania z semantyki\n",
"- Poleval: http://poleval.pl/ - przetwarzanie języka polskiego\n",
"- WMT http://www.statmt.org/wmt20/ (tłumaczenie maszynowe)\n",
"- IWSLT https://iwslt.org/2021/#shared-tasks (tłumaczenie mowy)\n",
"- CNLPS - Challenges for Natural Language Processing - https://fedcsis.org/sessions/aaia/cnlps"
"- IWSLT https://iwslt.org/2021/#shared-tasks (tłumaczenie mowy)"
]
},
{
@ -110,12 +108,11 @@
},
"source": [
"## Repozytoria/wyszukiwarki otwartych zbiorów danych\n",
"- Huggingface Datasets: https://huggingface.co/datasets\n",
"- Papers with code: https://paperswithcode.com/datasets\n",
"- UCI Machine Learning Repository: https://archive.ics.uci.edu/ml/ (University of California)\n",
"- UCI Machine Learning Repository: https://archive.ics.uci.edu/ml/\n",
"- Google dataset search: https://datasetsearch.research.google.com/\n",
"- Zbiory google:https://research.google/tools/datasets/\n",
"- Otwarte zbiory na Amazon AWS: https://registry.opendata.aws/\n",
"- https://registry.opendata.aws/\n",
" "
]
},
@ -129,11 +126,11 @@
"source": [
"## Otwarte zbiory\n",
"- Rozpoznawanie mowy:\n",
" - https://www.openslr.org/ - Libri Speech, TED Lium\n",
" - Mozilla Open Voice: https://commonvoice.mozilla.org/\n",
" - https://www.openslr.org/ - Libri Speech, TED Lium\n",
" - Mozilla Open Voice: https://commonvoice.mozilla.org/\n",
"- NLP:\n",
" - Clarin: https://clarin-pl.eu/index.php/zasoby/\n",
" - NKJP: http://nkjp.pl/\n",
" - Clarin PL: https://lindat.cz/repository/xmlui/\n",
" - Clarin: https://clarin-pl.eu/index.php/zasoby/\n",
" "
]
},
@ -146,22 +143,9 @@
},
"source": [
"## Crowdsourcing\n",
"- reCAPTCHA\n",
"<img src=\"img/ReCAPTCHA_idea.jpg\">\n",
"<img src=\"img/cat_captcha.png\">\n",
"\n",
"<sub>Źródło: https://pl.wikipedia.org/wiki/ReCAPTCHA#/media/Plik:ReCAPTCHA_idea.jpg</sub>"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"- Amazon Mechanical Turk: https://www.mturk.com/\n",
"- Yandex Toloka\n",
"- reCAPTCHA\n",
"<img src=\"img/Tuerkischer_schachspieler_windisch4.jpg\">\n",
"\n",
"<sub>Źródło: https://en.wikipedia.org/wiki/Mechanical_Turk#/media/File:Tuerkischer_schachspieler_windisch4.jpg</sub>"
@ -217,7 +201,13 @@
}
},
"source": [
"## Pobranie danych"
"## Inspekcja\n",
"- Zanim zaczniemy trenować model na danych, powinniśmy poznać ich specyfikę\n",
"- Pozwoli nam to:\n",
" - usunąć lub naprawić nieprawidłowe przykłady\n",
" - dokonać selekcji cech, których użyjemy w naszym modelu\n",
" - wybrać odpowiedni algorytm uczenia\n",
" - podjąć dezycję dotyczącą podziału zbioru i ewentualnej normalizacji\n"
]
},
{
@ -228,12 +218,15 @@
}
},
"source": [
"### Pobieranie z Kaggle"
"## Inspekcja\n",
"- Do inspekcji danych użyjemy popularnej biblioteki pythonowej Pandas: https://pandas.pydata.org/\n",
"- Do wizualizacji użyjemy biblioteki Seaborn: https://seaborn.pydata.org/index.html\n",
"- Służy ona do analizy i operowania na danych tabelarycznych jak i szeregach czasowych"
]
},
{
"cell_type": "code",
"execution_count": 1,
"execution_count": 12,
"metadata": {
"scrolled": true,
"slideshow": {
@ -245,33 +238,22 @@
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting kaggle\n",
" Downloading kaggle-1.5.13.tar.gz (63 kB)\n",
"\u001b[K |████████████████████████████████| 63 kB 558 kB/s eta 0:00:01\n",
"\u001b[?25hRequirement already satisfied: six>=1.10 in /home/tomek/miniconda3/lib/python3.9/site-packages (from kaggle) (1.16.0)\n",
"Requirement already satisfied: certifi in /home/tomek/miniconda3/lib/python3.9/site-packages (from kaggle) (2022.12.7)\n",
"Requirement already satisfied: python-dateutil in /home/tomek/miniconda3/lib/python3.9/site-packages (from kaggle) (2.8.2)\n",
"Requirement already satisfied: requests in /home/tomek/miniconda3/lib/python3.9/site-packages (from kaggle) (2.27.1)\n",
"Requirement already satisfied: tqdm in /home/tomek/miniconda3/lib/python3.9/site-packages (from kaggle) (4.64.0)\n",
"Collecting python-slugify\n",
" Downloading python_slugify-8.0.1-py2.py3-none-any.whl (9.7 kB)\n",
"Requirement already satisfied: urllib3 in /home/tomek/miniconda3/lib/python3.9/site-packages (from kaggle) (1.26.9)\n",
"Collecting text-unidecode>=1.3\n",
" Using cached text_unidecode-1.3-py2.py3-none-any.whl (78 kB)\n",
"Requirement already satisfied: idna<4,>=2.5 in /home/tomek/miniconda3/lib/python3.9/site-packages (from requests->kaggle) (3.3)\n",
"Requirement already satisfied: charset-normalizer~=2.0.0 in /home/tomek/miniconda3/lib/python3.9/site-packages (from requests->kaggle) (2.0.4)\n",
"Building wheels for collected packages: kaggle\n",
" Building wheel for kaggle (setup.py) ... \u001b[?25ldone\n",
"\u001b[?25h Created wheel for kaggle: filename=kaggle-1.5.13-py3-none-any.whl size=77733 sha256=83eee49596c7c76816c3bb9e8ffc0763b25e336457881b9790b9620548ae7297\n",
" Stored in directory: /home/tomek/.cache/pip/wheels/9c/45/15/6d6d116cd2539fb8f450d64b0aee4a480e5366bb11b42ac763\n",
"Successfully built kaggle\n",
"Installing collected packages: text-unidecode, python-slugify, kaggle\n",
"Successfully installed kaggle-1.5.13 python-slugify-8.0.1 text-unidecode-1.3\n",
"Requirement already satisfied: pandas in /home/tomek/miniconda3/lib/python3.9/site-packages (1.5.3)\n",
"Requirement already satisfied: numpy>=1.20.3 in /home/tomek/miniconda3/lib/python3.9/site-packages (from pandas) (1.24.2)\n",
"Requirement already satisfied: pytz>=2020.1 in /home/tomek/miniconda3/lib/python3.9/site-packages (from pandas) (2022.7.1)\n",
"Requirement already satisfied: python-dateutil>=2.8.1 in /home/tomek/miniconda3/lib/python3.9/site-packages (from pandas) (2.8.2)\n",
"Requirement already satisfied: six>=1.5 in /home/tomek/miniconda3/lib/python3.9/site-packages (from python-dateutil>=2.8.1->pandas) (1.16.0)\n"
"Requirement already satisfied: kaggle in /home/tomek/.local/lib/python3.8/site-packages (1.5.12)\n",
"Requirement already satisfied: python-dateutil in /home/tomek/anaconda3/lib/python3.8/site-packages (from kaggle) (2.8.1)\n",
"Requirement already satisfied: six>=1.10 in /home/tomek/anaconda3/lib/python3.8/site-packages (from kaggle) (1.15.0)\n",
"Requirement already satisfied: urllib3 in /home/tomek/anaconda3/lib/python3.8/site-packages (from kaggle) (1.25.11)\n",
"Requirement already satisfied: python-slugify in /home/tomek/.local/lib/python3.8/site-packages (from kaggle) (4.0.1)\n",
"Requirement already satisfied: certifi in /home/tomek/anaconda3/lib/python3.8/site-packages (from kaggle) (2020.6.20)\n",
"Requirement already satisfied: tqdm in /home/tomek/anaconda3/lib/python3.8/site-packages (from kaggle) (4.50.2)\n",
"Requirement already satisfied: requests in /home/tomek/anaconda3/lib/python3.8/site-packages (from kaggle) (2.24.0)\n",
"Requirement already satisfied: text-unidecode>=1.3 in /home/tomek/.local/lib/python3.8/site-packages (from python-slugify->kaggle) (1.3)\n",
"Requirement already satisfied: chardet<4,>=3.0.2 in /home/tomek/anaconda3/lib/python3.8/site-packages (from requests->kaggle) (3.0.4)\n",
"Requirement already satisfied: idna<3,>=2.5 in /home/tomek/anaconda3/lib/python3.8/site-packages (from requests->kaggle) (2.10)\n",
"Requirement already satisfied: pandas in /home/tomek/anaconda3/lib/python3.8/site-packages (1.1.3)\n",
"Requirement already satisfied: python-dateutil>=2.7.3 in /home/tomek/anaconda3/lib/python3.8/site-packages (from pandas) (2.8.1)\n",
"Requirement already satisfied: numpy>=1.15.4 in /home/tomek/anaconda3/lib/python3.8/site-packages (from pandas) (1.19.2)\n",
"Requirement already satisfied: pytz>=2017.2 in /home/tomek/anaconda3/lib/python3.8/site-packages (from pandas) (2020.1)\n",
"Requirement already satisfied: six>=1.5 in /home/tomek/anaconda3/lib/python3.8/site-packages (from python-dateutil>=2.7.3->pandas) (1.15.0)\n"
]
}
],
@ -281,21 +263,9 @@
"!pip install --user pandas"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
" - Pobierzemy zbiór Iris z Kaggle: https://www.kaggle.com/uciml/iris\n",
" - Licencja to \"Public Domain\", więc możemy z niego korzystać bez ograniczeń."
]
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": 61,
"metadata": {
"slideshow": {
"slide_type": "slide"
@ -306,11 +276,8 @@
"name": "stdout",
"output_type": "stream",
"text": [
"Downloading iris.zip to /home/tomek/repos/aitech-ium\r\n",
"\r",
" 0%| | 0.00/3.60k [00:00<?, ?B/s]\r\n",
"\r",
"100%|███████████████████████████████████████| 3.60k/3.60k [00:00<00:00, 438kB/s]\r\n"
"Warning: Your Kaggle API key is readable by other users on this system! To fix this, you can run 'chmod 600 /home/tomek/.kaggle/kaggle.json'\n",
"iris.zip: Skipping, found more recently modified local copy (use --force to force download)\n"
]
}
],
@ -322,9 +289,8 @@
},
{
"cell_type": "code",
"execution_count": 8,
"execution_count": 14,
"metadata": {
"scrolled": true,
"slideshow": {
"slide_type": "slide"
}
@ -344,50 +310,9 @@
"!unzip -o iris.zip"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Inspekcja\n",
"- Zanim zaczniemy trenować model na danych, powinniśmy poznać ich specyfikę\n",
"- Pozwoli nam to:\n",
" - usunąć lub naprawić nieprawidłowe przykłady\n",
" - dokonać selekcji cech, których użyjemy w naszym modelu\n",
" - wybrać odpowiedni algorytm uczenia\n",
" - podjąć dezycję dotyczącą podziału zbioru i ewentualnej normalizacji\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Podstawowa inspekcja za pomocą narzędzi Bash"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"151 Iris.csv\r\n"
]
}
],
"source": [
"!wc -l Iris.csv"
]
},
{
"cell_type": "code",
"execution_count": 11,
"execution_count": 15,
"metadata": {
"slideshow": {
"slide_type": "slide"
@ -410,88 +335,9 @@
"!head -n 5 Iris.csv"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"```less Iris.csv```"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Inspekcja\n",
"- Do inspekcji danych użyjemy popularnej biblioteki pythonowej Pandas: https://pandas.pydata.org/\n",
"- Do wizualizacji użyjemy biblioteki Seaborn: https://seaborn.pydata.org/index.html\n",
"- Służy ona do analizy i operowania na danych tabelarycznych jak i szeregach czasowych"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: pandas in /home/tomek/miniconda3/lib/python3.9/site-packages (1.5.3)\n",
"Requirement already satisfied: python-dateutil>=2.8.1 in /home/tomek/miniconda3/lib/python3.9/site-packages (from pandas) (2.8.2)\n",
"Requirement already satisfied: pytz>=2020.1 in /home/tomek/miniconda3/lib/python3.9/site-packages (from pandas) (2022.7.1)\n",
"Requirement already satisfied: numpy>=1.20.3 in /home/tomek/miniconda3/lib/python3.9/site-packages (from pandas) (1.24.2)\n",
"Requirement already satisfied: six>=1.5 in /home/tomek/miniconda3/lib/python3.9/site-packages (from python-dateutil>=2.8.1->pandas) (1.16.0)\n",
"Collecting seaborn\n",
" Downloading seaborn-0.12.2-py3-none-any.whl (293 kB)\n",
"\u001b[K |████████████████████████████████| 293 kB 694 kB/s eta 0:00:01\n",
"\u001b[?25hCollecting matplotlib!=3.6.1,>=3.1\n",
" Downloading matplotlib-3.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.6 MB)\n",
"\u001b[K |████████████████████████████████| 11.6 MB 253 kB/s eta 0:00:01 |██████▊ | 2.4 MB 396 kB/s eta 0:00:24\n",
"\u001b[?25hRequirement already satisfied: pandas>=0.25 in /home/tomek/miniconda3/lib/python3.9/site-packages (from seaborn) (1.5.3)\n",
"Requirement already satisfied: numpy!=1.24.0,>=1.17 in /home/tomek/miniconda3/lib/python3.9/site-packages (from seaborn) (1.24.2)\n",
"Requirement already satisfied: packaging>=20.0 in /home/tomek/miniconda3/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (23.0)\n",
"Requirement already satisfied: python-dateutil>=2.7 in /home/tomek/miniconda3/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (2.8.2)\n",
"Requirement already satisfied: importlib-resources>=3.2.0 in /home/tomek/miniconda3/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (5.12.0)\n",
"Collecting contourpy>=1.0.1\n",
" Downloading contourpy-1.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (299 kB)\n",
"\u001b[K |████████████████████████████████| 299 kB 613 kB/s eta 0:00:01\n",
"\u001b[?25hCollecting pyparsing>=2.3.1\n",
" Using cached pyparsing-3.0.9-py3-none-any.whl (98 kB)\n",
"Collecting fonttools>=4.22.0\n",
" Downloading fonttools-4.39.0-py3-none-any.whl (1.0 MB)\n",
"\u001b[K |████████████████████████████████| 1.0 MB 556 kB/s eta 0:00:01\n",
"\u001b[?25hCollecting cycler>=0.10\n",
" Downloading cycler-0.11.0-py3-none-any.whl (6.4 kB)\n",
"Collecting pillow>=6.2.0\n",
" Downloading Pillow-9.4.0-cp39-cp39-manylinux_2_28_x86_64.whl (3.4 MB)\n",
"\u001b[K |████████████████████████████████| 3.4 MB 664 kB/s eta 0:00:01\n",
"\u001b[?25hCollecting kiwisolver>=1.0.1\n",
" Downloading kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (1.6 MB)\n",
"\u001b[K |████████████████████████████████| 1.6 MB 1.0 MB/s eta 0:00:01\n",
"\u001b[?25hRequirement already satisfied: zipp>=3.1.0 in /home/tomek/miniconda3/lib/python3.9/site-packages (from importlib-resources>=3.2.0->matplotlib!=3.6.1,>=3.1->seaborn) (3.15.0)\n",
"Requirement already satisfied: pytz>=2020.1 in /home/tomek/miniconda3/lib/python3.9/site-packages (from pandas>=0.25->seaborn) (2022.7.1)\n",
"Requirement already satisfied: six>=1.5 in /home/tomek/miniconda3/lib/python3.9/site-packages (from python-dateutil>=2.7->matplotlib!=3.6.1,>=3.1->seaborn) (1.16.0)\n",
"Installing collected packages: pyparsing, pillow, kiwisolver, fonttools, cycler, contourpy, matplotlib, seaborn\n",
"Successfully installed contourpy-1.0.7 cycler-0.11.0 fonttools-4.39.0 kiwisolver-1.4.4 matplotlib-3.7.1 pillow-9.4.0 pyparsing-3.0.9 seaborn-0.12.2\n"
]
}
],
"source": [
"!pip install --user pandas\n",
"!pip install --user seaborn"
]
},
{
"cell_type": "code",
"execution_count": 14,
"execution_count": 18,
"metadata": {
"slideshow": {
"slide_type": "slide"
@ -662,7 +508,7 @@
"[150 rows x 6 columns]"
]
},
"execution_count": 14,
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
@ -1143,395 +989,6 @@
"sns.pairplot(data=iris.drop(columns=[\"Id\"]), hue=\"Species\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Pobieranie z HuggingFace &#x1F917; Datasets\n",
" - Szukamy na https://huggingface.co/datasets/\n",
" - Klikamy w \"</> Use in datasets library\" i kopiujemy kod\n",
" - Instalujemy bibliotekę datasets"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting datasets\n",
" Downloading datasets-2.10.1-py3-none-any.whl (469 kB)\n",
"\u001b[K |████████████████████████████████| 469 kB 683 kB/s eta 0:00:01\n",
"\u001b[?25hCollecting responses<0.19\n",
" Downloading responses-0.18.0-py3-none-any.whl (38 kB)\n",
"Collecting xxhash\n",
" Downloading xxhash-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (212 kB)\n",
"\u001b[K |████████████████████████████████| 212 kB 866 kB/s eta 0:00:01\n",
"\u001b[?25hCollecting pyarrow>=6.0.0\n",
" Downloading pyarrow-11.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (34.9 MB)\n",
"\u001b[K |████████████████████████████████| 34.9 MB 956 kB/s eta 0:00:01\n",
"\u001b[?25hRequirement already satisfied: numpy>=1.17 in /home/tomek/miniconda3/lib/python3.9/site-packages (from datasets) (1.24.2)\n",
"Requirement already satisfied: requests>=2.19.0 in /home/tomek/miniconda3/lib/python3.9/site-packages (from datasets) (2.27.1)\n",
"Collecting aiohttp\n",
" Downloading aiohttp-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.0 MB)\n",
"\u001b[K |████████████████████████████████| 1.0 MB 859 kB/s eta 0:00:01\n",
"\u001b[?25hCollecting pyyaml>=5.1\n",
" Downloading PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (661 kB)\n",
"\u001b[K |████████████████████████████████| 661 kB 857 kB/s eta 0:00:01\n",
"\u001b[?25hCollecting huggingface-hub<1.0.0,>=0.2.0\n",
" Downloading huggingface_hub-0.13.2-py3-none-any.whl (199 kB)\n",
"\u001b[K |████████████████████████████████| 199 kB 866 kB/s eta 0:00:01\n",
"\u001b[?25hRequirement already satisfied: packaging in /home/tomek/miniconda3/lib/python3.9/site-packages (from datasets) (23.0)\n",
"Collecting multiprocess\n",
" Downloading multiprocess-0.70.14-py39-none-any.whl (132 kB)\n",
"\u001b[K |████████████████████████████████| 132 kB 1.0 MB/s eta 0:00:01\n",
"\u001b[?25hRequirement already satisfied: tqdm>=4.62.1 in /home/tomek/miniconda3/lib/python3.9/site-packages (from datasets) (4.64.0)\n",
"Requirement already satisfied: pandas in /home/tomek/miniconda3/lib/python3.9/site-packages (from datasets) (1.5.3)\n",
"Collecting fsspec[http]>=2021.11.1\n",
" Downloading fsspec-2023.3.0-py3-none-any.whl (145 kB)\n",
"\u001b[K |████████████████████████████████| 145 kB 1.0 MB/s eta 0:00:01\n",
"\u001b[?25hCollecting dill<0.3.7,>=0.3.0\n",
" Downloading dill-0.3.6-py3-none-any.whl (110 kB)\n",
"\u001b[K |████████████████████████████████| 110 kB 772 kB/s eta 0:00:01\n",
"\u001b[?25hRequirement already satisfied: attrs>=17.3.0 in /home/tomek/miniconda3/lib/python3.9/site-packages (from aiohttp->datasets) (22.2.0)\n",
"Collecting async-timeout<5.0,>=4.0.0a3\n",
" Using cached async_timeout-4.0.2-py3-none-any.whl (5.8 kB)\n",
"Collecting aiosignal>=1.1.2\n",
" Downloading aiosignal-1.3.1-py3-none-any.whl (7.6 kB)\n",
"Collecting yarl<2.0,>=1.0\n",
" Downloading yarl-1.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (264 kB)\n",
"\u001b[K |████████████████████████████████| 264 kB 1.1 MB/s eta 0:00:01\n",
"\u001b[?25hCollecting frozenlist>=1.1.1\n",
" Downloading frozenlist-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (158 kB)\n",
"\u001b[K |████████████████████████████████| 158 kB 1.2 MB/s eta 0:00:01\n",
"\u001b[?25hCollecting multidict<7.0,>=4.5\n",
" Downloading multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (114 kB)\n",
"\u001b[K |████████████████████████████████| 114 kB 997 kB/s eta 0:00:01\n",
"\u001b[?25hRequirement already satisfied: charset-normalizer<4.0,>=2.0 in /home/tomek/miniconda3/lib/python3.9/site-packages (from aiohttp->datasets) (2.0.4)\n",
"Requirement already satisfied: typing-extensions>=3.7.4.3 in /home/tomek/miniconda3/lib/python3.9/site-packages (from huggingface-hub<1.0.0,>=0.2.0->datasets) (4.5.0)\n",
"Collecting filelock\n",
" Downloading filelock-3.9.1-py3-none-any.whl (9.7 kB)\n",
"Requirement already satisfied: urllib3<1.27,>=1.21.1 in /home/tomek/miniconda3/lib/python3.9/site-packages (from requests>=2.19.0->datasets) (1.26.9)\n",
"Requirement already satisfied: certifi>=2017.4.17 in /home/tomek/miniconda3/lib/python3.9/site-packages (from requests>=2.19.0->datasets) (2022.12.7)\n",
"Requirement already satisfied: idna<4,>=2.5 in /home/tomek/miniconda3/lib/python3.9/site-packages (from requests>=2.19.0->datasets) (3.3)\n",
"Requirement already satisfied: python-dateutil>=2.8.1 in /home/tomek/miniconda3/lib/python3.9/site-packages (from pandas->datasets) (2.8.2)\n",
"Requirement already satisfied: pytz>=2020.1 in /home/tomek/miniconda3/lib/python3.9/site-packages (from pandas->datasets) (2022.7.1)\n",
"Requirement already satisfied: six>=1.5 in /home/tomek/miniconda3/lib/python3.9/site-packages (from python-dateutil>=2.8.1->pandas->datasets) (1.16.0)\n",
"Installing collected packages: multidict, frozenlist, yarl, async-timeout, aiosignal, pyyaml, fsspec, filelock, dill, aiohttp, xxhash, responses, pyarrow, multiprocess, huggingface-hub, datasets\n",
"Successfully installed aiohttp-3.8.4 aiosignal-1.3.1 async-timeout-4.0.2 datasets-2.10.1 dill-0.3.6 filelock-3.9.1 frozenlist-1.3.3 fsspec-2023.3.0 huggingface-hub-0.13.2 multidict-6.0.4 multiprocess-0.70.14 pyarrow-11.0.0 pyyaml-6.0 responses-0.18.0 xxhash-3.2.0 yarl-1.8.2\n"
]
}
],
"source": [
"#Instalujemy bibliotekę datasets\n",
"!python -m pip install datasets"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Found cached dataset csv (/home/tomek/.cache/huggingface/datasets/scikit-learn___csv/scikit-learn--iris-4e13227f45447466/0.0.0/6b34fb8fcf56f7c8ba51dc895bfa2bfbe43546f190a60fcf74bb5e8afdcc2317)\n",
"100%|██████████| 1/1 [00:00<00:00, 268.64it/s]\n"
]
}
],
"source": [
"from datasets import load_dataset\n",
"\n",
"iris_dataset = load_dataset(\"scikit-learn/iris\")"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"data": {
"text/plain": [
"DatasetDict({\n",
" train: Dataset({\n",
" features: ['Id', 'SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm', 'Species'],\n",
" num_rows: 150\n",
" })\n",
"})"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"iris_dataset"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"scrolled": true,
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"data": {
"text/plain": [
"Dataset({\n",
" features: ['Id', 'SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm', 'Species'],\n",
" num_rows: 150\n",
"})"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"iris_dataset[\"train\"]"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"scrolled": false,
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"data": {
"text/plain": [
"{'Id': 1,\n",
" 'SepalLengthCm': 5.1,\n",
" 'SepalWidthCm': 3.5,\n",
" 'PetalLengthCm': 1.4,\n",
" 'PetalWidthCm': 0.2,\n",
" 'Species': 'Iris-setosa'}"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"iris_dataset[\"train\"][0]"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"scrolled": true,
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Id</th>\n",
" <th>SepalLengthCm</th>\n",
" <th>SepalWidthCm</th>\n",
" <th>PetalLengthCm</th>\n",
" <th>PetalWidthCm</th>\n",
" <th>Species</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>5.1</td>\n",
" <td>3.5</td>\n",
" <td>1.4</td>\n",
" <td>0.2</td>\n",
" <td>Iris-setosa</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>4.9</td>\n",
" <td>3.0</td>\n",
" <td>1.4</td>\n",
" <td>0.2</td>\n",
" <td>Iris-setosa</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>4.7</td>\n",
" <td>3.2</td>\n",
" <td>1.3</td>\n",
" <td>0.2</td>\n",
" <td>Iris-setosa</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>4.6</td>\n",
" <td>3.1</td>\n",
" <td>1.5</td>\n",
" <td>0.2</td>\n",
" <td>Iris-setosa</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5</td>\n",
" <td>5.0</td>\n",
" <td>3.6</td>\n",
" <td>1.4</td>\n",
" <td>0.2</td>\n",
" <td>Iris-setosa</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>145</th>\n",
" <td>146</td>\n",
" <td>6.7</td>\n",
" <td>3.0</td>\n",
" <td>5.2</td>\n",
" <td>2.3</td>\n",
" <td>Iris-virginica</td>\n",
" </tr>\n",
" <tr>\n",
" <th>146</th>\n",
" <td>147</td>\n",
" <td>6.3</td>\n",
" <td>2.5</td>\n",
" <td>5.0</td>\n",
" <td>1.9</td>\n",
" <td>Iris-virginica</td>\n",
" </tr>\n",
" <tr>\n",
" <th>147</th>\n",
" <td>148</td>\n",
" <td>6.5</td>\n",
" <td>3.0</td>\n",
" <td>5.2</td>\n",
" <td>2.0</td>\n",
" <td>Iris-virginica</td>\n",
" </tr>\n",
" <tr>\n",
" <th>148</th>\n",
" <td>149</td>\n",
" <td>6.2</td>\n",
" <td>3.4</td>\n",
" <td>5.4</td>\n",
" <td>2.3</td>\n",
" <td>Iris-virginica</td>\n",
" </tr>\n",
" <tr>\n",
" <th>149</th>\n",
" <td>150</td>\n",
" <td>5.9</td>\n",
" <td>3.0</td>\n",
" <td>5.1</td>\n",
" <td>1.8</td>\n",
" <td>Iris-virginica</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>150 rows × 6 columns</p>\n",
"</div>"
],
"text/plain": [
" Id SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm \\\n",
"0 1 5.1 3.5 1.4 0.2 \n",
"1 2 4.9 3.0 1.4 0.2 \n",
"2 3 4.7 3.2 1.3 0.2 \n",
"3 4 4.6 3.1 1.5 0.2 \n",
"4 5 5.0 3.6 1.4 0.2 \n",
".. ... ... ... ... ... \n",
"145 146 6.7 3.0 5.2 2.3 \n",
"146 147 6.3 2.5 5.0 1.9 \n",
"147 148 6.5 3.0 5.2 2.0 \n",
"148 149 6.2 3.4 5.4 2.3 \n",
"149 150 5.9 3.0 5.1 1.8 \n",
"\n",
" Species \n",
"0 Iris-setosa \n",
"1 Iris-setosa \n",
"2 Iris-setosa \n",
"3 Iris-setosa \n",
"4 Iris-setosa \n",
".. ... \n",
"145 Iris-virginica \n",
"146 Iris-virginica \n",
"147 Iris-virginica \n",
"148 Iris-virginica \n",
"149 Iris-virginica \n",
"\n",
"[150 rows x 6 columns]"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.DataFrame(iris_dataset[\"train\"])"
]
},
{
"cell_type": "markdown",
"metadata": {
@ -1972,7 +1429,7 @@
" - Dane dźwiękowe: normalizacja natężenia, rozdzielczości, częstotliwości próbkowania, ilości kanałów\n",
"- Poszerzanie (augumentacja) danych\n",
" - Generowanie nowych przykładów przez wprowadzanie szumu/przekształceń na originalnych danych\n",
" - np. dodanie echa do nagrania dźwiękowego, dodanie szumów do obrazka\n",
" - np. dodanie echa do nagrania dźwiękowego\n",
" - zmiana wartości cech o względnie małe, losowe wartości \n",
"- Over/under-sampling\n",
" - Algorymty uczące i metryki mogą być wrażliwe na niezbalansowane klasy w zbiorze\n",
@ -1991,20 +1448,11 @@
"# Zadanie [5pkt]\n",
"- Wybierz jeden z ogólnodostępnych zbiorów danych. Będziesz na nim pracował do końca roku (oczywiście, zbiór można zmienić w trakcie, ale będzie się to wiązało z powtarzeniem pewnych działań, co prawdwa niezbyt kosztownych, ale jednak).\n",
"- Zbiór powinien być:\n",
" - nie za duży (max ~200 MB)\n",
" - nie za duży (max 10-20 MB)\n",
" - nie za mały (np. IRIS jest za mały ;))\n",
" - unikalny (każda osoba w grupie pracuje na innym zbiorze). W celu synchronizacji, wybrany przez siebie zbiór proszę zapisać tutaj: https://uam.sharepoint.com/:x:/r/sites/2023SL06-DIUMUI0LABInynieriauczeniamaszynowego-Grupa11/Shared%20Documents/General/IUM-2023-zapisy.xlsx?d=w49d444e07d864d2997ef7d72c5a47da0&csf=1&web=1&e=4XgO7A\n",
" - najlepiej, żeby był to zbiór zawierający dane w formie tekstowej, mogący posłużyć do zadania klasyfikacji lub rergesji - na takim zbiorze będzie łatwiej pracować niż np. na zbiorze obrazów albo dźwięków. Dzięki temu będziesz się mogła/mógł skupić na istocie tych zajęć."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
" - unikalny (każda osoba w grupie pracuje na innym zbiorze). W celu synchronizacji, wybrany przez siebie zbiór proszę zapisać tutaj: https://uam.sharepoint.com/:x:/s/2021SL06-DIUMUI0LABInynieriauczeniamaszynowego-Grupa11/EYhZK_aXp41BsIVS4K-L1V4B_vM2FjO5nJZMWv2QKXJolA?e=DKIS2O\n",
" - najlepiej, żeby był to zbiór zawierający dane w formie tekstowej, mogący posłużyć do zadania klasyfikacji lub rergesji - na takim zbiorze będzie łatwiej pracować niż np. na zbiorze obrazów albo dźwięków. Dzięki temu będziesz się mogła/mógł skupić na istocie tych zajęć.\n",
"\n",
"- Napisz skrypt, który:\n",
"1. Pobierze wybrany przez Ciebie zbiór\n",
"2. Jeśli brak w zbiorze gotowego podziału na podzbiory train/dev/test, to dokona takiego podziału\n",
@ -2018,7 +1466,7 @@
"- Skrypt możesz napisać w swoim ulubionym języku. Jedyne ograniczenie: ma działać pod Linuxem\n",
"- Wygodnie będzie stworzyć zeszyt Jupyter w tym celu (choć nie jest to konieczne)\n",
"- Stwórz na wydziałowym serwerze git (http://git.wmi.amu.edu.pl/) repozytorium \"ium_nrindeksu\" i umieść w nim stworzony skrypt\n",
"- Link do repozytorium wklej do arkusza ze zbiorami: https://uam.sharepoint.com/:x:/r/sites/2023SL06-DIUMUI0LABInynieriauczeniamaszynowego-Grupa11/Shared%20Documents/General/IUM-2023-zapisy.xlsx?d=w49d444e07d864d2997ef7d72c5a47da0&csf=1&web=1&e=4XgO7A"
"- Link do repozytorium wklej do arkusza ze zbiorami (https://uam.sharepoint.com/:x:/s/2021SL06-DIUMUI0LABInynieriauczeniamaszynowego-Grupa11/EYhZK_aXp41BsIVS4K-L1V4B_vM2FjO5nJZMWv2QKXJolA?e=DKIS2O)\n"
]
},
{
@ -2055,7 +1503,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.12"
"version": "3.9.1"
},
"slideshow": {
"slide_type": "slide"

View File

@ -12,7 +12,7 @@
"<div class=\"alert alert-block alert-info\">\n",
"<h1> Inżynieria uczenia maszynowego </h1>\n",
"<h2> 3. <i>System ciągłej integracji na przykładzie Jenkins</i> [laboratoria]</h2> \n",
"<h3> Tomasz Ziętkiewicz (2023)</h3>\n",
"<h3> Tomasz Ziętkiewicz (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
@ -27,7 +27,7 @@
},
"source": [
"## Ciągła integracja \n",
" - Jest to praktyka rozwoju projektów informatycznych polegająca na częstym włączaniu nowych zmian do głównej gałęzi (branch)\n",
" - Jest to praktyka rozwoju projektów informatycznych polegająca na bardzo częstym włączaniu nowych zmian do głównej gałęzi (branch)\n",
" - Dzięki jej stosowaniu nie dochodzi do konfliktów przy łączeniu (mergowaniu) gałęzi rozwojowej (feature branch) z główną (master)\n",
" - Żeby stosować tę technikę, zmiany muszą być za każdym razem przetestowane, we wspólnym środowisku, tak, żeby działały u innych deweloperów\n",
" - Stąd narodziła się potrzeba stosowania systemów automatycznej ciągłej integracji\n",
@ -104,7 +104,7 @@
" - **Job, aka. Pipleine (Projekt)** - podstawowa jednostka organizacji pracy wykonywanej przez Jenkinsa. \n",
" - Posiada swoją konfigurację, która określa jakie polecenia będą wykonywane w jego ramach. \n",
" - Jeden pipeline może być wykonany wiele razy, za każdym razem tworząc nowe *Zadanie* (*Build*). \n",
" Przykładowy pipeline: https://tzietkiewicz.vm.wmi.amu.edu.pl:8081/job/hello-world/\n",
" Przykładowy pipeline: https://tzietkiewicz.vm.wmi.amu.edu.pl:8080/job/hello-world/\n",
"<img src=\"IUM_03/pipeline.jpg\"/>\n"
]
},
@ -121,10 +121,10 @@
" - Unstable <img style=\"height: 30px;\" src=\"IUM_03/yellow.png\"/>\n",
" - Aborted <img style=\"height: 30px;\" src=\"IUM_03/aborted.png\"/>\n",
" - Failed <img style=\"height: 30px;\" src=\"IUM_03/red.png\"/>\n",
" Np: https://tzietkiewicz.vm.wmi.amu.edu.pl:8081/job/hello-world/2/\n",
" Np: https://tzietkiewicz.vm.wmi.amu.edu.pl:8080/job/hello-world/2/\n",
" - Śledzenie wyników działania buildu jak i debugowanie ewentualnych problemów ułatwiają:\n",
" - Wyjście z konsoli [(Console Output)](https://tzietkiewicz.vm.wmi.amu.edu.pl:8081/job/hello-world/10/console) - tutaj widać logi wypisywane zarówno przez polecenia/funkcje Jenkinsowe jak i standardowe wyjście / wyjście błędów wykonywanych poleceń systemowych\n",
" - Workspace - to katalog roboczy, w którym uruchamiane są polecenia. Tutaj zostaje sklonowane repozytorium (jeśli je klonujemy), tu wywoływane będę polecenia systemowe. Można je przeglądać z poziomu przeglądarki, np. [tutaj](https://tzietkiewicz.vm.wmi.amu.edu.pl:8081/job/hello-world-scripted/1/execution/node/3/ws/)\n",
" - Wyjście z konsoli [(Console Output)](https://tzietkiewicz.vm.wmi.amu.edu.pl:8080/job/hello-world/10/console) - tutaj widać logi wypisywane zarówno przez polecenia/funkcje Jenkinsowe jak i standardowe wyjście / wyjście błędów wykonywanych poleceń systemowych\n",
" - Workspace - to katalog roboczy, w którym uruchamiane są polecenia. Tutaj zostaje sklonowane repozytorium (jeśli je klonujemy), tu wywoływane będę polecenia systemowe. Można je przeglądać z poziomu przeglądarki, np. [tutaj](https://tzietkiewicz.vm.wmi.amu.edu.pl:8080/job/hello-world-scripted/1/execution/node/3/ws/)\n",
" - Każdy uruchomiony build można zatrzymać (abort) co powoduje zaprzestanie jego wykonywania\n",
" - Build zakończony można usunąć (np. jeśli przez przypadek wypisaliśmy na konsolę nasze hasło)"
]
@ -160,7 +160,7 @@
"source": [
"## Dokumentacja\n",
"- https://www.jenkins.io/doc/book/pipeline/\n",
"- \"Pipeline syntax\" na stronie każdego projektu, np: https://tzietkiewicz.vm.wmi.amu.edu.pl:8081/job/hello-world/pipeline-syntax/\n",
"- \"Pipeline syntax\" na stronie każdego projektu, np: https://tzietkiewicz.vm.wmi.amu.edu.pl:8080/job/hello-world/pipeline-syntax/\n",
"- Znaki zapytania <img style=\"height: 16px;\" src=\"IUM_03/help.png\"/> (W konfiguracji joba oraz w \"Pipeline Syntax\")"
]
},
@ -203,7 +203,7 @@
},
"source": [
"#### 1. Zaloguj się\n",
" - zaloguj się na https://tzietkiewicz.vm.wmi.amu.edu.pl:8081 za pomocą konta wydziałowego (jak w laboratoriach WMI)"
" - zaloguj się na https://tzietkiewicz.vm.wmi.amu.edu.pl:8080 za pomocą konta wydziałowego (jak w laboratoriach WMI)"
]
},
{
@ -220,7 +220,7 @@
"\n",
" - Po kliknięciu \"Nowy projekt\" zobaczymy listę dostępnych rodzajów projektów. Nas interesuje projekt typu \"Pipeline\".\n",
"\n",
" - Jako nazwę wpisz \"z-s123456-create-dataset\" (w miejsce 123456 proszę wstawić swój numer indeksu)\n",
" - Jako nazwę wpisz \"s123456-create-dataset\" (w miejsce 123456 proszę wstawić swój numer indeksu)\n",
" "
]
},
@ -240,7 +240,7 @@
"\n",
" - Pierwszy z nich daje większe możliwości, drugi jest łatwiejszy, lepiej udokumentowany, ale ma mniejszą siłę ekpresji.\n",
"\n",
" - Fragmenty kodu można również generować przy pomocy kreatora, dostępnego pod linkiem [Pipeline syntax](https://tzietkiewicz.vm.wmi.amu.edu.pl:8081/job/hello-world/pipeline-syntax/) na stronie każdego projektu. Jest to bardzo przydatna funkcjonalność, nie tylko dla początkujących użytkowników\n",
" - Fragmenty kodu można również generować przy pomocy kreatora, dostępnego pod linkiem [Pipeline syntax](https://tzietkiewicz.vm.wmi.amu.edu.pl:8080/job/hello-world/pipeline-syntax/) na stronie każdego projektu. Jest to bardzo przydatna funkcjonalność, nie tylko dla początkujących użytkowników\n",
"\n",
" - Jenkinsfile może być wprowadzony bezpośrednio z poziomu przeglądarki, albo pobrany z repozytorium.\n",
"\n",
@ -258,7 +258,7 @@
}
},
"source": [
"Przykładowy declarative Pipeline (https://tzietkiewicz.vm.wmi.amu.edu.pl:8081/job/hello-world/):\n",
"Przykładowy declarative Pipeline (https://tzietkiewicz.vm.wmi.amu.edu.pl:8080/job/hello-world/):\n",
"\n",
"```groovy\n",
"pipeline {\n",
@ -301,7 +301,7 @@
}
},
"source": [
"Przykładowy scripted Pipeline (https://tzietkiewicz.vm.wmi.amu.edu.pl:8081/job/hello-world-scripted/):\n",
"Przykładowy scripted Pipeline (https://tzietkiewicz.vm.wmi.amu.edu.pl:8080/job/hello-world-scripted/):\n",
"\n",
"```groovy\n",
"node {\n",
@ -396,13 +396,12 @@
"export KAGGLE_USERNAME=datadinosaur\n",
"export KAGGLE_KEY=xxxxxxxxxxxxxx\n",
" ```\n",
" - Jenkins natomiast umożliwia utworzenie parametru typu password, którego wartość nie jest nigdzie zapisywana (wartości pozostałych parametrów są zapisywane w zakładce \"Parameters\" każdego build-a, np. [tutaj](https://tzietkiewicz.vm.wmi.amu.edu.pl:8081/job/hello-world-scripted/1/parameters/)\n",
" - Jenkins natomiast umożliwia utworzenie parametru typu password, którego wartość nie jest nigdzie zapisywana (wartości pozostałych parametrów są zapisywane w zakładce \"Parameters\" każdego build-a, np. [tutaj](https://tzietkiewicz.vm.wmi.amu.edu.pl:8080/job/hello-world-scripted/1/parameters/)\n",
" - konstukcja `withEnv` w Jenkinsfile, pozwala wywołać wszystkie otoczone nią polecenia z wyeksportowanymi wartościami zmiennych systemowych. Pozwala to np. przekazać wartości parametrów zadania Jenkinsowego do shella (poleceń wywoływanych z `sh`). \n",
" - Zwróć jednak uwagę na to, w jaki sposób odwołujesz się do zmiennej z hasłem: https://www.jenkins.io/doc/book/pipeline/jenkinsfile/#string-interpolation !\n",
" - ten sam rezultat co przy wykorzystaniu `withEnv` można by osiągnąć wywołując: `sh \"KAGGLE_USERNAME=${params.KAGGLE_USERNAME} KAGGLE_KEY=${params.KAGGLE_KEY} kaggle datasets list`, ale ten pierwszy wydahe się bardziej elegancki\n",
" - Poniżej przykładowy projekt, który pokazuje jak wywołać Kaggle CLI używając hasła podanego w parametrach zadania:\n",
" \n",
"https://tzietkiewicz.vm.wmi.amu.edu.pl:8081/job/kaggle-CLI-example/\n",
"https://tzietkiewicz.vm.wmi.amu.edu.pl:8080/job/kaggle-CLI-example/\n",
"```groovy\n",
"node {\n",
" stage('Preparation') { \n",
@ -460,7 +459,7 @@
}
},
"source": [
"### 6. Statystki [5 pkt]\n",
"#### 6. Statystki [5 pkt]\n",
"Stwórz projekt (job) s123456-dataset-stats, który zrealizuje następujące kroki:\n",
" 1. Sklonuje repozytorium git \n",
" 2. Skopiuje zarchiwizowane pliki ze zbiorem danych z artefaktów projektu s123456-create-dataset\n",
@ -509,7 +508,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.16"
"version": "3.9.1"
},
"slideshow": {
"slide_type": "slide"

View File

@ -12,7 +12,7 @@
"<div class=\"alert alert-block alert-info\">\n",
"<h1> Inżynieria uczenia maszynowego </h1>\n",
"<h2> 4. <i>Konteneryzacja</i> [laboratoria]</h2> \n",
"<h3> Tomasz Ziętkiewicz (2022)</h3>\n",
"<h3> Tomasz Ziętkiewicz (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
@ -51,23 +51,13 @@
" - rozwój,\n",
" - uruchamianie\n",
" - i dostarczanie\n",
"aplikacji."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"aplikacji.\n",
"- Konteneryzacja to nie tylko Docker:\n",
" - chroot\n",
" - Solaris Containers\n",
" - LXC (Linux Containers)\n",
" - OpenVZ\n",
" - Windows containers"
" - Windows containers\n"
]
},
{
@ -127,7 +117,7 @@
}
},
"source": [
"### 1.3 Podstawowe polecenia\n",
"## 1.3 Podstawowe polecenia\n",
"- ```docker help [polecenie]``` - wyświetla listę dostępnych poleceń dockera lub opis podanego polecenia. Rozbudowana dokumentacja poleceń: https://docs.docker.com/engine/reference/commandline/docker/\n",
"- ```docker run``` - uruchamia istniejący obraz tworząc kontener. Przykładowe wywołania:\n",
" - ```docker run -i -t ubuntu```<br>\n",
@ -135,37 +125,16 @@
"\n",
" - ```docker run -p 8080:8080 jenkins/jenkins:lts```<br>\n",
" Uruchomi kontener z Jenkinsem, w wersji \"LTS\". Jeśli obraz Jenkins nie był wcześniej zbudowany/pobrany na lokalną maszynę, automatycznie zostanie pobrany z [Docker Hub](https://hub.docker.com/r/jenkins/jenkins).\n",
" Port 8080 konenera zostanie powiązany z portem 8080 hosta. Dzięki temu będziemy mogli w przeglądarce dostać się do Jenkinsa pod adresem http://localhost:8080"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
" Port 8080 konenera zostanie powiązany z portem 8080 hosta. Dzięki temu będziemy mogli w przeglądarce dostać się do Jenkinsa pod adresem http://localhost:8080\n",
" Ważne: po zatrzymaniu kontenera \n",
"- ```docker build [OPTIONS] PATH | URL | -``` - buduje obraz na podstawie pliku Dockerfile i kontekstu (plików dostępnych podczas budowania). Przykład:<br>\n",
" - ```docker build -t tzietkiewicz/helloworld:1.0 .```<br>\n",
" buduje obraz przekazując bieżący katalog (`.`) jako kontekst i korzystając z pliku Dockerfile znajdującego się tamże. Obraz zostanie otagowany (`-t`) tagiem `tzietkiewicz/helloworld` z wersją `1.0`"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
" buduje obraz przekazując bieżący katalog (`.`) jako kontekst i korzystając z pliku Dockerfile znajdującego się tamże. Obraz zostanie otagowany (`-t`) tagiem `tzietkiewicz/helloworld` z wersją `1.0`\n",
"- ```docker images``` - listuje dostępne lokalnie obrazy\n",
"- ```docker ps``` - listuje uruchomione/zatrzymane kontenery\n",
"- ```docker stop CONTAINER_ID``` - zatrzymuje kontener. Uruchomione w nim procesy zostają wyłączone (`SIGTERM` -> `SIGKILL`)\n",
"- ```docker start CONTAINER_ID``` - uruchamia ponownie kontener\n",
"- ```docker system df``` - pokazuje miejsce zajęte przez obrazy, kontenery i woluminy\n",
"- ```docker system prune``` - usuwa nieużywane obrazy i kontenery, zazwyczaj zwalniając sporo miejsca na dysku\n",
"- ```docker exec``` - "
"- ```docker system prune``` - usuwa nieużywane obrazy i kontenery, zazwyczaj zwalniając sporo miejsca na dysku"
]
},
{
@ -180,9 +149,7 @@
" - Poprzez terminal\n",
" - Poprzez `docker exec` - wywołanie polecenia w działającym kontenerze\n",
" - Poprzez port zmapowany przez flagę `-p` (np. REST API albo interfejs w przegląrce)\n",
" - Przez system plików: \n",
" - bind mount: podmontowanie katalogów hosta w kontenerze poprzez flagę `-v` [dokumentacja](https://docs.docker.com/engine/reference/commandline/run/#mount-volume--v---read-only)\n",
" - volumes: https://docs.docker.com/storage/volumes/"
" - Przez system plików: podmontowanie katalogów hosta w kontenerze poprzez flagę `-v` [dokumentacja](https://docs.docker.com/engine/reference/commandline/run/#mount-volume--v---read-only)"
]
},
{
@ -248,7 +215,7 @@
}
},
"source": [
"### Przykładowy Dockerfile:\n",
"Przykładowy Dockerfile:\n",
"```Dockerfile\n",
"# Nasz obraz będzie dzidziczył z obrazu Ubuntu w wersji latest\n",
"FROM ubuntu:latest\n",
@ -458,8 +425,8 @@
},
"source": [
"### 2.1 Jenkins - Terminologia (https://www.jenkins.io/doc/book/glossary/):\n",
" - **Controller**: The central, coordinating process which stores configuration, loads plugins, and renders the various user interfaces for Jenkins\n",
" - **Agent**: An agent is typically a machine, or container, which connects to a Jenkins controller and executes tasks when directed by the controller\n",
" - **Controller**: The central, coordinating process which stores configuration, loads plugins, and renders the various user interfaces for Jenkins\n",
" - **Master**: A deprecated term, synonymous with Controller.\n",
" - **Node**: A machine which is part of the Jenkins environment and capable of executing Pipelines or Projects. Both the Controller and Agents are considered to be Nodes.\n",
" - **Executor**: A slot for execution of work defined by a Pipeline or Project on a Node. A Node may have zero or more Executors configured which corresponds to how many concurrent Projects or Pipelines are able to execute on that Node."
@ -509,9 +476,7 @@
" ## 2.2 Docker w Jenkins\n",
" <img style=\"height: 100px;\" src=\"IUM_04/docker-jenkins.png\"/></b>\n",
"\n",
" - Jenkins posiada wygodną intergrację z Dockerem \n",
" - Umożliwia ona uruchamianie kroków (steps) wewnątrz kontera\n",
" - Obrazy mogą być automatycznie pobrane albo zbudowane na podstawie Dockerfile\n",
" \n",
" - Więcej informacji: https://www.jenkins.io/doc/book/pipeline/docker/"
]
},
@ -536,7 +501,7 @@
" }\n",
"```\n",
" - Declarative:\n",
" ```groovy\n",
" ```groovy\n",
" pipeline {\n",
" agent {\n",
" docker { image 'ubuntu:latest' }\n",
@ -577,7 +542,7 @@
" }\n",
"```\n",
" - Declarative:\n",
" ```groovy\n",
" ```groovy\n",
" pipeline {\n",
" agent { \n",
" dockerfile true \n",
@ -606,7 +571,10 @@
" Skorzystaj z mechanizmu tworzącego kontener bezpośrednio na Jenkinsie wprost z pliku Dockerfile.\n",
"\n",
"2. Zmodyfikuj stworzony na poprzednich (3.) zajęciach Jenkinsfile opisujący pipeline \"s123456-dataset-stats\" tak, żeby wywoływać w nim skrypty stworzone na zajęciach 2., w środku kontenera stworzonego w zadaniu 2.<br>\n",
" Skorzystaj z mechanizmu wykorzystującego gotowy obraz (ściągany z Docker Hub)"
" Skorzystaj z mechanizmu wykorzystującego gotowy obraz (lokalny, albo ściągany z Docker Hub)\n",
"\n",
"### Termin\n",
"Termin na oddanie obu zadań (zadanie 2. i zadanie 3.): 11 IV"
]
}
],
@ -630,7 +598,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.12"
"version": "3.9.1"
},
"slideshow": {
"slide_type": "slide"

View File

@ -12,7 +12,7 @@
"<div class=\"alert alert-block alert-info\">\n",
"<h1> Inżynieria uczenia maszynowego </h1>\n",
"<h2> 5. <i>Biblioteki Deep Learning</i> [laboratoria]</h2> \n",
"<h3> Tomasz Ziętkiewicz (2022)</h3>\n",
"<h3> Tomasz Ziętkiewicz (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
@ -294,14 +294,13 @@
"source": [
"## Zadanie [22 pkt.]\n",
"\n",
"Termin: 2023-05-12\n",
"Termin: 2 tygodnie (25 IV)\n",
"\n",
"1. 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.\n",
" - wczytaj dane trenujące z pliku [2 pkt.]\n",
" - wytrenuj na nich model [6 pkt.]\n",
" - zapisz model do pliku [2 pkt.]\n",
" - w osobnym skypcie, przy pomocy zapisanego wcześniej modelu, dokonaj predykcji na danych ze zbioru testującego [8 pkt.]\n",
" - zapisz wyniki predykcji zwrócone przez model do pliku (nie metryki, tylko wyniki predykcji, czyli te informacje, które model miał przewidzieć) [2 pkt.]<br>\n",
" - wytrenuj na nich model [8 pkt.]\n",
" - przy jego pomocy dokonaj klasyfikacji/regresji na danych ze zbioru testującego [8 pkt.]\n",
" - zapisz wyniki zwrócone przez model do pliku [2 pkt.]<br>\n",
" Uwagi:\n",
" - wyniki nie są najważniejsze - o ile twój model nie zwraca losowych danych ;)\n",
" - nie musisz wnikać głęboko w szczegóły trenowania modelu i inferencji. W tym zadaniu chodzi o poznanie API i praktycznych aspektów\n",
@ -332,7 +331,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.12"
"version": "3.9.1"
},
"slideshow": {
"slide_type": "slide"

View File

@ -8,11 +8,11 @@
}
},
"source": [
"## ![Logo 1](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech1.jpg)\n",
"![Logo 1](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech1.jpg)\n",
"<div class=\"alert alert-block alert-info\">\n",
"<h1> Inżynieria uczenia maszynowego </h1>\n",
"<h2> 6. <i>Jenkins, część 2.</i> [laboratoria]</h2> \n",
"<h3> Tomasz Ziętkiewicz (2022)</h3>\n",
"<h3> Tomasz Ziętkiewicz (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
@ -172,7 +172,7 @@
"emailext body: 'Test Message', subject: 'Test Subject', to: 'test@example.com'\n",
"```\n",
"- Microsoft Teams ma swój własny plugin do powiadomień (https://plugins.jenkins.io/Office-365-Connector/), ale jest on zablokowany od strony Teams przez administratorów\n",
"- Na szczęście, kanały Teams mają swój adres email. Adres stworzonego przeze mnie kanału [\"IUM powiadomienia z Jenkins\"](https://teams.microsoft.com/l/channel/19%3a503542f4a8b449f79ba1bd42348c4da1%40thread.tacv2/IUM%2520powiadomienia%2520z%2520Jenkins?groupId=39ed4bde-b916-4da3-921c-92d3c25f1f04&tenantId=73689ee1-b42f-4e25-a5f6-66d1f29bc092) na naszej grupie zajęciowej: e19191c5.uam.onmicrosoft.com@emea.teams.ms\n",
"- Na szczęście, kanały Teams mają swój adres email. Adres stworzonego przeze mnie kanału \"Powiadomienia z Jenkins\" na naszej grupie zajęciowej: 26ab8f35.uam.onmicrosoft.com@emea.teams.ms\n",
"- Wysłanie na niego wiadomości email spowoduje pojawienie się jej na tym kanale"
]
},
@ -184,12 +184,12 @@
}
},
"source": [
"## Zadanie 1 [5 pkt] (termin: 2023-05-12)\n",
"## Zadanie 1 [5 pkt] (termin: 2 V 2021)\n",
"1. Stwórz na Jenkins projekt typu Multibranch pipeline o nazwie s123456-training\n",
" Projekt ten powinien przeprowadzać trenowanie modelu korzystając z kodu przygotowanego na poprzednich zajęciach. Trenowanie powinno odbywać się wewnątrz kontenera docker. [2 pkt]\n",
" Projekt ten powinien przeprowadzać trenowanie modelu korzystając z kodu przygotowanego na poprzednich zajęciach. Trenowanie powinno odbywać się wewnątrz kontenera docker. [1 pkt]\n",
"2. Projekt powinien odpalać się automatycznie po zakończonym budowaniu projektu s123456-create-dataset i kopiować z niego zbiór danych [1 pkt]\n",
"3. Po zakończeniu trenowania powstały model powinien zostać zarchiwizowany [1 pkt]\n",
"<!--4. Trenowanie modelu potrafi zająć bardzo dużo czasu. Sprawdzanie co 10 minut, czy już się zakończyło, to zły pomysł. Dodaj powiadomienie (wysyłane przez email na Teamsowy kanał \"Powiadomienia z Jenkins\") o zakończonym jobie zawierające rezultat (Status builda - successfull, failed, aborted itd) [1 pkt]-->\n",
"4. Trenowanie modelu potrafi zająć bardzo dużo czasu. Sprawdzanie co 10 minut, czy już się zakończyło, to zły pomysł. Dodaj powiadomienie (wysyłane przez email na Teamsowy kanał \"Powiadomienia z Jenkins\") o zakończonym jobie zawierające rezultat (Status builda - successfull, failed, aborted itd) [1 pkt]\n",
"5. Dodaj parametr umożliwiający przekazanie do skryptu trenującego parametrów trenowania. Najprościej zrobić to dodając parametr typu String i doklejać jego wartość do wywołania skryptu trenującego. [1 pkt]"
]
},
@ -201,30 +201,24 @@
}
},
"source": [
"## Zadanie 2 [15 pkt] (termin: 2023-05-12)\n",
"1. Stwórz na Jenkins projekt typu Multibranch pipeline o nazwie s123456-evaluation.eg\n",
" Projekt ten będzie przeprowadzał ewaluację modelu stworzonego w s123456-training na danych ze zbioru testującego [1 pkt]\n",
"2. Ewaluacja polega na:\n",
" - skopiowanie modelu z artefaktu z projektu training\n",
" - wczytaniu tego modelu\n",
" - dokonaniu predykcji na zbiorze testowym za pomocą wczytanego modelu i zapisanie wyników tej predykcji do pliku\n",
" - wyliczeniu zbiorczych metryk (1-3 metryki) na zbiorze testującym (np. Accuracy, Micro-avg precission/recall, F1, RMSE - patrz [wykład 4. \"Metody ewaluacji\"])(https://git.wmi.amu.edu.pl/AITech/aitech-uma/src/branch/master/wyk/04_Metody_ewaluacji.ipynb) z przedmiotu Uczenie Maszynowe), \n",
" - zapisaniu metryk do pliku\n",
" - zarchiwizowaniu go\n",
" [6 pkt]\n",
"## Zadanie 2 [15 pkt] (termin: 2 V 2021)\n",
"1. Stwórz na Jenkins projekt typu Multibranch pipeline o nazwie s123456-evaluation.\n",
" Projekt ten będzie przeprowadzał ewaluację modelu stworzonego w s123456-training na danych ze zbioru trenującego [1pkt]\n",
"2. Ewaluacja polega na wyliczeniu zbiorczych metryk (1-3 metryki) na zbiorze testującym (np. Accuracy, Micro-avg precission/recall, F1, RMSE - patrz [wykład 4. \"Metody ewaluacji\"])(https://git.wmi.amu.edu.pl/AITech/aitech-uma/src/branch/master/wyk/04_Metody_ewaluacji.ipynb) z przedmiotu Uczenie Maszynowe), zapisaniu metryk(i( do pliku i zarchiwizowaniu go [3 pkt]\n",
"3. W celu śledzenia zmian wartości metryk, zapisuj wartości kumulatywnie w jednym pliku. Żeby to osiągnąć można: \n",
" - zapisywać metryki w ścieżce zewnątrznej w stosunku do Jenkinsa (w innym przypadku mogą zostać nadpisane np. podczas checkout repozytorium) - tej opcji nie wykorzystamy\n",
" - dopisywać metrykę do końca pliku skopiowanego z artefaktów poprzedniego builda (należy uczynić kopiowanie tego artefaktu opcjonalnym, żeby pierwszt build na danym branchu nie \"wywalił się\" przy próbie skopiowania artefaktów z nieistniejącego joba) [2 pkt]\n",
"4. Mając skumulowane wartości metryk z wszystkich dotychczasowych buildów, stwórz wykres: na osi X numer builda, na osi Y wartość metryk(i). [2 pkt]\n",
"4. Mając skumulowane wartości metryk z wszystkich dotychczasowych buildów, stwórz wykres: na osi X numer builda, na osi Y wartość metryk(i). [3 pkt]\n",
" Możesz w tym celu użyć:\n",
" - pluginu [plot](https://plugins.jenkins.io/plot)\n",
" - [Matplotlib](https://matplotlib.org/) - biblioteka pythonowa - w tym przypadku archiwizuj wygenerowany obrazek z wykresem\n",
" - [Gnuplot](http://www.gnuplot.info/) - w tym przypadku archiwizuj wygenerowany obrazek z wykresem\n",
"5. Projekt powinien odpalać się automatycznie po zakończonym trenowaniu (s123456-training) i kopiować model z artefaktów. Zauważ, że żeby odpalony projekt (s123456-evaluation) skopiował artefakty z odpowiedniego brancha (tego, który go odpalił), projekt s123456-evaluation musi być wywołany przez s123456-training z odpowiednią wartością parametru branch (patrz punkt 7.) [1 pkt]\n",
"5. Projekt powinien odpalać się automatycznie po zakończonym trenowaniu (s123456-training) i kopiować model z artefaktów. Zauważ, że żeby odpalony projekt (s123456-evaluation) skopiował artefakty z odpowiedniego brancha (tego, który go odpalił), projekt s123456-evaluation musi być wywołany przez s123456-training z odpowiednią wartością parametru branch (patrz punkt 7.) [2pkt]\n",
"6. Dane testujące powinny być skopiowane z projektu s123456-create-dataset [1pkt]\n",
"7. Dodaj parametry umożliwiające wybór:\n",
" - gałęzi (branch) projektu s123456-training z której ma być skopiowany model. Można by tutaj użyć prostego parametru typu String, ale użyj łatwiejszego (w użytkowaniu) parametru typu \"Git parameter\" (patrz wyżej)[1 pkt]\n",
" - numeru builda projektu s123456-training (\"Build selector for Copy artifact\", patrz zajęcia 3.) [1pkt]"
" - numeru builda projektu s123456-training (\"Build selector for Copy artifact\", patrz zajęcia 3.) [1pkt]\n",
"8. Ewaluacja modelu potrafi zająć dużo czasu. Sprawdzanie co 10 minut, czy już się zakończyła, to zły pomysł. Dodaj powiadomienie o zakończonej ewaluacji zawierające status builda oraz wynik ewaluacji (wartość obliczonej metryki) [1 pkt]"
]
}
],
@ -248,7 +242,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.16"
"version": "3.9.1"
},
"slideshow": {
"slide_type": "slide"

View File

@ -12,7 +12,7 @@
"<div class=\"alert alert-block alert-info\">\n",
"<h1> Inżynieria uczenia maszynowego </h1>\n",
"<h2> 7. <i>Sacred</i> [laboratoria]</h2> \n",
"<h3> Tomasz Ziętkiewicz (2023)</h3>\n",
"<h3> Tomasz Ziętkiewicz (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
@ -35,21 +35,6 @@
" <cite>&mdash;https://github.com/IDSIA/sacred / [Sens życia według Monty Pythona](https://en.wikipedia.org/wiki/Every_Sperm_Is_Sacred) </cite>"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"- https://sacred.readthedocs.io/ - dokumentacja\n",
"- https://github.com/IDSIA/sacred - Github\n",
"- Open source\n",
"- Prosty w użyciu\n",
"- Wiele webowych frontendów"
]
},
{
"cell_type": "markdown",
"metadata": {
@ -115,7 +100,7 @@
},
{
"cell_type": "code",
"execution_count": 3,
"execution_count": 1,
"metadata": {
"slideshow": {
"slide_type": "slide"
@ -126,23 +111,41 @@
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: sacred in /home/tomek/miniconda3/lib/python3.9/site-packages (0.8.4)\n",
"Requirement already satisfied: jsonpickle>=1.2 in /home/tomek/miniconda3/lib/python3.9/site-packages (from sacred) (3.0.1)\n",
"Requirement already satisfied: colorama>=0.4 in /home/tomek/miniconda3/lib/python3.9/site-packages (from sacred) (0.4.6)\n",
"Requirement already satisfied: GitPython in /home/tomek/miniconda3/lib/python3.9/site-packages (from sacred) (3.1.31)\n",
"Requirement already satisfied: py-cpuinfo>=4.0 in /home/tomek/miniconda3/lib/python3.9/site-packages (from sacred) (9.0.0)\n",
"Requirement already satisfied: wrapt<2.0,>=1.0 in /home/tomek/miniconda3/lib/python3.9/site-packages (from sacred) (1.15.0)\n",
"Requirement already satisfied: munch<3.0,>=2.5 in /home/tomek/miniconda3/lib/python3.9/site-packages (from sacred) (2.5.0)\n",
"Requirement already satisfied: docopt<1.0,>=0.3 in /home/tomek/miniconda3/lib/python3.9/site-packages (from sacred) (0.6.2)\n",
"Requirement already satisfied: packaging>=18.0 in /home/tomek/miniconda3/lib/python3.9/site-packages (from sacred) (23.0)\n",
"Requirement already satisfied: six in /home/tomek/miniconda3/lib/python3.9/site-packages (from munch<3.0,>=2.5->sacred) (1.16.0)\n",
"Requirement already satisfied: gitdb<5,>=4.0.1 in /home/tomek/miniconda3/lib/python3.9/site-packages (from GitPython->sacred) (4.0.10)\n",
"Requirement already satisfied: smmap<6,>=3.0.1 in /home/tomek/miniconda3/lib/python3.9/site-packages (from gitdb<5,>=4.0.1->GitPython->sacred) (5.0.0)\n"
"Collecting sacred\n",
" Downloading sacred-0.8.2-py2.py3-none-any.whl (106 kB)\n",
"\u001b[K |████████████████████████████████| 106 kB 1.7 MB/s eta 0:00:01\n",
"\u001b[?25hRequirement already satisfied: packaging>=18.0 in /media/tomek/Linux_data/home/tomek/anaconda3/lib/python3.8/site-packages (from sacred) (20.4)\n",
"Collecting jsonpickle<2.0,>=1.2\n",
" Downloading jsonpickle-1.5.2-py2.py3-none-any.whl (37 kB)\n",
"Requirement already satisfied: GitPython in /media/tomek/Linux_data/home/tomek/anaconda3/lib/python3.8/site-packages (from sacred) (3.1.14)\n",
"Collecting munch<3.0,>=2.0.2\n",
" Downloading munch-2.5.0-py2.py3-none-any.whl (10 kB)\n",
"Collecting py-cpuinfo>=4.0\n",
" Downloading py-cpuinfo-8.0.0.tar.gz (99 kB)\n",
"\u001b[K |████████████████████████████████| 99 kB 2.7 MB/s eta 0:00:011\n",
"\u001b[?25hCollecting docopt<1.0,>=0.3\n",
" Downloading docopt-0.6.2.tar.gz (25 kB)\n",
"Requirement already satisfied: wrapt<2.0,>=1.0 in /media/tomek/Linux_data/home/tomek/anaconda3/lib/python3.8/site-packages (from sacred) (1.11.2)\n",
"Requirement already satisfied: colorama>=0.4 in /media/tomek/Linux_data/home/tomek/anaconda3/lib/python3.8/site-packages (from sacred) (0.4.4)\n",
"Requirement already satisfied: pyparsing>=2.0.2 in /media/tomek/Linux_data/home/tomek/anaconda3/lib/python3.8/site-packages (from packaging>=18.0->sacred) (2.4.7)\n",
"Requirement already satisfied: six in /media/tomek/Linux_data/home/tomek/anaconda3/lib/python3.8/site-packages (from packaging>=18.0->sacred) (1.15.0)\n",
"Requirement already satisfied: gitdb<5,>=4.0.1 in /media/tomek/Linux_data/home/tomek/anaconda3/lib/python3.8/site-packages (from GitPython->sacred) (4.0.5)\n",
"Requirement already satisfied: smmap<4,>=3.0.1 in /media/tomek/Linux_data/home/tomek/anaconda3/lib/python3.8/site-packages (from gitdb<5,>=4.0.1->GitPython->sacred) (3.0.5)\n",
"Building wheels for collected packages: py-cpuinfo, docopt\n",
" Building wheel for py-cpuinfo (setup.py) ... \u001b[?25ldone\n",
"\u001b[?25h Created wheel for py-cpuinfo: filename=py_cpuinfo-8.0.0-py3-none-any.whl size=22245 sha256=556a8ea1e899c40b6266eab7562141327aecacfb2cdb6509279a85c91bf729b2\n",
" Stored in directory: /home/tomek/.cache/pip/wheels/57/cb/6d/bab2257f26c5be4a96ff65c3d2a7122c96529b73773ee37f36\n",
" Building wheel for docopt (setup.py) ... \u001b[?25ldone\n",
"\u001b[?25h Created wheel for docopt: filename=docopt-0.6.2-py2.py3-none-any.whl size=13704 sha256=a9cd4cc934499c413a39353a865132382f2f2b230f614d2a2a495b1ccc0b2dd4\n",
" Stored in directory: /home/tomek/.cache/pip/wheels/56/ea/58/ead137b087d9e326852a851351d1debf4ada529b6ac0ec4e8c\n",
"Successfully built py-cpuinfo docopt\n",
"Installing collected packages: jsonpickle, munch, py-cpuinfo, docopt, sacred\n",
"Successfully installed docopt-0.6.2 jsonpickle-1.5.2 munch-2.5.0 py-cpuinfo-8.0.0 sacred-0.8.2\n"
]
}
],
"source": [
"!pip3 install sacred"
"!pip install sacred"
]
},
{
@ -158,23 +161,15 @@
},
{
"cell_type": "code",
"execution_count": 4,
"execution_count": null,
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Overwriting sacred_hello.py\n"
]
}
],
"outputs": [],
"source": [
"%%writefile sacred_hello.py\n",
"# %load sacred_hello.py\n",
"from sacred import Experiment\n",
"\n",
"ex = Experiment()\n",
@ -186,10 +181,10 @@
},
{
"cell_type": "code",
"execution_count": 5,
"execution_count": 13,
"metadata": {
"slideshow": {
"slide_type": "fragment"
"slide_type": "slide"
}
},
"outputs": [
@ -206,7 +201,7 @@
}
],
"source": [
"!python3 IUM_07/sacred_hello.py"
"!python IUM_07/sacred_hello.py"
]
},
{
@ -219,7 +214,7 @@
"source": [
"##### Co się dzieje w kodzie powyżej?\n",
"1. Tworzymy obiekt klasy Experiment\n",
"2. Dekorujemy funkcję \"my_main\" dekoratorem [automain](https://sacred.readthedocs.io/en/stable/apidoc.html#sacred.Experiment.automain)\n",
"2. Dekorujemy funkcję \"ma_main\" dekoratorem [automain](https://sacred.readthedocs.io/en/stable/apidoc.html#sacred.Experiment.automain)\n",
" Dzięki temu:\n",
" - otrzymujemy interfejs CLI, m.in. do kontrolowania poziomu logowania, przekazywania parametrów itp.\n",
" - oznaczamy funkcję \"my_main\" jako główną funkcję, która będzie wywoływana podczas wykonywania eksperymentu\n",
@ -240,10 +235,10 @@
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": 9,
"metadata": {
"slideshow": {
"slide_type": "fragment"
"slide_type": "slide"
}
},
"outputs": [
@ -278,7 +273,6 @@
" -f --force Disable warnings about suspicious changes for\r\n",
" this run.\r\n",
" -h --help Print this help message and exit.\r\n",
" -i VALUE --id=VALUE Set the id for this run.\r\n",
" -l VALUE --loglevel=VALUE Set the LogLevel. Loglevel either as 0 - 50 or\r\n",
" as string: DEBUG(10), INFO(20), WARNING(30),\r\n",
" ERROR(40), CRITICAL(50)\r\n",
@ -322,7 +316,7 @@
}
],
"source": [
"!python3 IUM_07/sacred_hello.py -h"
"!python IUM_07/sacred_hello.py -h"
]
},
{
@ -338,7 +332,7 @@
" - Ułatwiają przekazywanie parametrów - zmienne z konfiguracji są wstrzykiwane do funkcji wywoływanych \n",
" - Mogą być automatycznie zapisywane (dzięki czemu możemy śledzić jak zmieniały się parametry i jaki miały wpływ na wyniki)\n",
" - Konfigurację można stworzyć w jeden z 3 sposobów:\n",
" - używając config scopes (z dekoratorem `@config`)\n",
" - używając config scopes (zasięg konfiguracji)\n",
" - jako słownik\n",
" - wczytując ją z pliku"
]
@ -352,12 +346,12 @@
},
"source": [
"### Konfiguracje - config scopes\n",
"Jeśli oznaczymy jakąś funkcję dekoratorem `@config`, to zostanie ona uruchoniona przed wywołaniem eksperymentu i wszystkie jej lokalne zmienne, które da się zserializować jako json, zostaną dodane do konfiguracji. Potem ich wartości zostaną wstrzyknięte do innych funkcji wywoływanych w eksperymencie. "
"Jeśli oznaczymy jakąś funkcję dekoratorem `config`, to zostanie ona uruchoniona przed wywołaniem eksperymentu i wszystkie jej lokalne zmienne, które da sie zserializować jako json, zostaną dodane do konfiguracji. Potem ich wartości zostaną wstrzyknięte "
]
},
{
"cell_type": "code",
"execution_count": 8,
"execution_count": 91,
"metadata": {
"slideshow": {
"slide_type": "slide"
@ -370,7 +364,7 @@
"exint = Experiment(\"sacred_scopes\", interactive=True) #Jeśli wykonujemy interaktywnie (w konsoli Pythona albo w Jupyter):\n",
"# - musimy podać nazwę eksperymentu (domyślnie jako nazwa używana jest nazwa pliku źródłowego)\n",
"# - musimy dodać parametr \"interactive=True\"\n",
"# - zamiast dekoratora \"@ex.automain\" używamy \"@ex.main\"\n",
"# - zamiast \"automain\" używamy parametru \"main\"\n",
"\n",
"@exint.config\n",
"def my_config():\n",
@ -386,10 +380,10 @@
},
{
"cell_type": "code",
"execution_count": 9,
"execution_count": 92,
"metadata": {
"slideshow": {
"slide_type": "fragment"
"slide_type": "slide"
}
},
"outputs": [
@ -413,10 +407,10 @@
{
"data": {
"text/plain": [
"<sacred.run.Run at 0x7f89cc3175b0>"
"<sacred.run.Run at 0x7f423da33160>"
]
},
"execution_count": 9,
"execution_count": 92,
"metadata": {},
"output_type": "execute_result"
}
@ -438,10 +432,10 @@
},
{
"cell_type": "code",
"execution_count": 10,
"execution_count": 93,
"metadata": {
"slideshow": {
"slide_type": "fragment"
"slide_type": "slide"
}
},
"outputs": [
@ -451,7 +445,7 @@
"{'recipient': 'Świecie', 'greeting': 'Witaj', 'message': 'Witaj Świecie!'}"
]
},
"execution_count": 10,
"execution_count": 93,
"metadata": {},
"output_type": "execute_result"
}
@ -477,7 +471,7 @@
"execution_count": null,
"metadata": {
"slideshow": {
"slide_type": "fragment"
"slide_type": "slide"
}
},
"outputs": [],
@ -500,10 +494,10 @@
},
{
"cell_type": "code",
"execution_count": 14,
"execution_count": 88,
"metadata": {
"slideshow": {
"slide_type": "fragment"
"slide_type": "slide"
}
},
"outputs": [
@ -520,15 +514,15 @@
}
],
"source": [
"!python3 IUM_07/sacred_scopes.py with 'recipient=Przygodo'"
"!python IUM_07/sacred_scopes.py with 'recipient=Przygodo'"
]
},
{
"cell_type": "code",
"execution_count": 15,
"execution_count": 89,
"metadata": {
"slideshow": {
"slide_type": "fragment"
"slide_type": "slide"
}
},
"outputs": [
@ -542,21 +536,21 @@
" greeting = 'Witaj'\r\n",
" message = 'Witaj Świecie!'\r\n",
" recipient = 'Świecie'\r\n",
" seed = 269258424 \u001b[2m# the random seed for this experiment\u001b[0m\r\n",
" seed = 29744255 \u001b[2m# the random seed for this experiment\u001b[0m\r\n",
"INFO - sacred_scopes - Completed after 0:00:00\r\n"
]
}
],
"source": [
"!python3 IUM_07/sacred_scopes.py print_config"
"!python IUM_07/sacred_scopes.py print_config"
]
},
{
"cell_type": "code",
"execution_count": 16,
"execution_count": 90,
"metadata": {
"slideshow": {
"slide_type": "fragment"
"slide_type": "slide"
}
},
"outputs": [
@ -570,7 +564,7 @@
" greeting = 'Witaj'\r\n",
" message = 'Witaj Przygodo!'\r\n",
"\u001b[34m recipient = 'Przygodo'\u001b[0m\r\n",
" seed = 667939214 \u001b[2m# the random seed for this experiment\u001b[0m\r\n",
" seed = 215765170 \u001b[2m# the random seed for this experiment\u001b[0m\r\n",
"INFO - sacred_scopes - Completed after 0:00:00\r\n"
]
}
@ -595,7 +589,7 @@
"execution_count": null,
"metadata": {
"slideshow": {
"slide_type": "fragment"
"slide_type": "slide"
}
},
"outputs": [],
@ -609,7 +603,7 @@
},
{
"cell_type": "code",
"execution_count": 20,
"execution_count": 119,
"metadata": {
"slideshow": {
"slide_type": "slide"
@ -639,10 +633,10 @@
},
{
"cell_type": "code",
"execution_count": 21,
"execution_count": 120,
"metadata": {
"slideshow": {
"slide_type": "fragment"
"slide_type": "slide"
}
},
"outputs": [
@ -670,20 +664,20 @@
},
{
"cell_type": "code",
"execution_count": 22,
"execution_count": 121,
"metadata": {
"slideshow": {
"slide_type": "fragment"
"slide_type": "slide"
}
},
"outputs": [
{
"data": {
"text/plain": [
"{'recipient': 'samotności', 'greeting': 'Żegnaj', 'seed': 877272352}"
"{'recipient': 'samotności', 'greeting': 'Żegnaj', 'seed': 529757761}"
]
},
"execution_count": 22,
"execution_count": 121,
"metadata": {},
"output_type": "execute_result"
}
@ -705,10 +699,10 @@
},
{
"cell_type": "code",
"execution_count": 23,
"execution_count": 124,
"metadata": {
"slideshow": {
"slide_type": "fragment"
"slide_type": "slide"
}
},
"outputs": [
@ -742,16 +736,16 @@
}
},
"source": [
"#### Wstrzykiwanie zależności\n",
"#### Wtrzykiwanie zależności\n",
" - Oprócz funkcji głównej, wartości z konfiguracji są też wstrzykiwane do funkcji udekorowanych dekoratorem `@ex.capture`\n",
" - Możemy korzystać w nich ze specjalnych parametrów, np.:\n",
" - Możemy skorzystać w nich ze specjalnych parametrów, np.:\n",
" - `_log` - daje nam dostęp do obiektu logera (więcej: [logowanie](https://sacred.readthedocs.io/en/stable/logging.html))\n",
" - `_run` - daje dostęp do obiektu reprezentującego aktualne wywołanie eksperymentu (przykład później)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"execution_count": 193,
"metadata": {
"slideshow": {
"slide_type": "slide"
@ -779,10 +773,10 @@
{
"data": {
"text/plain": [
"<sacred.run.Run at 0x7f89a0db5550>"
"<sacred.run.Run at 0x7f423c40d820>"
]
},
"execution_count": 24,
"execution_count": 193,
"metadata": {},
"output_type": "execute_result"
}
@ -826,30 +820,8 @@
" - podstawowe informacje o środowisku (maszynie), na której przeprowadzono eksperyment\n",
" - użyte pliki źródłowe\n",
" - użyte zależności i ich wersje\n",
" - pliki otwarte za pomocą [ex.open_resource()](https://sacred.readthedocs.io/en/stable/apidoc.html#sacred.Experiment.open_resource) albo [ex.add_resource()](https://sacred.readthedocs.io/en/stable/apidoc.html#sacred.Experiment.add_resource)\n",
" - pliki dodane za pomocą [ex.add_artifact()](https://sacred.readthedocs.io/en/stable/apidoc.html#sacred.run.Run.add_artifact)"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"total 20\r\n",
"drwsrwsr-t 2 tomek tomek 4096 May 28 2022 1\r\n",
"drwsrwsr-t 2 tomek tomek 4096 May 28 2022 2\r\n",
"drwxr-sr-x 2 tomek tomek 4096 Apr 12 15:11 3\r\n",
"drwxr-sr-x 2 tomek tomek 4096 Apr 12 15:11 _resources\r\n",
"drwsrwsr-t 2 tomek tomek 4096 May 28 2022 _sources\r\n"
]
}
],
"source": [
"!ls -l my_runs"
" - pliki otwarte za pomocą ex.open_resource\n",
" - pliki dodane za pomocą ex.add_artifact"
]
},
{
@ -895,7 +867,7 @@
},
"outputs": [],
"source": [
"%%writefile IUM_07/file_observer.py\n",
"# %load IUM_07/file_observer.py\n",
"from sacred.observers import FileStorageObserver\n",
"from sacred import Experiment\n",
"\n",
@ -919,10 +891,10 @@
},
{
"cell_type": "code",
"execution_count": 29,
"execution_count": 159,
"metadata": {
"slideshow": {
"slide_type": "fragment"
"slide_type": "slide"
}
},
"outputs": [
@ -931,14 +903,14 @@
"output_type": "stream",
"text": [
"INFO - file_observer - Running command 'my_main'\r\n",
"INFO - file_observer - Started run with ID \"4\"\r\n",
"INFO - file_observer - Started run with ID \"2\"\r\n",
"Witaj Świecie!\r\n",
"INFO - file_observer - Completed after 0:00:00\r\n"
]
}
],
"source": [
"!python3 IUM_07/file_observer.py"
"!python IUM_07/file_observer.py"
]
},
{
@ -954,7 +926,7 @@
},
{
"cell_type": "code",
"execution_count": 30,
"execution_count": 160,
"metadata": {
"slideshow": {
"slide_type": "slide"
@ -965,13 +937,10 @@
"name": "stdout",
"output_type": "stream",
"text": [
"total 24\r\n",
"drwsrwsr-t 2 tomek tomek 4096 May 28 2022 1\r\n",
"drwsrwsr-t 2 tomek tomek 4096 May 28 2022 2\r\n",
"drwxr-sr-x 2 tomek tomek 4096 Apr 12 15:11 3\r\n",
"drwxr-sr-x 2 tomek tomek 4096 Apr 20 12:09 4\r\n",
"drwxr-sr-x 2 tomek tomek 4096 Apr 12 15:11 _resources\r\n",
"drwsrwsr-t 2 tomek tomek 4096 May 28 2022 _sources\r\n"
"total 12\r\n",
"drwxrwxr-x 2 tomek tomek 4096 kwi 26 09:54 1\r\n",
"drwxrwxr-x 2 tomek tomek 4096 kwi 26 10:21 2\r\n",
"drwxrwxr-x 2 tomek tomek 4096 kwi 26 10:21 _sources\r\n"
]
}
],
@ -981,7 +950,7 @@
},
{
"cell_type": "code",
"execution_count": 1,
"execution_count": 164,
"metadata": {
"slideshow": {
"slide_type": "slide"
@ -993,38 +962,49 @@
"output_type": "stream",
"text": [
"total 16\r\n",
"-rw-r--r-- 1 tomek tomek 77 May 28 2022 config.json\r\n",
"-rw-r--r-- 1 tomek tomek 159 May 28 2022 cout.txt\r\n",
"-rw-r--r-- 1 tomek tomek 2 May 28 2022 metrics.json\r\n",
"-rw-r--r-- 1 tomek tomek 1659 May 28 2022 run.json\r\n"
"-rw-rw-r-- 1 tomek tomek 76 kwi 26 10:21 config.json\r\n",
"-rw-rw-r-- 1 tomek tomek 159 kwi 26 10:21 cout.txt\r\n",
"-rw-rw-r-- 1 tomek tomek 2 kwi 26 10:21 metrics.json\r\n",
"-rw-rw-r-- 1 tomek tomek 1686 kwi 26 10:21 run.json\r\n"
]
}
],
"source": [
"!ls -l my_runs/1"
"!ls -l my_runs/2"
]
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 162,
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [],
"outputs": [
{
"data": {
"text/plain": [
"{'greeting': 'Witaj', 'recipient': 'Świecie', 'seed': 178660254}"
]
},
"execution_count": 162,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# %load my_runs/1/config.json\n",
"# %load my_runs/2/config.json\n",
"{\n",
" \"greeting\": \"Witaj\",\n",
" \"recipient\": \"\\u015awiecie\",\n",
" \"seed\": 805857632\n",
" \"seed\": 178660254\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 31,
"execution_count": 165,
"metadata": {
"slideshow": {
"slide_type": "slide"
@ -1036,14 +1016,14 @@
"output_type": "stream",
"text": [
"INFO - file_observer - Running command 'my_main'\r\n",
"INFO - file_observer - Started run with ID \"1\"\r\n",
"INFO - file_observer - Started run with ID \"2\"\r\n",
"Witaj Świecie!\r\n",
"INFO - file_observer - Completed after 0:00:00\r\n"
]
}
],
"source": [
"!cat my_runs/1/cout.txt"
"!cat my_runs/2/cout.txt"
]
},
{
@ -1056,41 +1036,42 @@
},
"outputs": [],
"source": [
"# %load my_runs/1/run.json\n",
"# %load my_runs/2/run.json\n",
"{\n",
" \"artifacts\": [],\n",
" \"command\": \"my_main\",\n",
" \"experiment\": {\n",
" \"base_dir\": \"/home/tomek/repos/aitech/aitech-ium/IUM_07\",\n",
" \"base_dir\": \"/home/tomek/AITech/repo/aitech-ium-private/IUM_07\",\n",
" \"dependencies\": [\n",
" \"numpy==1.19.2\",\n",
" \"sacred==0.8.2\"\n",
" ],\n",
" \"mainfile\": \"file_observer.py\",\n",
" \"name\": \"file_observer\",\n",
" \"repositories\": [\n",
" {\n",
" \"commit\": \"3055a4f1c2ef06ea1c29e3d41d862827cede7e2a\",\n",
" \"commit\": \"9a2064faaf4d209233ab0e20ad522638bb99b6f4\",\n",
" \"dirty\": true,\n",
" \"url\": \"git@git.wmi.amu.edu.pl:tzietkiewicz/aitech-ium.git\"\n",
" \"url\": \"git@git.wmi.amu.edu.pl:tzietkiewicz/aitech-ium-private.git\"\n",
" }\n",
" ],\n",
" \"sources\": [\n",
" [\n",
" \"file_observer.py\",\n",
" \"_sources/file_observer_cd34a0ef4a32fb0a966eaa01ea6371ad.py\"\n",
" \"_sources/file_observer_bb0a5c4720d1072b641d23da080696b6.py\"\n",
" ]\n",
" ]\n",
" },\n",
" \"heartbeat\": \"2022-04-25T07:51:37.853633\",\n",
" \"heartbeat\": \"2021-04-26T08:21:35.718761\",\n",
" \"host\": {\n",
" \"ENV\": {},\n",
" \"cpu\": \"Intel(R) Core(TM) i5-4200H CPU @ 2.80GHz\",\n",
" \"hostname\": \"ASUSEK\",\n",
" \"hostname\": \"tomek-asus\",\n",
" \"os\": [\n",
" \"Linux\",\n",
" \"Linux-4.4.0-19041-Microsoft-x86_64-with-Ubuntu-18.04-bionic\"\n",
" \"Linux-5.4.0-72-generic-x86_64-with-glibc2.10\"\n",
" ],\n",
" \"python_version\": \"3.6.9\"\n",
" \"python_version\": \"3.8.5\"\n",
" },\n",
" \"meta\": {\n",
" \"command\": \"my_main\",\n",
@ -1122,15 +1103,15 @@
" },\n",
" \"resources\": [],\n",
" \"result\": null,\n",
" \"start_time\": \"2022-04-25T07:51:37.831461\",\n",
" \"start_time\": \"2021-04-26T08:21:35.714091\",\n",
" \"status\": \"COMPLETED\",\n",
" \"stop_time\": \"2022-04-25T07:51:37.849334\"\n",
" \"stop_time\": \"2021-04-26T08:21:35.717141\"\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 32,
"execution_count": 170,
"metadata": {
"slideshow": {
"slide_type": "slide"
@ -1142,7 +1123,7 @@
"output_type": "stream",
"text": [
"total 4\r\n",
"-rw-r--r-- 1 tomek tomek 464 May 28 2022 file_observer_cd34a0ef4a32fb0a966eaa01ea6371ad.py\r\n"
"-rw-rw-r-- 1 tomek tomek 463 kwi 26 10:21 file_observer_bb0a5c4720d1072b641d23da080696b6.py\r\n"
]
}
],
@ -1161,7 +1142,8 @@
},
"outputs": [],
"source": [
"# %load my_runs/_sources/file_observer_cd34a0ef4a32fb0a966eaa01ea6371ad.py\n",
"## Źródła zostały zapisane\n",
"# %load my_runs/_sources/file_observer_bb0a5c4720d1072b641d23da080696b6.py\n",
"from sacred.observers import FileStorageObserver\n",
"from sacred import Experiment\n",
"\n",
@ -1180,7 +1162,7 @@
"\n",
"@ex.automain\n",
"def my_main(recipient, greeting):\n",
" print(prepare_message()) ## Nie musimy przekazywać wartości\n"
" print(prepare_message()) ## Nie musimy przekazywać wartości"
]
},
{
@ -1196,7 +1178,7 @@
},
{
"cell_type": "code",
"execution_count": 36,
"execution_count": 183,
"metadata": {
"slideshow": {
"slide_type": "slide"
@ -1208,7 +1190,7 @@
"output_type": "stream",
"text": [
"INFO - file_observer - Running command 'my_main'\n",
"INFO - file_observer - Started run with ID \"5\"\n",
"INFO - file_observer - Started run with ID \"6\"\n",
"INFO - file_observer - Completed after 0:00:00\n"
]
},
@ -1251,7 +1233,7 @@
},
{
"cell_type": "code",
"execution_count": 37,
"execution_count": 185,
"metadata": {
"slideshow": {
"slide_type": "slide"
@ -1263,13 +1245,13 @@
"output_type": "stream",
"text": [
"{\r\n",
" \"prepare_message_ts\": \"2023-04-20 12:10:28.197315\"\r\n",
" \"prepare_message_ts\": \"2021-04-26 10:39:59.268539\"\r\n",
"}"
]
}
],
"source": [
"cat my_runs/5/info.json"
"cat my_runs/6/info.json"
]
},
{
@ -1289,107 +1271,6 @@
"```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Otwieranie zasobów\n",
"- Zmiana danych wejściowych wpłwa w oczywisty sposób na wyniki\n",
"- Dlatego warto śledzić te zmiany za pomocą:\n",
" - [ex.open_resource()](https://sacred.readthedocs.io/en/stable/apidoc.html#sacred.Experiment.open_resource)\n",
" - [ex.add_resource()](https://sacred.readthedocs.io/en/stable/apidoc.html#sacred.Experiment.add_resource)"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO - resources - Running command 'my_main'\n",
"INFO - resources - Started run with ID \"6\"\n",
"INFO - resources - Completed after 0:00:00\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Id,SepalLengthCm,SepalWidthCm,PetalLengthCm,PetalWidthCm,Species\n",
"\n"
]
},
{
"data": {
"text/plain": [
"<sacred.run.Run at 0x7f89a0db5a30>"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sacred import Experiment\n",
"from sacred.observers import FileStorageObserver\n",
"\n",
"\n",
"ex = Experiment(\"resources\", interactive=True)\n",
"ex.observers.append(FileStorageObserver('my_runs'))\n",
"\n",
"@ex.main\n",
"def my_main():\n",
" f = ex.open_resource(\"Iris.csv\", \"r\")\n",
" print(f.readline())\n",
" \n",
"ex.run()"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"total 8\r\n",
"-rw-r--r-- 1 tomek tomek 5107 Apr 12 15:11 Iris_717820ef0af287ff346c5cabfb4c612c.csv\r\n"
]
}
],
"source": [
"!ls -l my_runs/_resources"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"my_runs/6/run.json: \"name\": \"resources\",\r\n",
"my_runs/6/run.json: \"resources\": [\r\n",
"my_runs/6/run.json: \"my_runs/_resources/Iris_717820ef0af287ff346c5cabfb4c612c.csv\"\r\n"
]
}
],
"source": [
"!grep -e \"resources\" -R my_runs/6"
]
},
{
"cell_type": "markdown",
"metadata": {
@ -1407,7 +1288,7 @@
},
{
"cell_type": "code",
"execution_count": 42,
"execution_count": 134,
"metadata": {
"slideshow": {
"slide_type": "slide"
@ -1418,18 +1299,17 @@
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: pymongo in /home/tomek/miniconda3/lib/python3.9/site-packages (4.3.3)\r\n",
"Requirement already satisfied: dnspython<3.0.0,>=1.16.0 in /home/tomek/miniconda3/lib/python3.9/site-packages (from pymongo) (2.3.0)\r\n"
"Requirement already satisfied: pymongo in /media/tomek/Linux_data/home/tomek/anaconda3/lib/python3.8/site-packages (3.11.3)\r\n"
]
}
],
"source": [
"!pip3 install pymongo"
"!pip install pymongo"
]
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 155,
"metadata": {
"slideshow": {
"slide_type": "slide"
@ -1441,8 +1321,26 @@
"output_type": "stream",
"text": [
"INFO - sacred_scopes - Running command 'my_main'\n",
"ERROR - sacred_scopes - Failed after 0:00:30!\n"
"INFO - sacred_scopes - Started run with ID \"2\"\n",
"INFO - sacred_scopes - Completed after 0:00:00\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Witaj Świecie!\n"
]
},
{
"data": {
"text/plain": [
"<sacred.run.Run at 0x7f423c3667c0>"
]
},
"execution_count": 155,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
@ -1450,9 +1348,9 @@
"from sacred import Experiment\n",
"\n",
"ex = Experiment(\"sacred_scopes\", interactive=True)\n",
"ex.observers.append(MongoObserver(url='mongodb://admin:IUM_2021@172.17.0.1:27017',\n",
"ex.observers.append(MongoObserver(url='mongodb://mongo_user:mongo_password@localhost:27017',\n",
" db_name='sacred')) # Tutaj podajemy dane uwierzytelniające i nazwę bazy skonfigurowane w pliku .env podczas uruchamiania bazy.\n",
"# W przypadku instancji na Jenkinsie url będzie wyglądał następująco: mongodb://admin:IUM_2021@172.17.0.1:27017\n",
"# W przypadku instancji na Jenkinsie url będzie wyglądał następująco: mongodb://mongo_user:mongo_password_IUM_2021@localhost:27017\n",
"@ex.config\n",
"def my_config():\n",
" recipient = \"Świecie\"\n",
@ -1500,13 +1398,46 @@
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 192,
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [],
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO - sacred_scopes - Running command 'my_main'\n",
"INFO - sacred_scopes - Started run with ID \"9\"\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Witaj Świecie!\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO - sacred_scopes - Completed after 0:00:50\n"
]
},
{
"data": {
"text/plain": [
"<sacred.run.Run at 0x7f423c2de550>"
]
},
"execution_count": 192,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sacred.observers import MongoObserver\n",
"from sacred import Experiment\n",
@ -1514,9 +1445,9 @@
"import time\n",
"\n",
"ex = Experiment(\"sacred_scopes\", interactive=True)\n",
"ex.observers.append(MongoObserver(url='mongodb://admin:IUM_2021@172.17.0.1:27017',\n",
"ex.observers.append(MongoObserver(url='mongodb://mongo_user:mongo_password@localhost:27017',\n",
" db_name='sacred')) # Tutaj podajemy dane uwierzytelniające i nazwę bazy skonfigurowane w pliku .env podczas uruchamiania bazy.\n",
"# W przypadku instancji na Jenkinsie url będzie wyglądał następująco: mongodb://admin:IUM_2021@172.17.0.1:27017\n",
"# W przypadku instancji na Jenkinsie url będzie wyglądał następująco: mongodb://mongo_user:mongo_password_IUM_2021@localhost:27017\n",
"@ex.config\n",
"def my_config():\n",
" recipient = \"Świecie\"\n",
@ -1567,18 +1498,14 @@
}
},
"source": [
"## Zadanie [15 pkt] (do 2023-06-?)\n",
"## Zadanie [15 pkt] (do 9 V 2021)\n",
"1. \"Owiń\" wywołanie swojego eksperymentu za pomocą Sacred, w ten sposób, żeby zapisane zostały [10pkt]:\n",
" - parametry, z którymi wywołany był trening\n",
" - powstały plik z modelem (jako artefakt)\n",
" - kod źródłowy użyty do przeprowadzenia treningu\n",
" - pliki wejściowe otwarte za pomocą open_resource\n",
" - metryki\n",
" \n",
"Jako nazwę eksperymentu użyj swojego numeru indeksu tak, żebyś mogła/mógł je odnaleźć w Omniboard\n",
"\n",
" - wyniki (np. ostateczny loss albo wyniki ewaluacji)\n",
"2. Wykorzystaj 2 obserwatory [5pkt]: \n",
" - MongoObserver, skorzytaj nastęþującego URL: `mongodb://admin:IUM_2021@172.17.0.1:27017` (będziesz mógł przeglądać wyniki na http://tzietkiewicz.vm.wmi.amu.edu.pl:9000/sacred)\n",
" - MongoObserver, skorzytaj nastęþującego URL: `mongodb://mongo_user:mongo_password_IUM_2021@localhost:27017` (będziesz mógł przeglądać wyniki na http://tzietkiewicz.vm.wmi.amu.edu.pl:9000/sacred)\n",
" - FileObserver - zapisane pliki zarchiwizuj na Jenkinsie jako jego artefakty\n"
]
}
@ -1603,7 +1530,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.12"
"version": "3.9.1"
},
"slideshow": {
"slide_type": "slide"

View File

@ -1,9 +0,0 @@
FROM ubuntu:latest
RUN apt update && apt install -y \
git \
python3-pip \
python3
RUN python3 -m pip install sacred pymongo

13
IUM_07/Jenkinsfile vendored
View File

@ -1,13 +0,0 @@
node {
checkout scm
//Pierwszy argument to tag, który zostania nadany zbudowanemu obrazowi
//Jeśli chcemy użyć Dockerfile z innej ścieżki niż ./Dockerfile, możemy ją podać jako drugi argument
def testImage = docker.build("sacred_pymongo", "./IUM_07/")
//Wszystkie polecenia poniżej wykonają się w kontenerze, z podmontowanym Workspace Jenkinsa
testImage.inside {
dir ("IUM_07"){
sh 'python3 mongo_observer.py'
}
}
}

View File

@ -16,4 +16,4 @@ def prepare_message(recipient, greeting):
@ex.automain
def my_main(recipient, greeting):
print(prepare_message()) ## Nie musimy przekazywać wartości
print(prepare_message()) ## Nie musimy przekazywać wartości

View File

@ -1,39 +0,0 @@
from sacred.observers import MongoObserver
from sacred import Experiment
import random
import time
ex = Experiment("sacred_scopes", interactive=True)
ex.observers.append(MongoObserver(url='mongodb://admin:IUM_2021@172.17.0.1:27017', db_name='sacred'))
#ex.observers.append(MongoObserver(url='mongodb://mongo_user:mongo_password@localhost:27017',
# db_name='sacred')) # Tutaj podajemy dane uwierzytelniające i nazwę bazy skonfigurowane w pliku .env podczas uruchamiania bazy.
# W przypadku instancji na Jenkinsie url będzie wyglądał następująco: mongodb://mongo_user:mongo_password_IUM_2021@localhost:27017
@ex.config
def my_config():
recipient = "Świecie"
greeting = "Witaj"
@ex.capture
def prepare_message(recipient, greeting):
return "{0} {1}!".format(greeting, recipient)
@ex.main
def my_main(recipient, greeting, _run):
print(prepare_message()) ## Nie musimy przekazywać wartości
counter = 0
while counter < 20:
counter+=1
value = counter
ms_to_wait = random.randint(5, 5000)
time.sleep(ms_to_wait/1000)
noise = 1.0 + 0.1 * (random.randint(0, 10) - 5)
# This will add an entry for training.loss metric in every second iteration.
# The resulting sequence of steps for training.loss will be 0, 2, 4, ...
if counter % 2 == 0:
_run.log_scalar("training.loss", value * 1.5 * noise, counter)
# Implicit step counter (0, 1, 2, 3, ...)
# incremented with each call for training.accuracy:
_run.log_scalar("training.accuracy", value * 2 * noise)
ex.run()

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -12,8 +12,8 @@
"![Logo 1](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech1.jpg)\n",
"<div class=\"alert alert-block alert-info\">\n",
"<h1> Inżynieria uczenia maszynowego </h1>\n",
"<h2> 11. <i>Github actions</i> [laboratoria]</h2> \n",
"<h3> Tomasz Ziętkiewicz (2023)</h3>\n",
"<h2> 11. <i>Github actions i CML</i> [laboratoria]</h2> \n",
"<h3> Tomasz Ziętkiewicz (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
@ -70,13 +70,13 @@
"source": [
"### Terminologia Github Actions\n",
" - *Workflow* - workflow odpowiada \"Pipeline\" z Jenkinsa.\n",
" - *Event* - zdarzenie, które odapala (\"triggers\") \"Workflow\". Np. wypchnięcie zmiany do repozytorium (\"push\"), utworzenie Pull requesta. [Pełna lista](https://docs.github.com/en/actions/reference/events-that-trigger-workflows)\n",
" - *Job* - workflow składa się z jednego lub kilku zadań (\"jobs\"). Każde z nich może być wykonywane równolegle na innej maszynie (patrz \"runner\")\n",
" - *Job* - workflow składa się z jednego lub kilku \"jobs\". Każdy z nich może być wykonywany równolegle na innej maszynie (patrz \"runner\")\n",
" - *Step* - odpowiednik \"Stage\" z Jenkinsa - służu do grupowania \"Actions\"\n",
" - *Action/command* - odpowiednik \"Step\" z Jenkinsa - pojedyncze polecenie do wykonania, np. dodanie komentarze do Pull requesta, wykonanie polecenia systemowego itp.\n",
" - *Action* - odpowiednik \"Step\" z Jenkinsa - pojedyncze polecenie do wykonania, np. dodanie komentarze do Pull requesta, wykonanie polecenia systemowego itp.\n",
" - *Runner* - odpowiednik Jenkinsowego \"Agent\" - serwer, na którym mogą być wykonywane zadania (\"jobs\")\n",
" - *Github-hosted runner* - serwer utrzymywany przez Github (2-core CPU, 7 GB RAM, 14 GB SSD). Windows, Linux albo macOS\n",
" - *Self-hosted runner* - nasz własny serwer, z zinstalowaną aplikacją [Github actions runner](https://github.com/actions/runner)"
" - *Self-hosted runner* - nasz własny serwer, z zinstalowaną aplikacją [Github actions runner](https://github.com/actions/runner)\n",
" - *Event* - zdażenie, które odapala (\"triggers\") uruchomienie Workflow. Np. wypchnięcie zmiany do repozytorium (\"push\"), utworzenie Pull requesta. [Pełna lista](https://docs.github.com/en/actions/reference/events-that-trigger-workflows)"
]
},
{
@ -89,7 +89,7 @@
},
"source": [
"### Definicja workflow\n",
" - Workflow definiuje się w plikach YAML(o rozszerzeniu `*.yml` albo `*.yaml`) umieszczonych w specjalnym folderze `.github/workflows/` wewnątrz repozytorium\n",
" - Workflow definiuje się w plikach YAM(o rozszerzeniu `*.yml` albo `*.yaml`) umieszczonych w specjalnym folderze `.github/workflows/` wewnątrz repozytorium\n",
" - Pełna składnia jest opisana [tutaj](https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions)\n",
" - Podstawowe pola:\n",
" - `name` [opcjonalna] - nazwa, pod którą workflow/step będzie widoczny w UI. Domyślnie ścieżka do pliku yaml\n",
@ -103,7 +103,33 @@
},
{
"cell_type": "code",
"execution_count": 4,
"execution_count": 1,
"id": "955585a9",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"/home/tomek/AITech/repo/aitech-ium-private/IUM_11\n",
"Initialized empty Git repository in /home/tomek/AITech/repo/aitech-ium-private/IUM_11/github-actions-hello/.git/\r\n"
]
}
],
"source": [
"%cd IUM_11\n",
"!mkdir github-actions-hello;\\\n",
"cd github-actions-hello;\\\n",
"git init"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "f4916c1f",
"metadata": {
"slideshow": {
@ -115,53 +141,18 @@
"name": "stdout",
"output_type": "stream",
"text": [
"/home/tomek/repos/aitech-ium/IUM_11/github-actions-hello\n"
"/home/tomek/AITech/repo/aitech-ium-private/IUM_11/github-actions-hello\n"
]
}
],
"source": [
"!mkdir -p IUM_11/github-actions-hello\n",
"%cd IUM_11/github-actions-hello\n",
"%cd github-actions-hello\n",
"!mkdir -p .github/workflows"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "88ce689f",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Reinitialized existing Git repository in /home/tomek/repos/aitech-ium/IUM_11/github-actions-hello/.git/\n",
"Enumerating objects: 6, done.\n",
"Counting objects: 100% (6/6), done.\n",
"Delta compression using up to 4 threads\n",
"Compressing objects: 100% (4/4), done.\n",
"Writing objects: 100% (6/6), 780 bytes | 780.00 KiB/s, done.\n",
"Total 6 (delta 0), reused 0 (delta 0), pack-reused 0\n",
"To github.com:TomekZet/ium-ga-hello.git\n",
" * [new branch] main -> main\n",
"Branch 'main' set up to track remote branch 'main' from 'origin'.\n"
]
}
],
"source": [
"!git init\n",
"!git branch -M main\n",
"!git remote add origin git@github.com:TomekZet/ium-ga-hello.git\n",
"!git push -u origin main"
]
},
{
"cell_type": "code",
"execution_count": 20,
"execution_count": 6,
"id": "dde8d432",
"metadata": {
"slideshow": {
@ -173,7 +164,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
"Overwriting .github/workflows/workflow.yml\n"
"Writing .github/workflows/workflow.yml\n"
]
}
],
@ -194,164 +185,6 @@
" - run: python3 --version"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "ff1e011e",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"On branch main\n",
"Your branch is up to date with 'origin/main'.\n",
"\n",
"nothing to commit, working tree clean\n",
"Everything up-to-date\n"
]
}
],
"source": [
"!git add .github/workflows/workflow.yml\n",
"!git commit -m \"Github Actions Workflow\"\n",
"!git push"
]
},
{
"cell_type": "markdown",
"id": "3e237076",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Zakładka actions na stronie repozytorium:\n",
"https://github.com/TomekZet/ium-ga-hello/actions"
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "32701383",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"total 16\r\n",
"drwxr-sr-x 2 tomek tomek 4096 May 17 11:51 .\r\n",
"drwxr-sr-x 3 tomek tomek 4096 May 17 11:51 ..\r\n",
"-rw-r--r-- 1 tomek tomek 456 May 17 11:51 parametrized.yml\r\n",
"-rw-r--r-- 1 tomek tomek 305 May 17 12:01 workflow.yml\r\n"
]
}
],
"source": [
"!ls -al .github/workflows"
]
},
{
"cell_type": "markdown",
"id": "1c01acb5",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Ręczne wywoływanie\n",
"Workflow można również wywołać ręcznie, podając parametry.\n",
"Więcej informacji np. tutaj: https://github.blog/changelog/2020-07-06-github-actions-manual-triggers-with-workflow_dispatch/"
]
},
{
"cell_type": "code",
"execution_count": 42,
"id": "a7250bf7",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Overwriting .github/workflows/parametrized.yml\n"
]
}
],
"source": [
"%%writefile .github/workflows/parametrized.yml\n",
"name: github-actions-hello-parametrized\n",
"on: \n",
" workflow_dispatch:\n",
" inputs:\n",
" input_text:\n",
" description: 'Text to display' \n",
" required: true\n",
" default: 'Hello World'\n",
"jobs:\n",
" hello-job:\n",
" runs-on: ubuntu-latest\n",
" steps:\n",
" - name: Checkout repo\n",
" uses: actions/checkout@v2\n",
" - name: Install dependencies\n",
" run:\n",
" sudo apt update;\n",
" sudo apt install -y figlet\n",
" - name: Write\n",
" run:\n",
" figlet \"${{ github.event.inputs.input_text }}\""
]
},
{
"cell_type": "code",
"execution_count": 43,
"id": "36ddaac0",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[main a98938d] just dispatch\n",
" 1 file changed, 6 deletions(-)\n",
"Enumerating objects: 9, done.\n",
"Counting objects: 100% (9/9), done.\n",
"Delta compression using up to 4 threads\n",
"Compressing objects: 100% (3/3), done.\n",
"Writing objects: 100% (5/5), 411 bytes | 411.00 KiB/s, done.\n",
"Total 5 (delta 1), reused 0 (delta 0), pack-reused 0\n",
"remote: Resolving deltas: 100% (1/1), completed with 1 local object.\u001b[K\n",
"To github.com:TomekZet/ium-ga-hello.git\n",
" 6c4a361..a98938d main -> main\n"
]
}
],
"source": [
"!git add -u .github/workflows\n",
"!git commit -m \"just dispatch\"\n",
"!git push"
]
},
{
"cell_type": "markdown",
"id": "ed780dea",
@ -386,339 +219,6 @@
" - z [Github Marketplace](https://github.com/marketplace?type=actions)"
]
},
{
"cell_type": "markdown",
"id": "a764cc0d",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Akcje wykonywane w kontenerze Docker\n",
"Akcja może być wywołana w kontenerze Docker (pobranym z Docker hub albo zbudowanym z Dockerfile)\n",
"W tym celu należy stworzyć własną akcję w pliku action.yaml i potem użyć jej w Workflow"
]
},
{
"cell_type": "code",
"execution_count": 59,
"id": "ff4dab8c",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Overwriting action.yml\n"
]
}
],
"source": [
"%%writefile action.yml\n",
"name: 'Hello World'\n",
"description: 'Greet someone and record the time'\n",
"inputs:\n",
" who-to-greet: # id of input\n",
" description: 'Who to greet'\n",
" required: true\n",
" default: 'World'\n",
"outputs:\n",
" time: # id of output\n",
" description: 'The time we greeted you'\n",
"runs:\n",
" using: 'docker'\n",
" image: 'Dockerfile'\n",
" args:\n",
" - ${{ inputs.who-to-greet }}"
]
},
{
"cell_type": "code",
"execution_count": 80,
"id": "f1aaff7c",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Overwriting Dockerfile\n"
]
}
],
"source": [
"%%writefile Dockerfile\n",
"# Container image that runs your code\n",
"FROM ubuntu:latest\n",
" \n",
"RUN apt update && apt install -y figlet\n",
"\n",
"# Copies your code file from your action repository to the filesystem path `/` of the container\n",
"COPY entrypoint.sh /entrypoint.sh\n",
"\n",
"VOLUME /github/workspace/\n",
"\n",
"WORKDIR /github/workspace/\n",
"\n",
"# Code file to execute when the docker container starts up (`entrypoint.sh`)\n",
"ENTRYPOINT [\"/entrypoint.sh\"]"
]
},
{
"cell_type": "code",
"execution_count": 84,
"id": "7f778025",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Overwriting entrypoint.sh\n"
]
}
],
"source": [
"%%writefile entrypoint.sh\n",
"#!/bin/sh -l\n",
"\n",
"figlet \"Hello $1\" | tee figlet.txt\n",
"echo \"Entrypoint invoked in: $PWD\"\n",
"readlink -f figlet.txt\n",
"time=$(date)\n",
"echo \"time=$time\" >> $GITHUB_OUTPUT"
]
},
{
"cell_type": "code",
"execution_count": 60,
"id": "911975de",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [],
"source": [
"!chmod +x entrypoint.sh"
]
},
{
"cell_type": "code",
"execution_count": 62,
"id": "483e0498",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Overwriting .github/workflows/docker.yml\n"
]
}
],
"source": [
"%%writefile .github/workflows/docker.yml\n",
"name: github-actions-hello-docker\n",
"on: \n",
" workflow_dispatch:\n",
" inputs:\n",
" input_text:\n",
" description: 'Who to greet' \n",
" required: true\n",
" default: 'World'\n",
"jobs:\n",
" hello-job:\n",
" runs-on: ubuntu-latest\n",
" steps:\n",
" - name: Checkout repo\n",
" uses: actions/checkout@v2\n",
" - name: Use docker action\n",
" id: hello\n",
" uses: ./\n",
" with:\n",
" who-to-greet: \"${{ github.event.inputs.input_text }}\"\n",
" # Use the output from the `hello` step\n",
" - name: Get the output time\n",
" run: echo \"The time was ${{ steps.hello.outputs.time }}\"\n",
" \n",
" "
]
},
{
"cell_type": "code",
"execution_count": 63,
"id": "bc24dff3",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[main 22a5094] Fix path\n",
" 1 file changed, 1 insertion(+)\n",
"Enumerating objects: 9, done.\n",
"Counting objects: 100% (9/9), done.\n",
"Delta compression using up to 4 threads\n",
"Compressing objects: 100% (5/5), done.\n",
"Writing objects: 100% (5/5), 570 bytes | 570.00 KiB/s, done.\n",
"Total 5 (delta 1), reused 0 (delta 0), pack-reused 0\n",
"remote: Resolving deltas: 100% (1/1), completed with 1 local object.\u001b[K\n",
"To github.com:TomekZet/ium-ga-hello.git\n",
" 97c7272..22a5094 main -> main\n"
]
}
],
"source": [
"!git add .github entrypoint.sh Dockerfile\n",
"!git commit -m \"Fix path\"\n",
"!git push"
]
},
{
"cell_type": "markdown",
"id": "12af9d1b",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Archiwizowanie artefaktów\n",
"https://docs.github.com/en/actions/using-workflows/storing-workflow-data-as-artifacts\n",
"\n",
"Do archiwizowania artefaktów służy akcja \"upload-artifact\":\n",
"\n",
"```yaml\n",
" - name: Archive artifacts\n",
" uses: actions/upload-artifact@v3\n",
" with:\n",
" name: figlet-output\n",
" path: figlet.txt\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "245f7c8a",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Overwriting .github/workflows/docker-artifact.yml\n"
]
}
],
"source": [
"%%writefile .github/workflows/docker-artifact.yml\n",
"name: github-actions-hello-docker-artifact\n",
"on: \n",
" workflow_dispatch:\n",
" inputs:\n",
" input_text:\n",
" description: 'Who to greet' \n",
" required: true\n",
" default: 'World'\n",
"jobs:\n",
" hello-job:\n",
" name: \"Do all the hard stuff\"\n",
" runs-on: ubuntu-latest\n",
" steps:\n",
" - name: Checkout repo\n",
" uses: actions/checkout@v2\n",
" - name: Use docker action\n",
" id: hello\n",
" uses: ./\n",
" with:\n",
" who-to-greet: \"${{ github.event.inputs.input_text }}\"\n",
" # Use the output from the `hello` step\n",
" - name: Get the output time\n",
" run: echo \"The time was ${{ steps.hello.outputs.time }}\" > time.txt\n",
" - name: Archive artifacts\n",
" uses: actions/upload-artifact@v3\n",
" with:\n",
" name: figlet-output\n",
" path: |\n",
" figlet.txt\n",
" time.txt\n",
" publish:\n",
" name: \"Publish as github comment\"\n",
" runs-on: ubuntu-latest\n",
" needs: hello-job\n",
" steps:\n",
" - uses: actions/checkout@v3\n",
" #We need to download the artifact first, jobs do not share workflow files\n",
" - name: get-artifact \n",
" uses: actions/download-artifact@v3\n",
" with:\n",
" name: figlet-output\n",
" - name: display_artifact_contents\n",
" run:\n",
" cat time.txt ; tr ' ' '#' < figlet.txt\n"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "47e301f9",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[main 5a40228] Archive in one job, use in other\n",
" 1 file changed, 1 insertion(+)\n",
"Enumerating objects: 9, done.\n",
"Counting objects: 100% (9/9), done.\n",
"Delta compression using up to 4 threads\n",
"Compressing objects: 100% (5/5), done.\n",
"Writing objects: 100% (5/5), 622 bytes | 622.00 KiB/s, done.\n",
"Total 5 (delta 2), reused 0 (delta 0), pack-reused 0\n",
"remote: Resolving deltas: 100% (2/2), completed with 2 local objects.\u001b[K\n",
"To github.com:TomekZet/ium-ga-hello.git\n",
" 4df6dc0..5a40228 main -> main\n"
]
}
],
"source": [
"!git add -u\n",
"!git commit -m \"Archive in one job, use in other\"\n",
"!git push"
]
},
{
"cell_type": "markdown",
"id": "805622e8",
@ -1047,23 +547,19 @@
}
},
"source": [
"## Zadania [20 pkt] (termin: 24.05.2023)\n",
"## Zadania\n",
"1. Utwórz konto na Github (jeśli jeszcze nie masz)\n",
"2. Stwórz publiczne repozytorium. Link do niego wklej do kolumny \"Link Github\" w arkuszu [\"Zapisy na zbiory\"](https://teams.microsoft.com/l/file/F62B5988-A797-418D-B085-52E0AF8BD55E?tenantId=73689ee1-b42f-4e25-a5f6-66d1f29bc092&fileType=xlsx&objectUrl=https%3A%2F%2Fuam.sharepoint.com%2Fsites%2F2021SL06-DIUMUI0LABInynieriauczeniamaszynowego-Grupa11%2FShared%20Documents%2FGeneral%2FZapisy%20na%20zbiory.xlsx&baseUrl=https%3A%2F%2Fuam.sharepoint.com%2Fsites%2F2021SL06-DIUMUI0LABInynieriauczeniamaszynowego-Grupa11&serviceName=teams&threadId=19:d67b0dc2ee0849eba517a2aa8507df9c@thread.tacv2&groupId=8cd6b30e-edd9-48db-85ab-259fc11d0c5b) [1 pkt]\n",
"2. Stwórz prosty Github workflow który:\n",
" - zrobi checkout Twojego repozytorium [1 pkt]\n",
" - ściągnie pliki trenujące. Najlepiej byłoby to zrobić za pomocą DVC, ale tym razem uprośćmy zadanie ze względu na komplikacje, które mogą się pojawić przy konfiguracji uwierzytelniania. Pliki można po prostu dodać do repozytorium albo ściągnąć przez wget jeśli są publicznie dostępne [2 pkt]\n",
" - będzie wywoływalny przez \"Workflow dispatch\" z parametrami trenowania [2 pkt]\n",
" - składał się będzie z co najmniej 3 jobów:\n",
" 1. dokona trenowania jako osobnej akcji wykonanej w Dockerze [8 pkt]\n",
" 2. dokona ewaluacji modelu [6 pkt]\n",
" 3. zarchiwizuje plik z modelem"
"2. Stwórz prosty Github workflow wykorzystujący akcje CML, który:\n",
" - zrobi checkout Twojego repozytorium [2 pkt]\n",
" - ściągnie pliki trenujące. Najlepiej byłoby to zrobić za pomocą DVC, ale tym razem uprośćmy zadanie ze względu na koplikacje, które mogą się pojawić przy konfiguracji uwierzytelniania. Pliki można po prostu dodać do repozytorium albo ściągnąć przez wget jeśli są publicznie dostępne [2 pkt]\n",
" - dokona trenowania i ewaluacji [8 pkt]\n",
" - wyniki opublikuje za pomocą `cml-send-github-check` i/lub `cml-send-comment` [2 pkt]"
]
}
],
"metadata": {
"author": "Tomasz Ziętkiewicz",
"celltoolbar": "Slideshow",
"email": "tomasz.zietkiewicz@amu.edu.pl",
"kernelspec": {
"display_name": "Python 3",
@ -1081,7 +577,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.16"
"version": "3.9.1"
},
"slideshow": {
"slide_type": "slide"

@ -1 +0,0 @@
Subproject commit 5a40228be54897d47e0480318adcdbdec0e74d60

View File

@ -66,7 +66,7 @@
"author": "Tomasz Ziętkiewicz",
"email": "tomasz.zietkiewicz@amu.edu.pl",
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
@ -81,7 +81,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.4"
"version": "3.9.1"
},
"slideshow": {
"slide_type": "slide"

View File

@ -1,577 +0,0 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "honey-resistance",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"![Logo 1](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech1.jpg)\n",
"<div class=\"alert alert-block alert-info\">\n",
"<h1> Inżynieria uczenia maszynowego </h1>\n",
"<h2> 12. <i>Przygotowanie publikacji naukowej</i> [laboratoria]</h2> \n",
"<h3> Tomasz Ziętkiewicz (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{
"cell_type": "markdown",
"id": "a5f10a0e",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Abstract\n",
"- Umiejętność pisania artykułu naukowego może okazać się przydatna dla osób zajmujących się uczeniem maszynowym.\n",
"- Zastosowanie klarownej struktury dokumentu ułatwia jego odbiór jak i tworzenie.\n",
"- LaTeX + Overleaf jaka narzędzia do składu artykułu"
]
},
{
"cell_type": "markdown",
"id": "35d3630d",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Introduction\n",
"\n",
"- Uczenie maszynowe i jego zastosowania to prężnie rozwijająca się dziedzina nauki\n",
"- Żeby nadążyć za jej rozwojem musimy czytać artykuły naukowe\n",
"- A jeśli nasza praca ma charakter badawczy, to warto efekty naszej pracy od zebrać w postaci artykułu i opublikować\n",
"- Nasz pracodawca może od nas tego wymagać lub przynajmniej zachęcać\n",
"- Dlatego zapoznamy się z:\n",
"1. Strukturą artykułu naukowego\n",
"2. Technicznymi aspektami jego tworzenia"
]
},
{
"cell_type": "markdown",
"id": "1033fc4d",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Related work\n",
"\n",
"Jak napisać artykuł naukowy z dziedziny ML:\n",
"- http://www.isle.org/~langley/papers/craft.ml2k.pdf / https://icml.cc/Conferences/2002/craft.html\n",
"- https://www.researchgate.net/publication/337857231_How_to_Write_a_Machine_Learning_Paper_for_not_so_Dummies/comments\n",
"- https://towardsdatascience.com/writing-more-successful-machine-learning-research-papers-39863ca9ea90\n",
"- https://towardsdatascience.com/tips-for-reading-and-writing-an-ml-research-paper-a505863055cf\n",
"\n",
"Dobre wyjaśnienie struktury artykułu naukowego znajdziemy w napisanym po polsku artykule\n",
"- https://ekulczycki.pl/warsztat_badacza/struktura-artykulu-naukowego-uniwersalne-wytyczne-i-przydatne-wskazowki/"
]
},
{
"cell_type": "markdown",
"id": "2c7eb238",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Methods"
]
},
{
"cell_type": "markdown",
"id": "changed-president",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"### Struktura artykułu naukowego\n",
"Struktura [(A)IMRaD](https://en.wikipedia.org/wiki/IMRAD):\n",
"\n",
"0. Abstrakt (**A**bstract) - Dlaczego, jak, \n",
"1. Wprowadzenie (**I**ntroduction) - \"Dlaczego?\"\n",
" 1. Related work - \"Kontekst naukowy\"\n",
"2. Metody (**M**ethod) - \"Jak?\"\n",
"3. Wyniki (**R**esults) - \"Co?\"\n",
"4. Wnioski (**D**iscussion/Conclusions) - \"Interpretacja wyników\""
]
},
{
"cell_type": "markdown",
"id": "8cb9b025",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"<img src=\"https://upload.wikimedia.org/wikipedia/commons/7/75/Wineglass_model_for_IMRaD_structure..png\"/>"
]
},
{
"cell_type": "markdown",
"id": "d3e245eb",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"#### Tytuł\n",
"- powinien odzwierciedlać treść artykułu ;)\n",
"- nie za długi (< 12 wyrazów)\n",
"- lepiej, żeby nie był pytaniem (patrz [Prawo nagłówków Betteridge'a](https://pl.wikipedia.org/wiki/Prawo_nag%C5%82%C3%B3wk%C3%B3w_Betteridge%E2%80%99a), choć [niekoniecznie](https://link.springer.com/article/10.1007/s11192-016-2030-2))\n",
"- dobry artykuł może mieć krótki, chwytliwy tytuł, szczególnie, jeśli autorzy mają renomę ;) Przykłady:\n",
" - [\"Attention Is All You Need\"](https://arxiv.org/abs/1706.03762)"
]
},
{
"cell_type": "markdown",
"id": "1f150ddb",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"#### Abstrakt\n",
"\n",
"- stanowi samodzielną całość - powinien być zrozumiały bez reszty artykułu\n",
"- jest bardzo istotny - stanowi \"reklamówkę\" naszej pracy - ma zachęcić do lektury\n",
"- powinien zawierać wszystkie najważniejsz elementy artykułu i mieć podobną strukturę (IMRaD)"
]
},
{
"cell_type": "markdown",
"id": "6005b4bd",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"#### Wprowadzenie\n",
" - Kontekst badań\n",
" - Od ogółu do szczegółu\n",
" - Motywacja\n",
" - Co chcemy właściwie zbadać - sformułowanie hipotezy badawczej"
]
},
{
"cell_type": "markdown",
"id": "1308de25",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"#### Related work\n",
" - Kontekst naukowy\n",
" - Co zrobiono przed nami\n",
" - Musimy się do tego odnieść w dalszej części i zaznaczyć co nasze badania wnoszą nowego do dziedziny\n",
" - Cytujemy najważniejsze prace\n",
" - Najlepiej zacząć szeroko i w przeszłości i stopniowo przechodzili do coraz nowszych i bardziej szczegółowych badań, bliżej związanych z tematyką poruszaną w naszym artykule."
]
},
{
"cell_type": "markdown",
"id": "b6cf4464",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"#### Metody\n",
"- Jak przeprowadziliśmy nasze badania/eksperymenty\n",
"- Informacje tu zawarte w powinny umożliwić zreprodukowanie naszych wyników innym badaczom\n",
"- Opisujemy:\n",
" - Dane\n",
" - Algorytmy/architekturę\n",
" - możemy, choć nie musimy, podać techniczne szczegóły dotyczące implementacji, np. użyty framework. Zazwyczaj jednak kwestie techniczne nie są istotne i możemy od nich abstachować a na potrzeby reprodukowalności wyników najlepiej po prostu opublikować kod źródłowy/dane i wspomnieć o tym w artykule\n",
" - Procedurę ewaluacji/testowania\n",
"- Warto na naszych dancyh przetestować metodą bazową (\"baseline\") - np. obecny SOTA (\"State of the art\"), żeby potem móc do niej porównać nasze rozwiązanie."
]
},
{
"cell_type": "markdown",
"id": "5aee7988",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"#### Wyniki\n",
"- Jakie wyniki otrzymaliśmy\n",
"- Powstrzymajmy się z ich interpretacją\n",
"- Możemy dokonywać porównań, ale z opiniami w stylu \"Nasze podejście deklasuje obecny SOTA\" (State Of The Art) poczekajmy do następnej sekcji"
]
},
{
"cell_type": "markdown",
"id": "7be88b24",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"#### Konkluzje\n",
"- Interpretacja wyników\n",
"- Jakie jest ich znaczenie?\n",
"- Jak prezentują się w szerszym kontekście\n",
"- Tak jak we wprowaszeniu przechodzimy od ogółu do szczegółu (zawężamy perspektywę), tutaj postępujemy odwrotnie - zaczynając od szczegółowej interpretacji przechodzimy do znaczenia wyników w szerszym kontekście"
]
},
{
"cell_type": "markdown",
"id": "4753cf22",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Latex\n",
"\n",
"- LaTeX (wym. *Latech*) to system składu tekstu\n",
"- Najbardziej popularny w dziedzinach technicznych\n",
"- https://www.latex-project.org//\n",
"- Podejście [WYSIWYM](https://pl.wikipedia.org/wiki/WYSIWYM)(\"What you see is what you mean\") w przeciwieństwie do WYSIWIG (What you see is what you get - przykład: Word).\n",
"- Piszemy tekst ze znacznikami, kompilujemy, dostajemy gotowy dokument, np. pdf\n",
"- Stosowany powszechnie do pisania publikacji naukowych (artykułów, książek jak i rozpraw nukowych)\n",
"- Pozwala łatwo zmienić styl/szablon\n",
"- W założeniu, podczas pisania skupiamy się na treści i strukturze a LaTeX sam zatroszczy się o wygląd\n",
"- Przystępna dokumentacja: https://www.overleaf.com/learn/latex/Learn_LaTeX_in_30_minutes"
]
},
{
"cell_type": "markdown",
"id": "918e3b39",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Struktura\n",
"```latex\n",
"\n",
"\\documentclass[conference]{IEEEtran}\n",
"%\\documentclass[a4paper]{IEEEconf}\n",
"\n",
"\\usepackage[]{graphicx}\n",
"% to typeset algorithms\n",
"\\usepackage{algorithmic}\n",
"\\usepackage{algorithm}\n",
"% to typeset code fragments\n",
"\\usepackage{listings}\n",
"% to make an accent \\k be available\n",
"\\usepackage[OT4,T1]{fontenc}\n",
"% provides various features to facilitate writing math formulas and to improve the typographical quality of their output.\n",
"\\usepackage[cmex10]{amsmath}\n",
"\\interdisplaylinepenalty=2500\n",
"% por urls typesetting and breaking\n",
"\\usepackage{url}\n",
"% for vertical merging table cells\n",
"\\usepackage{multirow}\n",
"% \\usepackage[utf8]{inputenc}\n",
"\n",
"\n",
"\\title{Research paper structure in LaTeX}\n",
"\n",
"\n",
"%\\author{}\n",
"\\name{Tomasz Ziętkiewicz}\n",
"\n",
"\n",
"\\begin{document}\n",
"\\maketitle\n",
"% \n",
"\\begin{abstract}\n",
"This paper is an example of a paper structure in \\LaTeX\n",
"\\end{abstract}\n",
"\n",
"\\noindent\\textbf{Index Terms}: speech recognition, error correction, post-processing, post-editing, natural language processing\n",
"\n",
"\n",
"\\section{Introduction}\n",
"Introductions has always been very important parts of scientific papers...\n",
"\n",
"\\section{Related work} \\label{sec:related}\n",
"Tips on writing research papers can be found in \\cite{howtowrite}\n",
"\n",
"\n",
"\\section{Data} \\label{sec:data}\n",
"Data is prepared using our novel data pipeline presented on figure \\ref{fig:data-piepline}\n",
"\n",
"\\begin{figure}[htbp]\n",
" \\centering\n",
" \\label{fig:data-pipeline}\n",
" \\includegraphics[scale=0.6]{data-pipeline.pdf}\n",
" \\caption{Data preparation pipeline}\n",
"\\end{figure}\n",
"\n",
"\n",
"Data statistics are shown in Table \\ref{tab:data}.\n",
"Data sets were randomly divided into training, development, and test subsets in a proportion 8:1:1.\n",
"\n",
"\t\\begin{table}\n",
"\t \\caption{Datasets statistics }\n",
" \\label{tab:data}\n",
" \\centering\n",
"\t\t\\begin{tabular}{|l|r|r|r|r|r|}\n",
" \t\t\\hline\n",
" \t\tLanguage & \\textbf{de-DE} & \\textbf{es-ES} & \\textbf{fr-FR} \\\\\n",
" \t\t\\hline\n",
" \t\tSentences & $12 242$ & $16 905$ & $7180$ \\\\\n",
" \t\tTokens & $37 955$ & $55 567$ & $28 004$ \\\\\n",
" \t\t\\hline\n",
"\t\t\\end{tabular}\n",
"\t\t\\end{table}\n",
"\n",
"\\section{Method} \\label{sec:method}\n",
"The proposed method consists of ...\n",
"\n",
"\\subsection{Data preparation}\n",
"To train the model, a lot of data is needed...\n",
"\n",
"\\subsection{Architecture}\n",
"\n",
"\n",
"\\section{Results} \\label{sec:results}\n",
"Table \\ref{tab:results} presents averaged results.\n",
"The metric used is computes as follows:\n",
"\\begin{equation}\n",
" RMSE = \\sqrt{\\frac{1}{n}\\Sigma_{i=1}^{n}{\\Big(\\frac{d_i -f_i}{\\sigma_i}\\Big)^2}}\n",
"\\end{equation} \n",
"where ...\n",
"\n",
" \\begin{table}\n",
"\t\t\\begin{tabular}{|l|c|c|c|c|c|}\n",
" \\hline \n",
" & Train & Test & Dev & - & Eval\\\\ \n",
" \\hline \n",
" Raw ASR 1best & 9.59 & 12.08 & 12.39 & 45.64 & 27.6\\\\ \n",
" \\hline \n",
" lattice oracle WER & 3.75 & 4.72 & 4.93 & 30.71 & 17.7\\\\ \n",
" \\hline \n",
" Edit operation tagger (from 1best) & - & 10.7 & - & - & 24.7\\\\ \n",
" \\hline \n",
" Absolute WER Reduction & - & $11.42\\%$ & - & - & $10.50\\%$ \\\\ \n",
" \\hline \n",
" Relative WER Reduction & - & $11.42\\%$ & - & - & $10.50\\%$ \\\\ \n",
" \\hline \n",
"\t\t\\end{tabular}\n",
" \\label{tab:results}\n",
"\t\t\\caption{Word Error Rates for input data and the proposed system.}\n",
"\t\\end{table}\n",
"\n",
"\n",
"\\section{Conclusions} \\label{sec:conclusions}\n",
"We presented a new approach to ASR errors correction problem. As demonstrated using three independent datasets, correction models trained using this approach are effective even for relatively small training datasets. The method allows to precisely control which errors should be included in the model and which of the included ones should be corrected at the inference time. The evaluations performed on the models show that they can significantly improve the ASR results by reducing the WER by more than $20\\%$. All of the models presented offer very good inference latency, making them suitable for use with streaming ASR systems. \n",
"\n",
"The presented method is well suited for industrial applications where the ability to precisely control how the error correction model works, as well as small latency, are crucial. \n",
"\n",
"%\\section{Acknowledgements}\n",
"\n",
"\n",
"\\bibliographystyle{IEEEtran}\n",
"\n",
"\\bibliography{bibliography}\n",
"\n",
"\\end{document}\n",
"\n",
"```"
]
},
{
"cell_type": "markdown",
"id": "3ea5c879",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"```bibtex\n",
"\n",
"@book{Hastie2009,\n",
"\ttitle={The Elements of Statistical Learning: Data Mining, Inference, and Prediction},\n",
"\tauthor={Hastie, Trevor and Tibshirani, Robert and Friedman, Jerome},\n",
"\tyear={2009},\n",
"\tpublisher={Springer},\n",
"\taddress = {New York, NY},\n",
"\tedition = {2nd}\n",
"}\n",
"\n",
"@article{Byon2013,\n",
"title = {Wind turbine operations and maintenance: A tractable approximation of dynamic decision-making},\n",
"author = {Byon, E.},\n",
"journal = { IIE Transactions},\n",
"volume = {45},\n",
"number = {11},\n",
"pages = {1188--1201},\n",
"year = {2013}\n",
"}\n",
"\n",
"@inproceedings{Breunig2000,\n",
" title={{LOF}: Identifying density-based local outliers},\n",
" author={Breunig, M. M. and Kriegel, H.-P. and Ng, R. T. and Sander, J.},\n",
" booktitle={Proceedings of the 2000 ACM SIGMOD International Conference on Management of Data},\n",
" pages={93--104},\n",
" year={2000},\n",
" organization={ACM}\n",
"}\n",
"\n",
"@incollection{Yang2010,\n",
" author = \"Yang, J. AND Huang, T. S.\",\n",
" title = \"Image super-resolution: {H}istorical overview and future challenges\",\n",
" booktitle = \"Super-Resolution Imaging\",\n",
" editor = \"Milanfar, Peyman\",\n",
" pages =\"3--35\",\n",
" publisher = \"Chapman \\& Hall/CRC Press\",\n",
" address = {Boca Raton, FL},\n",
" year = \"2010\"\n",
"}\n",
"```"
]
},
{
"cell_type": "markdown",
"id": "pressing-european",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Overleaf \n",
" - Overlaf to serwis/aplikacja webowa umożliwiająca edycję i kompilację dokumentów Latexa on-line, w przeglądarce\n",
" - https://www.overleaf.com/\n",
" - Działa od ręki, bez potrzeby konfiguracji, instalacji pakietów itp.\n",
" - podgląd gotowego dokumentu, automatyczna kompilacja\n",
" - edytor z uzupełnianiem składni\n",
" - intagracja z Git/GitHub"
]
},
{
"cell_type": "markdown",
"id": "ba75e390",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## arXiv.org\n",
" - https://arxiv.org/\n",
" - baza artykułów, uporządkowanych według kategorii\n",
" - umożliwia samodzielne opublikowanie artykułu jeszcze przed wysłaniem go do czasopisma/na konferencję. Artykuły tam dostępne nie są recenzowane, ale jest to sposób na otrzymanie feedbacku od społeczności poza oficjalnym procesem publikacyjnym."
]
},
{
"cell_type": "markdown",
"id": "e1822b3c",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### JupyterBook\n",
"https://jupyterbook.org/en/stable/intro.html\n"
]
},
{
"cell_type": "markdown",
"id": "ceef2f3f",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### The Turing Way\n",
"*The Turing Way handbook to reproducible, ethical and collaborative data science*\n",
"\n",
"https://the-turing-way.netlify.app/welcome.html"
]
},
{
"cell_type": "markdown",
"id": "informational-writer",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Conclusions\n",
"### Zadanie [30pkt][2023-06-07] (zmiana terminu!)\n",
"1. Wybierz konferencję naukową z dziedziny ML/AI/Computer Science\n",
"2. Używając szablonu Latex udostępnionego przez organizatorów konferencji, stwórz szkic artykułu naukowego opisującego wyniki eksperymentów ML, które przeprowadziłaś/eś w trakcie zajęć.\n",
"3. Napisz artykuł używając Overleaf. Udostępnij w [arkuszu z zapisami](https://uam.sharepoint.com/:x:/r/sites/2023SL06-DIUMUI0LABInynieriauczeniamaszynowego-Grupa11/Shared%20Documents/General/IUM-2023-zapisy.xlsx?d=w49d444e07d864d2997ef7d72c5a47da0&csf=1&web=1&e=RT11aP) link udostępniający dokument ([jak stworzyć taki link](https://www.overleaf.com/learn/how-to/What_is_Link_Sharing%3F))\n",
"4. Artykuł musi zawierać co najmniej:\n",
" - 6 niepustych sekcji (abstract, introduction, related work, method, results, conclusions)\n",
" - jedną tabelkę (np. opisującą dane lub wyniki)\n",
" - jedną ilustrację (np. jakiś wykres, który tworzyli Państwo na zajęciach)\n",
" - 5 cytowań (można np. zacytować artykuły opisujące użytą metodę, zbiory danych, narzędzia. Zazwyczaj popularne biblioteki, datasety podają w README jak należy je cytować)\n",
" - 1 wzór matematyczny\n",
"5. Artykuł powinien być zgodny z wytycznymi konferencji dotyczącymi formy artykułów (oczywiście poza liczbą stron)\n",
"6. Na przedostatnich i ostatnich zajęciach będą Państwo prezentować artykuł i wtedy też zostanie on oceniony\n",
" \n",
"\n",
"Zapewne w napisanym artykule nie opiszą państwo niczego nowatorskiego i wartego publikacji - tutaj udajemy, że zastosowaliśmy metodę po raz pierwszy, osiągnęliśmy nieosiągalne dotąd wyniki itp. Liczy się forma i struktura pracy. Można dodać komentarz wyjaśniający prawdziwy cel artykuły w sekcji/przypisie \"Disclaimer\", żeby nikt Państwa nie posądzał o pisanie nieprawdy.\n",
" "
]
},
{
"cell_type": "markdown",
"id": "challenging-student",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"![Tajny język naukowców](https://i1.kwejk.pl/k/obrazki/2017/10/2b48483a6c4f274aa276732e41f856af.jpg)"
]
}
],
"metadata": {
"celltoolbar": "Slideshow",
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.16"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

View File

@ -1,159 +0,0 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "3c047009",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Kubernetes\n",
"\n",
"<img style=\"height: 150px;\" src=\"img/kubernetes_logo.png\"/>"
]
},
{
"cell_type": "markdown",
"id": "9a21632b",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Kubernetes (aka. K8s) - system służący do automatyzacji:\n",
" - deploymentu\n",
" - skalowania\n",
" - zarządzania\n",
" \n",
" skonteneryzowanymi aplikacjami"
]
},
{
"cell_type": "markdown",
"id": "7bb1198e",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Motywacja\n",
"- Kubernetes jest środowiskiem, w którym działa Kubeflow - system stworzony z myślą o rozwoju i deploymencie modeli ML"
]
},
{
"cell_type": "markdown",
"id": "abe1d606",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Instalacja\n",
"- Instalacja do nauki i eksperymentów (nieprodukcyjna): https://minikube.sigs.k8s.io/docs/start/"
]
},
{
"cell_type": "markdown",
"id": "4ed97706",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Hello Minikube - interaktywny samouczek\n",
"1. Otwórz stronę: https://kubernetes.io/pl/docs/tutorials/hello-minikube/\n",
"2. Kliknij na \"Launch Terminal\" i wykonuj polecenia w otwartym terminalu (możesz klikać na fragmentach kodu a same przekopiują się do terminala i uruchomią)\n",
"\n",
"Większość interaktywnych samouczków z kubernetes.io przestała działać z końcem marca (https://kubernetes.io/blog/2023/02/14/kubernetes-katacoda-tutorials-stop-from-2023-03-31/), ale ten powyżej (i czasami niektóre inne, jeśli macie szczęście) wciąż działa"
]
},
{
"cell_type": "markdown",
"id": "eded46b6",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Terminologia\n",
"- Pod - (z angielskiego \"strąk\", np. strąk groszku, ale też grupa wielorybów <\"pod of whales\">)\n",
" grupa jednego lub więcej kontenerów wraz z przynależnymi wolumenami (volumes), adresem IP i informacją jak mogą być uruchomione\n",
"<img style=\"height: 200px;\" src=\"img/pod.jpg\"/>\n",
"- Node (węzeł) - pody (jeden lub więcej) są uruchamiane na węzłach - maszynach (fizycznych lub wirtualnych). Na każdym węźle jest uruchomiony proces \"kublet\", służący do komunikacji z \"control plane\", czyli serwerem kontrolującym klaster"
]
},
{
"cell_type": "markdown",
"id": "9d5b11fe",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"- Cluster - grupa węzłów\n",
"- Service - abstrakcja zapewniająca stabilny dostęp do Podów. Ponieważ Pod-y są efemeryczne, mogą być uruchamiane automatczynie np. w wyniki awarii węzła. Service definiuje jakie Pod-y (np. z jaką etykietą) są dostępne pod danym portem (więcej informacji: https://kubernetes.io/docs/concepts/services-networking/service/)\n",
"\n",
"- Schemat klastra: https://kubernetes.io/docs/concepts/overview/components/"
]
},
{
"cell_type": "markdown",
"id": "70932230",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Materiały\n",
"Zapoznaj się z następującymi materiałami:\n",
"1. https://kubernetes.io/pl/docs/tutorials/kubernetes-basics/create-cluster/cluster-intro/\n",
"1. https://kubernetes.io/pl/docs/tutorials/kubernetes-basics/explore/explore-intro/\n",
"2. https://kubernetes.io/pl/docs/tutorials/kubernetes-basics/expose/expose-intro/"
]
},
{
"cell_type": "markdown",
"id": "8af62811",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Zadanie\n",
"Brak ;) ale patrz nowy termin zadania z zajęć \"12. Publikacja\" (07.06.2023)"
]
}
],
"metadata": {
"celltoolbar": "Slideshow",
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.16"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 580 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB