ブラウザサイドでNumPyもscikit-learnもできるPython環境「Pyodide」がすごい


Pyodideとは

WASM上にビルドされたPython+NumPyなどのデータ分析ライブラリの実行環境です。

これまでにwebでPythonを使うとしたら、サーバサイドで使うか、BrythonのようなものでJavaScriptにトランスパイルするしかありませんでした。Brythonもajaxができたり結構な数の標準モジュールがサポートされていたりとすごいんですが、仕組み上NumPyのようなCによる低レイヤー拡張を含む外部ライブラリは使えません。

そこに出てきたのがPyodideです。これはWASMで全部まるっとコンパイルしているので、NumPyもscikit-learnも使えます。get startedしたらあまりの簡単さとポテンシャルにひっくり返ったので書いておきます。

github: https://github.com/pyodide/pyodide
ドキュメント: https://pyodide.org/en/stable/

試してみる

クライアントサイドのコードなので、基本的にはhtmlをコピペしてブラウザで開くだけです。公開されているテストコード(https://pyodide.org/en/stable/usage/quickstart.html#alternative-example )をVSCodeでデバッグ実行してみるとこんな感じのシェル機能が立ち上がります。(htmlファイルを保存して直接ブラウザで開こうとしたらメモリが足りないと怒られます。)

これやばくないですか。htmlコピペするだけでPythonシェルが使えるようになるんですよ。condaとかvenvとかで疲弊していたのがアホくさくなります。

上のテキストボックスにコードを書いてRunボタンを押すと実行できます。

NumPyやScikit-learnを使えるようにする

「NumPyやScikit-learnも使えるよ!」となっていますが、このデモコードでimportしようとしてみるとエラーが出ます。

これはネイティブのPythonコードで言うとNumPyがインストールできていない状態になっているからです。html側を修正してloadしてやります。ついでにscikit-learnも試してみましょう。

// 30行目
async function main() {
            let pyodide = await loadPyodide({
                indexURL: "https://cdn.jsdelivr.net/pyodide/v0.18.1/full/",
            });

	    // 追記箇所-------------------------------------
            // モジュールのimport
            await pyodide.loadPackage("numpy");
            await pyodide.loadPackage("scikit-learn");
	    //----------------------------------------------

            output.value += "Ready!\n";
            return pyodide;
        }

これでnumpyやscikit-learn(importするときはsklearn)がimportできるようになり、動きます。

まとめ

クライアントサイドでScikit-learnが動くというのは革命的です。サーバで学習してpickleで固めたオブジェクトをクライアントサイドでばらして推論させたりできそうです。

冒頭でちょろっと言及したBrythonもJS拡張に対応しているので、うまくいけばサーバサイドからフロントエンドまでオールPythonのweb開発ができるんじゃないかなって期待しています。

にしてもhtmlコピペでこんな簡単にPython環境が整うとはびっくりしました。