Compiler le code source de TensorFlow avec les optimisations AVX2 et FMA sous Mac OS X

Ce post concerne l’installation du paquet TensorFlow à partir du code source.

La motivation première est d’éviter ce warning :

"The TensorFlow library wasn't compiled to use AVX2 and FMA instructions, but these are available on your machine and could speed up CPU computations."

Pour contextualiser, je travaille sur un MacBook Pro 2017:

MacBook Pro (13-inch, 2017, Two Thunderbolt 3 ports)
Processeur 2.3 GHz Intel core i5 (2 coeurs)
Mémoire 8 Go 2133 MHz LPDDR3
Graphisme Intel Iris Plus Graphics 640 1536 Mo

Donc pas de GPU.

L'objectif est de compiler TensorFlow « nativement » pour ma machine, ce qui a priori devrait être mieux optimisé et donc plus performant en temps de calcul que l’installation standard par « pip install tensorflow ».

Cet article est principalement inspiré de la documentation de TensorFlow : https://www.tensorflow.org/install/source.
Je suis parti en fait de ce « post » : https://gist.github.com/winnerineast/05f63146e4b1e81ae08d14da2b38b11f, dans lequel il manque cependant des prérequis avant la compilation.
Enfin, la compilation sous Mac OS fait appel à « Bazel ». Son installation est expliquée là : https://docs.bazel.build/versions/master/install-os-x.html.

Dans un premier temps, j’explique l’installation d’Anaconda et la mise en place d’un environnement virtuel.
Ça n’est pas directement lié à notre problème, mais cela permet de poser le contexte.

Anaconda

Installation

Il faut aller là https://www.anaconda.com/distribution/ et cliquer sur le lien 64-Bit Command Line Installer (435 MB) - installation en ligne de commande.

Ensuite ouvrir un terminal et aller dans le répertoire Downloads

$ cd Downloads

Lancer l’installation

$ bash Anaconda3-2019.07-MacOSX-x86_64.sh

Création d’un environnement virtuel (python 3.6)

$ conda create --name py36 python=3.6 anaconda

Quand on veut activer l’environnement virtuel dans un terminal

$ source activate py36

Pour sortir de l’environnement

$ conda deactivate
On revient à nos moutons : taper

$ source activate py36

Puis

$ conda update numpy (inutile a priori puisqu’on vient d’installer l’environnement py36, mais ça peut servir s’il est déjà installé).

ON REVIENT A LA COMPILATION

 

ATTENTION, à ne pas oublier.

Il faut installer deux paquets avant la compilation sous peine de générer des erreurs.

$ source activate py36 (si ce n’est pas déjà fait)

$ pip install -U keras_applications==1.0.6 --no-deps

$ pip install -U keras_preprocessing==1.0.5 --no-deps

Pas besoin de l’option «--user » parce qu’on est dans un env. virtuel.

INSTALLATION DE BAZEL

« install Bazel using binary installer » tel que décrit dans https://docs.bazel.build/versions/master/install-os-x.html

Dans le GitHub, sélectionner la version 0.26.1 https://github.com/bazelbuild/bazel/releases/tag/0.26.1 puis télécharger le fichier bazel-0.26.1-installer-darwin-x86_64.sh

Enfin installer :

$ cd Downloads

$ bash bazel-0.26.1-installer-darwin-x86_64.sh --user

Attention, il est important que la version de Bazel soit <= 0.26.1

TELECHARGEMENT DU CODE SOURCE DE TENSORFLOW

$ git clone https://github.com/tensorflow/tensorflow.git

$ cd tensorflow

$ git checkout r1.14

La dernière ligne indique que l’on utilise la version/branche 1.14 de TensorFlow

COMPILATION

$ source activate py36 (si ce n’est pas déjà fait)

$ ./configure

Garder les options par défaut dans la configuration.

En particulier, l’option « march=native » indique que la compilation est faite pour votre Mac.

$ bazel clean

$ bazel build -c opt --copt=-mavx2 --copt=-mfma  -k //tensorflow/tools/pip_package:build_pip_package

ATTENTION LA COMPILATION PEUT PRENDRE DU TEMPS, PLUSIEURS HEURES SUR MA MACHINE.

CONSTRUIRE LE PAQUET

$ ./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

INSTALLER LE PAQUET avec pip

$ pip install /tmp/tensorflow_pkg/tensorflow-1.14.1-cp36-cp36m-macosx_10_7_x86_64.whl

Test pour vérifier que TensorFlow fonctionne

Sortir du dossier tensorflow :
$ cd

$ source activate py36 (si besoin)
$ python
Python 3.6.9 |Anaconda, Inc.| (default, Jul 30 2019, 13:42:17) 
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name=‘a')
>>> b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name=‘b')
>>> c = tf.matmul(a, b)
>>> with tf.Session() as sess:
        print (sess.run(c))
        aa = sess.run(a)
        bb = sess.run(b)
>>> print(aa.dot(bb))

Et voilà!

VST et DLL

Bonsoir à tous,

Un article sur les plugins VST (traitement audio) qui font appel à une librairie externe sous windows (une « DLL »).

Un plugin VST est un petit logiciel qui s’intègre à un éditeur audio comme « audacity » ou à un séquenceur (j’utilise « Reaper » qui est gratuit).

Je suis en train de faire un plugin VST pour faire du débruitage (off-line) dans audacity.

Mon plugin VST en soi est assez classique. On sélectionne une zone avec du bruit seul et on prend une « empreinte » du bruit dans un premier temps. Ensuite on sélectionne la zone à débruiter avec les réglages qui vont bien. Il existe déjà un plugin de ce type dans audacity et il marche plutôt pas mal. Je veux en faire un « home-made ». J’expliquerai peut-être dans un prochain article comment il fonctionne.

Enfin, je travaille sur ce plugin VST. Comme dans beaucoup de traitements audio, ce plugin utilise la transformée de Fourier discrète. Pour cela, j’ai d’abord utilisé la librairie « FFTW » (« Fastest Fourier Transform in the West »). C’est une librairie « libre de droits » (licence GPL). Elle se présente sous forme d’un fichier DLL sous windows. Sans entrer dans les détails, un programme qui utilise FFTW dans son code doit avoir sous la main cette DLL au moment de l’exécution. Et donc, il doit savoir où la trouver!

Cependant, avec audacity comme avec Reaper, mon plugin VST (qui se présente lui aussi sous forme d’une DLL) n’est pas reconnu. En investigant un peu, je me suis rendu compte que le coupable est la fameuse DLL de FFTW. Je ai mis les deux DLL (la DLL qui est mon plugin et la DLL de FFTW) dans le répertoire des plugins VST. Et ça, ça ne marche pas.

Depuis, j’ai passé mon chemin et j’utilise la fft de ALGLIB (ALGLIB FFT). Là pas de DLL externe. Le code C++ est compilé directement en même temps que le plugin. Miracle, ça marche sans problème. ALGLIB est aussi une librairie « libre » pour toute utilisation non commerciale (licence GPL).

A posteriori, je me dis qu’en mettant la DLL externe utilisée par le plugin VST dans le répertoire où est exécuté le programme (là où se trouve audacity.exe par exemple), ça aurait pu le faire. Mais bof.

P.S:

Voici deux liens expliquant comment intégrer une DLL à un code C/C++ avec Visual Studio et  les emplacements où windows va chercher les librairies et dans quel ordre.

How do I use a third-party DLL file in Visual Studio C++?

delay load DLL error (module not found)

Bon, dans un prochain post, je vous expliquerai comment j’ai fait ce plug-in.

Bonne nuit!