Forum: Projekte & Code TensorFlow GPU aktivieren in Windows


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Josef (nerd_c)


Lesenswert?

Servus zusammen,
ich arbeite aktuell an nem Hobbyprojekt wo ich eine Sprache 
automatisiert in eine andere übersetzen will. Dafür erstelle ich mir 
Modelle mittels TensorFlow. Das Training der Modelle ist leider recht 
rechenintensiv, daher wollte ich das TensorFlow meine Grafikkarte nutzt 
anstelle der CPU.

Zu meiner Überraschung war das aktivieren der Grafikkarte alles andere 
als trivial :D

Ich hab das mal hier dokumentiert: 
https://nerd-corner.com/de/tensorflow-gpu-aktivieren-unter-windows/ und 
für die internationalen 
https://nerd-corner.com/enable-tensorflow-gpu-under-windows/

Als nächstes würde ich den Ablauf der Datenverarbeitung und 
Modellerstellung dokumentieren.

von Josef (nerd_c)


Lesenswert?

So die gute Nachricht ist ich habe mittlerweile einen Prototypen der 
einigermaßen funktioniert. Ich haber allerdings auf dem Weg dahin sehr 
sehr viele Fehler gemacht und extrem viel Zeit mit Tensorflow.js 
verschwendet. Würde zukünftig nur noch die Python Version benutzen.

Die Unterschiede der beiden Libraries habe ich jetzt mal hauptsächlich 
für mich selbst dokumentiert:
https://nerd-corner.com/de/tensorflow-js-oder-tensorflow-nutzen/
Aber auch wieder eine englische Version gemacht, weil ich mir gedacht 
habe eigentlich kann die Doku auch anderen Leuten helfen: 
https://nerd-corner.com/tensorflow-js-vs-tensorflow-python/

Als nächstes habe ich vor die Unterschiede bei der Datenverarbeitung im 
direkten Vergleich zu zeigen. Das wird allerdings sehr aufwendig und 
wird daher nicht allzubald erscheinen...

von Sheeva P. (sheevaplug)


Lesenswert?

Josef schrieb:
> Zu meiner Überraschung war das aktivieren der Grafikkarte alles andere
> als trivial :D

Aus eigener mitunter leidvoller Erfahrung kann ich Dir sagen, daß die 
Installation von Tensorflow, CUDA, cuDNN etc. aufgrund der inhärenten 
Versionsabhängigkeiten auch unter Linux kein großes Vergnügen ist -- 
insbesondere auch, weil die Dokumentation von NVidia leider kein sehr 
übersichtliches Machwerk ist.

Darüber hinaus habe ich gesehen, daß Du die Python-Distribution Anaconda 
verwendest. Das ist unter Windows zweifellos keine schlechte Wahl. Aber: 
bitte achte dann darauf, nur mit "conda" zu installieren. Eine Mischung 
zwischen "conda" und "pip" führt leider häufig zu Problemen.

Josef schrieb:
> So die gute Nachricht ist ich habe mittlerweile einen Prototypen der
> einigermaßen funktioniert.

Darf ich fragen, was für ein Modell Du verwendest, woher Du Deine 
Trainingsdaten hast und wie umfangreich diese sind?

> Ich haber allerdings auf dem Weg dahin sehr
> sehr viele Fehler gemacht und extrem viel Zeit mit Tensorflow.js
> verschwendet.

Alles gut, ML- und DL-Anwendungen sind ausgesprochen komplex und 
besonders der Einstieg ist nicht ganz einfach und die Dokumentation 
bisweilen sowohl unübersichtlich als auch manchmal nicht ganz 
vollständig. Viele Dinge sind daher leider nur per Trial&Error 
herauszufinden.

> Würde zukünftig nur noch die Python Version benutzen.

Das ist sicherlich die bessere Wahl. Wenn man solche komplexen Dinge 
macht kann man darauf verzichten daß einem auf noch die Syntax, die 
Designfehler und die Limitierungen der Programmiersprache im Weg stehen. 
Ganz abgesehen von der Performance, versteht sich.

Viel Spaß und Erfolg bei Deinem Projekt -- und ich freue mich schon 
darauf weitere Dokumentationen von Dir zu lesen! :-)

von Josef (nerd_c)


Lesenswert?

Hey, ja ich nutze da kaggle.com um genau zu sein, habe ich mir für 
meinen Protoypen diesen Datensatz heruntergeladen: 
https://www.kaggle.com/datasets/devicharith/language-translation-englishfrench

Was das Modell angeht habe ich noch wenig Erfahrung und daher ein 
bestehendes übernommen. In meinem Fall habe ich von dem hier 
abgekupfert: 
https://www.kaggle.com/code/ahmedgamal12/model-machine-translation-from-eng-fr/input

Am Code habe ich paar Änderungen vorgenommen, aber letztlich basiert er 
zum Großteil auf dem Beispielcode. Was jetzt speziell mein Projekt 
angeht muss ich statt eines Englisch - Französisch Datensatzes einen 
Deutsch - Bairischen Datensatz erstellen. Ich habe vor mir ebenfalls von 
Kaggle einen Deutsch - Englischen Datensatz herunterzuladen und dann mit 
Hilfe der Webseite https://dialektl.com/ die deutschen Wörter und Texte 
automatisiert zu übersetzen und mit den Übersetzungen die englische 
Spalte des Datensatzes zu überschreiben. Anschließend würd ichs dann 
nochmal manuell prüfen. :)

von Sheeva P. (sheevaplug)


Lesenswert?

Josef schrieb:
> Hey, ja ich nutze da kaggle.com um genau zu sein, habe ich mir für
> meinen Protoypen diesen Datensatz heruntergeladen:
> https://www.kaggle.com/datasets/devicharith/language-translation-englishfrench
>
> Was das Modell angeht habe ich noch wenig Erfahrung und daher ein
> bestehendes übernommen. In meinem Fall habe ich von dem hier
> abgekupfert:
> 
https://www.kaggle.com/code/ahmedgamal12/model-machine-translation-from-eng-fr/input

Interessant, ein Modell mit einem Encoder und einem Decode mit je zwei 
kleinen (256 Einheiten) LSTMs, und trotzdem kommt es schon auf über 20 
Millionen trainierbare Parameter. Die Ergebnisse des Trainings (Loss und 
Accuracy) sehen aber schon sehr vielversprechend aus, viel Spaß und viel 
Glück damit! Tipp: vielleicht magst Du mal versuchen, anstelle der LSTMs 
einmal GRUs (Gated Recurrent Units) zu verwenden, die kommen häufig auf 
ähnlich gute Ergebnisse wie LSTMs, sind aber aufgrund ihrer einfacheren 
Architektur etwas weniger rechenintensiv und darum meistens schneller.

> Am Code habe ich paar Änderungen vorgenommen, aber letztlich basiert er
> zum Großteil auf dem Beispielcode. Was jetzt speziell mein Projekt
> angeht muss ich statt eines Englisch - Französisch Datensatzes einen
> Deutsch - Bairischen Datensatz erstellen. Ich habe vor mir ebenfalls von
> Kaggle einen Deutsch - Englischen Datensatz herunterzuladen und dann mit
> Hilfe der Webseite https://dialektl.com/ die deutschen Wörter und Texte
> automatisiert zu übersetzen und mit den Übersetzungen die englische
> Spalte des Datensatzes zu überschreiben. Anschließend würd ichs dann
> nochmal manuell prüfen. :)

Tja, die Datenaufbereitung -- oder, in Deinem Falle: Erstellung -- ist 
bedauerlicherweise ein Aufwand, den einem keiner abnimmt. Aber würdest 
Du nicht anstelle eines englisch-französischen Dataset nicht vielleicht 
mit einem englisch-deutschen etwas weniger Arbeit haben?

Wie gesagt, ich finde das Projekt wirklich interessant und freue mich, 
zukünftig mehr darüber lesen zu dürfen. Viel Spaß, Glück und Erfolg, und 
bitte laß' uns (okay: mich) wissen, wie es weitergeht... :-)

von Josef (nerd_c)


Lesenswert?

Vielen Dank!

Das mit den GRU's ist ein guter Tipp! Ich bleib zunächst bei meinem 
jetztigen Modell, werd das aber im Anschluss mal vergleichen (wenn ich 
da noch genauso motiviert bin wie jetzt :D )

Das war etwas missverständlich ausgedrückt, ich habe zwar für mein 
Modell einen eng-franz Datensatz benutzt, werde aber zum Erstellen 
meines eigenen Datensatzes von einem deutsch-englischem Datensatz 
beginnen.

So, ich hatte die Woche mir einfach fest vorgenommen weiter zu machen 
und habe daher alles was ich bisher gelernt habe dokumentiert. Dabei 
habe ich besonderen Wert darauf gelegt immer direkt Python mit JS zu 
vergleichen.

Wie gesagt ich habe leider mit JS gestartet, aber wollte meine 
Erkentnisse nicht verlieren, daher habe ich es gemeinsam dokumentiert. 
Weil so viel wurde musste ich es in 2 Teile aufspalten:

Teil 1:
https://nerd-corner.com/de/nlp-anwendung-tensorflow-js-vs-tensorflow-python-teil-1/ 
(DE Version)
https://nerd-corner.com/nlp-application-tensorflow-js-vs-tensorflow-python-part-1/ 
(EN Version)

Teil 2:
https://nerd-corner.com/de/nlp-anwendung-tensorflow-js-vs-tensorflow-python-teil-2/ 
(DE Version)
https://nerd-corner.com/nlp-application-tensorflow-js-vs-tensorflow-python-part-2/ 
(EN Version)


Jetzt hält mich eigentlich nichts mehr davon ab mit dem Aufbau des 
Bairischen Datensatzes zu beginnen :D

von Benedikt L. (Firma: Dem Ben seine Leiche) (dembenseineleiche) Flattr this


Lesenswert?

Wie wäre es mit einem Coral-USB-Stecker?
https://coral.ai/products/accelerator

Wäre das auch geignet?

von Sheeva P. (sheevaplug)


Lesenswert?

Josef schrieb:
> Das mit den GRU's ist ein guter Tipp! Ich bleib zunächst bei meinem
> jetztigen Modell, werd das aber im Anschluss mal vergleichen (wenn ich
> da noch genauso motiviert bin wie jetzt :D )

Du kannst die GRUs genauso wie die LSTMs verwenden. Einfach die 
LSTM()-Konstruktoren durch GRU()-Konstruktoren austauschen. Wenn ich 
mich recht entsinne, unterstützen beide dieselben Argumente. Erfahrene 
Pythonisten würden daher vielleicht etwa so etwas schreiben:
1
# LSTM und GRU aus tensorflow importieren
2
from argparse import ArgumentParser
3
4
if __name__ == '__main__':
5
    parser = ArgumentParser(description='...')
6
    parser.add_argument('--celltype', '-t', choices=['LSTM', 'GRU'], \
7
                        default='LSTM', help='cell type')
8
    args = parser.parse_args()
9
10
    CellType = LSTM
11
    if args.celltype == 'GRU':
12
        CellType = GRU
13
    print(args, CellType) # demo...

In Deinen Modellen kannst Du dann einfach die LSTM()-Aufrufe durch 
"CellType()" ersetzen und mit dem Schalter "--celltype" oder "-t" beim 
Aufruf des Programms auf der Kommandozeile bestimmen ob Du LSTMs oder 
GRUs benutzen möchtest.

> Teil 1:
> Teil 2:
> [...]

Wow, tolle Arbeit, Respekt! Habe es bisher leider nur kurz überfliegen 
können denn morgen wartet ein Swarm-Cluster auf meine Aufmerksamkeit -- 
wenn ich danach noch Kapazitäten habe lese ich mal genauer hinein. Und 
ansonsten habe ich spannenden Lesestoff fürs Wochenende. ;-)

Tipp: durch die Kombination der Python-Module "logging" und "json" 
kannst Du schöne maschinenlesbare Logdateien im JSON-Format ausgeben:
1
import json
2
import logging
3
logging.basicConfig(
4
  format='%(asctime)s %(levelname)s %(message)s',
5
  stream=sys.stdout, # loggt auf stdout, ansonsten file='log.txt'
6
  level=logging.DEBUG
7
)
8
9
logging.debug(json.dumps({'text': 'Nachricht', 'value': 4})

Ich bin mir übrigens nicht ganz sicher ob SparseCategoricalCrossEntropy 
wirklich sinnvoll ist. Vielleicht könnte eine andere Fehlerfunktion wie 
RMSE dort besser performen? Denn Du hast doch nicht wirklich kategoriale 
Targets, oder? Ich würd jedenfalls mal mit mit der Lossfunktion spielen. 
Das kannst Du auch ähnlich wie oben mit dem CellType machen...

Letzter Tipp vom Klugschieter für heute: CellType, LossFunction und alle 
anderen Parameter immer zumindest beim Programmstart loggen damit Du bei 
Deinen Auswertungen nicht durcheinander kommst. :-)

> Jetzt hält mich eigentlich nichts mehr davon ab mit dem Aufbau des
> Bairischen Datensatzes zu beginnen :D

Ich würde Dir gerne meine Hilfe anbieten aber mein Bairisch ist leider 
zwischen schlecht und nicht vorhanden... Viel Spaß und Erfolg, bisher 
ist das wirklich saucool und ich bin noch gespannter als vorher schon! 
:-)

von Sheeva P. (sheevaplug)


Lesenswert?

Benedikt L. schrieb:
> Wie wäre es mit einem Coral-USB-Stecker?
> https://coral.ai/products/accelerator
>
> Wäre das auch geignet?

Vermutlich eher nicht, nein. Wenn ich den TO richtig verstehe benutzt er 
einen richtigen PC mit einer richtigen Grafikkarte - und die unterstützt 
Tensorflow vollständig inklusive LSTMs und GRUs. Die Coral-Beschleuniger 
können hingegen nur Tensorflow Lite und wenn ich mich recht entsinne 
gibt es dort keine Unterstützung für diese beiden Typen. Die Dinger von 
Coral sind für Rechner ohne TF-kompatible GPU wie Raspberry Pi gedacht.

von Hannelore Hasenbein (Gast)


Lesenswert?

Sheeva P. schrieb:
> Ich bin mir übrigens nicht ganz sicher ob SparseCategoricalCrossEntropy
> wirklich sinnvoll ist.

Dem kann ich mich nur anschließen. Es wird wahrscheinlich 
ParseError-Fehlermeldungen geben.

Sheeva P. schrieb:
> Wenn ich den TO richtig verstehe benutzt er
> einen richtigen PC mit einer richtigen Grafikkarte

Was hälst du von der Idee, den TO einfach zu fragen?

von Ein T. (ein_typ)


Lesenswert?

Hannelore Hasenbein schrieb:
> Sheeva P. schrieb:
>> Wenn ich den TO richtig verstehe benutzt er
>> einen richtigen PC mit einer richtigen Grafikkarte
>
> Was hälst du von der Idee, den TO einfach zu fragen?

Nicht nötig, denn ich habe seine Dokumentation gelesen. Trotzdem vielen 
Dank für Deinen "gehaltvollen" "Beitrag".

Beitrag #7451045 wurde von einem Moderator gelöscht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.