forked from AITech/aitech-ium
Compare commits
79 Commits
Author | SHA1 | Date | |
---|---|---|---|
a3a9ee4f70 | |||
6c6d5fba88 | |||
a013feb294 | |||
e927e26135 | |||
b5bdb4e165 | |||
c7bfa4a316 | |||
50a5e2998f | |||
06d7e0d3a7 | |||
375e08921f | |||
b650e23073 | |||
1f72275e83 | |||
eb983c3ddd | |||
4fee50befa | |||
fa535a10ac | |||
bfac49d4fe | |||
3de0fde490 | |||
8f75914eba | |||
db340bdbb2 | |||
425c9defb6 | |||
8264284fd7 | |||
b079dbb978 | |||
0d2ac2309a | |||
a022ba0b64 | |||
c9bed7835d | |||
18c7c11ace | |||
06eccfadf7 | |||
e8f9c38340 | |||
1d3e3ff71c | |||
28189bfeef | |||
74c46acf61 | |||
3eaf176f65 | |||
b88e776291 | |||
76adf25321 | |||
1c2d00f3dc | |||
855ca79293 | |||
d85421d61b | |||
4bb431da57 | |||
3104a23c03 | |||
014fbd8479 | |||
bfe0b0004f | |||
808ab908e7 | |||
e470c7c055 | |||
f7b4bce1d0 | |||
54e8efa9b7 | |||
e7d2e17474 | |||
dbe0e367a0 | |||
|
b819483ba3 | ||
9be417dd6a | |||
78aef5d79e | |||
19f229b3e6 | |||
|
67e14528bb | ||
|
107dc3301a | ||
|
b5daf596ba | ||
|
3bafb6109d | ||
ae37e8ddd1 | |||
|
8e7fc82ec1 | ||
f857b890af | |||
|
13a0ff9035 | ||
d3b75559e1 | |||
|
a7527539c5 | ||
ea4a2b110d | |||
|
2102e9f082 | ||
68c93b6e5b | |||
3055a4f1c2 | |||
f8de2b8853 | |||
4d36d0cc2a | |||
7cd468a5c5 | |||
2815f857f4 | |||
7d6116c382 | |||
267b1fff9a | |||
30ec372384 | |||
16dcf15944 | |||
c4d4b3154c | |||
b087c96a81 | |||
b737c1a504 | |||
70579927aa | |||
b5377e8f8b | |||
8f8a8f14f9 | |||
0e2b626d0a |
13
.github/workflows/workflow.yml
vendored
Normal file
13
.github/workflows/workflow.yml
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
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
|
@ -2,7 +2,7 @@
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "ac87c554",
|
||||
"id": "3ae03d8e",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Środowisko wykorzystywane na zajęciach"
|
||||
@ -10,7 +10,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "167416f3",
|
||||
"id": "dc65cc30",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Certificat SSL dla strony: https://letsencrypt.org/\n",
|
||||
@ -57,7 +57,7 @@
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "60970c71",
|
||||
"id": "71e2cecc",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
@ -65,7 +65,7 @@
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"display_name": "Python 3 (ipykernel)",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
@ -79,7 +79,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.9.1"
|
||||
"version": "3.10.4"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
@ -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 (2021)</h3>\n",
|
||||
"<h3> Tomasz Ziętkiewicz (2023)</h3>\n",
|
||||
"</div>\n",
|
||||
"\n",
|
||||
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
|
||||
@ -43,7 +43,6 @@
|
||||
"## Przedmiot\n",
|
||||
"- Kod przedmiotu: 06-DIUMUI0\n",
|
||||
"- Nazwa: Inżynieria Uczenia Maszynowego\n",
|
||||
"- WMI UAM 2021\n",
|
||||
"- Sylabus: Sylabus-AITech-InzynieriaUczeniaMaszynowego.pdf"
|
||||
]
|
||||
},
|
||||
@ -60,10 +59,13 @@
|
||||
"- 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/tzietkiewicz/aitech-ium\n",
|
||||
"- konsultacje: przez MS Teams, po wcześniejszym umówieniu mailowym lub przez chat"
|
||||
"<!-- - 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"
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -97,15 +99,16 @@
|
||||
"3. Ciągła Integracja - Jenkins\n",
|
||||
"4. Konteneryzacja - Docker\n",
|
||||
"5. Biblioteki ML\n",
|
||||
"6. Przygotowanie eksperymentu ML\n",
|
||||
"7. Jenkins pipeline\n",
|
||||
"6. Jenkins pipeline\n",
|
||||
"7. Hugging Face Hub\n",
|
||||
"8. Kontrola eksperymentów - Sacred\n",
|
||||
"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"
|
||||
"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"
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -151,7 +154,9 @@
|
||||
"## 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."
|
||||
"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"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -175,7 +180,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.9.1"
|
||||
"version": "3.9.16"
|
||||
},
|
||||
"slideshow": {
|
||||
"slide_type": "slide"
|
||||
|
@ -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 (2021)</h3>\n",
|
||||
"<h3> Tomasz Ziętkiewicz (2023)</h3>\n",
|
||||
"</div>\n",
|
||||
"\n",
|
||||
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
|
||||
@ -115,6 +115,7 @@
|
||||
"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",
|
||||
@ -220,7 +221,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.9.1"
|
||||
"version": "3.9.12"
|
||||
},
|
||||
"slideshow": {
|
||||
"slide_type": "slide"
|
||||
|
@ -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 (2021)</h3>\n",
|
||||
"<h3> Tomasz Ziętkiewicz (2023)</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\n",
|
||||
" - Ekstrakcja\n"
|
||||
" - Data scrapping"
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -92,11 +92,13 @@
|
||||
"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)"
|
||||
"- IWSLT https://iwslt.org/2021/#shared-tasks (tłumaczenie mowy)\n",
|
||||
"- CNLPS - Challenges for Natural Language Processing - https://fedcsis.org/sessions/aaia/cnlps"
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -108,11 +110,12 @@
|
||||
},
|
||||
"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/\n",
|
||||
"- UCI Machine Learning Repository: https://archive.ics.uci.edu/ml/ (University of California)\n",
|
||||
"- Google dataset search: https://datasetsearch.research.google.com/\n",
|
||||
"- Zbiory google:https://research.google/tools/datasets/\n",
|
||||
"- https://registry.opendata.aws/\n",
|
||||
"- Otwarte zbiory na Amazon AWS: https://registry.opendata.aws/\n",
|
||||
" "
|
||||
]
|
||||
},
|
||||
@ -126,11 +129,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 PL: https://lindat.cz/repository/xmlui/\n",
|
||||
" - Clarin: https://clarin-pl.eu/index.php/zasoby/\n",
|
||||
" - Clarin: https://clarin-pl.eu/index.php/zasoby/\n",
|
||||
" - NKJP: http://nkjp.pl/\n",
|
||||
" "
|
||||
]
|
||||
},
|
||||
@ -143,9 +146,22 @@
|
||||
},
|
||||
"source": [
|
||||
"## Crowdsourcing\n",
|
||||
"- Amazon Mechanical Turk: https://www.mturk.com/\n",
|
||||
"- Yandex Toloka\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",
|
||||
"<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>"
|
||||
@ -201,13 +217,7 @@
|
||||
}
|
||||
},
|
||||
"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"
|
||||
"## Pobranie danych"
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -218,15 +228,12 @@
|
||||
}
|
||||
},
|
||||
"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"
|
||||
"### Pobieranie z Kaggle"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 12,
|
||||
"execution_count": 1,
|
||||
"metadata": {
|
||||
"scrolled": true,
|
||||
"slideshow": {
|
||||
@ -238,22 +245,33 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"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"
|
||||
"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"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -263,9 +281,21 @@
|
||||
"!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": 61,
|
||||
"execution_count": 7,
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "slide"
|
||||
@ -276,8 +306,11 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"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"
|
||||
"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"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -289,8 +322,9 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 14,
|
||||
"execution_count": 8,
|
||||
"metadata": {
|
||||
"scrolled": true,
|
||||
"slideshow": {
|
||||
"slide_type": "slide"
|
||||
}
|
||||
@ -310,9 +344,50 @@
|
||||
"!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": 15,
|
||||
"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,
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "slide"
|
||||
@ -335,9 +410,88 @@
|
||||
"!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": 18,
|
||||
"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,
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "slide"
|
||||
@ -508,7 +662,7 @@
|
||||
"[150 rows x 6 columns]"
|
||||
]
|
||||
},
|
||||
"execution_count": 18,
|
||||
"execution_count": 14,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@ -989,6 +1143,395 @@
|
||||
"sns.pairplot(data=iris.drop(columns=[\"Id\"]), hue=\"Species\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "slide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"### Pobieranie z HuggingFace 🤗 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": {
|
||||
@ -1429,7 +1972,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\n",
|
||||
" - np. dodanie echa do nagrania dźwiękowego, dodanie szumów do obrazka\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",
|
||||
@ -1448,11 +1991,20 @@
|
||||
"# 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 10-20 MB)\n",
|
||||
" - nie za duży (max ~200 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:/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",
|
||||
" - 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": [
|
||||
"- 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",
|
||||
@ -1466,7 +2018,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:/s/2021SL06-DIUMUI0LABInynieriauczeniamaszynowego-Grupa11/EYhZK_aXp41BsIVS4K-L1V4B_vM2FjO5nJZMWv2QKXJolA?e=DKIS2O)\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"
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -1503,7 +2055,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.9.1"
|
||||
"version": "3.9.12"
|
||||
},
|
||||
"slideshow": {
|
||||
"slide_type": "slide"
|
||||
|
@ -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 (2021)</h3>\n",
|
||||
"<h3> Tomasz Ziętkiewicz (2023)</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 bardzo częstym włączaniu nowych zmian do głównej gałęzi (branch)\n",
|
||||
" - Jest to praktyka rozwoju projektów informatycznych polegająca na 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:8080/job/hello-world/\n",
|
||||
" Przykładowy pipeline: https://tzietkiewicz.vm.wmi.amu.edu.pl:8081/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:8080/job/hello-world/2/\n",
|
||||
" Np: https://tzietkiewicz.vm.wmi.amu.edu.pl:8081/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: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",
|
||||
" - 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",
|
||||
" - 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:8080/job/hello-world/pipeline-syntax/\n",
|
||||
"- \"Pipeline syntax\" na stronie każdego projektu, np: https://tzietkiewicz.vm.wmi.amu.edu.pl:8081/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:8080 za pomocą konta wydziałowego (jak w laboratoriach WMI)"
|
||||
" - zaloguj się na https://tzietkiewicz.vm.wmi.amu.edu.pl:8081 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 \"s123456-create-dataset\" (w miejsce 123456 proszę wstawić swój numer indeksu)\n",
|
||||
" - Jako nazwę wpisz \"z-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: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",
|
||||
" - 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",
|
||||
"\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:8080/job/hello-world/):\n",
|
||||
"Przykładowy declarative Pipeline (https://tzietkiewicz.vm.wmi.amu.edu.pl:8081/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:8080/job/hello-world-scripted/):\n",
|
||||
"Przykładowy scripted Pipeline (https://tzietkiewicz.vm.wmi.amu.edu.pl:8081/job/hello-world-scripted/):\n",
|
||||
"\n",
|
||||
"```groovy\n",
|
||||
"node {\n",
|
||||
@ -396,12 +396,13 @@
|
||||
"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:8080/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:8081/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:8080/job/kaggle-CLI-example/\n",
|
||||
"https://tzietkiewicz.vm.wmi.amu.edu.pl:8081/job/kaggle-CLI-example/\n",
|
||||
"```groovy\n",
|
||||
"node {\n",
|
||||
" stage('Preparation') { \n",
|
||||
@ -459,7 +460,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",
|
||||
@ -508,7 +509,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.9.1"
|
||||
"version": "3.9.16"
|
||||
},
|
||||
"slideshow": {
|
||||
"slide_type": "slide"
|
||||
|
@ -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 (2021)</h3>\n",
|
||||
"<h3> Tomasz Ziętkiewicz (2022)</h3>\n",
|
||||
"</div>\n",
|
||||
"\n",
|
||||
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
|
||||
@ -51,13 +51,23 @@
|
||||
" - rozwój,\n",
|
||||
" - uruchamianie\n",
|
||||
" - i dostarczanie\n",
|
||||
"aplikacji.\n",
|
||||
"aplikacji."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
"slide_type": "slide"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"- Konteneryzacja to nie tylko Docker:\n",
|
||||
" - chroot\n",
|
||||
" - Solaris Containers\n",
|
||||
" - LXC (Linux Containers)\n",
|
||||
" - OpenVZ\n",
|
||||
" - Windows containers\n"
|
||||
" - Windows containers"
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -117,7 +127,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",
|
||||
@ -125,16 +135,37 @@
|
||||
"\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\n",
|
||||
" Ważne: po zatrzymaniu kontenera \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": [
|
||||
"- ```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`\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": [
|
||||
"- ```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 prune``` - usuwa nieużywane obrazy i kontenery, zazwyczaj zwalniając sporo miejsca na dysku"
|
||||
"- ```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``` - "
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -149,7 +180,9 @@
|
||||
" - 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: podmontowanie katalogów hosta w kontenerze poprzez flagę `-v` [dokumentacja](https://docs.docker.com/engine/reference/commandline/run/#mount-volume--v---read-only)"
|
||||
" - 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/"
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -215,7 +248,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",
|
||||
@ -425,8 +458,8 @@
|
||||
},
|
||||
"source": [
|
||||
"### 2.1 Jenkins - Terminologia (https://www.jenkins.io/doc/book/glossary/):\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",
|
||||
" - **Agent**: An agent is typically a machine, or container, which connects to a Jenkins controller and executes tasks when directed by the controller\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."
|
||||
@ -476,7 +509,9 @@
|
||||
" ## 2.2 Docker w Jenkins\n",
|
||||
" <img style=\"height: 100px;\" src=\"IUM_04/docker-jenkins.png\"/></b>\n",
|
||||
"\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",
|
||||
" - Więcej informacji: https://www.jenkins.io/doc/book/pipeline/docker/"
|
||||
]
|
||||
},
|
||||
@ -501,7 +536,7 @@
|
||||
" }\n",
|
||||
"```\n",
|
||||
" - Declarative:\n",
|
||||
" ```groovy\n",
|
||||
" ```groovy\n",
|
||||
" pipeline {\n",
|
||||
" agent {\n",
|
||||
" docker { image 'ubuntu:latest' }\n",
|
||||
@ -542,7 +577,7 @@
|
||||
" }\n",
|
||||
"```\n",
|
||||
" - Declarative:\n",
|
||||
" ```groovy\n",
|
||||
" ```groovy\n",
|
||||
" pipeline {\n",
|
||||
" agent { \n",
|
||||
" dockerfile true \n",
|
||||
@ -571,10 +606,7 @@
|
||||
" 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 (lokalny, albo ściągany z Docker Hub)\n",
|
||||
"\n",
|
||||
"### Termin\n",
|
||||
"Termin na oddanie obu zadań (zadanie 2. i zadanie 3.): 11 IV"
|
||||
" Skorzystaj z mechanizmu wykorzystującego gotowy obraz (ściągany z Docker Hub)"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -598,7 +630,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.9.1"
|
||||
"version": "3.9.12"
|
||||
},
|
||||
"slideshow": {
|
||||
"slide_type": "slide"
|
||||
|
@ -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 (2021)</h3>\n",
|
||||
"<h3> Tomasz Ziętkiewicz (2022)</h3>\n",
|
||||
"</div>\n",
|
||||
"\n",
|
||||
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
|
||||
@ -294,13 +294,14 @@
|
||||
"source": [
|
||||
"## Zadanie [22 pkt.]\n",
|
||||
"\n",
|
||||
"Termin: 2 tygodnie (25 IV)\n",
|
||||
"Termin: 2023-05-12\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 [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",
|
||||
" - 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",
|
||||
" 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",
|
||||
@ -331,7 +332,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.9.1"
|
||||
"version": "3.9.12"
|
||||
},
|
||||
"slideshow": {
|
||||
"slide_type": "slide"
|
||||
|
@ -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 (2021)</h3>\n",
|
||||
"<h3> Tomasz Ziętkiewicz (2022)</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 \"Powiadomienia z Jenkins\" na naszej grupie zajęciowej: 26ab8f35.uam.onmicrosoft.com@emea.teams.ms\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",
|
||||
"- Wysłanie na niego wiadomości email spowoduje pojawienie się jej na tym kanale"
|
||||
]
|
||||
},
|
||||
@ -184,12 +184,12 @@
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"## Zadanie 1 [5 pkt] (termin: 2 V 2021)\n",
|
||||
"## Zadanie 1 [5 pkt] (termin: 2023-05-12)\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. [1 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. [2 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,24 +201,30 @@
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"## 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",
|
||||
"## 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",
|
||||
"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). [3 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",
|
||||
" 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.) [2pkt]\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",
|
||||
"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]\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]"
|
||||
" - numeru builda projektu s123456-training (\"Build selector for Copy artifact\", patrz zajęcia 3.) [1pkt]"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -242,7 +248,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.9.1"
|
||||
"version": "3.9.16"
|
||||
},
|
||||
"slideshow": {
|
||||
"slide_type": "slide"
|
||||
|
File diff suppressed because it is too large
Load Diff
9
IUM_07/Dockerfile
Normal file
9
IUM_07/Dockerfile
Normal file
@ -0,0 +1,9 @@
|
||||
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
Normal file
13
IUM_07/Jenkinsfile
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
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'
|
||||
}
|
||||
}
|
||||
}
|
@ -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
|
||||
|
39
IUM_07/mongo_observer.py
Normal file
39
IUM_07/mongo_observer.py
Normal file
@ -0,0 +1,39 @@
|
||||
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()
|
8310
IUM_08.MLFlow.ipynb
8310
IUM_08.MLFlow.ipynb
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
1117
IUM_10.DVC.ipynb
1117
IUM_10.DVC.ipynb
File diff suppressed because it is too large
Load Diff
594
IUM_11.CML.ipynb
594
IUM_11.CML.ipynb
@ -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 CML</i> [laboratoria]</h2> \n",
|
||||
"<h3> Tomasz Ziętkiewicz (2021)</h3>\n",
|
||||
"<h2> 11. <i>Github actions</i> [laboratoria]</h2> \n",
|
||||
"<h3> Tomasz Ziętkiewicz (2023)</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",
|
||||
" - *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",
|
||||
" - *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",
|
||||
" - *Step* - odpowiednik \"Stage\" z Jenkinsa - służu do grupowania \"Actions\"\n",
|
||||
" - *Action* - odpowiednik \"Step\" z Jenkinsa - pojedyncze polecenie do wykonania, np. dodanie komentarze do Pull requesta, wykonanie polecenia systemowego itp.\n",
|
||||
" - *Action/command* - 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)\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)"
|
||||
" - *Self-hosted runner* - nasz własny serwer, z zinstalowaną aplikacją [Github actions runner](https://github.com/actions/runner)"
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -89,7 +89,7 @@
|
||||
},
|
||||
"source": [
|
||||
"### Definicja workflow\n",
|
||||
" - Workflow definiuje się w plikach YAM(o rozszerzeniu `*.yml` albo `*.yaml`) umieszczonych w specjalnym folderze `.github/workflows/` wewnątrz repozytorium\n",
|
||||
" - Workflow definiuje się w plikach YAML(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,33 +103,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"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,
|
||||
"execution_count": 4,
|
||||
"id": "f4916c1f",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
@ -141,18 +115,53 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"/home/tomek/AITech/repo/aitech-ium-private/IUM_11/github-actions-hello\n"
|
||||
"/home/tomek/repos/aitech-ium/IUM_11/github-actions-hello\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"%cd github-actions-hello\n",
|
||||
"!mkdir -p IUM_11/github-actions-hello\n",
|
||||
"%cd IUM_11/github-actions-hello\n",
|
||||
"!mkdir -p .github/workflows"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"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,
|
||||
"id": "dde8d432",
|
||||
"metadata": {
|
||||
"slideshow": {
|
||||
@ -164,7 +173,7 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Writing .github/workflows/workflow.yml\n"
|
||||
"Overwriting .github/workflows/workflow.yml\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -185,6 +194,164 @@
|
||||
" - 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",
|
||||
@ -219,6 +386,339 @@
|
||||
" - 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",
|
||||
@ -547,19 +1047,23 @@
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"## Zadania\n",
|
||||
"## Zadania [20 pkt] (termin: 24.05.2023)\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 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]"
|
||||
"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"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"author": "Tomasz Ziętkiewicz",
|
||||
"celltoolbar": "Slideshow",
|
||||
"email": "tomasz.zietkiewicz@amu.edu.pl",
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
@ -577,7 +1081,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.9.1"
|
||||
"version": "3.9.16"
|
||||
},
|
||||
"slideshow": {
|
||||
"slide_type": "slide"
|
||||
|
1
IUM_11/github-actions-hello
Submodule
1
IUM_11/github-actions-hello
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 5a40228be54897d47e0480318adcdbdec0e74d60
|
@ -66,7 +66,7 @@
|
||||
"author": "Tomasz Ziętkiewicz",
|
||||
"email": "tomasz.zietkiewicz@amu.edu.pl",
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"display_name": "Python 3 (ipykernel)",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
@ -81,7 +81,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.9.1"
|
||||
"version": "3.10.4"
|
||||
},
|
||||
"slideshow": {
|
||||
"slide_type": "slide"
|
||||
|
577
IUM_12.Publikacja.ipynb
Normal file
577
IUM_12.Publikacja.ipynb
Normal file
@ -0,0 +1,577 @@
|
||||
{
|
||||
"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
|
||||
}
|
159
IUM_13.Kubernetes.ipynb
Normal file
159
IUM_13.Kubernetes.ipynb
Normal file
@ -0,0 +1,159 @@
|
||||
{
|
||||
"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
|
||||
}
|
85
IUM_15.Google_Cloud_Vertex_AI.ipynb
Normal file
85
IUM_15.Google_Cloud_Vertex_AI.ipynb
Normal file
File diff suppressed because one or more lines are too long
BIN
img/ReCAPTCHA_idea.jpg
Normal file
BIN
img/ReCAPTCHA_idea.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 19 KiB |
BIN
img/cat_captcha.png
Normal file
BIN
img/cat_captcha.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 580 KiB |
BIN
img/kubernetes_logo.png
Executable file
BIN
img/kubernetes_logo.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 17 KiB |
BIN
img/pod.jpg
Executable file
BIN
img/pod.jpg
Executable file
Binary file not shown.
After Width: | Height: | Size: 56 KiB |
Loading…
Reference in New Issue
Block a user