Szukam sposobu na użycie GPU z wnętrza kontenera dockera.
Kontener wykona dowolny kod, więc nie chcę używać trybu uprzywilejowanego.
Jakieś wskazówki?
Z poprzednich badań zrozumiałem, że run -v
i / lub LXC cgroup
było drogą do zrobienia, ale nie jestem pewien, jak dokładnie to zrobić
Odpowiedzi:
Odpowiedź Regana jest świetna, ale jest trochę nieaktualna, ponieważ poprawnym sposobem na to jest unikanie kontekstu wykonywania lxc, ponieważ Docker porzucił LXC jako domyślny kontekst wykonywania od wersji docker 0.9.
Zamiast tego lepiej jest powiedzieć dockerowi o urządzeniach nvidia za pomocą flagi --device i po prostu użyć natywnego kontekstu wykonywania zamiast lxc.
Środowisko
Te instrukcje zostały przetestowane w następującym środowisku:
Zainstaluj sterownik nvidia i cuda na swoim hoście
Zobacz CUDA 6.5 w wystąpieniu GPU AWS z systemem Ubuntu 14.04, aby uzyskać konfigurację maszyny hosta.
Zainstaluj Docker
Znajdź swoje urządzenia nvidia
Uruchom kontener Docker z preinstalowanym sterownikiem nvidia
Utworzyłem obraz Dockera z preinstalowanymi sterownikami cuda. Plik dockerfile jest dostępny na dockerhub, jeśli chcesz wiedzieć, jak ten obraz został zbudowany.
Będziesz chciał dostosować to polecenie, aby pasowało do Twoich urządzeń nvidia. Oto, co zadziałało dla mnie:
Sprawdź, czy CUDA jest poprawnie zainstalowany
Powinno to zostać uruchomione z wnętrza właśnie uruchomionego kontenera Dockera.
Zainstaluj próbki CUDA:
Build deviceQuery przykład:
Jeśli wszystko działało, powinieneś zobaczyć następujący wynik:
źródło
ls -la /dev | grep nvidia
ale CUDA nie może znaleźć żadnego urządzenia obsługującego CUDA:./deviceQuery
./deviceQuery Starting...
CUDA Device Query (Runtime API) version (CUDART static linking)
cudaGetDeviceCount returned 38
-> no CUDA-capable device is detected
Result = FAIL
czy dzieje się tak z powodu niezgodności bibliotek CUDA na hoście iw kontenerze?Pisanie zaktualizowanej odpowiedzi, ponieważ większość już obecnych odpowiedzi jest obecnie nieaktualna.
Wersje wcześniejsze niż
Docker 19.03
wymagałynvidia-docker2
i--runtime=nvidia
flaga.Ponieważ
Docker 19.03
musisz zainstalowaćnvidia-container-toolkit
pakiet, a następnie użyć--gpus all
flagi.Oto podstawy,
Instalacja pakietu
Zainstaluj
nvidia-container-toolkit
pakiet zgodnie z oficjalną dokumentacją na Github .W przypadku systemów operacyjnych opartych na Redhat wykonaj następujący zestaw poleceń:
W przypadku systemów operacyjnych opartych na Debianie wykonaj następujący zestaw poleceń:
Uruchamianie dockera z obsługą GPU
Należy pamiętać, że flaga
--gpus all
służy do przypisywania wszystkich dostępnych procesorów graficznych do kontenera Dockera.Aby przypisać określone GPU do kontenera Dockera (w przypadku wielu GPU dostępnych na twoim komputerze)
Lub
źródło
Ok, w końcu udało mi się to zrobić bez użycia trybu --privileged.
Pracuję na serwerze ubuntu 14.04 i używam najnowszego CUDA (6.0.37 dla Linuksa 13.04 64 bity).
Przygotowanie
Zainstaluj sterownik nvidia i cuda na swoim hoście. (może to być trochę trudne, więc proponuję postępować zgodnie z tym przewodnikiem /ubuntu/451672/installing-and-testing-cuda-in-ubuntu-14-04 )
UWAGA: Bardzo ważne jest, aby zachować pliki użyte do instalacji hosta cuda
Pobierz demona platformy Docker do uruchomienia przy użyciu lxc
Musimy uruchomić demona dockera przy użyciu sterownika lxc, aby móc modyfikować konfigurację i nadać kontenerowi dostęp do urządzenia.
Jednorazowe wykorzystanie:
Stała konfiguracja Zmodyfikuj plik konfiguracyjny dockera znajdujący się w / etc / default / docker Zmień wiersz DOCKER_OPTS dodając '-e lxc' Oto moja linia po modyfikacji
Następnie zrestartuj demona za pomocą
Jak sprawdzić, czy demon efektywnie wykorzystuje sterownik lxc?
Linia Execution Driver powinna wyglądać następująco:
Zbuduj swój obraz za pomocą sterowników NVIDIA i CUDA.
Oto podstawowy plik Dockerfile do tworzenia obrazu zgodnego z CUDA.
Uruchom swój obraz.
Najpierw musisz zidentyfikować swój główny numer powiązany z twoim urządzeniem. Najłatwiej jest wykonać następujące polecenie:
Jeśli wynik jest pusty, użyj uruchomienia jednej z próbek na hoście. Wynik powinien wyglądać tak. Jak widać, między grupą a datą znajduje się zestaw 2 liczb. Te dwie liczby nazywane są liczbami głównymi i pomocniczymi (zapisane w tej kolejności) i projektują urządzenie. Dla wygody użyjemy tylko głównych liczb.
Dlaczego aktywowaliśmy sterownik LXC? Aby użyć opcji lxc conf, która pozwala nam zezwolić naszemu kontenerowi na dostęp do tych urządzeń. Dostępna opcja: (zalecam użycie znaku * jako podrzędnej liczby, ponieważ zmniejsza to długość polecenia uruchomienia)
Więc jeśli chcę uruchomić kontener (zakładając, że nazwa twojego obrazu to cuda).
źródło
--device
opcję zezwalania kontenerowi na dostęp do urządzenia hosta. Jednak próbowałem użyć,--device=/dev/nvidia0
aby zezwolić kontenerowi dockerowi na uruchomienie cuda i nie udało mi się./dev/nvidiao
,/dev/nvidia1
,/dev/nvidiactl
i/dev/nvidia-uvm
z--device
. Chociaż nie wiem dlaczego./dev/nvidia*
@Regan. Dla @ChillarAnand zrobiłem cuda -Właśnie udostępniliśmy eksperymentalne repozytorium GitHub, które powinno ułatwić proces używania procesorów graficznych NVIDIA w kontenerach Docker.
źródło
Ostatnie ulepszenia firmy NVIDIA zaowocowały znacznie bardziej niezawodnym sposobem na osiągnięcie tego.
Zasadniczo znaleźli sposób na uniknięcie konieczności instalowania sterownika CUDA / GPU w kontenerach i dopasowywania go do modułu jądra hosta.
Zamiast tego sterowniki znajdują się na hoście, a kontenery ich nie potrzebują. Obecnie wymaga zmodyfikowanego docker-cli.
To świetnie, ponieważ teraz kontenery są znacznie bardziej przenośne.
Szybki test na Ubuntu:
Aby uzyskać więcej informacji, zobacz: Kontener Dockera z obsługą GPU i: https://github.com/NVIDIA/nvidia-docker
źródło
Zaktualizowano dla CUDA-8.0 na Ubuntu 16.04
Zainstaluj docker https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04
Zbuduj następujący obraz, który zawiera sterowniki nvidia i zestaw narzędzi cuda
Dockerfile
sudo docker run -ti --device /dev/nvidia0:/dev/nvidia0 --device /dev/nvidiactl:/dev/nvidiactl --device /dev/nvidia-uvm:/dev/nvidia-uvm <built-image> ./deviceQuery
Powinieneś zobaczyć dane wyjściowe podobne do:
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 8.0, CUDA Runtime Version = 8.0, NumDevs = 1, Device0 = GRID K520 Result = PASS
źródło
Aby użyć GPU z kontenera Dockera, zamiast korzystać z natywnego Dockera, użyj Nvidia-docker. Aby zainstalować docker Nvidia, użyj następujących poleceń
źródło
Użyj x11docker firmy mviereck:
https://github.com/mviereck/x11docker#hardware-acceleration mówi
Ten skrypt jest naprawdę wygodny, ponieważ obsługuje całą konfigurację i instalację. Uruchamianie obrazu dockera na X przy użyciu gpu jest tak proste, jak
źródło