Recent posts

Aggregation of blog posts published on xavierdupre.fr


2023-05-30 - Sphinx

Sphinx constantly changed its API. I played a lot with it more than five years ago to automate many things and it now fails because I started to use the internal API...

source

2023-04-05 - Lecture

HTML - * `Using Bitwise Operations on Bitfields as a Primitive SIMD `_ * `Accelerating Feedforward Computation via Parallel Nonlinear Equation Solving `_ * `Memory part 2: CPU caches `_ * `Optimal Transport for Counterfactual Estimation: A Method for Causal Inference `_

2023-04-04 - Année 2023, séance 5

HTML - **Partie I : quelques rappels sur scikit-learn** * API scikit-learn * `NFM `_ * vieillissement des modèles * `analyse de survie `_ * séries temporelles * `cartes `_ * sélection de variables * interprétation * machine learning éthique **Partie II : ingénierie logicielle** * notion d'ingéniérie logicielle (git, github, pull request, review, intégration continue) * partager son travail, package, documentation * mise en production docker, onnx **Partie III : transfer learning** * `Zoo de modèles `_ * `torch `_ ou `tensorflow `_ * `ChatGPT `_ * `GAN `_ Carte de connaissances +=====================+================================+=====================+==================================+============================+ | langage | variables/test/boucles | liste/dictionnaires | fonctions | itérateurs | +=====================+================================+=====================+==================================+============================+ | programmation objet | classes | constructeur | opérateurs | héritages | | IO | lecture / écriture de fichiers | json | pickle | stream | | interface graphique | boutons | souris | événements | réactivité | | web | html | api rest | synchronisation | web scrapping | | DataFrame | lecture/écriture | groupby/merge | graphes | streaming | | scikit-learn | fit/predict | pipeline | modèle customisé | séries temporelles | | machine learning | réduction de dimension | clustering | régressor / classifieur | ranking / NMF / … | | deep learning | réseaux de neurones | transfert learning | RNN / modèle de langages | torch | | génie logiciel | test unitaire | git / pull request | intégration continue | style (pep8, black, ruff) | | mise en production | docker / onnx | benchmark | pipeline de données | mise à jour | | algorithmes | dichotomie | tri | plus court chemin dans un graphe | TSP | | partage | création d'un package python | documentation | design | support | | performance | C/C++ | cmake | parallélisation | GPU | | expérience | 1000 lignes de code | 5000 lignes de code | 50000 mille lignes de code | Impossible de compter | +=====================+================================+=====================+==================================+============================+

2023-03-07 - Année 2023, séance 4

HTML - Séance découpée en trois parties. **Partie I : exercices** * Retour sur les exercices en fin de session, :ref:`seance6marsrst` * Comment travailler avec un grand jeu de données qui ne tient pas en mémoire **Partie II : modèle customisé** Les données nécessite un prétraitement spécifiques impossible à trouver dans une librairie. Il faut le coder soi-même de sorte qu'il puisse s'insérer dans un pipeline ? **Partie III : ingénierie logicielle** * enregister, restorer un modèle de machine learning * notion d'ingéniérie logicielle (git, github, pull request, review, intégration continue) * partager son travail, package, documentation * mise en production docker, onnx

2023-03-06 - Année 2023, séance 3

HTML - Séance découpée en trois parties. **Partie I : exercices** Retour sur les exercices en fin de session : :ref:`seance6fevrierrst`. *fonction, notion de coût* * fonctions : def .. runpython:: :showcode: :toggle: out import cProfile nombres = [9, 7, 5, 4, 6, 7, 3, 1, 7, 8] def moyenne(ens): return sum(ens) / len(ens) def ecarttype(ens): var = [(n - moyenne(ens)) ** 2 for n in ens] return (sum(var) / len(var)) ** 0.5 print(moyenne(nombres)) print(ecarttype(nombres)) with cProfile.Profile() as pr: for n in range(100000): ecarttype(nombres) pr.print_stats() * coût d'un algorithme * notation ``with`` **Partie II : scikit-learn** Quelques rappels : * créer son premier modèle, type de problème résolus, famille de modèles, transformer, pipeline * Régression, classification, clustering, réduction de dimensions Autres modèles : * Modèles moins classiques : ranking, (voir `Ranking et search engine `_), système de recommandations, `factorisation de matrices `_ * valeurs manquantes * Méthodes ensembliste ou à base de gradient **Partie III : prétraitement** * variables numériques, faut-il normaliser ou non ? * que faire des variables textuelles ?, catégories, texte libre * `dirty-cat `_ * deep learning, embeddings, transfer learning * `pytorch `_ **Exercices**

2023-02-17 - Plan séance 5

HTML - Voici le plan prévu pour la cinquième séance du cours de machine learning pour l'économie et la finance. Comment manipuler de gros jeux de données ? **séries temporelles** * prédictions * décomposition, `Holt Winters `_ * détection des changements de régime * `Filtre de Kalman `_ * `SSA `_ * packages `prophet `_, `statsmodels `_, `ruptures `_, `tslearn `_ **anomalie** * densité * `GAN `_ * prédictions aberrantes * astuce : comment s'assurer que la base d'apprentissage et de test sont semblables ? **éthique** * `interprétabilité `_ * `machine learning éthique `_, `Latanya Sweeney: How technology impacts humans and dictates our civic future `_ **mise en production** * Mise en production : déploiement de modèles de machine learning * algorithmes, plus court chemin dans un graphe, recherche dichotomique ? * carte avec `geopandas `_ Les projets sont à rendre pour le 30 juin 2023, à faire par groupe de deux ou trois. **projet 1** 26 septembre 2019 : `Incendie de l'usine Lubrizol à Rouen `_ Données : `Demandes de valeurs foncières `_, voir aussi `DVF `_. Il faut répondre à une des questions suivantes : * Quel est l'impact de l'accident sur le foncier autour de l'indicent ? * Les prix de l'immobilier ont-ils augmenté dans les villes gares TGV après le confinement ? **projet 2** Données `Résultats du contrôle sanitaire de l'eau distribuée commune par commune `_, voir aussi `Ce que l'on sait des résidus de pesticides dans l'eau du robinet de milliers de communes (et des incertitudes sur leur toxicité) `_, `Achats de pesticides par code postal `_, `Prix de l'eau par commune `_ Il faut répondre à une des questions suivantes : * Sur un département donné, peut-on prédire le prix de l'eau ?

2023-02-13 - Un livre d'exercice sur le machine learning

HTML - `Exercises in Machine Learning `_

2023-02-10 - Plan séance 4

HTML - Voici le plan prévu pour la quatrième séance du cours de machine learning pour l'économie et la finance. **théorie** * `réseau de neurones `_ * gradient stochastique * méthodes ensemblistes, gradient boosting * quand faut-il normaliser les données ? * deep learning * du deep learning à ChatGPT * transfert learning **développement** * `pytorch `_ * manipulation de gros fichiers exemple `Demandes de valeurs foncières `_ * créer son propre package et documentation * git * tests unitaires * série temporelles * analyse de survie **suite** * Mise en production : déploiement de modèles de machine learning * machine learning éthique * algorithmes, plus court chemin dans un graphe, recherche dichotomique ? * carte avec `geopandas `_

2023-02-06 - Année 2023, séance 2

HTML - Séance découpée en quatre parties. **Partie I : exercice** Un base de données contient une variable catégorielle. Malheureusement, elle est renseignée de façon imparfaite car elle contient des erreurs de syntaxe. Exemple : :: ['comptabilité', 'datascience', 'data science', 'pilote', 'pilotage', 'auteur', 'autrice', ...] Que peut-on faire pour nettoyer cette variable ? **Partie II : pandas, graphes, gros fichiers, cartes** * :epkg:`pandas` : tables de données * enregister et restaurer des dataframe avec :epkg:`pickle` * lecture d'un gros fichier `Demandes de valeurs foncières `_ * :epkg:`geopandas` *fonction, notion de coût* Les fonctions * fonctions : def .. runpython:: :showcode: :toggle: out import cProfile nombres = [9, 7, 5, 4, 6, 7, 3, 1, 7, 8] def moyenne(ens): return sum(ens) / len(ens) def ecarttype(ens): var = [(n - moyenne(ens)) ** 2 for n in ens] return (sum(var) / len(var)) ** 0.5 print(moyenne(nombres)) print(ecarttype(nombres)) with cProfile.Profile() as pr: for n in range(100000): ecarttype(nombres) pr.print_stats() * coût d'un algorithme * notation ``with`` **Partie III : premiers pas avec scikit-learn** Pourquoi :epkg:`scikit-learn` ? * créer son premier modèle * type de problème résolus * famille de modèles * transformer * pipeline

2023-02-03 - Plan séance 3

HTML - Voici le plan prévu pour la troisième séance du cours de machine learning pour l'économie et la finance. **théorie** * recommandations `NMF `_ * `factorisation de matrices `_ * ranking * traitement des valeurs manquantes * `TSNE `_ **exercice** On veut construire un modèle qui prédit le loyer moyen en fonction de caractéristiques moyennes, données : `Résultats nationaux des observatoires locaux des loyers `_ Il faut construire un pipeline simple avec au moins une classe `ColumnTransformer `_. **développement** * créer son propre transformer ou prédicteur * manipulation de gros fichiers exemple `Demandes de valeurs foncières `_ * créer son propre package et documentation * git * tests unitaires **autres packages** * `category_encoders `_ * `dirty_cat `_ * `xgboost `_ * `lightgbm `_ * `catboost `_ * cheatcheet numpy, or `awesome machine learning `_, `Track Awesome Machine Learning Updates Daily `_ * `statsmodels `_ **suite** * notions de séries temporelles ? prédiction, analyse de survie. * Quelques mots de deep learning : encoding, transfer learning * Mise en production : déploiement de modèles de machine learning * machine learning éthique * algorithmes, plus court chemin dans un graphe, recherche dichotomique ?

2023-01-27 - Plan séance 2

HTML - Voici le plan prévu pour la seconde séance du cours de machine learning pour l'économie et la finance. **exercices** * exercice autour du `pivot de gauss `_ * `Evoluation d’une population `_ **résumé** * :epkg:`numpy` * :epkg:`pandas` **exemples de problèmes rencontrés** * économie, sociologie : études statistiques, analyse de biais, prévision * finance : trading, analyse de nouvelles, vitesse de trading, scoring * actuariat : prédiction des sinistres * stratégie : emplacement d'un entrepôt **machine learning** * prétraitement : transformer toutes les variables, quelles qu'elles soient, en variables numériques * optimisation d'un modèle Données supervisées, non supervisées... **scikit-learn** * transformer / prédicteur * régression, classification, clustering, ranking, réduction de dimension, recommandation * hyperparamètres, grille de recherche * validation croisée * notion de pipeline * sérialisation **pour aller plus loin** * créer son propre transformer ou prédicteur * `factorisation de matrices `_ * `TSNE `_ **autres packages** * `category_encoders `_ * `dirty_cat `_ * `xgboost `_ * `lightgbm `_ * `catboost `_ * cheatcheet numpy, or `awesome machine learning `_, `Track Awesome Machine Learning Updates Daily `_ * `statsmodels `_ **exercice** On veut construire un modèle qui prédit le loyer moyen en fonction de caractéristiques moyennes, données : `Résultats nationaux des observatoires locaux des loyers `_ Il faut construire un pipeline simple avec au moins une classe `ColumnTransformer `_.

2023-01-20 - Plan séance 1

HTML - Voici le plan prévu pour la première séance du cours de machine learning pour l'économie et la finance. **Séance 1** * `Python `_, `Anaconda `_, :epkg:`pandas`, :epkg:`numpy`, :epkg:`jupyter`, :epkg:`matplotlib`, expressions régulières, fichiers * Ressource `www.xavierdupre.fr `_ * `Source de données `_ * :epkg:`scikit-learn` : API * :ref:`l-regclass`, multi-classification * Courbe ROC, AUC, voir :ref:`winescolorrocrst`, `Courbe ROC `_, `graphe erreur ROC `_ * `Ridge, Lasso `_ * Ranking, Clustering Une discussion recopiée depuis un article sur Linkedin à propos de `ChatGPT `_ qui montre que c'est un outil efficace mais seulement un outil. * **JP :** Hey Chat GPT : La mère de Jean a 4 enfants. 3 des enfants s'appellent Pédro, Caroline et Robert. Quel est le prénom du quatrième ? * **ChatGPT :** "Il n'est pas possible de déterminer le prénom du quatrième enfant de la mère de Jean uniquement avec l'information donnée." * **JP :** si c’est possible. c’est dans l'énoncé * **ChatGPT :** "Il n'y a pas assez d'informations dans l'énoncé pour déterminer le prénom du quatrième enfant. Il est seulement mentionné que les trois premiers enfants s'appellent Pedro, Caroline et Robert." * **JP :** pourtant il est dit « La mère de Jean» c’est la mère de qui ? * **ChatGPT :** "Vous avez raison, dans l'énoncé il est mentionné "La mère de Jean", donc Jean est un individu dont on ne sait rien, à part qu'il a une mère et qu'elle a 4 enfants." Cela dit, il est possible que son utilisation change un peu la donne quant aux moteurs de recherches si ce n'est que son coût est sans doute encore prohibitif pour un usage si massif. `Training language models to follow instructions with human feedback `_ Un article intéressant sur l'inflation : `De nouveaux indicateurs de perception de l’inflation en France issus des médias `_. A quoi ressemble le bruit d'une foule ? Parmi les sujets abordés cette année : * expressions régulières, fichiers, calcul matriciel, dataframe, graphes ? * :epkg:`scikit-learn` : concepts de transformer et prédicteur, revue des modèles les plus couramment utilisés, présentation de la validation croisée, et grille de recherche, notion de pipe-line en machine learning * valeurs manquantes, problème de classification avec des classes sous représentées, * ingénierie logicielle ? tests unitaires, git, pull request, notebook, librairies, réalisation d'un package pour partager son code, écrire une documentation. Cette partie est utile si on travaille à plusieurs sur le même code. * notions de séries temporelles ? prédiction, analyse de survie. * Grands jeux de données * Quelques mots de deep learning : encoding, transfer learning * Mise en production : déploiement de modèles de machine learning * machine learning éthique * algorithmes, plus court chemin dans un graphe, recherche dichotomique ? La médecine de demain : * `Intelligence artificielle et médecine, par le Pr. Jean-Emmanuel Bibault `_, aide à l'interprétation des images, à la localisation des tumeurs, assistance chirurgicale * enregistrement des données en temps réel, détection de symptômes sur des données qu'on n'avait pas avant * ... Ethique * `IS THERE DISCRIMINATION AGAINST THE POOR? `_ * `Y-A-T-IL UNE DISCRIMINATION CONTRE LES PAUVRES ? `_ * `ASSURANCES, VERS UNE UTILISATION ÉTHIQUE DE L’INTELLIGENCE ARTIFICIELLE `_

2023-01-11 - Forward, forward

HTML - Un article intéressant : * `The Forward-Forward Algorithm: Some Preliminary Investigations `_ * `Noise-contrastive estimation: A new estimation principle for unnormalized statistical models `_ * `Training language models to follow instructions with human feedback `_ * `Attention Is All You Need `_ * `Optimal Transport for Counterfactual Estimation: A Method for Causal Inference `_ Et d'autres papiers : * `A Succinct Summary of Reinforcement Learning `_ * `Top ML Papers of the Week (Jan 1-8) `_ * `sparseml `_ * `solo-learn `_ * `deepchecks `_

2023-01-10 - Année 2023, séance 1

HTML - Séance découpée en quatre parties. **Partie I : installation et premier pas** Installation * Choix d'une version : 3.8, 3.9, 3.10, (3.11 est sortie trop récemment) * Solution simple : `Anaconda `_ * `Python `_ Système de Packages * `Anaconda repo `_ * `PyPI `_ Les packages à avoir pour faire de la datascience * :epkg:`numpy`, :epkg:`scipy` : calcul matriciel * :epkg:`pandas` : tables de données * :epkg:`matplotlib` : calcul matriciel * :epkg:`jupyter` : notebooks ou `spyder `_ * :epkg:`scikit-learn` : machine learning * :epkg:`statsmodels` : série temporelle Installer un package * avec `conda `_ * avec `pip `_ Package pure python ? * Les librairies de calculs incluent souvent du code C++. Qu'est-ce que cela implique ? Un peu plus sur les notebooks * `Notebook Jupyter `_ `Les premiers pas `_ * fonction ``print`` * variables : int, float, str, tuple, list, set, dict * boucle : for, while * tests : if, else (voir aussi `PEP 636 -- Structural Pattern Matching: Tutorial `_) Que fait le programme suivant ? .. runpython:: :showcode: :toggle: out res = [[1]] for i in range(1, 10): row = [1] for j in range(1, i): n = sum(res[-1][j-1: j+1]) row.append(n) row.append(1) res.append(row) import pprint pprint.pprint(res) Installation d'un package... Essayez avec `GDAL `_ avec `pip `_ ou `conda `_. **Partie II : fonction, notion de coût** Les fonctions * fonctions : def .. runpython:: :showcode: :toggle: out import cProfile nombres = [9, 7, 5, 4, 6, 7, 3, 1, 7, 8] def moyenne(ens): return sum(ens) / len(ens) def ecarttype(ens): var = [(n - moyenne(ens)) ** 2 for n in ens] return (sum(var) / len(var)) ** 0.5 print(moyenne(nombres)) print(ecarttype(nombres)) with cProfile.Profile() as pr: for n in range(100000): ecarttype(nombres) pr.print_stats() * coût d'un algorithme * notation ``with`` **Exercice :** calculer le nombre de caractères différents entre deux chaînes de caractères : * chaînes de même longueur ou, * chaînes de longueur différentes (voir `distance de Levenshtein `_ ou, * chaînes de longueur différentes donnant moins de poids à une confusion entre `mm` et `mn`. **Partie III : dictionnaires** Tout d'abord une source d'erreurs fréquentes : .. runpython:: :showcode: :toggle: out def bizarre(ensemble): # premier zero ensemble.append(0) for i in range(len(ensemble)): if ensemble[i] == 0: return i res = [1, 4, 5] print("bizarre=", bizarre(res)) print("res=", res) Dictionnaires * on ne peut plus s'en passer * dictionnaires : compter les éléments * `Python, constructions classiques `_ **Exercice :** compter les paires de lettres consécutives dans un texte. **Partie IV : dictionnaires** * fichiers * expressions régulières **Exercice pour la prochaine fois** * installer un package * mettre à jour un package * réfléchir au problème suivant Un base de données contient une variable catégorielle. Malheureusement, elle est renseignée de façon imparfaite car elle contient des erreurs de syntaxe. Exemple : :: ['comptabilité', 'datascience', 'data science', 'pilote', 'pilotage', 'auteur', 'autrice', ...] Que peut-on faire pour nettoyer cette variable ?

2023-01-08 - Année 2023, plan

HTML - #. **Premiers pas avec python :** quelques rappels du langage, installation d'un package, différences entre windows et linux, expressions régulières, fichiers. #. **Calcul matriciel et graphes :** tour d'horizon de :epkg:`numpy`, :epkg:`pandas` #. **Graphes :** les graphes en python, :epkg:`matplotlib`, :epkg:`bokeh`, réalisation d'une carte. #. **Tour d'horizon de scikit-learn :** concepts de transformer et prédicteur, revue des modèles les plus couramment utilisés, présentation de la validation croisée, et grille de recherche, notion de pipe-line en machine learning. #. **Ingénierie logicielle :** tests unitaires, git, pull request, notebook, librairies, réalisation d'un package pour partager son code, écrire une documentation. Cette partie est utile si on travaille à plusieurs sur le même code. #. **Notions de séries temporelles :** prédiction, analyse de survie. #. **Grands jeux de données :** comment travailler lorsque la mémoire ne peut contenir toutes les données à traiter ou que ce traitement est trop long. #. **Quelques mots de deep learning :** encoding, transfer learning #. **Mise en production :** déploiement de modèles de machine learning

2022-12-08 - Mathador

HTML - Un petit problème de chiffre, le `mathador `_ consiste à trouver un montant à partir de 5 nombres et 4 opérations. Example : composer 28 avec 17, 12, 3, 2, 1 et les opérations *, +, /, -. Il faut tout utiliser. C'est plus simple avec un programme, non ? J'ai fait ça très vite. Il y a sans doute mieux. :: # coding: utf-8 from itertools import permutations nombres = [17, 12, 3, 2, 1] ops = ['+', '-', '/', '*'] total = 28 solution = [] parentheses = [(i, j) for i in range(0, 3) for j in range(i + 1, 4)] # permutations sur les nombres for pn in permutations(nombres): # permutations sur les opérations for po in permutations(ops): exp = [] for d, o in zip(pn, po): exp.append(str(d)) exp.append(str(o)) exp.append(str(pn[-1])) # 0 parenthèse text = ''.join(exp) res = eval(text) if res == 28: print(res) solution.append(res) # 2 parenthèses for i, j in parentheses: exp[i * 2] = '(' + exp[i * 2] exp[j * 2] = exp[j * 2] + ')' text = ''.join(exp) try: res = eval(text) if res == 28: print(res, text) solution.append(res) except ZeroDivisionError: pass exp[i * 2] = exp[i * 2][1:] exp[j * 2] = exp[j * 2][:-1] # 4 parenthèses for a, b in parentheses: exp[a * 2] = '(' + exp[a * 2] exp[b * 2] = exp[b * 2] + ')' for c, d in parentheses: exp[c * 2] = '(' + exp[c * 2] exp[d * 2] = exp[d * 2] + ')' text = ''.join(exp) try: res = eval(text) if res == 28: print(res, text) solution.append(res) except ZeroDivisionError: pass exp[c * 2] = exp[c * 2][1:] exp[d * 2] = exp[d * 2][:-1] exp[a * 2] = exp[a * 2][1:] exp[b * 2] = exp[b * 2][:-1] # 6 parenthèses... Résultats : :: 28.0 (17-12/3+1)*2 28.0 (17-(12)/3+1)*2 28.0 ((17-12/3)+1)*2 28.0 (17-(12/3)+1)*2 28.0 (17-12/(3)+1)*2 28.0 ((17-12/3)+1)*2 28.0 ((17-12/3+1))*2 28.0 (17-(12/3)+1)*2 28.0 (17-12/(3+1))*2 28.0 (17-(12/3)+1)*2 28.0 (17-(12)/3+1)*2 28.0 (17-(12/3)+1)*2 28.0 (17-12/(3)+1)*2 28.0 (17-12/(3+1))*2 28.0 (17-12/(1+3))*2 28.0 (17-12/(1+3))*2 28.0 (17+3)*2-12/1 28.0 ((17+3))*2-12/1 28.0 ((17+3)*2)-12/1 28.0 ((17+3)*2-12)/1 28.0 ((17+3)*2)-12/1 28.0 ((17+3)*2-12)/1 28.0 (17+3)*2/1-12 28.0 ((17+3))*2/1-12 28.0 ((17+3)*2)/1-12 28.0 ((17+3)*2/1)-12 28.0 (17+3)*(2/1)-12 28.0 ((17+3)*2)/1-12 28.0 ((17+3)*2/1)-12 28.0 (17+3)*(2/1)-12 28.0 (17*(3+1)-12)/2 28.0 (17*(3+1)-12)/2 28.0 (17*(3+1)-12)/2 28.0 (17*(3+1)-12)/2 28.0 (17+3)/1*2-12 28.0 (17+3/1)*2-12 28.0 ((17+3))/1*2-12 28.0 ((17+3)/1)*2-12 28.0 ((17+3)/1*2)-12 28.0 (17+(3)/1)*2-12 28.0 ((17+3)/1)*2-12 28.0 ((17+3/1))*2-12 28.0 ((17+3/1)*2)-12 28.0 (17+(3/1))*2-12 28.0 ((17+3)/1*2)-12 28.0 ((17+3/1)*2)-12 28.0 (17+(3)/1)*2-12 28.0 (17+(3/1))*2-12 28.0 (17+1-12/3)*2 28.0 ((17+1)-12/3)*2 28.0 (17+(1)-12/3)*2 28.0 (17+1-(12)/3)*2 28.0 ((17+1)-12/3)*2 28.0 ((17+1-12/3))*2 28.0 (17+(1-12/3))*2 28.0 (17+1-(12/3))*2 28.0 (17+(1)-12/3)*2 28.0 (17+(1-12/3))*2 28.0 (17+1-(12)/3)*2 28.0 (17+1-(12/3))*2 28.0 (17*(1+3)-12)/2 28.0 (17*(1+3)-12)/2 28.0 (17*(1+3)-12)/2 28.0 (17*(1+3)-12)/2 28.0 (17/1+3)*2-12 28.0 ((17/1)+3)*2-12 28.0 (17/(1)+3)*2-12 28.0 ((17/1)+3)*2-12 28.0 ((17/1+3))*2-12 28.0 ((17/1+3)*2)-12 28.0 ((17/1+3)*2)-12 28.0 (17/(1)+3)*2-12 28.0 12*3+(1-17)/2 28.0 (12*3)+(1-17)/2 28.0 (12*3)+(1-17)/2 28.0 12*3+((1-17))/2 28.0 12/(1-3)+17*2 28.0 (12/(1-3))+17*2 28.0 (12/(1-3))+17*2 28.0 12/((1-3))+17*2 28.0 12/(1-3)+2*17 28.0 (12/(1-3))+2*17 28.0 (12/(1-3))+2*17 28.0 12/((1-3))+2*17 28.0 (3+17)*2-12/1 28.0 ((3+17))*2-12/1 28.0 ((3+17)*2)-12/1 28.0 ((3+17)*2-12)/1 28.0 ((3+17)*2)-12/1 28.0 ((3+17)*2-12)/1 28.0 (3+17)*2/1-12 28.0 ((3+17))*2/1-12 28.0 ((3+17)*2)/1-12 28.0 ((3+17)*2/1)-12 28.0 (3+17)*(2/1)-12 28.0 ((3+17)*2)/1-12 28.0 ((3+17)*2/1)-12 28.0 (3+17)*(2/1)-12 28.0 (3+17)/1*2-12 28.0 (3+17/1)*2-12 28.0 ((3+17))/1*2-12 28.0 ((3+17)/1)*2-12 28.0 ((3+17)/1*2)-12 28.0 (3+(17)/1)*2-12 28.0 ((3+17)/1)*2-12 28.0 ((3+17/1))*2-12 28.0 ((3+17/1)*2)-12 28.0 (3+(17/1))*2-12 28.0 ((3+17)/1*2)-12 28.0 ((3+17/1)*2)-12 28.0 (3+(17)/1)*2-12 28.0 (3+(17/1))*2-12 28.0 3*12+(1-17)/2 28.0 (3*12)+(1-17)/2 28.0 (3*12)+(1-17)/2 28.0 3*12+((1-17))/2 28.0 ((3+1)*17-12)/2 28.0 ((3+1)*17-12)/2 28.0 (3/1+17)*2-12 28.0 ((3/1)+17)*2-12 28.0 (3/(1)+17)*2-12 28.0 ((3/1)+17)*2-12 28.0 ((3/1+17))*2-12 28.0 ((3/1+17)*2)-12 28.0 ((3/1+17)*2)-12 28.0 (3/(1)+17)*2-12 28.0 2*(17+3)-12/1 28.0 (2*(17+3))-12/1 28.0 (2*(17+3)-12)/1 28.0 (2*(17+3)-12)/1 28.0 (2*(17+3))-12/1 28.0 (2*(17+3)-12)/1 28.0 2*((17+3))-12/1 28.0 (2*(17+3)-12)/1 28.0 2*(17+3)/1-12 28.0 2*(17+3/1)-12 28.0 (2*(17+3))/1-12 28.0 (2*(17+3)/1)-12 28.0 (2*(17+3)/1)-12 28.0 (2*(17+3/1))-12 28.0 (2*(17+3))/1-12 28.0 (2*(17+3)/1)-12 28.0 2*((17+3))/1-12 28.0 2*((17+3)/1)-12 28.0 2*(17+(3)/1)-12 28.0 (2*(17+3)/1)-12 28.0 (2*(17+3/1))-12 28.0 2*((17+3)/1)-12 28.0 2*((17+3/1))-12 28.0 2*(17+(3/1))-12 28.0 2*(17+(3)/1)-12 28.0 2*(17+(3/1))-12 28.0 2*(17/1+3)-12 28.0 (2*(17/1+3))-12 28.0 2*((17/1)+3)-12 28.0 2*(17/(1)+3)-12 28.0 (2*(17/1+3))-12 28.0 2*((17/1)+3)-12 28.0 2*((17/1+3))-12 28.0 2*(17/(1)+3)-12 28.0 2*(3+17)-12/1 28.0 (2*(3+17))-12/1 28.0 (2*(3+17)-12)/1 28.0 (2*(3+17)-12)/1 28.0 (2*(3+17))-12/1 28.0 (2*(3+17)-12)/1 28.0 2*((3+17))-12/1 28.0 (2*(3+17)-12)/1 28.0 2*(3+17)/1-12 28.0 2*(3+17/1)-12 28.0 (2*(3+17))/1-12 28.0 (2*(3+17)/1)-12 28.0 (2*(3+17)/1)-12 28.0 (2*(3+17/1))-12 28.0 (2*(3+17))/1-12 28.0 (2*(3+17)/1)-12 28.0 2*((3+17))/1-12 28.0 2*((3+17)/1)-12 28.0 2*(3+(17)/1)-12 28.0 (2*(3+17)/1)-12 28.0 (2*(3+17/1))-12 28.0 2*((3+17)/1)-12 28.0 2*((3+17/1))-12 28.0 2*(3+(17/1))-12 28.0 2*(3+(17)/1)-12 28.0 2*(3+(17/1))-12 28.0 2*(3/1+17)-12 28.0 (2*(3/1+17))-12 28.0 2*((3/1)+17)-12 28.0 2*(3/(1)+17)-12 28.0 (2*(3/1+17))-12 28.0 2*((3/1)+17)-12 28.0 2*((3/1+17))-12 28.0 2*(3/(1)+17)-12 28.0 2/1*(17+3)-12 28.0 (2/1)*(17+3)-12 28.0 (2/1*(17+3))-12 28.0 (2/1)*(17+3)-12 28.0 (2/1*(17+3))-12 28.0 2/1*((17+3))-12 28.0 2/1*(3+17)-12 28.0 (2/1)*(3+17)-12 28.0 (2/1*(3+17))-12 28.0 (2/1)*(3+17)-12 28.0 (2/1*(3+17))-12 28.0 2/1*((3+17))-12 28.0 (1+17-12/3)*2 28.0 ((1+17)-12/3)*2 28.0 (1+(17)-12/3)*2 28.0 (1+17-(12)/3)*2 28.0 ((1+17)-12/3)*2 28.0 ((1+17-12/3))*2 28.0 (1+(17-12/3))*2 28.0 (1+17-(12/3))*2 28.0 (1+(17)-12/3)*2 28.0 (1+(17-12/3))*2 28.0 (1+17-(12)/3)*2 28.0 (1+17-(12/3))*2 28.0 (1-17)/2+12*3 28.0 ((1-17))/2+12*3 28.0 ((1-17)/2)+12*3 28.0 ((1-17)/2)+12*3 28.0 (1-17)/2+3*12 28.0 ((1-17))/2+3*12 28.0 ((1-17)/2)+3*12 28.0 ((1-17)/2)+3*12 28.0 (1-12/3+17)*2 28.0 (1-(12)/3+17)*2 28.0 ((1-12/3)+17)*2 28.0 (1-(12/3)+17)*2 28.0 (1-12/(3)+17)*2 28.0 ((1-12/3)+17)*2 28.0 ((1-12/3+17))*2 28.0 (1-(12/3)+17)*2 28.0 (1-(12/3)+17)*2 28.0 (1-(12)/3+17)*2 28.0 (1-(12/3)+17)*2 28.0 (1-12/(3)+17)*2 28.0 ((1+3)*17-12)/2 28.0 ((1+3)*17-12)/2

2022-12-07 - Utilisation de cartopy sous Windows (sous WSL)

HTML - Installer `cartopy `_ est une vraie gageure. J'ai utilisé la version disponible sur `Archived: Unofficial Windows Binaries for Python Extension Packages `_ mais le site n'est plus maintenu et je veux bien comprendre que c'est un travail ingrat qui requiert une attention permenante (voir `What to do when Gohlke's python wheel service shuts down? `_). La seule option viable sous Windows est d'utiliser la distribution Anaconda sous Windows. L'autre option est d'installer une distribution Ubuntu sous `Windows Subsystem for Linux? `_ ou *WSL* en abrégé. Ca marche très bien. Il suffit de démarrer le serveur de notebook sous WSL avec une instruction comme celle-ci `jupyter-notebook --NotebookApp.token= --NotebookApp.password=` puis d'y accéder via son navigateur. Pour coder, il suffit d'utiliser `Visual Studio Code _` avec l'extension `Remote Development `_. La version python 3.10.6 est installée par défaut sur le noyau `Ubuntu 22.04.1 _`.

2022-12-02 - Build onnxruntime on WSL (Windows Linux Subsystem)

HTML - I tried to build :epkg:`onnxruntime-training` for GPU on :epkg:`WSL` (Windows Linux Subsystem). I took the distribution `Ubuntu 22.04`. Paths should be updated according to your installation. **some useful commands once installed** :: nvidia-smi nsys Let's assume WSL is installed, otherwise, here are some useful commands. :: # see all local distributions wsl -s -l # see available distributions online wsl --list --online # install one distribution or download it wsl --install -d Ubuntu-22.04 The CUDA driver must be installed as well. it can be downloaded from `NVIDIA Driver Downloads `_. Make sure you are using the one from your graphics card. Installation of required packages. :: sudo apt-get update sudo apt-get upgrade -y sudo apt autoremove -y sudo apt-get install -y cmake zlib1g-dev libssl-dev python3-dev libhwloc-dev libevent-dev libcurl4-openssl-dev libopenmpi-dev clang unzip Let's install :epkg:`gcc`: :: sudo apt-get update sudo apt-get upgrade -y sudo apt autoremove -y sudo apt install -y libcurl4 ca-certificates sudo apt-get install -y gcc g++ gcc --version Installation of `ninja `_: :: wget https://github.com/ninja-build/ninja/releases/download/v1.11.1/ninja-linux.zip unzip ninja-linux.zip sudo cp ./ninja /usr/local/bin/ sudo chmod a+x /usr/local/bin/ninja Installation of :epkg:`cmake`. :: mkdir install cd install curl -OL https://github.com/Kitware/CMake/releases/download/v3.25.1/cmake-3.25.1.tar.gz tar -zxvf cmake-3.25.1.tar.gz cd cmake-3.25.1 ./bootstrap --system-curl make sudo make install export PATH=~/install/cmake-3.25.1/bin/:$PATH cmake --version Installation of CUDA (choose a compatible version with :epkg:`pytorch`, 11.8 for example). See `CUDA on WSL User Guide `_ :: export CUDA_VERSION=12.0 export CUDA_VERSION_=12-0 wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600 wget https://developer.download.nvidia.com/compute/cuda/${CUDA_VERSION}.0/local_installers/cuda-repo-wsl-ubuntu-${CUDA_VERSION_}-local_${CUDA_VERSION}.0-1_amd64.deb sudo dpkg -i cuda-repo-wsl-ubuntu-${CUDA_VERSION_}-local_${CUDA_VERSION}.0-1_amd64.deb sudo cp /var/cuda-repo-wsl-ubuntu-12-0-local/cuda-2E27EA96-keyring.gpg /usr/share/keyrings/ sudo apt-get update sudo apt-get -y install cuda Now you may run `nvidia-smi -L` to list the available GPUs. Installation of :epkg:`cudnn` (after it is downloaded): :: sudo dpkg -i cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb sudo cp /var/cudnn-local-repo-ubuntu2204-8.7.0.84/cudnn-local-BF23AD8A-keyring.gpg /usr/share/keyrings/ sudo apt-get update sudo apt-get install libcudnn8 libcudnn8-dev Installation of :epkg:`nccl` See `Install NCCL `_. :: sudo dpkg -i nccl-local-repo-ubuntu2204-2.15.5-cuda11.8_1.0-1_amd64.deb sudo cp /var/nccl-local-repo-ubuntu2204-2.15.5-cuda11.8/nccl-local-1F5D0FB9-keyring.gpg /usr/share/keyrings/ sudo apt update sudo apt install libnccl2 libnccl-dev Installation of pip and update python packages: :: sudo apt-get install -y python3-pybind11 libpython3.10-dev wget https://bootstrap.pypa.io/get-pip.py sudo python3 get-pip.py sudo python3 -m pip install --upgrade numpy jupyter pandas statsmodels scipy scikit-learn pybind11 cython flatbuffers mpi4py notebook nbconvert flatbuffers pylint autopep8 sphinx sphinx-gallery cffi black py-spy fire pytest Installation of :epkg:`pytorch` of it is available for CUDA 11.8: :: python3 -m pip install torch torchvision torchaudio Otherwise, it has to be built from sources: :: wget https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh bash Anaconda3-2022.10-Linux-x86_64.sh conda create -p ~/install/acond10 python=3.10 conda activate ~/install/acond10 conda install -y astunparse numpy ninja pyyaml setuptools cmake cffi typing_extensions future six requests dataclasses conda install -y mkl mkl-include conda install -c pytorch magma-cuda118 mkdir ~/github cd ~/github git clone --recursive https://github.com/pytorch/pytorch cd pytorch # python tools/amd_build/build_amd.py export CMAKE_PREFIX_PATH=${CONDA_PREFIX:-"$(dirname $(which conda))/../"} export CUDA_VERSION=11.8 export CUDACXX=/usr/local/cuda-${CUDA_VERSION}/bin/nvcc export USE_ITT=0 export USE_KINETO=0 export BUILD_TEST=0 export USE_MPI=0 export BUILD_CAFFE2=0 export BUILD_CAFFE2_OPS=0 export USE_DISTRIBUTED=0 export MAX_JOBS=1 python setup.py build Then to check CUDA is available: :: import torch print(torch.cuda.is_available()) Build :epkg:`onnxruntime-training` before :epkg:`onnx` to build :epkg:`protobuf` as well. :: alias python=python3 export CUDA_VERSION=11.8 export CUDACXX=/usr/local/cuda-${CUDA_VERSION}/bin/nvcc export CMAKE_CUDA_COMPILER=/usr/local/cuda-${CUDA_VERSION}/bin/nvcc python3 ./tools/ci_build/build.py --skip_tests --build_dir ./build/linux_gpu --config Release --use_mpi true --enable_training --enable_training_torch_interop --use_cuda --cuda_version=${CUDA_VERSION} --cuda_home /usr/local/cuda-${CUDA_VERSION}/ --cudnn_home /usr/local/cuda-${CUDA_VERSION}/ --build_wheel --parallel Option ``--parallel 1`` can be used to fix the parallelism while building onnxruntime. Option `--use_mpi false` can be replaced by `--mpi_home /usr/local/lib/openmpi`. Another option is to use a docker: `Running Existing GPU Accelerated Containers on WSL 2 `_. Then onnx built inplace: :: git clone https://github.com/onnx/onnx.git cd onnx python setup.py build python setup.py build_ext --inplace Some useful commands: :: export PYTHONPATH=~/github/onnx:~/github/onnxruntime/build/linux_gpu/Release/Release export PYTHONPATH=$PYTHONPATH:~/github/onnxcustom:~/github/mlprodict

2022-11-15 - Don't use id(node)

HTML - I was expecting the following code to be produce unique keys. But it seems python objects for the nodes are created one the fly and destroyed in the same loop. Then `id(node)` are not unique. :: for node in onnx_model.graph.node: key = id(node) It is also not sure that the same loop would produce the same results if run a second time later in the code.

2022-10-01 - Un algorithme d'inspiration quantique

HTML - Une petite introduction sur l'informatique quantique. `A PROPOS D’INFORMATIQUE QUANTIQUE `_ Qui m'a amené à l'article suivant. `A quantum-inspired classical algorithm for recommendation systems `_

2022-09-14 - A lire

HTML - * `INTERPRÉTABILITÉ ET EXPLICABILITÉ (FORMALISÉ) DES MODÈLES PRÉDICTIFS `_ * `A Tutorial on Thompson Sampling `_ * `Meta-Learning Sparse Compression Networks `_

2022-09-07 - Introduction à la programmation (sketch)

HTML - Xavier Dupré - *http://www.xavierdupre.fr* **Présentation** * Avant l'ENSAE, programmation en classes préparatoires, `Informatique en CPGE `_ * concepts de base, tests, boucles, fonctions * calcul matriciel * notion de quelques algorithmes * langage python * Après l'ENSAE * réalisation de nombreux projets en python * plus grande culture algorithmique, graphes, algorithmes probabilistes * notion d'ingénierie logicielle * tests unitaires * notion de processeur, CPU, GPU * manipulations des données * Selon les options * langages plus bas niveau C/C++ * autres langages, javascript pour les sites web, SQL pour les bases de données, R pour les statistiques * SAS... * Python à l'ENSAE depuis 2005 * beaucoup de choses ont changé depuis, le langage python s'est largement répandu dans le monde professionnel * Mon boulot en 2005 * Mon boulot aujourd'hui * Même si la plupart des ingénieurs savent programmer, peu savent très bien programmer * La double compétence mathématiques / informatique est rare. * Python : le langage du machine learning * numpy, scikit-learn, pandas, matplotlib, jupyter * deep learning = python * automatisation, site web * Python : langage commun à toutes les universités de par le monde * facile, travail plus facile pour les professeurs également * interfaçage avec C++ **Assembler des algorithmes existants** * Trouver le plus court chemin d'une station de métro à une autre ? --> plus court chemin dans un graphe * Même question en tenant compte des temps de changement de ligne ? * Optimiser la tournée d'un camion poubelle **Automtiser** * Lancer tous les matins la récupération automatiques de données épidémiologiques pour construire un rapport de suivi **Machine learning aujourd'hui** * Apprentissage fait avec python * :epkg:`scikit-learn` * deep learning : :epkg:`pytorch` * Code faisant les calculs écrit en C/C++/asm * :epkg:`numpy`, :epkg:`scipy` * :epkg:`scikit-learn`, `_tree.pyx `_ * Déploiement (utilisation des modèles) sur d'autres langages encore (javascript, C#, go, ...) * Python très lent malgré et difficile à maintenir d'une version de python à une autre * Le Cloud `AWS `_, `Azure `_ ... * Démocratisation dans de nombreux pays * `Health Data Hub `_ * `data.gouv.fr `_ **Deep Learning** * Le deep learning envahit la vie quotidienne * santé (aide au diagnotisque) * sécurité (vidéo surveillance), * automatisation (voiture) * publicité, objets connectées * ... * Besoin de calculs, besoin de codes rapides * CPU, GPU, TPU * `NVIDIA A100 `_, innovation matérielle et logicielle * recherche très active dans ce domaine * Modèles de plus en plus gros * Il ne suffit plus d'être bon en maths, ou bon en informatique, il faut être les deux **Ingéniérie logicielle** * Le point faible des ingénieurs français * On commence l'informatique avant la prépa dans d'autres pays * Pas assez de pratique, un bon codeur a beaucoup codé. * **tests unitaires :** à connaître avant d'aller passer un entretien d'embauche * intégration continue * A chaque modification, on vérifie que les tests unitaires passent. * documentation * C'est fastidieux mais indispensable dans un monde open source. * Les projets qui ont réussi ont toujours une bonne documentation. * culture algorithmique * un produit matriciel n'est pas aussi simple qu'on le dit quand on veut qu'il soit rapide * :ref:`l-algoculture` * git * Un outil injustement méconnu des juristes. **Thèse...** * C/C++ : même si vous n'en avez pas besoin tous les jours, on code mieux en python quand on connaît un langage bas niveau car on comprend mieux tout ce que le langage nous cache * linux **Cours, premiere semestre** * TD : :ref:`l-td1a` * Evaluation, anciens examens :ref:`l-seances-notees-1A` **Cours, second semestre** * Projet : :ref:`l-projinfo1a` **Ressource, supports pour ce cours** * TD : `Python dans tous ses états `_ * Rappels : `Petit voyage au pays du machine learning `_ * Programmation : `Apprendre la programmation avec Python `_ * Un peu plus mathématique : `Les maths d’abord, la programmation ensuite `_ Et puis... * Les moteurs de recherche : `python + message d'erreur`, `cheatsheet` * `Questions tagged [python] `_ * `Compétition de code par Google `_ * `Compétition de code en français ou presque `_ * `Projet Euler `_ **A la fin de l'année, vous devriez pouvoir...** * Imaginer une stratégie automatique au 2048. * Simuler une épidémie, des régimes de retraites * Supprimer les pesticides en programmant des drones pour couper les mauvaises herbes ou couper les feuilles infectées par le mildiou * Lutter contre les îlots de chaleur dans les villes en verdissant les toits avec un mélange de plantes en fonction de la disposition du toit (`Singapour : des gratte-ciels anti-pollution `_) * Devenir le prochain `covidtracker `_ * Calculer l'exposition d'une économie à un certain type de produit... `PSA : l'usine de Rennes à l’arrêt par manque de semi-conducteurs `_ `Panne Orange : quelles conséquences ? `_, `Xavier Jaravel, meilleur jeune économiste 2021 pour ses travaux sur l'innovation et les inégalités `_, Tout est sur `GitHub `_. **Culture algorithme et informatique** Connaissez-vous ? * Debian ? * git ? * github ? * les exceptions ? * les expressions régulières ? * json ? * les graphes ? * une table de hashage ? * Comment résoudre un sudoku avec un programme ? * Un algorithme de streaming ? * Le problème du postier chinois ? * Un problème d'appariement ? * Un problème NP-complet ? * la librairie openmp ? * Un cache ? * un float, un double ? * un test unitaire ? * ADA ? * John Von Neumann ? * Guido van Rossum ? * INRIA ? Programme : :ref:`l-feuille-de-route-2022-1A` **Notions à connaître** Algorithmes, structure de données * Dictionnaires * Tri bulle, tri fusion * Recherche dichotomique * Graphe, prédécesseur, successeur, composante connexe dans un graphe * Plus court chemin dans un graphe, distance d'édition * Plus court chemin passant par tous les points d'un graphe Techniques * expression régulière * profiling * JSON, sérialisation avec pickle * numpy, pandas, matplotlib * tests unitaires

2022-07-17 - Quelques articles intéressants

HTML - Deep Learning * `Training Deep Networks without Learning Rates Through Coin Betting `_ * `Model Comparison and Calibration Assessment: User Guide for Consistent Scoring Functions in Machine Learning and Actuarial Practice `_ * `On Embeddings for Numerical Features in Tabular Deep Learning `, `TABULAR DATA MODELING VIA CONTEXTUAL EMBEDDINGS `_ * `MLGO: a Machine Learning Guided Compiler Optimizations Framework `_ * `Embedding Recycling for Language Models `_ * `Language Modelling with Pixels `_ * `XLS-R: Self-supervised Cross-lingual Speech Representation Learning at Scale `_ * `Emerging Cross-lingual Structure in Pretrained Language Models `_ * `Word Translation Without Parallel Data `_ * `Very Deep Convolutional Networks for Text Classification `_ * `XTREME-S: Evaluating Cross-lingual Speech Representations `_ * `DeepSpeed Compression: A composable library for extreme compression and zero-cost quantization `_ * `Towards Robust Deep Learning using Entropic Losses `_ * `Few-shot Learning with Retrieval Augmented Language Models `_ * `Multi-instrument Music Synthesis with Spectrogram Diffusion `_ Machine Learning * `On the consistency of supervised learning with missing values `_ * `Why do tree-based models still outperform deep learning on tabular data? `_ * `Evaluating machine learning models and their diagnostic value `_ Ecologie * `Measuring the Carbon Intensity of AI in Cloud Instances `_ Un site * `paperwithcode `_ Librairies * `TorchArrow `_ Un benchmark * `MIXED PRECISION TRAINING IN PRACTICE `_ Autres articles * `On the Principles of Parsimony and Self-Consistency for the Emergence of Intelligence `_ * `Shift-Curvature, SGD, and Generalization `_

2022-06-30 - Un module python pour avoir un clone d'Excel dans un notebook

HTML - Voir `bamboolib `_.

2022-06-29 - Array API

HTML - `Python array API `_ `Path for Adopting the Array API spec `_ `ENH Adds Array API support to LinearDiscriminantAnalysis `_ `array-api-tests `_ `NEP 47 — Adopting the array API standard `_ `napari `_ `PyTorch and Python Data API comparison `_ `NVFuser `_s

2022-06-28 - Articles, liens, code efficaces

HTML - * `pyornear `_ : détection de départs de feux * `Réseaux sociaux : la modélisation mathématique peut-elle contribuer à réduire la polarisation des opinions ? `_ * `dowhy `_ : An end-to-end library for causal inference * `merlion `_ A Machine Learning Library for Time Series * `On the Convergence of Adam and Beyond `_ * `A Path Towards Autonomous Machine Intelligence `_ * `Gradient Descent Provably Optimizes Over-parameterized Neural Networks `_ * `jupyterlite `_

2022-05-29 - ONNX Backend Scoreboard

HTML - `ONNX Backend Scoreboard `_ shows how many operators a runtime supports. Page :ref:`l-backend-python-coverage` computes the same figure for the Python Runtime implemented in this package, more than 90%.

2022-05-16 - Année 2022, séance 6

HTML - Séance découpée en trois parties. **Partie I : analyse de survie** * `analyse de survie `_ **Partie II : machine learning éthique** * interprétabilité, `LIME `_, `Shapeley `_, `Counter Factual `_, `Partial Dependence `_ * biais en machine learning * `machine learning éthique `_ **Partie III :** * ingéniérie logicielle * tests unitaires * mise en production * `git `_, `jenkins `_, `Intégration continue `_ `pull request `_, notebook ou programme **A propros des biais** * `Calibration for the (Computationally-Identifiable) Masses `_ * `Outcome Indistinguishability `_ * `L'équité de l'apprentissage machine en assurance `_ * `Machine Learning éthique `_ * `Interprétabilité des modèles `_ Extraits : * Les biais de type 1 sont liés à des classes qui ne reflèteraient pas la réalité du risque, mais seraient motivés par de purs préjugés (critique qui ne remet pas en question le principe du bien-fondé de la classification). Justifiée en amont par le mythe d'une causalité des signes astrologiques sur les accidents par exemple, une classification zodiacale se révèlerait à l'usage comme « biaisée », au sens trivial où le modèle est faux ; * Les biais de type 2 sont liés à des classes qui reflètent une réalité statistique avérée (une corrélation avec le risque, donc un modèle exact) mais non causale, ce qui rend leur usage suspect d'un parti-pris et d'un choix arbitraire. C'est le cas par exemple du paramètre homme/femme. Là aussi on admet le bien-fondé d'une classification qui s'appuierait uniquement sur des variables causales, mais la corrélation seule ne donne pas lieu à une explication acceptable ; * Les biais de types 3 sont liés à des classes qui reflètent une réalité statistique et causale, mais qui est elle-même le fait de discriminations sociales en amont. Dans ce cas, le modèle est exact mais la classification est intrinsèquement nuisible car elle reproduit et ancre dans la réalité une situation contre laquelle il faut lutter. A propos du biais de type 1, il apparaît également lorsqu'une nomenclature n'évolue pas et ne reflète plus les données d'aujourd'hui. L'indice des prix est une statistique dont le sens ne change pas mais dont la pondération change : `Pour comprendre l'indice des prix `_. *Machine Learning privé* * `Calibrating Noise to Sensitivity in Private Data Analysis `_ * `The Algorithmic Foundations of Differential Privacy `_

2022-04-20 - Photos du hackathon ENSAE 2022

HTML - Elles sont là :ref:`l-hackathon-2022`.

2022-03-29 - Année 2022, projet

source

2022-03-27 - AttributeError: module 'jinja2' has no attribute 'Markup

HTML - The notebook conversion fails again due to the following error: :: AttributeError: module 'jinja2' has no attribute 'Markup :epkg:`jinja2` needs to be downgraded to 3.0.3. See `nbconvert #9468 `_.

2022-03-08 - Année 2022, séance 5

HTML - Séance découpée en trois parties. **Exercice** On veut créer une classe d'arbre de décision qui fonctionne comme un arbre de décision mais génère une erreur si la distribution des feuilles prédites s'éloigne de celle observée durant l'apprentissage. **Partie I : réseaux de neurones et transfer learning** * machine learning et `deep learning `_ * réseau de neurones profond, `pytorch `_ * `onnx `_, `onnxruntime `_ * utilisation de modèles de deep learning avec scikit-learn Quelques éléments techniques. * CPU, GPU * double, float * dense, sparse * json, xml, yml * encoding * graphes, graphes sociaux, communautés **Partie II : données massives** Que faire quand les données sont énormes et qu'on n'a pas de cluster ? * `pandas `_ * `sqlite3 `_ * `streaming `_ * `streaming machine learning `_ * `river `_ **Partie III : variables textuelles** Catégorie et texte * webscrapping, html, javascript * catégories, `dirty-cat `_ (rappel) * convertir du texte libre en variable numérique, n-grammes * traitement de phrase, tfidf * text embedding * word2vec, gloves, gensim, spacy * séries temporelles **Projet** * Mois d'avril (début 28/3, rendu 15/5, note 30/6) * Modalités précisées en fin de mois **Exercice** Trouver les adresses identiques après la fusion de deux bases de données. Comment utiliser du machine learning ?

2022-03-07 - Année 2022, séance 4

HTML - Séance découpée en trois parties. **Partie I** * Exercice : Comment utiliser `GridSearch `_, un modèle customisé pour faire de la sélection de variables ? * `géolocalisation `_ * `geopandas `_ * tracer une carte, `shapely `_, `folium `_ * système de coordonnées **Exercice** On veut créer une classe d'arbre de décision qui fonctionne comme un arbre de décision mais génère une erreur si la distribution des feuilles prédites s'éloigne de celle observée durant l'apprentissage.

2022-02-28 - Lectures

HTML - `Large Batch Optimization for Deep Learning: Training BERT in 76 minutes `_

2022-02-27 - Xop, easy to create onnx graph

HTML - :epkg:`onnx` package has a very verbose API to create ONNX graph. Could you imagine a user to directly write the syntax tree of a program instead of some python code? Creating a ONNX graph is very similar to that task except ONNX language is more simple than python. We could start writing a compiler for ONNX language but it should be defined first. Another option consists in using an existing API, such as :epkg:`numpy` API (see :ref:`l-numpy2onnx-tutorial`). But it is not always easy to keep the same simplicity when numpy is not strongly typed and ONNX is. Another direction is to implement :epkg:`ONNX Operators` as function. Adding an operator into a graph becomes similar to a function call. This API is introduced in :ref:`l-xop-api`.

2022-02-25 - Plan séance 5

HTML - Voici le plan prévu pour la première séance du cours de machine learning pour l'économie et la finance. **Séance 5 - partie 1** * json, rest, javascript * `analyse de survie `_ **Séance 5 - partie 2** * interprétabilité, `LIME `_, `Shapeley `_, `Counter Factual `_, `Partial Dependence `_ * biais en machine learning * `machine learning éthique `_ * le projet, un modèle, analyser trois observations mal prédites, utiliser un des outils pour interpréter, en déduire une explication, suggérer une amélioration du modèle ou des variables pour corriger ces erreurs *A propros des biais* * `Calibration for the (Computationally-Identifiable) Masses `_ * `Outcome Indistinguishability `_ * `L'équité de l'apprentissage machine en assurance `_ * `Machine Learning éthique `_ * `Interprétabilité des modèles `_ Extraits : * Les biais de type 1 sont liés à des classes qui ne reflèteraient pas la réalité du risque, mais seraient motivés par de purs préjugés (critique qui ne remet pas en question le principe du bien-fondé de la classification). Justifiée en amont par le mythe d'une causalité des signes astrologiques sur les accidents par exemple, une classification zodiacale se révèlerait à l'usage comme « biaisée », au sens trivial où le modèle est faux ; * Les biais de type 2 sont liés à des classes qui reflètent une réalité statistique avérée (une corrélation avec le risque, donc un modèle exact) mais non causale, ce qui rend leur usage suspect d'un parti-pris et d'un choix arbitraire. C'est le cas par exemple du paramètre homme/femme. Là aussi on admet le bien-fondé d'une classification qui s'appuierait uniquement sur des variables causales, mais la corrélation seule ne donne pas lieu à une explication acceptable ; * Les biais de types 3 sont liés à des classes qui reflètent une réalité statistique et causale, mais qui est elle-même le fait de discriminations sociales en amont. Dans ce cas, le modèle est exact mais la classification est intrinsèquement nuisible car elle reproduit et ancre dans la réalité une situation contre laquelle il faut lutter. A propos du biais de type 1, il apparaît également lorsqu'une nomenclature n'évolue pas et ne reflète plus les données d'aujourd'hui. L'indice des prix est une statistique dont le sens ne change pas mais dont la pondération change : `Pour comprendre l'indice des prix `_. *Machine Learning privé* * `Calibrating Noise to Sensitivity in Private Data Analysis `_ * `The Algorithmic Foundations of Differential Privacy `_ *Projets*

2022-02-18 - Plan séance 4

Voici le plan prévu pour la première séance du cours de machine learning pour l'économie et la finance. **Séance 4 - partie 1** * réseau de neurones * transfer learning **Séance 4 - partie 2** * texte embedding, word2vec, gloves, gensim, spacy * cartes **Séance 4 - partie 3** quelques histoires à programmer * deviner le nom d'un quartier * évaluer un système de suggestion * trouver les doublons dans un annuaire

source

2022-02-11 - Plan séance 3

HTML - Voici le plan prévu pour la première séance du cours de machine learning pour l'économie et la finance. **Séance 3 - partie 1** * API de :epkg:`scikit-learn`. Utiliser une grille de recherche pour sélectionner un modèle. * Description de l'API :epkg:`scikit-learn` (fit, predict) * ColumnTransformer * nom des variables * exercice * gradient * ensemble **Séance 3 - partie 2** * série temporelle * split train test dans le cas d'une série temporelle * prédiction de la veille * tendance... * `prophet `_ (Sous Windows, c'est compliqué) * `sktime `_ * jours fériés, décompositions en séries périodiques * dynamic time warping `dtw-python `_ * `ruptures `_, segmentation de séries temporelles, détection de changements

2022-02-04 - Plan séance 2

HTML - Voici le plan prévu pour la première séance du cours de machine learning pour l'économie et la finance. **Séance 2 - partie 1** * `métriques `_ * `Imbalanced problem `_ * Decision Tree, `Arbres de décision / Random Forest `_, `Prédiction d'une durée `_ * `Valeurs manquantes (cheatsheet) `_, `Valeurs manquantes (notebooks) `_ * `Réseaux de neurones `_ (inférence, gradient) **Séance 2 - partie 2** API de :epkg:`scikit-learn`. Utiliser une grille de recherche pour sélectionner un modèle.

2021-12-16 - Build onnxruntime on WSL (Windows Linux Subsystem)

HTML - I tried to build :epkg:`onnxruntime-training` for GPU on :epkg:`WSL` (Windows Linux Subsystem). I took the distribution `Ubuntu 20.04`. Paths should be updated according to your installation. **some useful commands once installed** :: nvidia-smi nsys Let's assume WSL is installed, otherwise, here are some useful commands. :: # see all local distributions wsl -s -l # see available distributions online wsl --list --online # install one distribution wsl --install -d Ubuntu-20.04 Installation of required packages. :: sudo apt-get install cmake sudo apt-get install zlib1g-dev sudo apt-get install libssl-dev sudo apt-get install python3-dev sudo apt-get install libhwloc-dev sudo apt-get install libevent-dev Installation of :epkg:`cmake`. :: curl -OL https://github.com/Kitware/CMake/releases/download/v3.22.1/cmake-3.22.1.tar.gz tar -zxvf cmake-3.22.1.tar.gz cd cmake-3.22.1 ./bootstrap make sudo make install export PATH=~/install/cmake-3.22.1/bin/:$PATH Installation of :epkg:`openmpi`: :: gunzip -c openmpi-4.1.2.tar.gz | tar xf - cd openmpi-4.1.2 ./configure --prefix=/usr/local --with-cuda make all install Installation of CUDA (choose a compatible version with :epkg:`pytorch`, 11.3 for example). See `CUDA on WSL User Guide `_ :: export CUDA_VERSION=11.3 export CUDA_VERSION_=11-3 wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600 wget https://developer.download.nvidia.com/compute/cuda/${CUDA_VERSION}.0/local_installers/cuda-repo-wsl-ubuntu-${CUDA_VERSION_}-local_${CUDA_VERSION}.0-1_amd64.deb sudo dpkg -i cuda-repo-wsl-ubuntu-${CUDA_VERSION_}-local_${CUDA_VERSION}.0-1_amd64.deb sudo apt-key add /var/cuda-repo-wsl-ubuntu-${CUDA_VERSION_}-local/7fa2af80.pub sudo apt-get update sudo apt-get -y install cuda Installation of :epkg:`cudnn` (after it is downloaded): :: sudo dpkg -i cudnn-local-repo-ubuntu2004-8.3.1.22_1.0-1_amd64.deb sudo apt-key add /var/cudnn-local-repo-*/7fa2af80.pub sudo apt-get update sudo apt-get install libcudnn8 sudo apt-get install libcudnn8-dev Installation of :epkg:`nccl` See `Install NCCL `_. :: sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/7fa2af80.pub sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /" sudo apt update sudo apt install libnccl2 libnccl-dev Installation of :epkg:`pytorch`: :: python3 -m pip install torch==1.10.1+cu113 torchvision==0.11.2+cu113 torchaudio==0.10.1+cu113 -f https://download.pytorch.org/whl/cu113/torch_stable.html Then to check CUDA is available: :: import torch print(torch.cuda.is_available()) Build :epkg:`onnxruntime-training`: :: alias python=python3 export CUDA_VERSION=11.3 export CUDACXX=/usr/local/cuda-${CUDA_VERSION}/bin/nvcc export MPI_HOME=~/install/openmpi-4.1.2 python3 ./tools/ci_build/build.py --skip_tests --build_dir ./build/linux_gpu --config Release --use_mpi false --enable_training --enable_training_torch_interop --use_cuda --cuda_version=${CUDA_VERSION} --cuda_home /usr/local/cuda-${CUDA_VERSION}/ --cudnn_home /usr/local/cuda-${CUDA_VERSION}/ --build_wheel --parallel Option ``--parallel 1`` can be used to fix the parallelism while building onnxruntime. Option `--use_mpi false` can be replaced by `--mpi_home /usr/local/lib/openmpi`. Another option is to use a docker: `Running Existing GPU Accelerated Containers on WSL 2 `_.

2021-11-24 - Architecture, Gilles Dupré

HTML - Je n'imaginais que faire la liste des constructions de mon père, `Gilles Dupré `_ soit aussi fastidieuse. Les adresses des constructions sont rarement notées. J'ai passé pas mal de temps à chercher un toit dans le village de Lonny qui puisse ressembler à une maison que je ne connaissais que grâce à deux photos. J'ai sillonné virtuellement dans les rues du village depuis Paris, en me demandant si sa maison n'avait pas été détruite ou refaite de façon méconnaissable. Je n'ai pas retrouvé la trace d'une maison qu'il a aménagé à Carolles. Je sais pourtant qu'elle existe puisque j'y ai déjeuné il y a très longtemps. :ref:`gillesduprerst` Témoin du temps qui passe, j'ai mis les pieds dans trois maisons que mon père a construite. Toutes étaient en bordure de village à l'époque où elles furent construites. Elles ne le sont plus maintenant. J'ai passé pas mal de temps à parcourir les rues avec Google Street View, à regarder les cartes IGN, plus précises que celles de Google, à m'extasier devant les `traces GPS d'OpenStreetMap `_, inutiles pour ma recherche, mais intrigantes.

2021-11-21 - Profiler

HTML - Un profiler sert à mesurer le temps passé à n'importe quel endroit du programme. GPU et CPU peuvent fonctionner ensemble, moins il y a de temps, plus le programme est rapide. C'est ce que mesure ce type d'outils : .. image:: https://developer.nvidia.com/sites/default/files/akamai/gameworks/ns1.png Accessible ici : `Nsight Visual Studio Edition 2021.3 Download `_ Ce n'est pas le seul, NVidia propose une version : `NVidia Profiler `_. Son installation nécessite quelques contorsions lors de l'installation, car il nécessite une version spécifique de java, la plus récente ne fonctionne pas. Ca changera sans doute à la prochaine mise à jour.

2021-10-13 - First blog

HTML - :epkg:`onnxruntime-training`

2021-10-13 - First blog

HTML - This package proposes many examples to discover `onnxruntume `_ or `onnxruntime-training `_.

2021-08-12 - A few tricks for tf2onnx

HTML - A few things I tend to forget. To run a specific test on a specific opset. :: python tests/test_backend.py --opset 12 BackendTests.test_rfft2d_ops_specific_dimension Optimisation of an onnx file. It applies the whole list of optimizers available in :epkg:`tensorflow-onnx`. :: import logging import onnx from onnx import helper from tf2onnx.graph import GraphUtil from tf2onnx import logging, optimizer, constants from tf2onnx.late_rewriters import rewrite_channels_first, rewrite_channels_last logging.basicConfig(level=logging.DEBUG) def load_graph(fname, target): model_proto = onnx.ModelProto() with open(fname, "rb") as f: data = f.read() model_proto.ParseFromString(data) g = GraphUtil.create_graph_from_onnx_model(model_proto, target) return g, model_proto def optimize(input, output): g, org_model_proto = load_graph(input, []) if g.is_target(constants.TARGET_CHANNELS_FIRST): g.reset_nodes(rewrite_channels_first(g, g.get_nodes())) if g.is_target(constants.TARGET_CHANNELS_LAST): g.reset_nodes(rewrite_channels_last(g, g.get_nodes())) g = optimizer.optimize_graph(g) onnx_graph = g.make_graph( org_model_proto.graph.doc_string + " (+tf2onnx/onnx-optimize)") kwargs = GraphUtil.get_onnx_model_properties(org_model_proto) model_proto = helper.make_model(onnx_graph, **kwargs) with open(output, "wb") as f: f.write(model_proto.SerializeToString()) optimize("debug_noopt.onnx", "debug_opt.onnx")

2021-08-11 - Decompose einsum into numpy operators

HTML - Notebook :ref:`einsumdecompositionrst` what function :epkg:`numpy:einsum` does and how it can be decomposed into a series of basic operations, all available in ONNX. That's the purpose of function Function :func:`decompose_einsum_equation `. With function :func:`export2numpy `, it is possible to convert back this ONNX graph into a series of numpy operations. .. runpython:: :showcode: :process: import numpy from mlprodict.testing.einsum import decompose_einsum_equation from mlprodict.onnx_tools.onnx_export import export2numpy seq_clean = decompose_einsum_equation( "bsnh,btnh->bnts", strategy='numpy', clean=True) onx = seq_clean.to_onnx("Y", "X1", "X2", dtype=numpy.float32) code = export2numpy(onx, name="einsum", rename=True) print(code) In some cases, it is faster to permute a matrix before doing a matrix multiplication. There exists many equivalent equation by permutating letters inside the initial equation. All leads to the same results but, once decomposed, they do different transpositions. The following code is obtained by looking for the best permutation and converting the optimized ONNX graph into *numpy*. .. runpython:: :showcode: :process: import numpy from mlprodict.onnx_tools.onnx_export import export2numpy from mlprodict.testing.einsum import optimize_decompose_einsum_equation seq_opt = optimize_decompose_einsum_equation( "bsnh,btnh->bnts", numpy.float64, strategy='ml', verbose=1, runtime="python", optimize=True) print("best equation:", seq_opt.equation_) code = export2numpy(seq_opt.onnx_, name="einsum_opt", rename=True) print(code) The optimization was done for :epkg:`onnxruntime`, that does not guarantee the result will be faster than with :epkg:`numpy:einsum`. Let's check... .. runpython:: :showcode: :process: import pprint import numpy from mlprodict.onnx_tools.exports.numpy_helper import ( argmin_use_numpy_select_last_index, make_slice) from cpyquickhelper.numbers.speed_measure import measure_time def numpy_einsum(X1, X2): ''' Numpy function for ``einsum``. * producer: mlprodict * version: 0 * description: ''' # initializers B = numpy.array([4], dtype=numpy.int64) C = numpy.array([3], dtype=numpy.int64) D = numpy.array([0, 1], dtype=numpy.int64) E = numpy.array([4], dtype=numpy.int64) F = numpy.array([-1], dtype=numpy.int64) G = numpy.array([2], dtype=numpy.int64) H = numpy.array([3], dtype=numpy.int64) I = numpy.array([1], dtype=numpy.int64) J = numpy.array([1], dtype=numpy.int64) # nodes K = X1 L = numpy.expand_dims(K, axis=tuple(B)) M = numpy.transpose(L, axes=(0, 2, 1, 4, 3)) N = X2 O = numpy.expand_dims(N, axis=tuple(C)) P = numpy.transpose(O, axes=(0, 2, 3, 1, 4)) Q = numpy.array(M.shape, dtype=numpy.int64) R = numpy.array(P.shape, dtype=numpy.int64) S = numpy.take(Q, D, axis=0) T = numpy.take(R, D, axis=0) U = S.prod(axis=0, keepdims=1) V = T.prod(axis=0, keepdims=1) W = numpy.take(Q, E, axis=0) X = numpy.take(R, E, axis=0) Z = numpy.concatenate([U, F, W], 0) BA = numpy.concatenate([V, F, X], 0) BB = M.reshape(tuple(Z)) BC = P.reshape(tuple(BA)) BD = numpy.transpose(BC, axes=(0, 2, 1)) BE = BB @ BD BF = numpy.maximum(S, T) BG = numpy.take(Q, G, axis=0) BH = numpy.take(R, H, axis=0) BI = numpy.concatenate([BF, BG, BH, I], 0) BJ = BE.reshape(tuple(BI)) BK = numpy.transpose(BJ, axes=(0, 4, 1, 3, 2)) BL = numpy.squeeze(BK, axis=tuple(J)) BM = BL Y = BM return Y def numpy_einsum_opt(X0, X1): ''' Numpy function for ``einsum``. * producer: mlprodict * version: 0 * description: ''' # initializers B = numpy.array([2], dtype=numpy.int64) C = numpy.array([1], dtype=numpy.int64) D = numpy.array([0, 1], dtype=numpy.int64) E = numpy.array([4], dtype=numpy.int64) F = numpy.array([-1], dtype=numpy.int64) G = numpy.array([2], dtype=numpy.int64) H = numpy.array([3], dtype=numpy.int64) I = numpy.array([1], dtype=numpy.int64) J = numpy.array([3], dtype=numpy.int64) # nodes K = X0 L = numpy.expand_dims(K, axis=tuple(B)) M = numpy.transpose(L, axes=(0, 3, 1, 2, 4)) N = X1 O = numpy.expand_dims(N, axis=tuple(C)) P = numpy.transpose(O, axes=(0, 3, 1, 2, 4)) Q = numpy.array(M.shape, dtype=numpy.int64) R = numpy.array(P.shape, dtype=numpy.int64) S = numpy.take(Q, D, axis=0) T = numpy.take(R, D, axis=0) U = S.prod(axis=0, keepdims=1) V = T.prod(axis=0, keepdims=1) W = numpy.take(Q, E, axis=0) X = numpy.take(R, E, axis=0) Z = numpy.concatenate([U, F, W], 0) BA = numpy.concatenate([V, F, X], 0) BB = M.reshape(tuple(Z)) BC = P.reshape(tuple(BA)) BD = numpy.transpose(BC, axes=(0, 2, 1)) BE = BB @ BD BF = numpy.maximum(S, T) BG = numpy.take(Q, G, axis=0) BH = numpy.take(R, H, axis=0) BI = numpy.concatenate([BF, BG, BH, I], 0) BJ = BE.reshape(tuple(BI)) BK = numpy.transpose(BJ, axes=(0, 1, 3, 4, 2)) BL = numpy.squeeze(BK, axis=tuple(J)) BM = BL Y = BM return Y N = 2 m1 = numpy.random.randn(N, N, N, N) m2 = numpy.random.randn(N, N, N, N) print("Discrepencies?") print(numpy.einsum("bsnh,btnh->bnts", m1, m2)) print(numpy_einsum(m1, m2)) print(numpy_einsum_opt(m1, m2)) N = 20 m1 = numpy.random.randn(N, N, N, N) m2 = numpy.random.randn(N, N, N, N) print('numpy.einsum') res = measure_time( lambda: numpy.einsum("bsnh,btnh->bnts", m1, m2), repeat=10, number=20, div_by_number=True, context={'numpy': numpy, 'm1': m1, 'm2': m2}) pprint.pprint(res) print('numpy.einsum decomposed') res = measure_time( lambda: numpy_einsum(m1, m2), repeat=10, number=20, div_by_number=True, context={'numpy': numpy, 'm1': m1, 'm2': m2, 'numpy_einsum': numpy_einsum}) pprint.pprint(res) print('numpy.einsum decomposed and optimized') res = measure_time( lambda: numpy_einsum_opt(m1, m2), repeat=10, number=20, div_by_number=True, context={'numpy': numpy, 'm1': m1, 'm2': m2, 'numpy_einsum_opt': numpy_einsum_opt}) pprint.pprint(res) The optimization is not faster than the first decomposition but the decomposition is faster than the numpy implementation.

2021-08-10 - onnxruntime shape [] != None

HTML - `None` is the undefined shape, `[]` is an empty shape. And when shapes do not fit the results, the outputs can be suprising. The following example shows what :epkg:`onnxruntime` produces for the same graph except input and output shapes when defined as `None` and `[]`. .. runpython:: :showcode: import numpy from onnx import helper, TensorProto from onnxruntime import InferenceSession def model(shape): X = helper.make_tensor_value_info('X', TensorProto.FLOAT, shape) Z = helper.make_tensor_value_info('Z', TensorProto.INT64, shape) node_def = helper.make_node('Shape', ['X'], ['Z'], name='Zt') graph_def = helper.make_graph([node_def], 'test-model', [X], [Z]) model_def = helper.make_model( graph_def, producer_name='mlprodict', ir_version=7, producer_version='0.1', opset_imports=[helper.make_operatorsetid('', 13)]) sess = InferenceSession(model_def.SerializeToString()) rnd = numpy.random.randn(12).astype(numpy.float32) print("shape=%r results=%r" % (shape, sess.run(None, {"X": rnd}))) model(None) model([])

2021-07-09 - ONNX from C#

This example shows how to compute the predictions of a model using C#. :: using System.Collections.Generic; using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; namespace ConsoleAppOnnx { class Program { static void Main(string[] args) { // Loads the model. var opts = new SessionOptions(); string model_path = "model.onnx"; var session = new InferenceSession(model_path, opts); // Creating an input tensor (assuming there is only one). // Get the name of the input and the number of features. string name = string.Empty; int n_features = -1; foreach (var inp in session.InputMetadata) { name = inp.Key; n_features = inp.Value.Dimensions[1]; break; } // Creates an empty input. var dims = new int[] { 1, n_features }; var t = new DenseTensor(dims); for (int i = 0; i < dims[1]; ++i) t.SetValue(i, 1.0f / (dims[1] + 1)); var tensor = NamedOnnxValue.CreateFromTensor(name, t); // Runs the inference. var inputs = new List() { tensor }; using (var outputs = session.Run(inputs)) { foreach (var o in outputs) { DenseTensor to = o.AsTensor().ToDenseTensor(); var values = new float[to.Length]; to.Buffer.CopyTo(values); // values contains the results. foreach (var i in values) System.Console.Write(string.Format("{0}, ", i)); System.Console.WriteLine(); } } } } }

source

2021-07-09 - Convert a Lightgbm dump

HTML - This example shows how to convert a :epkg:`lightgbm` model dumped as a text file. It uses :epkg:`lightgbm` to restore the model, converts it and checks the discrepencies. :: import numpy from numpy.testing import assert_almost_equal import lightgbm from onnxruntime import InferenceSession from onnxmltools import convert_lightgbm from skl2onnx.common.data_types import FloatTensorType booster = lightgbm.Booster(model_file="model.txt") n = booster.num_feature() onx = convert_lightgbm(booster, initial_types=[('input', FloatTensorType([None, n]))]) sess = InferenceSession(onx.SerializeToString()) rnd = numpy.random.random((1, n)).astype(numpy.float32) expected = booster.predict(rnd) got = sess.run(None, {'input': rnd})[0] assert_almost_equal(expected, got.ravel(), decimal=4)

2021-06-14 - Quelques articles

HTML - * `Deep Learning course: lecture slides and lab notebooks `_ (Charles Ollion, Olivier Grisel), `Master Year 2 Data Science IP-Paris `_ * `LocoProp: Enhancing BackProp via Local Loss Optimization `_ * `Understanding Failures of Deep Networks via Robust Feature Extraction `_ * `Understanding Failures of Deep Networks via Robust Feature Extraction `_

2021-06-14 - Quelques articles

HTML - * `Simulation-based Bayesian inference for multi-fingered robotic grasping `_

2021-05-05 - Numpy API for ONNX and scikit-learn (part II)

HTML - This follows blog post :ref:`Numpy API for ONNX and scikit-learn (part I) `. It demonstrated how to insert a custom function in a pipeline and still be able to convert that pipeline into ONNX. This blog post shows how to implement a custom transformer. This time, we need to implement method not a function but the method `transform` of a custom transformer. The design is the same and relies on a decorator before the class declaration. In the following example, a method `onnx_transform` implements the method transform with the API mentioned in the first part: :ref:`f-numpyonnximpl`. The decorator `onnxsklearn_class` detects that the decorated class is a transform. It then assumes that method `onnx_transform` contains the ONNX implementation of method `transform`. The decorator adds an implementation for method `transform`. It behaves like the custom function described in part I. Once called, this method will detects the input type, generates the ONNX graph if not available and executes it with a runtimme. That explains why the first call is much slower. .. runpython:: :showcode: :process: import numpy from pandas import DataFrame from sklearn.base import TransformerMixin, BaseEstimator from sklearn.decomposition import PCA from sklearn.model_selection import train_test_split from sklearn.datasets import make_classification from mlprodict.npy import onnxsklearn_class from mlprodict.onnx_conv import to_onnx from mlprodict.plotting.text_plot import onnx_simple_text_plot import mlprodict.npy.numpy_onnx_impl as nxnp import mlprodict.npy.numpy_onnx_impl_skl as nxnpskl X, y = make_classification(200, n_classes=2, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=2, hypercube=False) X_train, X_test, y_train, y_test = train_test_split(X, y) @onnxsklearn_class("onnx_transform", op_version=14) # opset=13, 14, ... class DecorrelateTransformerOnnx(TransformerMixin, BaseEstimator): def __init__(self, alpha=0.): BaseEstimator.__init__(self) TransformerMixin.__init__(self) self.alpha = alpha def fit(self, X, y=None, sample_weights=None): self.pca_ = PCA(X.shape[1]) # pylint: disable=W0201 self.pca_.fit(X) return self def onnx_transform(self, X): if X.dtype is None: raise AssertionError("X.dtype cannot be None.") mean = self.pca_.mean_.astype(X.dtype) cmp = self.pca_.components_.T.astype(X.dtype) return (X - mean) @ cmp model = DecorrelateTransformerOnnx() model.fit(X_train) print(model.transform(X_test[:5])) onx = to_onnx(model, X_test[:5], target_opset=14) # opset=13, 14, ... print() print(onnx_simple_text_plot(onx)) print() print(onx) The tutorial :ref:`l-numpy-api-for-onnx` extends this example to regressors or classifiers. It also mentions a couple of frequent errors that may appear along the way.

2021-01-15 - Install pythonnet on debian is difficult

HTML - From `Install the .NET SDK or the .NET Runtime on Debian `_. :: wget https://packages.microsoft.com/config/debian/10/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb sudo apt-get update sudo apt-get install -y apt-transport-https sudo apt-get install -y dotnet-sdk-5.0 sudo apt-get install -y aspnetcore-runtime-5.0 sudo apt-get install -y dotnet-runtime-5.0 Then build `pythonnet `_: :: git clone https://github.com/pythonnet/pythonnet cd pythonnet python3.9 setup.py build_dotnet python3.9 setup.py bdist_wheel Unfortunately, *pythonnet* does not work with *dotnet* yet on linux. *mono* is still needed (see `Add the Mono repository to your system `_). :: sudo apt install apt-transport-https dirmngr gnupg ca-certificates sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF echo "deb https://download.mono-project.com/repo/debian stable-stretch main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list sudo apt update sudo apt install mono-devel nuget mono --version The package `dotnetcore2 `_ might be needed. This is a work in progress.

2021-01-13 - Issue with nbconvert: unknown exporter "python"

HTML - I bumped into the following error: :: nbconvert.exporters.base.ExporterNameError: Unknown exporter "python", did you mean one of: ? This issue was raised by the following piece of code: :: from nbconvert.exporters import get_exporter get_exporter("python") And this code gave another reason for the error: :: Permission denied: '/usr/share/jupyter/nbconvert/templates/conf.json' And this file is only available to another user. I don't know why *nbconvert* looks into that folder, it was run from a virtual environment created with option `--system-site-packages`. Anyway, removing the folder `/usr/share/jupyter/nbconvert/templates/` fixes the issue.

2021-01-11 - Build Tensorflow from source

HTML - Tensorflow has no released for python 3.9 yet. To build it `from source `_, `bazel `_ must be installed first. :: curl -fsSL https://bazel.build/bazel-release.pub.gpg | gpg --dearmor > bazel.gpg sudo mv bazel.gpg /etc/apt/trusted.gpg.d/ echo "deb [arch=amd64] https://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list apt update apt install bazel bazel --version Then Tensorflow: :: pip install keras_preprocessing --no-deps git clone https://github.com/tensorflow/tensorflow.git cd tensorflow ./configure The last script prompts to ask question. One of them is the CPU optimization. Nothing or some suggestions: :: --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2 Then build tensorflow: :: bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package And finally: :: bazel-bin/tensorflow/tools/pip_package/build_pip_package --nightly_flag tensorflow_pkg It took me 5 to 6 hours to build the whole package. Then `pip install ...`.

2021-01-11 - AttributeError: module 'nbconvert.exporters' has no attribute 'WebPDFExporter'

HTML - I faced the following issue when running a notebook server juste the installation. :: AttributeError: module 'nbconvert.exporters' has no attribute 'WebPDFExporter' That leaded to an empty screen showing `"500: internal error"` returned by the server. I could not find a solution despite many searches on the internet so I decided to modify the code of `notebook` in file `notebook/handler.py `_ and update with the following lines: :: try: exporter_class = get_exporter(name) except AttributeError: continue I hope this issue if fixed next time I install it. I remember facing the same one quite a while but I have no memory on how I got it fixed.

2021-01-09 - Install Python 3.9 and many packages on Linux Debian 10

HTML - **Password** :: sudo passwd **sudo, git, valgrind, nodejs** :: apt-get install sudo git valgrind nodejs npm **Firewall** Let's start with the firewall: :: apt-get install ufw sudo ufw enable sudo ufw allow ssh sudo ufw allow 8080/tcp Another series of packages to install: :: apt-get install intel-mkl apt-get install cmake apt-transport-https clang apt-get install protobuf-compiler libprotoc-dev apt-get install chromium-driver apt-get install dvipng p7zip-full inkscape graphviz unrar **Python** Then `Python 3.9 `_. Some package require a different build because they need shared libraries. About --enable-shared, see `Relocation R_X86_64_32S against _Py_NotImplementedStruct can not be used when making a shared object; recompile with -fPIC `_, `How to configure python with --enable-shared on Ubuntu 18.04 `_ Option `--enable-shared --prefix=/opt/python` is needed when to embed python interpreter in a C application, see `Embedding the Python interpreter `_. :: sudo apt update && sudo apt upgrade sudo apt install wget build-essential libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev libffi-dev zlib1g-dev software-properties-common wget https://www.python.org/ftp/python/3.9.1/Python-3.9.1.tgz tar xzf Python-3.9.1.tgz cd Python-3.9.1 ./configure --enable-optimizations --with-ensurepip=install --enable-shared --prefix=/opt/python make make altinstall If needed, do it again with: :: ./configure --enable-optimizations --with-ensurepip=install --enable-shared make make altinstall These settings must be added every time python is run or a python module is compiled: :: export LD_LIBRARY_PATH=/usr/local/lib/ **/etc/environment/** You may add the following two lines in file ``/etc/environment/**: :: export LLVM_CONFIG=/usr/bin/llvm-config export LD_LIBRARY_PATH=/usr/local/lib/ **llvmlite** :: wget https://apt.llvm.org/llvm.sh chmod +x llvm.sh sudo ./llvm.sh 10 ls /usr/bin/llvm* sudo ln -s /usr/bin/llvm-config-8 /usr/bin/llvm-config python3.9 -m pip install llvmlite These settings must be also added: :: export LLVM_CONFIG=/usr/bin/llvm-config **GEOS** Useful to draw maps. :: apt-get install libgeos-dev libproj-dev proj-data graphviz libblas-dev liblapack-dev python3.9 -m pip install shapely pyproj shapely cartopy **Latex** :: apt-get install texlive texlive-latex-extra texlive-xetex **pandoc** :: apt-get install pandoc **Jenkins** Then `Jenkins `_: :: sudo apt update sudo apt install default-jdk wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add - sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list' sudo apt update sudo apt install jenkins sudo systemctl enable --now jenkins To retrieve the password: :: sudo cat somewhere/secrets/initialAdminPassword **Website** See `Installation of nginx `. **FTP server** See `Install FTP server on debian `. **profile** Edit file: :: ~/.profile **pypiserver** :: nohup python3.9 -m pypiserver --port=8067 --root=somewhere/workspace/local_pypi/local_pypi_server/ > pypi.log & **keyring** Something is missing here. Maybe for the next installation. :: apt-get install libdbus-glib-1-2 libdbus-glib-1-dev dbus-tests dbus-launch gnome-keyring python3.9 -m pip install dbus-python keyring keyrings.cryptfile export $(dbus-launch) **pycurl** :: apt-get install libcurl4-openssl-dev libssl-dev python3.9 -m pip install pycurl

2021-01-06 - Cannot load library libcairo-2.dll

HTML - The following error may appear when using `pycairo `_. This module is usually not directly used but through :epkg:`matplotlib`. :: cannot load library '..\bin\libcairo-2.dll': error 0xc1 cannot load library 'libcairo.so.2': error 0x7e cannot load library 'libcairo.2.dylib': error 0x7e cannot load library 'libcairo-2.dll': error 0xc1 I was able to solved the issue by installing the latest version of `Graphviz `_ (2.44) which can be found here: `www2.graphviz.org/... `_.

2021-01-05 - Quelques articles

HTML - Ce papier ouvre la voix à la reconnaissance du langage des signes en temps réel et aussi à n'importe quel forme de pilotage à partir de la position des mains, tous les sports, un logiciel pourra vous dire si votre geste de tennis est correct, et toutes les consoles de jeux n'auront plus besoin de manettes. `Constraining Dense Hand Surface Tracking with Elasticity `_ Le suivant résoud une équation différentielle... `Artificial Intelligence Solves Schrödinger's Equation, a Fundamental Problem in Quantum Chemistry `_

2021-01-04 - Issues with installation from source on Windows

HTML - The installation may fail on Windows when the model is compiled from the source. I could not find a particular reason. It works when :epkg:`numpy` is uninstalled before running `pip install cpyquickhelper`. Otherwise, this is the kind of error which appear: :: AppData\Local\Temp\pip-install-neuk85qw\cpyquickhelper_478c84dd0c2549f4bbfec94c5d99c7f8\cpyquickhelper\numbers\slowcode.cpp : fatal error C1083: Impossible d'ouvrir le fichier g‚n‚r‚(e) par le compilateurÿ: ''ÿ: Invalid argument Or: :: RuntimeError: The current Numpy installation ('c:\\xavierdupre\\venv\\py38\\lib\\site-packages\\numpy\\__init__.py') fails to pass a sanity check due to a bug in the windows runtime. This happened on a virtual environment. The best is probably to download one of the `artifacts from appveyor `_.

2021-01-03 - scikit-learn 0.23

HTML - The unit test are run against :epkg:`scikit-learn` 0.23, 0.24. Some unit tests are failing with version 0.23. They were disabled instead of looking into a cause which does not appear with the latest version. It affects all classes inheriting from :class:`SkBase ` where a model using it is trained. The issue happens in :epkg:`joblib`.