zondag 27 december 2020

Installatie perikelen.

Vermoedelijk na wat updates die ik heb moeten / willen draaien voor de Toonify / deepfake experimenten, werkt mijn gpu niet meer bij het trainen van deel learning netwerken. Vanuit de blog van mijn broer haal ik een werkbare configuratie.


  • Cuda 10.0
  • Tensorflow-GPU==1.14.0
  • Python 3.6.5
  • Keras 2.2.4

Ik installeer deze en verifieer de versies:
 

>>> keras.__version__   

'2.2.4-tf'

>>> keras.__version__

'2.2.4'

Python 3.6.5

>>> import tensorflow as tf

>>> tf.__version__

'1.14.0'


PS C:\Users\DirkW> nvcc --version

nvcc: NVIDIA (R) Cuda compiler driver

Copyright (c) 2005-2018 NVIDIA Corporation

Built on Sat_Aug_25_21:08:04_Central_Daylight_Time_2018

Cuda compilation tools, release 10.0, V10.0.130

De versies kloppen en lijken op het eerste gezicht ook een werkbare installatie op te leveren. Hiermee test je snel of de gpu ook inderdaad gevonden wordt:

>>>tf.test.is_gpu_available(cuda_only=False, min_cuda_compute_capability=None)

De installatie geeft wel al snel veel memory-tekort-errors. Ik denk dat ik toch ga proberen een eerdere versie te installeren.  


Ik begin met het deinstalleren van keras en tensorflow-gpu

>pip uninstall keras

 Successfully uninstalled Keras-2.2.4

>pip uninstall tensorflow-gpu

 Successfully uninstalled tensorflow-gpu-1.14.0


Via Windows 'Apps and Feautures deinstalleer ik alle CUDA software / versies. 

Ik haal versie 8 hier op met ook een patch:

https://developer.nvidia.com/cuda-80-ga2-download-archive

Cuda 8 herkent de grafische kaart nog niet. Ik schakel nu naar 9.2

Nsight moet blijkbaar ook worden gedeinstalleerd. Dus ik laat opnieuw de installatie lopen en daarna de patch. Dit lijkt aallemaal goed te gaan tot nu toe.


Nu nog CuDNN : 

en download deze



Deze moeten weer naar de betreffende Cuda direcories worden gekopieerd.
(C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2)
Ook moest ergens het pad worden opgenomen in de systeem variabelen.
Met Control X en daarna advanced system settings kom ik hier:


Ik zie dat ze al zijn toegevoegd:




Ok, verder met de juiste tensorflow en keras versies:
Ik lees dat deze versie met Cuda 9.2 zou ,oeten werken:

> pip install tensorflow-gpu==1.8.0

Bij geeft aan dat de installatie succesvol is maar tocj ook een error m.b.t. tensorboard. (Hoewel hij net 2.4.0 heeft gedeinstalleerd)
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
-ensorflow 1.12.0 requires tensorboard<1.13.0,>=1.12.0, but you have tensorboard 1.8.0 which is incompatible.
tensorflow 1.14.0 requires tensorboard<1.15.0,>=1.14.0, but you have tensorboard 1.8.0 which is incompatible.

Ik ben benieuwd of keras nu ook is geinstalleerd

 >>> from tensorflow import keras
ImportError: Could not find 'cudart64_90.dll'. TensorFlow requires that this DLL be installed in a directory that is named in your %PATH% environment variable. Download and install CUDA 9.0 from this URL: https://developer.nvidia.com/cuda-toolkit


Vreemd, misschien eerst even rebooten.

Ook dat werkt niet. Ik besluit op basis van wat adviezen om Cuda 9.0 t installeren. Dit lijkt prima te werken. Ik hoef ook geen nieuwe CuDNN te downloaden. Na reboot komt hij gelijk met de juiste bevestiging: 

>>> tf.test.is_gpu_available(cuda_only=False, min_cuda_compute_capability=None)
2020-12-27 20:12:56.087941: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:1435] Adding visible gpu devices: 0
2020-12-27 20:12:56.089254: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:923] Device interconnect StreamExecutor with strength 1 edge matrix:
2020-12-27 20:12:56.089831: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:929]      0
2020-12-27 20:12:56.090446: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:942] 0:   N
2020-12-27 20:12:56.091079: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:1053] Created TensorFlow device (/device:GPU:0 with 9647 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:05:00.0, compute capability: 6.1)
True

Alleen dit vind ik een beetje vreemd:


>>> from tensorflow import keras

>>> keras.__version__

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

AttributeError: module 'tensorflow.tools.api.generator.api.keras' has no attribute '__version__'

 Dit doet het wel:

tf.__version__

'1.8.0'

Ik heb dus nu 

- Tensorflow - GPU 1.8.0

- Keras - ?

- Cuda - 9.0

- CuDNN v7.6.5

Ik ga nog de Cuda 9.0 patches downloaden. Hoop dat dat geen roet in het eten gooit. 

Dat is gelukt maar er is nog een probleempje met keras zelf. Ondanks dat een import van keras uit tensorflow geen fout geeft lijken er geen modules te kunnen worden geladen.  Ik moet Keras blijkbaar zelf ook nog installeren. Versie 2.1.6 lijkt hierbij te passen:

pip install keras==2.1.6

Dit lijkt nu weer helemaal goed te werken. Ook Keras werkt met de GPU

Nu nog een juist deep learning programma :-)



donderdag 10 december 2020

NLP nieuwe experimenten 01

Het is alweer even geleden dat ik met nlp heb geexperimenteerd. Nog wel wat zaken voor incident classificatie gedaan op basis van Bert maar eigen testjes hebben even stil gelegen. Toch borrelen er af en toe wat gedachten op die dan ook soms tot nieuwe programmeer experimentjes leiden. 


Een van die gedachten / overwegingen is de keuze bij Bert om woorden op te splitsen in woorddelen. In het char2word2vev verhaal ben ik ervan uitgegaan dat je , door van de karakters uit te gaan, in elk geval geen informatie verloren laat gaan van gelijkvormige woorden zoals 'school' en 'schoollokaal', 'schoolbank' etc . Uit deze woorden kan je afleiden, zelfs als je niet zou kunnen leen, dat er veel meer overeenkomst is tussen de woorden dan bijvoorbeeld 3 willekeurige andere. Zoals aangegeven hoopte ik deze betekenis te kunnen vasthouden tijdens de omzetting naar getallen (creatie van een vocabulary met indices). Dit leidt in pincipe tot een zeer beperkte / kleine 'vocab' van, zeg maar, 28 letters (eventueel het dubbele bij hoofdletters) , 10 cijfers en een setje symbolen. 

Dit kleine setje zou het gevoelsmatig makkelijker moeten maken om uit een reeks informatie te extraheren.  


Bij Bert is de vocab echter zo'n 30K groot en blijkbaar geeft dat heel goede resultaten. Neurale netwerken hebben dus niet heel veel moeite om met dergelijke grotere vocabulares om te gaan. De opdeling van woorden in woorddelen lijkt bij Bert echter wat willekeurig. Een goede tussen mogelijkheid is wellicht om woorden op te splitsen in lettergrepen. Daarbij blijft veel 'woordinformatie' behouden. Bijvoorbeeld 'school' uit bovenstaand voorbeeld wordt in alle drie de gevallen op dezelfde wijze gecodeerd. 

Ik vind al snel een aardige python lettergreep omzetter:

from hyphenate import hyphenate_word

Ik pak weer het 'movie sentiment bestand' en doe wat testen. Dit bestand bevat 100.000 reviews. Ik kijk hoe lang (aantal karakters) de reviews gemiddeld zijn (voor de aardigheid opgesplitst naar sentiment):

sentiment

negative    1294.0

neutral     1329.9

positive    1324.8

Het omzetten naar lettergrepen gaat niet allemaal zoals ik zou verwachten maar we komen een heel eind. Ik krijg 65.626 verschillende 'lettergrepen'. Hier een voorbeeld van de 10 meest voorkomende lettergrepen en de frequentie:

[('ing', 5072), ('i', 3462), ('ly', 3082), ('er', 2944), ('in', 2266), ('re', 1914), ('ed', 1766), ('tion', 1753), ('un', 1693), ('ter', 1495)]

Maar als ik de lettergrepen verwijder die maar 1x voorkomen hou ik er maar 14.543 over. De overige 'lettergrepen' moeten maar, net als bij Bert, met de letters zelf worden gecodeerd. Die moet ik dan, denk ik, nog wel toevoegen, voor zover ze nog niet in de huidige vocabulary beschikbaar zijn.  

Nu maar eens even een lettergreep codeer functie schrijven die woorden omzet in arrays met de indexen uit deze volledige vocabulary.