web-dev-qa-db-fra.com

paquet de type numpy pour noeud

Au cours de mes années sur le développement de Python, j'ai toujours été étonné de voir à quel point les choses vont beaucoup plus vite si vous parvenez à réécrire ce code qui tourne en boucle dans votre ndarray et fait quelque chose, avec des fonctions numpy qui fonctionnent simultanément sur tout le tableau. Plus récemment, je me suis tourné de plus en plus vers un noeud et je recherche quelque chose de similaire. Jusqu'à présent, j'ai trouvé certaines choses dont aucune ne semble prometteuse:

  • scikit-node , exécute scikit-learn en python et s'interface avec node. Je ne l'ai pas essayé, mais je ne m'attends pas à ce que cela me donne la vitesse de pointe que j'aimerais.
  • Il existe des bibliothèques de matrice javascript plutôt anciennes et plus récentes ( sylvester , gl-matrix , ...). En plus de ne pas être sûrs qu'ils fonctionnent bien avec les matrices plus grandes que 4x4 (ce qui est le plus utile pour le rendu 3D), ils semblent être du javascript natif (et certains, pas sûrs, utilisent l'accélération webGL). Grand sur le navigateur, pas si sur le noeud.

Autant que je sache, npms peut être écrit en C++, alors je me demande pourquoi il n’existe pas de bibliothèques de type numpy pour node. N'y a-t-il simplement pas assez d'intérêt dans node pour la communauté qui a besoin de ce type de pouvoir? Peut-on espérer que les fonctionnalités de l'ES6 (compréhensions de liste) permettront aux compilateurs javascript de vectoriser automatiquement le code JS natif au format C++? Suis-je peut-être en train de rater autre chose?

Edit, en réponse aux votes serrés: Remarque, je ne demande pas "quel est le meilleur package pour faire xyz". Je me demande simplement s'il y a une raison technique, il n'y a pas de paquet pour le faire sur un nœud, pour une raison sociale, ou pas de raison du tout et il y a juste un paquet que j'ai raté. Peut-être pour éviter de trop nombreuses critiques, j'aimerais savoir: j'ai environ 10000 matrices de 100 x 100 chacune. Quel est le meilleur moyen (* correction, une rapidité raisonnable) de les additionner?

Edit2 Après quelques recherches supplémentaires, il s’est avéré que je cherchais la mauvaise chose sur Google. Google pour "node.js scientific computing" et des liens vers des notes très intéressantes:

En gros, pour autant que je sache, personne ne s’est inquiété jusqu’à présent. De plus, étant donné que js TypedArrays comporte des omissions majeures (telles que les ints 64 bits), il peut être difficile d’ajouter un bon support en utilisant simplement des NPM et en ne piratant pas le moteur lui-même, ce qui irait à l’encontre du but recherché. Là encore, je n'ai pas approfondi mes recherches sur cette dernière affirmation.

38
Claude

Non, il n'y a pas de raison technique pour laquelle un paquet de type numpy n'existe pas pour Node.js et, plus généralement, pour JavaScript.

Deux obstacles principaux empêchent Node.js et JavaScript d’accroître la part d’esprit dans les communautés de la science des données et de l’informatique numérique.

Le premier obstacle est la communauté. Alors que la communauté JavaScript est énorme, le sous-ensemble de personnes faisant des choses intéressantes dans l'informatique numérique est peu nombreux. Par conséquent, si vous souhaitez utiliser l'informatique numérique en JavaScript et dans Node.js, il peut être difficile de trouver des ressources pour vous aider tout au long du processus, ce qui peut vous sembler être une entreprise solitaire.

Ensuite, l’absence de bibliothèques comparables (poulet et œuf: des bibliothèques sont nécessaires pour attirer des auteurs de bibliothèque et des auteurs pour écrire de bonnes bibliothèques). Il n'y a pas de raisons techniques pour lesquelles les bibliothèques ne peuvent pas être écrites en JavaScript ou tirer parti de Node.js (par exemple, via des add-ons natifs). Je sais, comme j’ai écrit de nombreuses bibliothèques de calcul numérique en JavaScript. Ainsi, alors que l'informatique numérique est possible en JavaScript, le problème provient de l'incapacité d'attirer des développeurs possédant une expertise suffisante et capables de consacrer le temps et les efforts nécessaires à la rédaction d'implémentations informatiques numériques de haute qualité.

En ce qui concerne les fonctionnalités linguistiques mentionnées dans le PO:

  • ES6/ES2015: aucun des ajouts récents apportés au langage n'a aidé ou empêché le développement de bibliothèques de calcul numérique en JavaScript. Les ajouts potentiels tels que la compréhension de liste ne changeront pas non plus le jeu. WebAssembly est le seul changement à apporter à la plate-forme Web. Avec WebAssembly, la compilation de bibliothèques C/C++/Fortran à exécuter dans les navigateurs Web sera facilitée. Au moment de cette réponse, WebAssembly semble être le moyen de transférer SIMD sur le Web, permettant éventuellement certaines accélérations, bien que l'accent semble être mis sur un SIMD court plutôt que long. Mais même avec WebAssembly, le portage de bibliothèques informatiques numériques sur le Web ne sera pas aussi simple que d'appuyer sur le bouton de compilation. Les bases de code numériques devront être transformées pour pouvoir être utilisées sur le Web et, même dans ce cas, des API de niveau supérieur devront probablement être écrites pour masquer certaines fonctionnalités de niveau inférieur, telles que la gestion manuelle du segment de mémoire.
  • Compléments natifs: oui, les modules de nœud peuvent être écrits en tant que compléments natifs, ce qui permet d'utiliser du code C/C++/Fortran dans une application Node.js. Les individus ont écrit des bibliothèques à cette fin; par exemple, voir stdlib . Si cela est bien fait, Node.js peut effectuer des calculs numériques à des vitesses comparables à celles utilisant directement des implémentations natives.
  • Tableaux typés: tels qu'ils sont maintenant, ils conviennent au calcul numérique. Semblable au C, vous pouvez créer des tampons en pool, ce qui permet une réutilisation efficace de la mémoire et de meilleures performances. En outre, comme dans les langages tels que R, Python et Julia, vous pouvez utiliser des tableaux typés pour créer des interfaces ndarray (aka strided array). Bien que les tableaux d’entiers U/Int64 ne soient pas disponibles au moment de cette réponse, (a) leur absence n’est pas un spectacle et que (b) les propositions avancent au niveau de la spécification pour ajouter des tableaux d’entiers U/Int64 à JavaScript. Idem pour les nombres complexes avec des types structurés.

Ma conviction personnelle est qu’une certaine forme d’informatique numérique est inévitable dans JavaScript et Node.js. Les avantages (omniprésence, distribution, performance) et les applications potentielles (Edge Computing, intégration de l’apprentissage automatique, visualisation de données) sont trop puissants pour ne pas prendre en charge les applications informatiques, du moins au niveau de base.

divulgation: moi-même et d'autres personnes travaillons actuellement sur un projet ( https://github.com/stdlib-js/stdlib ) qui vise à fournir des installations informatiques numériques en JavaScript et en Node.js.

20
kgryte

Je n'ai pas essayé cela, mais j'ai trouvé node-lapack . Puisque Numpy tire le meilleur parti de sa rapidité en utilisant blas/lapack pour tout faire, cela devrait aider. D'après le fichier readme, il semble également qu'il y ait un objet tableau, ce qui est essentiel pour ne pas convertir entre JS et lapack à chaque opération.

Voici une partie de leur démo:

var lapack = require('lapack');

var result = lapack.sgeqrf([
    [1, 2, 3],
    [3, 4, 5],
    [5, 6, 7]
]);

console.log(result.R);
console.log(result.tau);

result = sgesvd('A', 'A', [
    [1, 2, 3],
    [3, 4, 5],
    [5, 6, 7]
]);

console.log(result.U);
console.log(result.S);
console.log(result.VT);

result = lapack.sgetrf([
    [1, 2, 3],
    [3, 4, 5],
    [5, 6, 7]
]);

// see the readme for more

Cela semble être une interface assez directe pour lapack qui utilise les mêmes noms. Ce n'est donc pas aussi pratique que Numpy, mais au moins, il prend en charge les dimensions des tableaux et tout le reste. Lapack dans les deux cas).

Cependant, cela ne fonctionnera pas dans un navigateur, ce qui signifie que partout où il est disponible, Python est probablement également disponible. Personnellement, je me contenterais de Python, qui est beaucoup plus dominant pour les tâches numériques, à moins qu’il n’y ait une fonctionnalité de nœud spécifique qui manque à Python ...

6
Mark

Voici le fichier TensorFlow.js de Google (qui s'appelait précédemment https://deeplearnjs.org ), qui fait exactement cela et possède des capacités intégrées pour former des réseaux de neurones profonds sur des GPU utilisant WebGL. Vous pouvez également porter les modèles TensorFlow .

Ne soyez pas dupe en pensant que c'est seulement pour l'apprentissage en profondeur. Il s’agit d’une plate-forme informatique numérique à part entière avec accélération GPU intégrée. Il suit le modèle "exécuter au fur et à mesure", comme NumPy (et Tensorflow Eager, et PyTorch, et autres), et non le modèle "définir puis exécuter" comme Tensorflow. En tant que tel, il semblera naturel de l'utiliser à quiconque a déjà utilisé NumPy auparavant.

Voici le repo très informatif Github:

https://github.com/tensorflow/tfjs-core (l'ancien lien https://github.com/PAIR-code/deeplearnjs y redirige maintenant)

5
Jules G.M.

La majorité du travail des noeuds semble être dans l'univers "full stack" du Web, avec beaucoup moins de travail dans les zones où le traitement numérique rapide est un avantage.

Dans les régions où le traitement numérique rapide est un avantage, Python, R, etc. ont probablement une mentalité dominante.

Combinez ces deux faits et vous vous retrouverez avec peu de gens investis dans des bibliothèques de traitement numérique de nœuds.

4
Mark Harrison

Je développe PyExtJS voir à 

https://github.com/fernandezajp/PyExtJS

2
Alvaro Fernandez

Dans le même esprit que @ Julius dans sa réponse à propos de deeplearn.js, tensorflow.js est la continuation du même projet. Pour jouer avec le module tensorflow dans le REPL, je l'ai installé globalement (pour info - il est généralement déconseillé de le faire) en utilisant ceci:

$ npm install --global @tensorflow/tfjs

Ensuite, j'ai exécuté $ node pour démarrer le nœud REPL.

Cela peut différer pour vous (surtout si vous avez décidé d’installer localement tensorflow), mais j’ai saisi ceci pour faire référence au module tensorflow:

var tf = require('/usr/local/lib/node_modules/@tensorflow/tfjs')

Pour créer un tenseur de rang 1 (équivalent à un tableau 1-D dans numpy), essayez:

var x = tf.tensor( [-3,4] )

Et placez-le avec:

x.square().print()

Vous devriez obtenir [9,16] pour votre sortie. Voir https://js.tensorflow.org pour plus de détails.

Je dirais que tensorflow.js n’est pas seulement un remplacement de JS pour numpy, mais également pour sklearn, keras et bien sûr, tensorflow.

0
scottlittle