web-dev-qa-db-ja.com

ノードのnumpyのようなパッケージ

私の長年のPython開発では、ndarrayをループして何かを実行するコードをnumpy関数で書き直せば、ずっと速くなることにいつも驚かされました。配列全体を一度に処理します最近ではノードに切り替えることが多くなり、似たようなものを探しています。

  • scikit-node 、pythonでscikit-learnを実行し、ノードとインターフェイスします。試したことはありませんが、希望する最先端の速度が得られるとは思いません。
  • かなり古くて新しいjavascriptマトリックスライブラリがいくつかあります( sylvestergl-matrix 、...)。 4x4より大きい行列(3Dレンダリングに最も役立つ)よりもうまく機能するかどうかが不明であることに加えて、それらはネイティブjavascriptであるように見えます(これらの一部はwebGLアクセラレーションを使用します)。ノードではなく、ブラウザで最適です。

私の知る限り、npmsはC++で作成できるため、nodeにnumpyに似たライブラリがないのはなぜかと思っています。そのような力を必要とするコミュニティからのノードにはまだ十分な関心がありませんか? ES6の機能(リスト内包表記)により、javascriptコンパイラがネイティブJSコードをC++速度に自動的にベクトル化できるようになるという希望はありますか?他に何かが足りないのでしょうか?

Edit、クローズ投票への応答:注、「xyzを実行するのに最適なパッケージは何か」を求めているわけではありません。ノードでこれを行うパッケージがない、社会的な理由がある、またはまったく理由がない、技術的な理由があり、見逃したパッケージがあるだけだと思っています。あまりにも多くの意見を述べる批判を避けるために、私は知りたい:私はそれぞれ100 x 100である約10000のマトリックスを持っています。それらを一緒に追加するのに最適な(*修正、合理的な高速)方法は何ですか?

Edit2さらに掘り下げた後、間違ったことを探していたことがわかりました。 「node.jsサイエンティフィックコンピューティング」のGoogleおよび非常に興味深いメモへのリンクがあります。

基本的に私が今理解している限りでは、これまで誰も気にしていません。また、js TypedArraysにはいくつかの大きな省略(64ビットintなど)があるため、NPMを使用するだけで、エンジン自体をハッキングしないで適切なサポートを追加するのは難しいかもしれません。繰り返しになりますが、私はこの最後の声明をさらに調査しませんでした。

46
Claude

いいえ、Node.jsおよびより一般的にはJavaScript用のnumpyライクなパッケージが存在しない技術的な理由はありません。

Node.jsとJavaScriptがデータサイエンスと数値計算のコミュニティでより多くのマインドシェアを達成することを妨げる2つの主な障害があります。

最初の障害はコミュニティです。 JavaScriptコミュニティーは巨大ですが、数値計算で興味深いことをしているコミュニティー内の人々のサブセットは少数です。したがって、JavaScriptとNode.jsで数値計算を行いたい場合、その過程で役立つリソースを見つけるのは困難な場合があり、孤独な努力のように感じるかもしれません。

次に、同等のライブラリがありません(チキンとエッグ:ライブラリ作成者を引き付けるためにライブラリが必要であり、作成者は優れたライブラリを書くために必要です)ライブラリをJavaScriptで記述したり、Node.jsを活用したりできない技術的な理由はありません(たとえば、ネイティブアドオン経由)。 JavaScriptで多くの数値計算ライブラリを書いたので、知っています。 JavaScriptで数値計算が可能ですが、問題は、十分な専門知識を持ち、高品質の数値計算実装を作成するのに必要な時間と労力を投入できる開発者を引き付けることができないことに起因します。

OPで言及されている特定の言語機能について:

  • ES6/ES2015:最近の言語の追加はいずれも、JavaScriptでの数値計算ライブラリの開発を支援または妨害しません。リスト内包表記などの潜在的な追加も、ゲームチェンジャーではありません。違いを生むWebプラットフォームへの1つの変更は、WebAssemblyです。 WebAssemblyを使用すると、C/C++/FortranライブラリをコンパイルしてWebブラウザーで実行するのが簡単になります。この回答の時点で、WebAssemblyはSIMDをWebに持ち込むための手段であるように見えますが、潜在的にいくつかの高速化を可能にしますが、焦点は長いのではなく短いSIMDにあるようです。しかし、WebAssemblyを使用しても、数値計算ライブラリをWebに移植することは、コンパイルボタンを押すほど簡単ではありません。数値計算のコードベースは、Webで使用できるようにマッサージする必要があります。その場合でも、ヒープの手動管理など、低レベルの機能の一部をマスクするために、より高レベルのAPIを記述する必要があります。
  • ネイティブアドオン:はい、ノードモジュールはネイティブアドオンとして記述でき、C/C++/Fortranコードをノード内で使用できます。 jsアプリケーション。個人はこの目的のためにライブラリを作成しました。たとえば、 stdlib を参照してください。うまくいけば、Node.jsは、ネイティブ実装を直接使用するのと同等の速度で数値計算を実行できます。
  • 型付き配列:現在のように、数値計算に適しています。 Cと同様に、プールされたバッファを作成して、メモリを効率的に再利用し、パフォーマンスを向上させることができます。さらに、R、Python、Juliaなどの言語と同様に、型付き配列を活用してndarray(別名ストライド配列)インターフェイスを作成できます。 U/Int64整数配列はこの回答の時点では現在利用できませんが、(a)それらの不在はショーストッパーではなく、(b)JavaScriptにU/Int64整数配列を追加するための仕様レベルで提案が進んでいます。構造化型を使用した複雑な数値についても同様です。

私の個人的な信念は、JavaScriptとNode.jsでは何らかの形の数値計算が避けられないということです。利点(ユビキタス、配信、パフォーマンス)および潜在的なアプリケーション(エッジコンピューティング、機械学習の統合、データの視覚化)は、少なくとも基本的なレベルでは、データサイエンスアプリケーションをサポートしない進化の力が強すぎます。

disclosure:私と他の人は現在プロジェクトに取り組んでいます( https://github.com/stdlib-js/stdlib )JavaScriptおよびNode.jsで数値計算機能を提供することを目的としています。

23
kgryte

Googleの TensorFlow.js (以前は https://deeplearnjs.org )があります。これはまさにそれを行い、WebGLを使用してGPUでディープニューラルネットワークをトレーニングする機能を内蔵しています。 。 TensorFlowモデルをポートする にすることもできます。

これがディープラーニングのためだけであると考えて、だまされてはいけません。 GPUアクセラレーションを内蔵した本格的な数値計算プラットフォームです。これは、Tensorflowのような「define then run」モデルではなく、NumPy(およびTensorflow Eager、PyTorchなど)のような熱心な「実行と同時に実行」モデルに従います。そのため、NumPyを以前に使用したことがある人なら誰でも使用するのが自然に感じられます。

非常に有益なGithubリポジトリを次に示します。

https://github.com/tensorflow/tfjs-core (古いリンク https://github.com/PAIR-code/deeplearnjs 現在リダイレクトされます)

12
Jules G.M.

私はこれを試していませんが、 node-lapack を見つけました。 Numpyはblas/lapackを使用してすべてを実行することで速度の大部分を取得するため、これが役立つはずです。 READMEからは、配列オブジェクトもあるように見えます。これは、すべての操作でJSとlapackの間で変換しないことが不可欠です。

デモの一部を次に示します。

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

同じ名前を使用したlapackへの非常に直接的なインターフェースのように思えるので、その点ではNumpyほど便利ではありませんが、少なくとも配列の次元と要素を処理し、ほぼ高速である必要があります(ほとんどの作業はいずれの場合もLapackによって行われます)。

ただし、これはブラウザーでは機能しません。つまり、これが利用できるすべての場所でPythonもおそらく利用可能です。個人的にはPythonに固執します。 、特定のNode機能性Pythonがありません...

7
Mark

ノード作業の大部分は、Webの「フルスタック」ユニバースで行われているようです。高速な数値処理が有利な領域では、作業量がはるかに少なくなっています。

高速な数値処理が有利な分野では、Python、Rなどがおそらく支配的なマインドシェアを持っています。

これらの2つの事実を組み合わせると、ノードの数値処理ライブラリに労力を費やす人が少なくなります。

4
Mark Harrison

私はPyExtJSを開発しています

https://github.com/fernandezajp/PyExtJS

3

Deeplearn.jsに関する@Juliusの答えと同じ精神で、tensorflow.jsは同じプロジェクトの続きです。 REPLのtensorflowモジュールをいじるために、これをグローバルにインストールしました(FYI-通常、これを行わないことをお勧めします)。

$ npm install --global @tensorflow/tfjs

次に、$ nodeノードREPLを開始します。

これは特に異なる場合があります(特にtensorflowをローカルにインストールすることにした場合)が、私はこれを入力してtensorflowモジュールを参照します。

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

ランク1テンソル(numpyの1次元配列に相当)を作成するには、次を試してください。

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

そしてそれを二乗する:

x.square().print()

[9,16]出力用。詳細については、 https://js.tensorflow.org を参照してください。

Tensorflow.jsはnumpyのJS置換であるだけでなく、sklearn、keras、そしてもちろんtensorflowでもあります。

1
scottlittle