{"id":1183,"date":"2019-11-11T19:26:52","date_gmt":"2019-11-11T18:26:52","guid":{"rendered":"http:\/\/wchmurze.cloud\/?p=1183"},"modified":"2020-02-13T22:08:05","modified_gmt":"2020-02-13T21:08:05","slug":"jetson-nano-z-wykorzystaniem-konteneryzacji","status":"publish","type":"post","link":"https:\/\/wchmurze.cloud\/index.php\/2019\/11\/11\/jetson-nano-z-wykorzystaniem-konteneryzacji\/","title":{"rendered":"Jetson Nano z wykorzystaniem konteneryzacji"},"content":{"rendered":"<p>Jednym z pocz\u0105tkowych problem\u00f3w z jakimi natkn\u0105\u0142em si\u0119 podczas pracy z p\u0142ytk\u0105 Nvidia Jetson Nano by\u0142 d\u0142ugi czas potrzebny do konfiguracji nowego \u015brodowiska wirtualnego w Pythonie. System operacyjny uruchamiany z karty microSD i potrzeba kompilacji poszczeg\u00f3lnych bibliotek, kt\u00f3re umo\u017cliwia\u0142y uruchamianie modeli uczenia maszynowego z wykorzystaniem GPU w nie nale\u017ca\u0142y w sumie do demon\u00f3w pr\u0119dko\u015bci. Trudno si\u0119 dziwi\u0107, nieco inne jest zastosowanie tego typu urz\u0105dze\u0144 elektronicznych. Zacz\u0105\u0142em si\u0119 zastanawia\u0107, czy zamiast budowy osobnych \u015brodowisk wirtualnych dla pakietu Keras z TensorFlow, dla pakietu Pytorch i pakietu Scikit-Learn, wykorzysta\u0107 mo\u017cliwo\u015b\u0107 budowy gotowych obraz\u00f3w w skonteneryzowanej postaci.<\/p>\n<p>Niniejszy wpis jest pr\u00f3b\u0105 weryfikacji takiej konfiguracji.<\/p>\n<p>&nbsp;<\/p>\n<h3>Instalacja<\/h3>\n<p>&nbsp;<\/p>\n<p>Zdecydowa\u0142em si\u0119 na zakup nowej karty microSD o wielko\u015b\u0107 128GB.<\/p>\n<p>Na pocz\u0105tku \u015bci\u0105gn\u0105\u0142em obraz<\/p>\n<p><a href=\"https:\/\/developer.nvidia.com\/embedded\/jetpack\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/developer.nvidia.com\/embedded\/jetpack<\/a><\/p>\n<p>Zainteresowa\u0142o mnie jedno zdanie:<\/p>\n<p>&#8220;In addition to the features listed below, JetPack 4.2.1 also introduced two beta features: NVIDIA Container Runtime with Docker integration and TensorRT support for INT-8 DLA operations.&#8221;<\/p>\n<p>&nbsp;<\/p>\n<p>Obraz zajmuje ok 5GB. Po rozpakowaniu pliku nagra\u0142em go na kart\u0119 za pomoc\u0105 programu <a href=\"https:\/\/www.balena.io\/etcher\/?ref=etcher_footer\" target=\"_blank\" rel=\"noopener noreferrer\">Balena Etcher.<\/a><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-1184\" src=\"http:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/10\/etcher_1.png\" alt=\"\" width=\"1008\" height=\"633\" srcset=\"https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/10\/etcher_1.png 1008w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/10\/etcher_1-300x188.png 300w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/10\/etcher_1-768x482.png 768w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/10\/etcher_1-80x50.png 80w\" sizes=\"(max-width: 1008px) 100vw, 1008px\" \/><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-1186\" src=\"http:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/10\/etcher_2.png\" alt=\"\" width=\"1008\" height=\"633\" srcset=\"https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/10\/etcher_2.png 1008w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/10\/etcher_2-300x188.png 300w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/10\/etcher_2-768x482.png 768w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/10\/etcher_2-80x50.png 80w\" sizes=\"(max-width: 1008px) 100vw, 1008px\" \/> <img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-1187\" src=\"http:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/10\/etcher_3.png\" alt=\"\" width=\"1008\" height=\"633\" srcset=\"https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/10\/etcher_3.png 1008w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/10\/etcher_3-300x188.png 300w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/10\/etcher_3-768x482.png 768w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/10\/etcher_3-80x50.png 80w\" sizes=\"(max-width: 1008px) 100vw, 1008px\" \/><\/p>\n<p>Po zako\u0144czeniu wgrywania obrazu na kart\u0119 microSD nadszed\u0142 czas na uruchomienie oprogramowania.<\/p>\n<p>Po pierwszym uruchomieniu systemu Ubuntu nadszed\u0142 czas na konfiguracj\u0119<\/p>\n<p>Przy okazji warto zaktualizowa\u0107 czas systemowy<\/p>\n<pre lang=\"BASH\">sudo date --set \"27 Oct 2019 15:08:00\"\r\n<\/pre>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-1189\" src=\"http:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/10\/jetson_docker.png\" alt=\"\" width=\"830\" height=\"515\" srcset=\"https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/10\/jetson_docker.png 830w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/10\/jetson_docker-300x186.png 300w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/10\/jetson_docker-768x477.png 768w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/10\/jetson_docker-80x50.png 80w\" sizes=\"(max-width: 830px) 100vw, 830px\" \/><\/p>\n<p>Jak wida\u0107 silnik konteneryzacji (Docker) jest ju\u017c zainstalowany, ale do sprawnego dzia\u0142anie b\u0119dziemy musieli zaktualizowa\u0107 jego wersj\u0119 (do wersji 19.03 w momencie pisania tego artyku\u0142u).<\/p>\n<p>W razie problem\u00f3w z DNS nale\u017cy do pliku <strong>\/etc\/systemd\/resolved.conf<\/strong> doda\u0107 g\u0142\u00f3wny DNS Google lub preferowany inny<\/p>\n<pre class=\"\"><code>DNS=8.8.8.8 2001:4860:4860::8888\r\nFallbackDNS=8.8.4.4 2001:4860:4860::8844<\/code><\/pre>\n<p>Za\u0142o\u017cy\u0142em, \u017ce wszelkie kompilacje oprogramowania wykonam na \u015brodowisku natywnym (Jetson Nano).<\/p>\n<p>W tym momencie warto doda\u0107 plik wymiany, gdy\u017c wolna pami\u0119\u0107 4GB mo\u017ce si\u0119 okaza\u0107 chwilami zasobem zanikaj\u0105cym.<\/p>\n<pre lang=\"BASH\">#!\/bin\/bash\r\nsudo fallocate -l 8G \/swapfile\r\nsudo chmod 600 \/swapfile\r\nsudo mkswap \/swapfile\r\nsudo swapon \/swapfile\r\necho \"\/swapfile swap swap defaults 0 0\" | sudo tee --append \/etc\/fstab &gt; \/dev\/null\r\n\r\n<\/pre>\n<p>Dokonujemy aktualizacji silnika Docker<\/p>\n<pre lang=\"BASH\">sudo apt-get install curl -y\r\ncurl -sSL https:\/\/get.docker.com\/ | sh\r\n<\/pre>\n<p>Po zako\u0144czeniu instalacji mamy ju\u017c wersj\u0119 19.03<\/p>\n<pre class=\"\">Client: Docker Engine - Community\r\n Version:           19.03.4\r\n API version:       1.40\r\n Go version:        go1.12.10\r\n Git commit:        9013bf5\r\n Built:             Fri Oct 18 15:52:24 2019\r\n OS\/Arch:           linux\/arm64\r\n Experimental:      false\r\n\r\nServer: Docker Engine - Community\r\n Engine:\r\n  Version:          19.03.4\r\n  API version:      1.40 (minimum version 1.12)\r\n  Go version:       go1.12.10\r\n  Git commit:       9013bf5\r\n  Built:            Fri Oct 18 15:50:53 2019\r\n  OS\/Arch:          linux\/arm64\r\n  Experimental:     false\r\n containerd:\r\n  Version:          1.2.10\r\n  GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339\r\n runc:\r\n  Version:          1.0.0-rc8+dev\r\n  GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657\r\n docker-init:\r\n  Version:          0.18.0\r\n  GitCommit:        fec3683\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h3>Budowa obraz\u00f3w<\/h3>\n<p>&nbsp;<\/p>\n<p>Nale\u017cy uzbroi\u0107 si\u0119 w cierpliwo\u015b\u0107, budowa jednego obrazu to co najmniej godzina czasu. Mo\u017ce si\u0119 to wydawa\u0107 d\u0142ugim czasem, ale jeden z wpis\u00f3w na blogu, kt\u00f3ry przeczyta\u0142em o walkach autora z instalacj\u0105 Tensorflow 2.0 doprowadzi\u0142 do jedynego s\u0142usznego wniosku, \u017ce taki spos\u00f3b rozwoju oprogramowania to droga donik\u0105d.<\/p>\n<p><em><a href=\"https:\/\/jkjung-avt.github.io\/build-tensorflow-2.0.0\/\" target=\"_blank\" rel=\"noopener noreferrer\">Note this script would take a very long time (~40 hours) to run<\/a>.<\/em><\/p>\n<p>To by\u0142a dodatkowa motywacja, by przygotowa\u0107 raz, a dobrze podstawowe zbiory pakiet\u00f3w dla uczenia maszynowego, czy nawet uczenia g\u0142\u0119bokiego z wykorzystaniem GPU. Wyobra\u017amy sobie, \u017ce karta SD, na kt\u00f3rej uruchamiamy system operacyjny ulega uszkodzeniu, co wtedy, kolejne godziny kompilacji? Co jest wa\u017cniejsze, trenowanie i rozbudowa modelu, czy wieczna konfiguracja i instalacja?\u00a0 I o tym jest poni\u017csza opowie\u015b\u0107.<\/p>\n<p>&nbsp;<\/p>\n<p>Dla os\u00f3b, kt\u00f3re chc\u0105 zamiast wykonywania polece\u0144 z poziomu linii komend wykorzysta\u0107 interfejs w przegl\u0105darce polecam instalacj\u0119 Portainera.<\/p>\n<p>Mo\u017cna pobra\u0107 gotowy obraz Portainera<\/p>\n<pre class=\"\" lang=\"BASH\"># pobieramy z repozytorium\r\ndocker pull portainer\/portainer\r\n# uruchamiany w trybie automatycznego restartu\r\ndocker run -d -p 9000:9000 --name portainer --restart always -v \/var\/run\/docker.sock:\/var\/run\/docker.sock portainer\/portainer\r\n<\/pre>\n<p>Aplikacja uruchomiona zostanie na porcie 9000 hosta, je\u015bli chcemy korzysta\u0107 z naszego laptopa mo\u017cna forwardowa\u0107 port 9000 przy konfiguracji \u0142\u0105cza SSH.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-1236\" src=\"http:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/11\/portainer_admin.png\" alt=\"\" width=\"1161\" height=\"701\" srcset=\"https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/11\/portainer_admin.png 1161w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/11\/portainer_admin-300x181.png 300w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/11\/portainer_admin-768x464.png 768w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/11\/portainer_admin-1024x618.png 1024w\" sizes=\"(max-width: 1161px) 100vw, 1161px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Po utworzeniu konta administratorskiego wraz z has\u0142em\u00a0 i zalogowaniu si\u0119 nale\u017cy pod\u0142\u0105czy\u0107 si\u0119 do lokalnego silnika Dockera.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-1235\" src=\"http:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/11\/portainer_connect.png\" alt=\"\" width=\"1641\" height=\"603\" srcset=\"https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/11\/portainer_connect.png 1641w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/11\/portainer_connect-300x110.png 300w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/11\/portainer_connect-768x282.png 768w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/11\/portainer_connect-1024x376.png 1024w\" sizes=\"(max-width: 1641px) 100vw, 1641px\" \/><\/p>\n<p>Od tego momentu wszystkie podane ni\u017cej operacje b\u0119dzie mo\u017cna wykona\u0107 z poziomu przegl\u0105darki.\u00a0 Przyk\u0142adowy tutorial mo\u017cna znale\u017a\u0107 np. tutaj:<\/p>\n<p><a href=\"https:\/\/www.howtoforge.com\/tutorial\/ubuntu-docker-portainer\/\" target=\"_blank\" rel=\"noopener noreferrer\">ubuntu-docker-portainer<\/a><\/p>\n<p>W tym momencie warto zrobi\u0107 forwardowanie dla portu 8888, kt\u00f3ry b\u0119dzie wykorzystywany przez Jupyter Lab\/Notebook. W popularnym kliencie SSH Putty wygl\u0105da to tak:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-1234\" src=\"http:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/11\/putty_port_9000_8888.png\" alt=\"\" width=\"606\" height=\"535\" srcset=\"https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/11\/putty_port_9000_8888.png 606w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/11\/putty_port_9000_8888-300x265.png 300w\" sizes=\"(max-width: 606px) 100vw, 606px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Zaczynamy w\u0142a\u015bciw\u0105 zabaw\u0119.<\/p>\n<p>Pobieramy bazowy obraz z repozytorium NVidia<\/p>\n<p>Jest to przygotowane oprogramowanie dobrze wsp\u00f3\u0142pracuj\u0105ce z architektur\u0105 ARM 64-bit i procesorami GPU serii Tegra.<\/p>\n<pre class=\"\" lang=\"BASH\">sudo docker pull nvcr.io\/nvidia\/l4t-base:r32.2.2\r\n<\/pre>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-1190\" src=\"http:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/10\/jetson_docker_2.png\" alt=\"\" width=\"830\" height=\"515\" srcset=\"https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/10\/jetson_docker_2.png 830w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/10\/jetson_docker_2-300x186.png 300w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/10\/jetson_docker_2-768x477.png 768w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/10\/jetson_docker_2-80x50.png 80w\" sizes=\"(max-width: 830px) 100vw, 830px\" \/><\/p>\n<p>Prace na nowo uruchomionym systemie operacyjnym mo\u017cemy rozpocz\u0105\u0107 od sklonowania repozytorium:<\/p>\n<pre lang=\"BASH\">git clone https:\/\/github.com\/djkormo\/jetson-nano.git\r\n<\/pre>\n<p>Kod znajduje si\u0119 w podkatalogu <strong>ml-containers<\/strong><\/p>\n<p>Postanowi\u0142em przygotowa\u0107 trzy obrazy zawieraj\u0105ce r\u00f3\u017cne grupy oprogramowania do uczenia maszynowego:<\/p>\n<p>1) Scikit-learn, ale tu nie b\u0119dzie wsparcia GPU zgodnie z:<\/p>\n<p><a href=\"https:\/\/scikit-learn.org\/stable\/faq.html\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/scikit-learn.org\/stable\/faq.html<\/a><\/p>\n<p>2) Tensorflow plus Keras z obs\u0142ug\u0105 GPU<\/p>\n<p>3) Pytorch z obs\u0142ug\u0105 GPU.<\/p>\n<p>Dodatkowo rozszerzy\u0142em te obrazy o najbardziej popularne pakiety (scipy,numpy, pandas, folium, matplotlib, seaborn), ten wyb\u00f3r jest autorski i wynika z do\u015bwiadcze\u0144 typowego wykorzystywana dodatkowych pakiet\u00f3w do wst\u0119pnego przetwarzania danych wej\u015bciowych i ich wizualizacji.<\/p>\n<p>Ka\u017cdy z tych obraz\u00f3w mo\u017cna b\u0119dzie dodatkowo rozszerzy\u0107 o instalacj\u0119 Jupyter Notebook i Jupyter Lab.<\/p>\n<p>Wszystkie obrazy zostan\u0105 umieszczone publicznym repozytorium Docker Hub.<\/p>\n<p>Skrypty buduj\u0105ce i zawarto\u015b\u0107 Dockerfile oraz przyk\u0142adowe pliki Pythona czy notatniki Jupytera umie\u015bci\u0142em\u00a0 w repozytorium Githuba. Kod b\u0119dzie sukcesywnie rozwijany. Licz\u0119 na konstruktywne uwagi.<\/p>\n<p><a href=\"https:\/\/github.com\/djkormo\/jetson-nano\/tree\/master\/ml-containers\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/github.com\/djkormo\/jetson-nano\/tree\/master\/ml-containers<\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Dla ka\u017cdego z obraz\u00f3w przygotowa\u0142em podkatalog zawieraj\u0105ce przynajmniej nast\u0119puj\u0105ce pliki<\/p>\n<p>&nbsp;<\/p>\n<p><strong>\u00a0A. Dockerfile &#8211; plik\u00a0 zwieraj\u0105cy instrukcj\u0119 budowy naszego obrazu<\/strong><\/p>\n<pre class=\"\" lang=\"BASH\">FROM nvcr.io\/nvidia\/l4t-base:r32.2\r\nWORKDIR \/home\r\nRUN apt-get update &amp;&amp; apt-get install -y --fix-missing make g++ libblas-dev liblapack-dev libatlas-base-dev gfortran\r\nRUN apt-get update &amp;&amp; apt-get install -y --fix-missing python3-pip libhdf5-serial-dev hdf5-tools libfreetype6-dev\r\nRUN apt-get update &amp;&amp; apt-get install -y python3-h5py\r\nRUN pip3 install --pre --no-cache-dir --extra-index-url https:\/\/developer.download.nvidia.com\/compute\/redist\/jp\/v42 tensorflow-gpu\r\nRUN pip3 install -U --pre --no-cache-dir numpy \r\nRUN pip3 install --no-cache-dir folium seaborn  keras\r\nRUN update-alternatives --install \/usr\/bin\/pip pip \/usr\/bin\/pip3 1\r\nRUN update-alternatives --install \/usr\/bin\/python python \/usr\/bin\/python3 1\r\nCOPY test.py test.py\r\nCMD [ \"bash\" ]\r\n<\/pre>\n<p>Zwracam uwag\u0119 na kilka podstawowych zasad, kt\u00f3re przyj\u0105\u0142em przy budowie aplikacji<\/p>\n<ol>\n<li>Korzystamy z tego samego obrazu bazowego <strong>nvcr.io\/nvidia\/l4t-base:r32.2<\/strong><\/li>\n<li>Instalujemy potrzebne oprogramowanie (ten punkt by\u0142 najbardziej pracoch\u0142onny, gdy\u017c dopiero podczas etapu kompilacji pojawia\u0142y si\u0119 b\u0142\u0119dy braku zale\u017cno\u015bci)<\/li>\n<li>Dedykowane oprogramowanie (Tensorflow, Pytorch) pochodzi z repozytorium NVidia dla kart GPU Tegra<\/li>\n<li>Dedykowane polecenia python3 i pip3 zostan\u0105 zmapowane do <strong>python<\/strong> i <strong>pip<\/strong>. Wersja 2.7 Pythona nie b\u0119dzie wykorzystywana<\/li>\n<li>Dodany zostanie przynajmniej jeden plik z testowym kodem (test.py)<\/li>\n<\/ol>\n<p><strong>B. build.bash &#8211; polecenia umo\u017cliwiaj\u0105cy sprawn\u0105 budow\u0119 obrazu i jego wypchni\u0119cie do publicznego repozytorium<\/strong><\/p>\n<pre class=\"\" lang=\"BASH\">#!\/bin\/bash\r\n\r\nDOCKER_REGISTRY=docker.io\r\nDOCKER_PROJECT_ID=djkormo\r\nSERVICE_NAME=jetson-pytorch-base:0.1.0\r\nDOCKER_IMAGE_NAME=$DOCKER_PROJECT_ID\/$SERVICE_NAME\r\nDOCKER_IMAGE_REPO_NAME=$DOCKER_REGISTRY\/$DOCKER_IMAGE_NAME\r\n\r\necho \"DOCKER_REGISTRY: $DOCKER_REGISTRY\"\r\necho \"DOCKER_PROJECT_ID: $DOCKER_PROJECT_ID\"\r\necho \"SERVICE_NAME: $SERVICE_NAME\"\r\necho \"DOCKER_IMAGE_NAME: $DOCKER_IMAGE_NAME\"\r\necho \"DOCKER_IMAGE_REPO_NAME: $DOCKER_IMAGE_REPO_NAME\"\r\n\r\n#  build \r\ndocker build -t $SERVICE_NAME . -f Dockerfile\r\n\r\n# tag\r\ndocker tag $SERVICE_NAME $DOCKER_IMAGE_NAME \r\n\r\n#push\r\ndocker push  $DOCKER_IMAGE_NAME\r\n<\/pre>\n<p><strong>C. run_local.bash<\/strong> &#8211; polecenie uruchamiaj\u0105ce kontener na podstawie zbudowanego obrazu<\/p>\n<p>W przypadku kontener\u00f3w bazowych (bez oprogramowania Jupyter)\u00a0 uruchamiam oprogramowanie w trybie interaktywnym<\/p>\n<pre class=\"\" lang=\"BASH\">docker run -it --runtime=nvidia --network=host djkormo\/jetson-tensorflow-base:0.1.0\r\n<\/pre>\n<p>W przypadku kontener\u00f3w dodatkowych uruchamiam oprogramowanie z podaniem mapowania portu kontenera na port host bez trybu interaktywnego<\/p>\n<pre class=\"\" lang=\"BASH\">docker run -d --runtime=nvidia -p 8888:8888 djkormo\/jetson-tensorflow-jlab:0.1.0\r\n<\/pre>\n<p>Nale\u017cy pami\u0119ta\u0107 o opcji <strong>&#8211;runtime=nvidia<\/strong>, inaczej nie b\u0119dzie mo\u017cliwo\u015bci\u00a0 wykorzystania procesora graficznego.<\/p>\n<p>&nbsp;<\/p>\n<p><strong>D. test.py<\/strong> &#8211; plik zawieraj\u0105cy testowy kod weryfikuj\u0105cy poprawno\u015b\u0107 instalacji (w szczeg\u00f3lno\u015bci wykorzystanie GPU hosta).<\/p>\n<p>Ten kod nale\u017cy wykona\u0107 wewn\u0105trz kontenera.<\/p>\n<p>Czasem wystarczy proste sprawdzenie, czy GPU Hosta jest widoczne w kontenerze, przyk\u0142adowo dla biblioteki Pytorch:<\/p>\n<pre class=\"\" lang=\"PYTHON\">import torch\r\nprint(\"torch.__version__\",torch.__version__)\r\nprint(\"torch.cuda.current_device()\",torch.cuda.current_device())\r\nprint(\"torch.cuda.device(0)\",torch.cuda.device(0))\r\nprint(\"torch.cuda.device_count()\",torch.cuda.device_count())\r\nprint(\"torch.cuda.get_device_name(0)\",torch.cuda.get_device_name(0))\r\nprint(\"torch.cuda.is_available()\",torch.cuda.is_available())\r\n<\/pre>\n<p>Po uruchomieniu kontenera wystarczy wpisa\u0107 polecenie<\/p>\n<p><strong>python test.py.<\/strong><\/p>\n<p>&nbsp;<\/p>\n<p>Proces budowania sk\u0142ada si\u0119 z nast\u0119puj\u0105cych krok\u00f3w<\/p>\n<p>1. Przygotowanie pliku <strong>Dockerfile<\/strong><\/p>\n<p>2 Przygotowanie pliku buduj\u0105cego <strong>build bash<\/strong><\/p>\n<p>Uruchomienie polecenia <strong>bash build.bash<\/strong><\/p>\n<p>3. Przygotowanie pliku lokalnego uruchomienia <strong>run_local.bash<\/strong><\/p>\n<p>Uruchomienie polecenia<strong> bash run_local.bash<\/strong><\/p>\n<p>Punkty od 1) do 3) maj\u0105 charakter cykliczny, do czasu uzyskania dzia\u0142aj\u0105cego oprogramowania\u00a0 przetestowanego odpowiednim skryptem (*.py).<\/p>\n<h4>Uwaga na pakiet Pytorch<\/h4>\n<p>W przypadku pakietu Pytorch pojawi\u0142 si\u0119 pewien problem, nie uda\u0142o si\u0119 skompilowa\u0107 pakietu <strong>torchvision<\/strong> w spos\u00f3b automatyczny. Poradzi\u0142em sobie w nast\u0119puj\u0105cy spos\u00f3b.<\/p>\n<p>1. Po zbudowaniu obrazu o nazwie jetson-pytorch-base:0.1.0 uruchomi\u0142em go z opcj\u0105 <strong>&#8211;runtime=nvidia<\/strong><\/p>\n<p>2. Wewn\u0105trz kontenera doinstalowa\u0142em brakuj\u0105cy pakiet (jak zwykle nale\u017cy si\u0119 uzbroi\u0107 w cierpliwo\u015b\u0107)<\/p>\n<pre lang=\"BASH\">cd torchvision \r\npython3 setup.py install\r\n<\/pre>\n<p>3. Po zbudowaniu pakietu skorzysta\u0142em z mo\u017cliwo\u015bci zatwierdzenia zmian z punktu 2)<\/p>\n<p>Stworzy\u0142em dedykowany kawa\u0142ek kodu<\/p>\n<pre class=\"\" lang=\"BASH\">#!\/bin\/bash\r\nCONTAINER_ID=$(docker ps -qf \"ancestor=djkormo\/jetson-pytorch-base:0.1.0\")\r\ndocker commit $CONTAINER_ID djkormo\/jetson-pytorch-base:0.2.0\r\n# push to repo \r\ndocker push djkormo\/jetson-pytorch-base:0.2.0\r\n<\/pre>\n<p>Obrazy, kt\u00f3re zosta\u0142y umieszczone w repozytorium <a href=\"https:\/\/hub.docker.com\" target=\"_blank\" rel=\"noopener noreferrer\">DockerHub<\/a>.<\/p>\n<p>bazowe<\/p>\n<p><a href=\"https:\/\/hub.docker.com\/r\/djkormo\/jetson-scikit-base\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/hub.docker.com\/r\/djkormo\/jetson-scikit-base<\/a><\/p>\n<p><a href=\"https:\/\/hub.docker.com\/r\/djkormo\/jetson-tensorflow-base\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/hub.docker.com\/r\/djkormo\/jetson-tensorflow-base<\/a><\/p>\n<p><a href=\"https:\/\/hub.docker.com\/r\/djkormo\/jetson-pytorch-jlab\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/hub.docker.com\/r\/djkormo\/jetson-pytorch-jlab<\/a><\/p>\n<p>z dodatkiem Jupyter Lab<\/p>\n<p><a href=\"https:\/\/hub.docker.com\/r\/djkormo\/jetson-scikit-jlab\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/hub.docker.com\/r\/djkormo\/jetson-scikit-jlab<\/a><\/p>\n<p><a href=\"https:\/\/hub.docker.com\/r\/djkormo\/jetson-tensorflow-jlab\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/hub.docker.com\/r\/djkormo\/jetson-tensorflow-jlab<\/a><\/p>\n<p><a href=\"https:\/\/hub.docker.com\/r\/djkormo\/jetson-pytorch-jlab\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/hub.docker.com\/r\/djkormo\/jetson-pytorch-jlab<\/a><\/p>\n<h3>Demonstracja:<\/h3>\n<p>Korzystaj\u0105c\u00a0 z przygotowanego obrazu uruchamiamy kontener w trybie detach z wystawionym portem 8888 hosta.<\/p>\n<pre class=\"\" lang=\"BASH\">docker run -d --runtime=nvidia -p 8888:8888 djkormo\/jetson-tensorflow-jlab:0.1.0\r\n<\/pre>\n<p>Po uruchomieniu obrazu\u00a0 <strong>djkormo\/jetson-pytorch-jlab:0.1.0<\/strong> mamy mo\u017cliwo\u015b\u0107 rozpocz\u0119cia testu na przygotowanym notatniku Jupyter. Zawiera on prosty model konwolucyjny wykorzystuj\u0105cy klasyczny zbi\u00f3r danych Cifar10.<\/p>\n<pre class=\"\">Net(\r\n  (conv1): Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1))\r\n  (pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\r\n  (conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))\r\n  (fc1): Linear(in_features=400, out_features=120, bias=True)\r\n  (fc2): Linear(in_features=120, out_features=84, bias=True)\r\n  (fc3): Linear(in_features=84, out_features=10, bias=True)\r\n)<\/pre>\n<p>Wa\u017cne, \u017ceby podczas trenowania zweryfikowa\u0107, czy GPU hosta jest wykorzystywane. Warto w tym celu mie\u0107 zainstalowany\u00a0 pakiet <a href=\"https:\/\/github.com\/rbonghi\/jetson_stats\" target=\"_blank\" rel=\"noopener noreferrer\">jtop<\/a>.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-1240\" src=\"http:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/11\/jetson_gpu_pytorch.png\" alt=\"\" width=\"675\" height=\"424\" srcset=\"https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/11\/jetson_gpu_pytorch.png 675w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/11\/jetson_gpu_pytorch-300x188.png 300w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/11\/jetson_gpu_pytorch-80x50.png 80w\" sizes=\"(max-width: 675px) 100vw, 675px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Dla os\u00f3b, kt\u00f3re s\u0142ysz\u0105 po raz pierwszy o pakiecie Pytorch, konkurencyjnym do TenforFlow, zwr\u00f3c\u0119 uwag\u0119 na jeden szczeg\u00f3\u0142. Pytorch wymaga jawnego (explicite) oprogramowania wykorzystania CUDA, TensorFlow robi to w trybie niejawnym (implicite).<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-1239\" src=\"http:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/11\/pytorch-jlab.png\" alt=\"\" width=\"1573\" height=\"815\" srcset=\"https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/11\/pytorch-jlab.png 1573w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/11\/pytorch-jlab-300x155.png 300w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/11\/pytorch-jlab-768x398.png 768w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/11\/pytorch-jlab-1024x531.png 1024w\" sizes=\"(max-width: 1573px) 100vw, 1573px\" \/><\/p>\n<p>Przy okazji zwracam uwag\u0119 na bazowe oprogramowanie hosta<\/p>\n<p><strong>NVIDIA Jetson NANO\/TX1 &#8211; Jetpack UNKNOWN [L4T 32.2.1]<\/strong>, kt\u00f3re jest starsze ni\u017c bazowe oprogramowanie wykorzystywane przy budowie obraz\u00f3w (!).<\/p>\n<p>Mo\u017cna te\u017c uruchamia\u0107 skrypty Pythona z poziomu\u00a0 wbudowanego terminala<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-1242\" src=\"http:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/11\/pytorch-jlab-terminal.png\" alt=\"\" width=\"1575\" height=\"819\" srcset=\"https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/11\/pytorch-jlab-terminal.png 1575w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/11\/pytorch-jlab-terminal-300x156.png 300w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/11\/pytorch-jlab-terminal-768x399.png 768w, https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/11\/pytorch-jlab-terminal-1024x532.png 1024w\" sizes=\"(max-width: 1575px) 100vw, 1575px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Dla os\u00f3b, kt\u00f3re zamiast Jupyter Lab wol\u0105 notatniki, wystarczy w adresie URL zamieni\u0107 <strong>\/lab<\/strong> na <strong>\/tree<\/strong><\/p>\n<p><a href=\"http:\/\/localhost:8888\/tree\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/localhost:8888\/tree<\/a><\/p>\n<h3>Wnioski:<\/h3>\n<p>Czy konteneryzacja i uczenie maszynowe mog\u0105 si\u0119 uzupe\u0142nia\u0107 i by\u0107 efektywnie wykorzystane? My\u015bl\u0119, \u017ce tak. Niniejszy wpis jest pr\u00f3b\u0105 pokazania i pr\u00f3b\u0105 odpowiedzi na pytanie, czy warto zna\u0107 jedno i drugie? Warto, ale nale\u017cy pami\u0119ta\u0107, \u017ce optymalizacja i automatyzacja naszego kodu mo\u017ce dotyczy\u0107 nie tylko typowego oprogramowania biznesowego, ale r\u00f3wnie\u017c modeli uczenia maszynowego.<\/p>\n<p>&nbsp;<\/p>\n<h3>Literatura:<\/h3>\n<p><a href=\"https:\/\/ngc.nvidia.com\/catalog\/containers\/nvidia:l4t-base\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/ngc.nvidia.com\/catalog\/containers\/nvidia:l4t-base<\/a><\/p>\n<p><a href=\"https:\/\/medium.com\/@chengweizhang2012\/how-to-run-keras-model-on-jetson-nano-in-nvidia-docker-container-b52d0df07129\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/medium.com\/@chengweizhang2012\/how-to-run-keras-model-on-jetson-nano-in-nvidia-docker-container-b52d0df07129<\/a><br \/>\n<a href=\"http:\/\/collabnix.com\/why-docker-19-03-on-nvidia-jetson-nano\/\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/collabnix.com\/why-docker-19-03-on-nvidia-jetson-nano\/<\/a><\/p>\n<p><a href=\"https:\/\/jkjung-avt.github.io\/build-tensorflow-2.0.0\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/jkjung-avt.github.io\/build-tensorflow-2.0.0\/<\/a><\/p>\n<p><a href=\"https:\/\/github.com\/rbonghi\/jetson_stats\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/github.com\/rbonghi\/jetson_stats<\/a><\/p>\n<p><a href=\"https:\/\/www.howtoforge.com\/tutorial\/ubuntu-docker-portainer\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/www.howtoforge.com\/tutorial\/ubuntu-docker-portainer\/<\/a><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Jednym z pocz\u0105tkowych problem\u00f3w z jakimi natkn\u0105\u0142em si\u0119 podczas pracy z p\u0142ytk\u0105 Nvidia Jetson Nano by\u0142 d\u0142ugi czas potrzebny do konfiguracji nowego \u015brodowiska wirtualnego w Pythonie. System operacyjny uruchamiany z karty microSD i potrzeba kompilacji poszczeg\u00f3lnych bibliotek, kt\u00f3re umo\u017cliwia\u0142y uruchamianie &hellip; <a href=\"https:\/\/wchmurze.cloud\/index.php\/2019\/11\/11\/jetson-nano-z-wykorzystaniem-konteneryzacji\/\">Continued<\/a><\/p>\n","protected":false},"author":1,"featured_media":1247,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[14,25,23,3,8,6],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.13 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Jetson Nano z wykorzystaniem konteneryzacji - W chmurze o chmurze i nie tylko<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/wchmurze.cloud\/index.php\/2019\/11\/11\/jetson-nano-z-wykorzystaniem-konteneryzacji\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Jetson Nano z wykorzystaniem konteneryzacji - W chmurze o chmurze i nie tylko\" \/>\n<meta property=\"og:description\" content=\"Jednym z pocz\u0105tkowych problem\u00f3w z jakimi natkn\u0105\u0142em si\u0119 podczas pracy z p\u0142ytk\u0105 Nvidia Jetson Nano by\u0142 d\u0142ugi czas potrzebny do konfiguracji nowego \u015brodowiska wirtualnego w Pythonie. System operacyjny uruchamiany z karty microSD i potrzeba kompilacji poszczeg\u00f3lnych bibliotek, kt\u00f3re umo\u017cliwia\u0142y uruchamianie &hellip; Continued\" \/>\n<meta property=\"og:url\" content=\"https:\/\/wchmurze.cloud\/index.php\/2019\/11\/11\/jetson-nano-z-wykorzystaniem-konteneryzacji\/\" \/>\n<meta property=\"og:site_name\" content=\"W chmurze o chmurze i nie tylko\" \/>\n<meta property=\"article:published_time\" content=\"2019-11-11T18:26:52+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-02-13T21:08:05+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/11\/tf_docker_jupyter_nvidia-1.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"596\" \/>\n\t<meta property=\"og:image:height\" content=\"351\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"djkormo\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Napisane przez\" \/>\n\t<meta name=\"twitter:data1\" content=\"djkormo\" \/>\n\t<meta name=\"twitter:label2\" content=\"Szacowany czas czytania\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/wchmurze.cloud\/index.php\/2019\/11\/11\/jetson-nano-z-wykorzystaniem-konteneryzacji\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/wchmurze.cloud\/index.php\/2019\/11\/11\/jetson-nano-z-wykorzystaniem-konteneryzacji\/\"},\"author\":{\"name\":\"djkormo\",\"@id\":\"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323\"},\"headline\":\"Jetson Nano z wykorzystaniem konteneryzacji\",\"datePublished\":\"2019-11-11T18:26:52+00:00\",\"dateModified\":\"2020-02-13T21:08:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/wchmurze.cloud\/index.php\/2019\/11\/11\/jetson-nano-z-wykorzystaniem-konteneryzacji\/\"},\"wordCount\":1476,\"commentCount\":3,\"publisher\":{\"@id\":\"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323\"},\"articleSection\":[\"implementacja\",\"Jetson\",\"konteneryzacja\",\"Machine Learning\",\"migawka\",\"Python\"],\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/wchmurze.cloud\/index.php\/2019\/11\/11\/jetson-nano-z-wykorzystaniem-konteneryzacji\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/wchmurze.cloud\/index.php\/2019\/11\/11\/jetson-nano-z-wykorzystaniem-konteneryzacji\/\",\"url\":\"https:\/\/wchmurze.cloud\/index.php\/2019\/11\/11\/jetson-nano-z-wykorzystaniem-konteneryzacji\/\",\"name\":\"Jetson Nano z wykorzystaniem konteneryzacji - W chmurze o chmurze i nie tylko\",\"isPartOf\":{\"@id\":\"https:\/\/wchmurze.cloud\/#website\"},\"datePublished\":\"2019-11-11T18:26:52+00:00\",\"dateModified\":\"2020-02-13T21:08:05+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/wchmurze.cloud\/index.php\/2019\/11\/11\/jetson-nano-z-wykorzystaniem-konteneryzacji\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/wchmurze.cloud\/index.php\/2019\/11\/11\/jetson-nano-z-wykorzystaniem-konteneryzacji\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/wchmurze.cloud\/index.php\/2019\/11\/11\/jetson-nano-z-wykorzystaniem-konteneryzacji\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/wchmurze.cloud\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Jetson Nano z wykorzystaniem konteneryzacji\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/wchmurze.cloud\/#website\",\"url\":\"https:\/\/wchmurze.cloud\/\",\"name\":\"W chmurze o chmurze i nie tylko\",\"description\":\"W chmurze o chmurze i nie tylko\",\"publisher\":{\"@id\":\"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/wchmurze.cloud\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pl-PL\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323\",\"name\":\"djkormo\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/wchmurze.cloud\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/14a901b808871fa98086ae259c45d646?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/14a901b808871fa98086ae259c45d646?s=96&d=mm&r=g\",\"caption\":\"djkormo\"},\"logo\":{\"@id\":\"https:\/\/wchmurze.cloud\/#\/schema\/person\/image\/\"},\"url\":\"https:\/\/wchmurze.cloud\/index.php\/author\/djkormo\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Jetson Nano z wykorzystaniem konteneryzacji - W chmurze o chmurze i nie tylko","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/wchmurze.cloud\/index.php\/2019\/11\/11\/jetson-nano-z-wykorzystaniem-konteneryzacji\/","og_locale":"pl_PL","og_type":"article","og_title":"Jetson Nano z wykorzystaniem konteneryzacji - W chmurze o chmurze i nie tylko","og_description":"Jednym z pocz\u0105tkowych problem\u00f3w z jakimi natkn\u0105\u0142em si\u0119 podczas pracy z p\u0142ytk\u0105 Nvidia Jetson Nano by\u0142 d\u0142ugi czas potrzebny do konfiguracji nowego \u015brodowiska wirtualnego w Pythonie. System operacyjny uruchamiany z karty microSD i potrzeba kompilacji poszczeg\u00f3lnych bibliotek, kt\u00f3re umo\u017cliwia\u0142y uruchamianie &hellip; Continued","og_url":"https:\/\/wchmurze.cloud\/index.php\/2019\/11\/11\/jetson-nano-z-wykorzystaniem-konteneryzacji\/","og_site_name":"W chmurze o chmurze i nie tylko","article_published_time":"2019-11-11T18:26:52+00:00","article_modified_time":"2020-02-13T21:08:05+00:00","og_image":[{"width":596,"height":351,"url":"https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/11\/tf_docker_jupyter_nvidia-1.jpg","type":"image\/jpeg"}],"author":"djkormo","twitter_card":"summary_large_image","twitter_misc":{"Napisane przez":"djkormo","Szacowany czas czytania":"10 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/wchmurze.cloud\/index.php\/2019\/11\/11\/jetson-nano-z-wykorzystaniem-konteneryzacji\/#article","isPartOf":{"@id":"https:\/\/wchmurze.cloud\/index.php\/2019\/11\/11\/jetson-nano-z-wykorzystaniem-konteneryzacji\/"},"author":{"name":"djkormo","@id":"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323"},"headline":"Jetson Nano z wykorzystaniem konteneryzacji","datePublished":"2019-11-11T18:26:52+00:00","dateModified":"2020-02-13T21:08:05+00:00","mainEntityOfPage":{"@id":"https:\/\/wchmurze.cloud\/index.php\/2019\/11\/11\/jetson-nano-z-wykorzystaniem-konteneryzacji\/"},"wordCount":1476,"commentCount":3,"publisher":{"@id":"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323"},"articleSection":["implementacja","Jetson","konteneryzacja","Machine Learning","migawka","Python"],"inLanguage":"pl-PL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/wchmurze.cloud\/index.php\/2019\/11\/11\/jetson-nano-z-wykorzystaniem-konteneryzacji\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/wchmurze.cloud\/index.php\/2019\/11\/11\/jetson-nano-z-wykorzystaniem-konteneryzacji\/","url":"https:\/\/wchmurze.cloud\/index.php\/2019\/11\/11\/jetson-nano-z-wykorzystaniem-konteneryzacji\/","name":"Jetson Nano z wykorzystaniem konteneryzacji - W chmurze o chmurze i nie tylko","isPartOf":{"@id":"https:\/\/wchmurze.cloud\/#website"},"datePublished":"2019-11-11T18:26:52+00:00","dateModified":"2020-02-13T21:08:05+00:00","breadcrumb":{"@id":"https:\/\/wchmurze.cloud\/index.php\/2019\/11\/11\/jetson-nano-z-wykorzystaniem-konteneryzacji\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/wchmurze.cloud\/index.php\/2019\/11\/11\/jetson-nano-z-wykorzystaniem-konteneryzacji\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/wchmurze.cloud\/index.php\/2019\/11\/11\/jetson-nano-z-wykorzystaniem-konteneryzacji\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/wchmurze.cloud\/"},{"@type":"ListItem","position":2,"name":"Jetson Nano z wykorzystaniem konteneryzacji"}]},{"@type":"WebSite","@id":"https:\/\/wchmurze.cloud\/#website","url":"https:\/\/wchmurze.cloud\/","name":"W chmurze o chmurze i nie tylko","description":"W chmurze o chmurze i nie tylko","publisher":{"@id":"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/wchmurze.cloud\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pl-PL"},{"@type":["Person","Organization"],"@id":"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323","name":"djkormo","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/wchmurze.cloud\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/14a901b808871fa98086ae259c45d646?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/14a901b808871fa98086ae259c45d646?s=96&d=mm&r=g","caption":"djkormo"},"logo":{"@id":"https:\/\/wchmurze.cloud\/#\/schema\/person\/image\/"},"url":"https:\/\/wchmurze.cloud\/index.php\/author\/djkormo\/"}]}},"_links":{"self":[{"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/posts\/1183"}],"collection":[{"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/comments?post=1183"}],"version-history":[{"count":30,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/posts\/1183\/revisions"}],"predecessor-version":[{"id":1254,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/posts\/1183\/revisions\/1254"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/media\/1247"}],"wp:attachment":[{"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/media?parent=1183"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/categories?post=1183"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/tags?post=1183"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}