PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : NV-Patch für Unraid


robbitop
2019-10-01, 18:25:28
Hallo,

mein Unraid Server (basiert auf Linux) dient mir als Plex Media Server.
Verbaut ist ein Ryzen 1700 und eine Geforce GTX 1070.

Der Plex Media Server läuft als Docker. (neuste Betaversion - Plexpass).
Damit HW Encoding und Decoding funktioniert habe ich ich das Plugin "Unraid NVidia" installiert. Ich vermute, dass dies eine eine angepasste Unraid Build installiert, welche den GPU Treiber enthält und den De/Encoder als Funktionalität an das OS übergeben kann.
Version ist 6.7.2 - Treiber ist 430.14.

HW Transcoding/Decoding funktioniert auch wunderbar (das kann man mittels nv-smi kontrollieren). Allerdings sind Geforce Karten auf 2 Streams beschränkt.

Mittels diesem Patch kann man diese Restriktion umgehen:
https://github.com/keylase/nvidia-patch


Docker support
It is possible to use this patch with nvidia-docker containers, even if host machine hasn't patched drivers. See Dockerfile for example.

Essentially all you need to do during build is:

COPY the patch.sh and docker-entrypoint.sh files into your container.
Make sure docker-entrypoint.sh is invoked on container start.
docker-entrypoint.sh script does on-the-fly patching by means of manipulating dynamic linker to workaround read-only mount of Nvidia runtime. Finally it passes original docker command to shell, like if entrypoint was not restricted by ENTRYPOINT directive. So docker run --runtime=nvidia -it mycontainer echo 123 will print 123. Also it can be just invoked from your entrypoint script, if you have any.

Dummerweise sind meine Linuxkenntnisse (auch was Docker etc betrifft) bei nahezu null. Ich mache hier alles mittels GUI und folge Videotutorials. Dummerweise gibt es zu diesem Thema keines. (bzw. es gibt eines für Windows und eines für Ubuntu - aber keines für Unraid und Plex Docker)

Soweit ich das verstanden habe, muss damit ein Docker gepatcht werden (frage mich welcher - der Plex Docker kann es nicht sein und das NV Plugin ist ja nur ein Installer für eine custom Unraid build) - der Patch geht aber AFAIK nach dem Reboot verloren.

Mittels Userscripts (bzw da gibt es eine Community Application die "User Scripts" heißt) soll das aber so einstellbar sein, dass es bei jedem Reboot wieder geht.

Hat jemand von euch Linux Experten ggf. Lust, mir zu helfen? :)

Ganon
2019-10-01, 18:39:40
Siehst, das ist halt der Nachteil wenn man sich ohne Verstand irgendwas zusammenklickt... man hat keine Ahnung, wenn man mal was braucht, was man nicht einfach zusammenklicken kann.

Ich hab keine Ahnung was dir das "unRAID Nvidia" Plugin da so installiert, aber der Patch muss dort ausgeführt werden, wo der NVidia Treiber installiert wurde. Ich rate jetzt mal ins Blaue auf dem Host unRAID und nicht in irgend einem Docker Container. Versuch doch einfach mal dort, wo du auch nvidia-smi eingegeben hast, mal den Patch auszuführen.

robbitop
2019-10-01, 18:48:53
Siehst, das ist halt der Nachteil wenn man sich ohne Verstand irgendwas zusammenklickt... man hat keine Ahnung, wenn man mal was braucht, was man nicht einfach zusammenklicken kann.
Ja das stimmt. Aber wesentlich mehr gibt meine Zeit einfach nicht her. Und bis dato ist Unraid einfach eine super gute Lösung, die toll funktioniert.


Ich hab keine Ahnung was dir das "unRAID Nvidia" Plugin da so installiert, aber der Patch muss dort ausgeführt werden, wo der NVidia Treiber installiert wurde. Ich rate jetzt mal ins Blaue auf dem Host unRAID und nicht in irgend einem Docker Container. Versuch doch einfach mal dort, wo du auch nvidia-smi eingegeben hast, mal den Patch auszuführen.
Unraid selbst hat einen Button um eine Konsole zu öffnen. Ich habe auch einen Filemanager zur Verfügung.
Das einfache Ausführen der patch.sh funktioniert nicht. Die Answeisung sagt auch irgendwas davon, zwei Dateien in den Container zu kopieren (siehe oben das gequotete und siehe github link). Aber Dinge wie "Entrypoint" und "Invoke" sagen mir genau nichts.

Hier ist laut der Anweisung ein Beispiel:
https://github.com/keylase/nvidia-patch/blob/master/Dockerfile



FROM nvidia/cuda:latest

ENV NVIDIA_VISIBLE_DEVICES all
ENV NVIDIA_DRIVER_CAPABILITIES compute,video,utility

RUN mkdir -p /usr/local/bin /patched-lib
COPY patch.sh docker-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/patch.sh /usr/local/bin/docker-entrypoint.sh

ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]

aufkrawall
2019-10-01, 19:01:29
Hab ich das richtig verstanden, dass man mit NV nicht mehr als zwei Videos gleichzeitig dekodieren/enkodieren lassen kann? :freak:

Ganon
2019-10-01, 19:22:49
Hab ich das richtig verstanden, dass man mit NV nicht mehr als zwei Videos gleichzeitig dekodieren/enkodieren lassen kann? :freak:

Soweit ich weiß nur Encode, aber ja. Das Limit ist 2 bei Consumer GPUs. Erst die teuren Varianten der Quadro Linie sind ohne künstliches Limit.

Das einfache Ausführen der patch.sh funktioniert nicht. Die Answeisung sagt auch irgendwas davon, zwei Dateien in den Container zu kopieren (siehe oben das gequotete und siehe github link). Aber Dinge wie "Entrypoint" und "Invoke" sagen mir genau nichts.

Wenn ich das von der unRAID Nvidia Plugin Seite richtig verstehe, dann müsstest du vermutlich das Nvidia Plugin anpassen. In dessen Dockerfile müsstest du dann sowas in der Art reinschreiben, wie in der Anleitung steht. Also aus der Hüfte dort einfügen:

mkdir /nvidia-patch
COPY nvidia-patch/*.sh /nvidia-patch
sh /nvidia-patch/docker-entrypoint.sh

Die Dateien müssen dann neben dem Dockerfile im Ordner nvidia-patch liegen. Aber wie man das jetzt im Zusammenhang mit unRAID macht, da bin ich auch überfragt.

robbitop
2019-10-01, 19:25:29
Man bekommt den NV Docker ja im Community Application store. Ich wüsste nicht wie man da was reintun sollte. Aber er taucht nicht unter „Docker“ sondern unter „Plugins“ auf. MMn installiert das Plugin nur eine veränderte Version von Unraid selbst.

Screemer
2019-10-01, 19:29:34
Hab ich das richtig verstanden, dass man mit NV nicht mehr als zwei Videos gleichzeitig dekodieren/enkodieren lassen kann? :freak:
Wundert mich, dass das die das noch nicht bekannt ist (No offence). Ich dachte das wäre überall schon Mal angesprochen worden. Mehr streams gibt's nur mit quadros: https://superuser.com/questions/1351191/getting-more-than-two-nvenc-video-streams

Ganon
2019-10-01, 19:40:16
Man bekommt den NV Docker ja im Community Application store. Ich wüsste nicht wie man da was reintun sollte. Aber er taucht nicht unter „Docker“ sondern unter „Plugins“ auf. MMn installiert das Plugin nur eine veränderte Version von Unraid selbst.

Auch der Store führt im Hintergrund nur irgend ein docker pull <xyz> aus, vermute ich mal. Das kann man sicherlich auch manuell erledigen. Ich denke mal nicht, dass es für das Problem eine "einfache" Lösung gibt, sofern du nicht irgendwo doch noch eine Copy&Paste Anleitung findet von jemandem der das schon gemacht hat.

Ich würde an deiner Stelle mal eher in unRAID Community/Foren fragen.

robbitop
2019-10-01, 19:44:18
Die heulen rum, dass die Diskussion nicht sauber genug ist wegen der Aushebelubg der 2 Stream Restriktion. :rolleyes:

Verstehe nicht, warum der Author keine Step-by-Step Anleitung beilegt. :-/

Ggf gibt es ja hier im Forum ja noch jmd anderen der noch helfen kann? Gern sonst auch via Remote.

aufkrawall
2019-10-01, 19:52:24
Wundert mich, dass das die das noch nicht bekannt ist (No offence). Ich dachte das wäre überall schon Mal angesprochen worden. Mehr streams gibt's nur mit quadros: https://superuser.com/questions/1351191/getting-more-than-two-nvenc-video-streams
Tja, lächerlich. Mit VAAPI Encode gibts so einen Murks natürlich nicht, wobei hier der AMD-Treiber zumindest mit Polaris bei HEVC rumspackt. Dürfte aber mit jeder Intel-IGP ab Gen 9.5 kein Problem sein...

robbitop
2019-10-01, 20:06:22
Liegt daran, dass NV jahrelang keine echte Konkurrenz gesehen haben. Ohne Druck ruht man sich aus und vergroßert Margen und schafft künstliche Kaufanreize/verdongelt HW.
Intel wird nächstes Jahr schon für Druck dank Xe sorgen. Videokompression war ja lange Intels Steckenpferd - nur dank 10 nm Problemen hat man seit Jahren null Innovation zeigen können (Quicksync). Auch das erstarkende AMD wird das immer mehr tun. Allerdings hat AMD im Thema HW Transcoding IIRC noch echten Nachholbedarf. BQ pro Bitrate ist iirc noch nicht auf dem Level.

Ganon
2019-10-01, 20:08:00
Verstehe nicht, warum der Author keine Step-by-Step Anleitung beilegt. :-/

Weil das nichts spezifisch für unRAID ist, sondern allgemein für normale NVidia-Treiber bzw. die normale NVidia Docker Runtime.

Hast du dich denn schon mal den verlinkten Bugreport durchgelesen?: https://github.com/keylase/nvidia-patch/issues/43

robbitop
2019-10-01, 20:10:56
Jep und da steht dass der Einsatz für Unraid möglich ist. Aber es wird schnell „spanisch“ für mich.

aufkrawall
2019-10-01, 20:57:08
nur dank 10 nm Problemen hat man seit Jahren null Innovation zeigen können (Quicksync).
Na ja, man kann seit Q1 2017 VP9 8 Bit und HEVC 10 Bit in Hardware enkodieren. Da konnte man mit anderen GPUs nur von träumen, außer evtl. einige Mobile SoCs.
QuickSync kann afaik btw. nichts besser als VAAPI. Mit VAAPI in ffmpeg geht z.B. auch Zero Copy Decoding/Encoding für maximale Effizienz.

robbitop
2019-10-01, 20:59:12
Ja aber wie ist die BQ pro Bitrate? Gerade da hat dich NV einen riesen Sprung gemacht mit Turing. AMD war in der Hinsicht doch iirc eher relativ schlecht. Ist das mittlerweile anders?

aufkrawall
2019-10-01, 21:09:11
Zumindest Polaris ist bei Qualität/Bitrate für die Tonne und zu Navi sind mir keine Tests mit AMF bekannt. AMD wirkt da ziemlich überfordert, sie bieten ja noch nicht mal 4k 60fps ReLive Capture an (obwohl mit OBS die Encoding-Performance zu reichen scheint).
Skylake schien mir mit QuickSync ICQ H.264 in OBS ziemlich gute Capture-Qualität zu haben. Ab Gen 9.5 wird da mit HEVC (+ 10 Bit) sicherlich noch eine ordentliche Schippe drauf gelegt, wobei dann die Performance für Echtzeit-Captures zu hinterfragen wäre.
Ist wohl davon auszugehen, dass Intel zumindest in der Hinsicht mit Xe ordentlich aufräumen wird. Man muss ihnen lassen, dass sie Video einfach können. Sowohl in Hardware, als auch Treiber.

drdope
2019-10-02, 18:12:44
@Robbitop
Mal eine ganz doofe Zwischenfrage, warum willst du bei einem vorhandenen R7-1700 mit der GPU transkodieren?
Ich hab für ein Bekannten letztens ein Qnap TS-877 mit gleicher CPU u.A. als Plexserver in Betrieb genommen... iirc haben wir bei der gleichzeitigen Wiedergabe von sieben Streams (3x AppleTV@1080p, 2x iPad und 3x iPhone mit Plexclients) aufgehört zu testen.

robbitop
2019-10-02, 18:18:37
Ich lasse VMs und Docker laufen. Auch soll zukünftig 4K Material transkodiert werden. Es soll Echtzeittonemapping in Arbeit sein. Auch sehe ich h265 am Horizont. All das sollte per HW Transcoding deutlich besser gehen. HW Decoding und HW Encoding ist energieffizienter und kostengünstiger. Spätestens wenn es in Richtung 4K geht.

drdope
2019-10-02, 18:39:38
Man bekommt den NV Docker ja im Community Application store. Ich wüsste nicht wie man da was reintun sollte. Aber er taucht nicht unter „Docker“ sondern unter „Plugins“ auf. MMn installiert das Plugin nur eine veränderte Version von Unraid selbst.

Google hat mir das hier ausgeworfen

In order to copy a file from a container to the host, you can use the command

docker cp <containerId>:/file/path/within/container /host/path/target
--> https://stackoverflow.com/questions/22049212/copying-files-from-docker-container-to-host

Daraus schließe ich mal grob -> es gibt ein Set von Kommandos mit dem man Docker vom Host aus Steuern und verändern kann... da müßte man sich jetzt weiter mit auseinander setzen (ich hab von Dockern auch keine große Ahnung).

Das , was du weiter Oben als "Anweisung" interpretiert hast, ist das Dockerfile (dort werden diverse Variablen für den Docker gesetzt)
Daruf bezieht sich der erste Satz des readme

In dem Readme zum nvidia-patch stehet folgendes:

Docker support

It is possible to use this patch with nvidia-docker containers, even if host machine hasn't patched drivers. See Dockerfile for example.

Essentially all you need to do during build is:

COPY the patch.sh and docker-entrypoint.sh files into your container.
Make sure docker-entrypoint.sh is invoked on container start.
docker-entrypoint.sh script does on-the-fly patching by means of manipulating dynamic linker to workaround read-only mount of Nvidia runtime. Finally it passes original docker command to shell, like if entrypoint was not restricted by ENTRYPOINT directive. So docker run --runtime=nvidia -it mycontainer echo 123 will print 123. Also it can be just invoked from your entrypoint script, if you have any.
--> https://github.com/keylase/nvidia-patch/blob/master/README.md

Damit würde ich mal beginnen...

robbitop
2019-10-02, 18:48:39
Ja das habe ich ja weiter iben schon gepostet. Ich bin nur zu blöd damit was anzufangen. Was müsste ich denn da machen? :)

drdope
2019-10-02, 19:29:00
Ganz grob, müßtest du mit einer deiner Umgebung angepassten Version von:

docker cp <containerId>:/file/path/within/container /host/path/target

patch.sh und docker-entrypoint.sh in den Docker kopieren.

Und den Rest macht imho das DockerFile (Variablen Deklarieren, Verzeichnisse anlegen, Dateien an den richtigen Ort kopieren, Dateien ausführbar machen). Vermutlich kann man selbiges dem Docker irgendwo als Config übergeben?

Das dumme ist -> ich hab nur so ein bissl Ahnung von Linux, kenn mich aber mit Dockern gar nicht aus...

Evtl. wäre es ja sinnvoll sich mal grundlegende Tutorials zum Thema Docker anzuschauen, speziell Aufbau eines Dockers und Management von Dockern?
Ist Anfangs nervig, ich weiss...

Acid-Beatz
2019-10-29, 10:52:03
Servus zusammen,

ist das Thema noch aktuell?

Ich habe das ganze mal überflogen und würde einfach den Treiber vom OS patchen, weil auf nichts anderes greift Docker ja dann zu:

NVIDIA-Patch install Driver (https://github.com/keylase/nvidia-patch#install-driver)

Ansonsten kann ich gerne noch paar Zeilen dazu schreiben, wenn Bedarf besteht?!

robbitop
2019-10-29, 11:07:31
Klaro besteht Bedarf. Idealerweise Schritt für Schritt was zu tun ist. :)

Acid-Beatz
2019-10-29, 13:15:22
Ich schau es mir heute Abend mal an, wenn der Tag nicht mehr allzu sehr in Stress ausartet :up:

nvidia-smi
Was sagt denn diese Ausgabe eigentlich bei Dir, funktioniert das?

robbitop
2019-10-29, 15:43:39
Ja das funktioniert gut.
https://abload.de/thumb/nv-smiqwjn9.png (https://abload.de/image.php?img=nv-smiqwjn9.png)

Er encodiert tatsächlich nur 2x Streams. Beim 3. steigt die CPU Auslastung. Jedoch das Decoding scheint keine Limitierung zu haben (das hilft auch schonmal).

Acid-Beatz
2019-10-29, 18:11:19
Guten Abend,

nachdem Du offenbar schon einen funktionierenden Treiber drauf hast, sind evtl. garnicht so viel Schritte notwendig, behaupte ich mal in meinem jugendlichen Leichtsinn :) :

Root werden:
# sudo -i

Patch-Skript herunterladen:
wget https://github.com/keylase/nvidia-patch/blob/master/patch.sh

Skript ausführbar machen:
chmod 700 patch.sh

Skript ausführen:
./patch.sh

Ich habe das Skript kurz überflogen, den Rest holt er sich dann alles aus der Ausgabe von nvidia-smi, beziehungsweise Vergleicht irgendwelche Rückgabewerte.


Das müsste es schon gewesen sein, zu einfach um wahr zu sein aber schauen wir mal :)

Edit: Und zur Sicherheit noch der Hinweis: Du patcht das "Hauptsystem", also Dein Linux und nicht irgendwelche Container: Mir war ja eh schleierhaft, wie ein Patch in einem Container wirken soll, wenn der Grafiktreiber eine Ebene weiter unten sitzt. Also aus meiner Sicht müsste wenn dann dieser Weg zielführend sein!

Ganon
2019-10-29, 20:10:47
Edit: Und zur Sicherheit noch der Hinweis: Du patcht das "Hauptsystem", also Dein Linux und nicht irgendwelche Container: Mir war ja eh schleierhaft, wie ein Patch in einem Container wirken soll, wenn der Grafiktreiber eine Ebene weiter unten sitzt. Also aus meiner Sicht müsste wenn dann dieser Weg zielführend sein!

Keine Ahnung ob er es auch gemacht hat, aber das sagte ich schon in meiner ersten Antwort:

Versuch doch einfach mal dort, wo du auch nvidia-smi eingegeben hast, mal den Patch auszuführen.

robbitop
2019-10-30, 07:54:39
@Acid-Beatz

Habe es soeben probiert. Irgendwas hat offenbar nicht funktioniert:

https://abload.de/thumb/nv-smitujo8.png (https://abload.de/image.php?img=nv-smitujo8.png)

Ganon
2019-10-30, 08:08:15
wget https://raw.githubusercontent.com/keylase/nvidia-patch/master/patch.sh

Der andere Befehl lädt die Webseite runter, was die Fehlermeldung auch erahnen lässt ;)

robbitop
2019-10-30, 08:16:46
@Ganon
Danke probiere ich gleich aus :)

@Acid-Beatz
Danke auf jeden Fall schon mal für deine Mühe. :)

robbitop
2019-10-30, 08:35:25
Woohoo! Es funktioniert! Tausend Dank euch beiden!! :up:

Ich habe aber noch eine Anschlussfrage: bei jedem Reboot ist der Patch wohl wieder weg.

Kann ich genau die Reihenfolge wie von euch beschrieben in ein Userscript eintragen? Müsste das beim Reboot dann funktionieren? Unraid bietet diese Option.

Das Script sähe so aus:


#!/bin/bash
# sudo -i
chmod 700 patch.sh
./patch.sh

Anmerkungen:
A) Die erste Zeile stand da im leeren Script schon drin - kA ob das falsch ist.
B) wget patch.sh muss ich ja nur einmalig machen. Die Datei ist ja da, richtig?

Acid-Beatz
2019-10-30, 10:39:59
Coole Sache, immer gerne :up:

Der andere Befehl lädt die Webseite runter, was die Fehlermeldung auch erahnen lässt ;)
Interessant - ich habs zu Hause ja eigentlich ausprobiert und dann wohl doch das falsche hierher kopiert aber das ist genau meine Art von Fehlern, die mir hin und wieder mal unterlaufen :freak:

Danke fürs korrigieren :)

Ich habe aber noch eine Anschlussfrage: bei jedem Reboot ist der Patch wohl wieder weg.
Du sagst das irgendwie so fragend - ist der Patch denn weg oder nicht, wenn Du das System neu startest?
Aus dem Bauch heraus hätte ich nämlich gesagt, dass der Patch höchstens bei einer Treiber-Installation wieder weg ist.
Sicher weg wäre er nur bei Containern gewesen, da hättest Du dann das Image Patchen müssen aber diesen Fall haben wir hier ja nicht.


Ich würde jetzt mal vorschlagen, dass Du das System neu startest und anschließend schauen wir weiter ;)

robbitop
2019-10-30, 11:23:57
Ich hatte sowas mal im Zusammenhang in einem Redit Thread gelesen (da ging es um den Patch und Unraid - nur hat es dort niemand erklärt, wie man den Patch installiert). Aber was du sagst, macht natürlich Sinn. Prüfe ich nach und melde mich zurück! :)

robbitop
2019-10-30, 17:03:52
So getestet:
Nach dem Reboot geht es tatsächlich nicht mehr. Auch die patch.sh ist verschwunden.

Es ist frapierend, was HW Encoding bringt. Ich habe dem Plex Docker 5 Kerne / 10 Threads meines Ryzen 1700 gegeben und bei 4 Encodes war er (trotz decode Beschleunigung) schon ziemlich an der Vollauslastung. Gepatcht und die CPU Cores drehen förmlich Däumchen als würden sie nichts tun. 5-10% Auslastung bei 5x FullHD Streams mit 8 Mbit/s. Wirklich Wahnsinn.

Ich habe jetzt entsprechend das Userscript so erstellt:


#!/bin/bash
# sudo -i
wget https://raw.githubusercontent.com/keylase/nvidia-patch/master/patch.sh
chmod 700 patch.sh
./patch.sh

Und das startet er bei jedem Reboot neu. Wirklich genial! Tausend Dank! :)

Warum er die patch.sh löscht und der Treiberpatch nicht mehr gültig ist beim Reboot bleibt mir ein Rätsel. Jedoch habe ich ähnliches wie gesagt auf Reddit gelesen.

Acid-Beatz
2019-10-30, 17:42:32
Guten Abend,

ich kenne die Distribution leider garnicht, genauso wie Slackware aber gut, man lernt nie aus - vielleicht bereinigt sie sich ja wirklich irgendwie selbst.

Viel Spaß auf alle Fälle beim Filme schauen ;)