Kontenery docker’a ze natywną obsługą GPU Nvidia na CentOS 8, CentOS 7

Przed wersją Docker Comunity Edition 19.3 wykorzystanie akceleratorów GPU z kontenera doker’a możliwe było za pomocą nvidia-docker w połączaniu z Docker CE. Obecnie od wersji 19.3 Docker CE natywnie wspiera obsługę akceleratorów GPU, jednak dalej konieczne jest zainstalowanie dodatku nvidia-container-toolkit. Opcja --gpus pozwala określić do których akceleratorów GPU z pośród dostępnych dla systemu operacyjnego ma mieć dostęp uruchamiany kontener.

Dystrybucje „RedHat’a” – RHEL 7 oraz CentOS 7 zawierają w sobie RedHat’owy fork docker’a w wersji 1.13.1 (w momencie pisania tego artykułu). Należy zaznaczyć, że numeracja wersji RedHat’a i Docker inc. jest różna i nie ma między nimi prostego przełożenia. Niemniej jednak chwilę obecną fork RedHata dostępny w repozytorium dla CentOS7 nie zawiera opcji –gpus.

Natomiast w RHEL 8 / CentoOS 8 i Fedora 31 narzędzie/klient docker’a został zastąpiony narzędziem podman. Niestety podman nie mamy opcji –gpus, która umożliwia wykorzystanie GPU z poziomu kontenera.

Dostęp do GPU Nvidia z kontenerów docker’a pod CentOS 7/8 bez root’a/sudo

Ab móc korzystać z GPU z pozziomu kontenera docker pod wymienionymi OSami należy wykonać nast nastepujace kroki;

  • Jeśli jest zainstalowany to odinstalować RedHat’owy fork docker‚a.
  • Zainstalować Docker’a CE
  • Zainstalować NVIDIA Container Toolkit
  • Na koniec należy dodać użytkowników którzy mają uruchamiać kontener bez sudo do systemowej grupy docker.

Odinstalowujemy RedHat’owego docker’a

Zaczynamy od odinstalowania silnika i klienta dockera zainstalowane z repozytoriów CentOS 7, z konsoli:

sudo yum remove docker \
                docker-client \
                docker-client-latest \
                docker-common \
                docker-latest \
                docker-latest-logrotate \
                docker-logrotate \
                docker-engine

W repo RHEL/CentOS’a 8 i Fedory 31 fork RedHat dockera został zastąpiony podman’em.

Instalujemy Docker Community Edition na RHEL / CentOS 7 i CentOS 8

Najpierw należy dodać repozytorium Docker CE od Docker inc. Możemy to zrobić za pomocą yum-utils:

sudo yum install yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

Teraz możemy zainstalować Docker CE poleceniem:

sudo yum install docker-ce docker-ce-cli containerd.io

Następnie uruchamiany demona dockera:

sudo systemctl start docker

I testujemy czy wszystko poszło ok:

docker -v
Docker version 19.03.*, build *********

Powinniśmy dostać wersję docker’a min. 19.03.1, jeśli tak jest sprzwdzamy jeszcze dokerowe „Hello world” wywołując z konsoli:

sudo docker run --rm hello-world

Polecenie run sprawdzi czy mamy już pobrany obraz hello-world, w razie potrzeby pobierze go, a następnie uruchomi jego instancje. Opcja --rm odpowiada za usunięcie/zamknięcie instancji obrazu zaraz po wykoaniu wszystkich poleceń. W naszym wypadku żadnych poleceń nie przekazujemy więc instancja zostanie usunięta/zamknięta natychmiast po uruchomieniu. Jeśli wszystko poszło ok to uruchomiona instancja kontenera hello-world powinna przed zamknięciem zwrócić output jak ten widoczny poniżej.

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Jeśli tak jest możemy przejść dalej.

Instalacja NVIDIA Container Toolkit

Zaczynamy od dodania repozytorium NVIDIA Container Toolkit:

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | sudo tee /etc/yum.repos.d/nvidia-docker.repo

Następnie instalujemy nvidia-container-toolkit:

sudo yum install nvidia-container-toolkit

Restartujemy dockera’a:

service docker restart

I sprawdzamy czy Hello world działa:

docker run --rm hello-world

Wynik powinien być taki sam jak poprzednio.

Jeżeli działa sprawdzamy czy GPU jest widoczne z instrancji docker’a. W tym cely uruchamiamy jakiś obraz zawierajacy np. CUDE z hub.docker.com i polecenie nvidia-smi i wykonujemy w nim to polecenie:

docker run --gpus all --rm nvidia/cuda nvidia-smi

--gpus all oznacza że chcemy dać obrazowi dostęp do wszystkich GPU dostępnych w systemie.
Jeżeli wszystko poszło sprawnie powinniście dostać output podobny do tego poniżej:

Sun May 24 19:07:34 2020 
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.79       Driver Version: 410.79       CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla V100-PCIE...  Off  | 00000000:18:00.0 Off |                    0 |
| N/A   40C    P0    39W / 250W |  31194MiB / 32480MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  Tesla V100-PCIE...  Off  | 00000000:3B:00.0 Off |                    0 |
| N/A   40C    P0    36W / 250W |  30884MiB / 32480MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   2  Tesla V100-PCIE...  Off  | 00000000:86:00.0 Off |                    0 |
| N/A   41C    P0    39W / 250W |  30884MiB / 32480MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   3  Tesla V100-PCIE...  Off  | 00000000:AF:00.0 Off |                    0 |
| N/A   39C    P0    37W / 250W |  30884MiB / 32480MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

W tym wypadku widzimy że kontener ma dostęp do 4 akceleratorów Tesla V100.

Powodzenia!

Przegląd wybranych bibliotek Java Script do obsługi ekranów dotykowych

Ze względu na rosnącą liczbę wejść z urządzeń mobilnych na stronę oferującą usługi fotograficzne która korzysta z napisanej przez mnie parę lat temu dedykowanej galerii stanołem przed koniecznością zoptymalizowania jej pod kątem urządzeń z ekranami dotykowymi.
Jak powszechnie wiadomo dominujące na rynku przeglądarki lubią się zwalczać robiąc te same rzeczy w inny sposób, jednocześnie utrudniając prace webmasterom, w czym od zawsze prym wiedzie Internet Explorer. Z tego powodu postanowiłem zacząć od przeszukania frameworku Java Script który pozwolił by w zunifikowany sposób obsłużyć wszystkie dominujące przeglądarki tj. Firefox, Internet Explorer i Google Chrome.

Czytaj dalej

Backup schematu partycji GPT (GUID Partition Table) wraz z MBR na wypadek awarii dysku twaredgo

Wraz z dyskami o romiarach powyżej 2 TB i EFI które zastąpiło poczciwy BIOS, nastała też era tabeli partycji w formacie GPT (GUID Partition Table) która to zastąpiła tabele partycji w stylu DOS, potocznie często błędnie nazywaną MBR (ang. Master Boot Record). Dlaczego błędnie? Poniważ MBR (ang. Master Boot Record) znajdujący się na pierwszych 512 bajtach dysku to nie tylko tablica partycji która zawiera 4 pozycje i zajmuje 64 bajty ale głównie zajmujący pierwszych 446 bajtów program rozruchowy (ang. bootloader).
A ponieaż w polskim internecie nie ma zbyt wielu informacji o GPT (GUID_Partition_Table), a tym bardziej jak zrobić kopie zapasową schematu partycji GPT wraz programem rozruchowym (ang. botloaderem), aby w przypadku awarii można było go łatwo odtworzyć, więc postanowiłem stworzyć tą notatkę.

Czytaj dalej

Porównanie kompresji compress, gzip, bzip2, xz, lzip, lzma, lzop

W poniższym artykule przedstawiam wyniki testów wybranych programów do kompresji i/lub archiwizacji plików. Przedstawione są wyniki testów uzyskane na rużnych zbiorach danych i rużnorodym sprzęcie. Zestawiono wyniki testow m.in. tar, compress, gzip, bzip2, xz, lzip, lzma, lzop, 7-zip (7z).

Na chwilę obecną wydaje się że wszędzie tam gdzie był stosowany compress można go zastąpić lzop, uzyskując mniejsze pliki w krótszym czasie. Warto też rozważyć zastąpienie gzip’a przez lzop – dostaniemy wtedy nieznacznie większych rozmiarów archiwa, ale w kilku-krotnie krótszym czasie. Natomiast jeżli chcemy uzyskać jak najmniejsze archiwym bez względu na czas kompresji najlepsze wyniki uzyskuja bzip2, lzip i lzma, ale jest to kosztem kilkukrotnie większego czasu kompresji niż przy zastosowaniu gzip, za co dostajemy o pare procent mniejsze archiwa.

Czytaj dalej

Postgres-XC – czyli klaster serwerów PostgreSQL o wysokiej dostępności z równoważeniem obciążenia

Czym jest Postgres-XC?

Postgres-XC jest rozszerzeniem PostgreSQL i dziedziczy większość jego funkcji. Oprogramowanie to udostępnia skalowalne dla zapisu, synchroniczne, symetryczne i transparentne dla urzytkownika rozwiązanie klastra PostgreSQL. Jest to zbiór ściśle połączonych elementów bazy danych, które działają jako całość mogąc być zainstalowane na więcej niż jednej maszynie.

Czytaj dalej

Synchronizacja czasu w linux’ie poprzez NTP(d)

NTP (ang. Network Time Protocol) to protokół służący do precyzyjnej synchronizacji czasu na różnych urządzeniach (komputerach) podłączonych do tej samej sieci. Jest on zaimplementowany w większości współczesnych systemów operacyjnych i przy zastosowaniu standardowego sprzętu komputerowego klasy PC, precyzja może wynosić kilka milisekund. Stosowanie wielu źródeł czasu jednocześnie znacząco poprawia precyzje synchronizacji, dostarczając wielopoziomową redundancję oraz pozwala wychwytywać i eliminować dostawców fałszywego czasu. Czytaj dalej

ssh – logowane bez hasła, czyli certyfikat zamiast hasła

Witam poniżej przedstawiam bardzo skrucone howto opsujące jak można logować się poprzez ssh bez hasła, zamiast którego urzyjemu certyfikatu/klucza RSA.
Czytaj dalej

Foreign Data, Table, Server – czyli obce dane, tabele i servery w PostgreSQL

PostgreSQL realizuje części specyfikacji SQL/MED, co pozwala na dostęp do danych które znajdują się na poza bazą PostgeSQL za pomocą zwykłych zapytań SQL. Takie dane są określane jako „dane obce” (ang. foreign data). (Nie ma to żadnego związku z kluczami obcymi, które są rodzajem przymusu w bazie danych.)

Dosęp do danych obcych jest możliwy przy pomocy „wraperów danych obcych” (ang. foreign data wrapper). Wrapper danych obcych to biblioteka, która może komunikować się z zewnętrznym źródłem danych, ukrywając szczegóły połączenia ze źródłem i uzyskiwania z niego danych. Istnieje kilka wbudowanych wrperów danych obcych dostępnych jak na przykład postgres_fdw lub file_fdw. A Jeśli nie uda się znaleźć gotowego wrapera dla danego typu danych obcych to można go napisać samemu.

Czytaj dalej

cp vs install – czyli dlaczego nie należy używać cp do instalacji programów i bibliotek

Parę słów odnośnie różnicy między programami cpinstall, czyli o tym jakie niemiłe skutki może spowodować instalowanie programów i bibliotek poprzez cp, zamiast install. Podstawowa „składnia” obu programów jest podobna, na pierwszy rzut oka wydaje się, że oba programy robią dokładnie to samo, jednak jak się często zdarza diabeł tkwi w szczegółach.

Czytaj dalej

Krótkie wprowadzenie do GNU make – czyli jak pisać poprawne Makefile

Make jest programem automatyzującym proces kompilacji programów, na które składa się wiele zależnych od siebie plików. Make przetwarza plik reguł Makefile, analizuje daty aktualizacji poszczególnych plików i wywołuje kompilacje tylko tych plików, które są zależne od plików które uległy zmianie od ostatniej kompilacji, co zaoszczędza wiele czasu przy tworzeniu programu, dzięki czemu nie ma potrzeby kompilacji całego projektu co pozwala oszczędzić czas. Ponadto umiejetnie zastosowany upraszcza i przyśpiesza proces instalacji i sprawia iż jest on bardziej elastyczny

Czytaj dalej