Streamlit ウェブサイト: https://streamlit.io/ GitHub アドレス: https://github.com/streamlit/streamlit/ 300 行の Python コードで、ニューラル ネットワーク推論をリアルタイムで実行するセマンティック検索エンジンをプログラムします。
私の経験では、重要な機械学習プロジェクトはすべて、バグが多く、メンテナンスが難しい内部ツールの組み合わせを使用して構築されてきました。これらのツールは通常、Jupyter Notebook や Flask アプリで記述されており、デプロイが難しく、クライアント サーバー アーキテクチャ (C/S アーキテクチャ) に関する推論が必要であり、Tensorflow GPU セッションなどの機械学習コンポーネントとうまく統合されません。
私がこの種のツールを初めて目にしたのはカーネギーメロン大学で、その後はバークレー、Google X、Zoox でも目にしました。これらのツールは、センサー キャリブレーション ツール、シミュレーション比較アプリ、LIDAR アライメント アプリ、シーン再構築ツールなど、小さな Jupyter ノートブックとして始まりました。
ツールの重要性が増すと、プロジェクト マネージャーが関与するようになり、プロセスと要件が増加し続けます。これらの個々のプロジェクトはコード スクリプトになり、徐々に長期にわたるメンテナンスの悪夢へと発展していきました...
機械学習エンジニアによるアプリ作成プロセス(アドホック)。
そして、ツールが重要な場合は、ツール チームを編成します。彼らは、ラップトップに宣言型フレームワークのステッカーを貼りながら、Vue と React を流暢に書いています。設計プロセスは次のとおりです。
ツール チームがアプリを構築するプロセス (クリーンで整然と、ゼロから)。
これは本当に素晴らしいです!しかし、これらすべてのツールには、毎週のように新しい機能がリリースされるような新しい機能が必要です。一方、ツール チームは一度に 10 件以上のプロジェクトをサポートしている可能性があり、「2 か月以内にツールを更新します」と言うことがあります。
私たちは、Flask アプリをデプロイし、HTML、CSS、JavaScript を記述し、ノートブックからスタイルシートまですべてをバージョン管理するという、独自のツールを構築するプロセスに戻りました。 Google X の友人 Thiago Teixeira と私は、ツールの構築が Python スクリプトを書くのと同じくらい簡単だったらどうなるだろうと考え始めました。
私たちは、機械学習エンジニアがツールチームなしで優れたアプリを構築できるようにしたいと考えています。これらの内部ツールは、機械学習ワークフローの副産物として自然に生まれるはずです。このようなツールを書くのは、ニューラル ネットワークをトレーニングしたり、Jupyter でアドホック分析を実行したりするのと同じような感覚です。同時に、強力なアプリ フレームワークの柔軟性を維持したいと考えました。私たちはエンジニアが誇りに思える素晴らしいツールを作りたいと考えています。
私たちは、Uber、Twitter、Stitch Fix、Dropbox などのエンジニアと協力し、機械学習エンジニア向けの無料のオープンソース アプリ フレームワークである Streamlit を 1 年かけて作成しました。どのようなプロトタイプであっても、Streamlit の基本原理はよりシンプルで純粋です。
Streamlit アプリは、隠れた状態がなく、上から下まで完全に実行されるスクリプトです。関数呼び出しを使用してコードを操作できます。 Python スクリプトを書くことができれば、Streamlit アプリを書くこともできます。たとえば、次のように画面に書き込むことができます。
import streamlit as stst.write( 'Hello, world!' )
Streamlit にはコールバックはありません。各インタラクションでは、スクリプトを上から下へ単純に再実行します。このアプローチにより、非常にクリーンなコードが作成されます。
import streamlit as stx = st.slider( 'x' )
st.write(x, 'squared is' , x * x)
3 行のコードで書かれた Streamlit インタラクティブ アプリ。大量のデータをダウンロードしたり、複雑な計算を実行したりしたい場合はどうすればよいでしょうか?重要なのは、複数の実行にわたって情報を安全に再利用することです。 Streamlit は、Streamlit アプリが情報を簡単かつ安全に再利用できるようにする、永続的でデフォルトで不変のデータ ストレージとして機能するキャッシュ プリミティブを導入します。たとえば、次のコードは、Udacity 自動運転車プロジェクト (https://github.com/udacity/self-driving-car) からデータを 1 回だけダウンロードし、シンプルで高速なアプリを取得できます。
Streamlit の複数回の実行間でデータを保存するには、st.cache を使用します。コードの実行手順については、https://gist.github.com/treuille/c633dc8bc86efaa98eb8abe76478aa81#gistcomment-3041475 を参照してください。
上記の st.cache の例を実行したときの出力。
簡単に言うと、Streamlit のワークフローは次のようになります。
- 各ユーザー操作では、スクリプト全体を最初から実行する必要があります。
- Streamlit はウィジェットの状態に基づいて各変数に最新の値を割り当てます。
- キャッシュにより、Streamlit はデータと計算を再利用できるようになります。
ユーザー イベントにより、Streamlit はスクリプトを最初から再実行します。実行間ではキャッシュのみが保持されます。興味があればすぐに試せます!次の行を実行するだけです: Web ブラウザが自動的に開き、ローカルの Streamlit アプリにリダイレクトされます。ブラウザ ウィンドウが表示されない場合は、リンクをクリックしてください。
これらのアイデアはシンプルですが効果的であり、Streamlit を使用しても機能豊富で便利なアプリを作成できるという利点があります。 Zoox と Google X に在籍していたとき、自動運転車プロジェクトが、パフォーマンスを比較するために画像データ上でモデルを実行するなど、検索して理解する必要があるギガバイト単位の視覚データにまで拡大していく様子を見てきました。私がこれまでに見た自動運転車プロジェクトでは、すべてチーム全体がこのツールの開発に取り組んでいました。 Streamlit でこのようなツールを構築するのは非常に簡単です。次の Streamlit デモでは、Udacity の自動運転車の写真データセット全体に対してセマンティック検索を実行し、人間が注釈を付けたグラウンド トゥルース ラベルを視覚化し、アプリ内で完全なニューラル ネットワーク (YOLO) をリアルタイムで実行します。
この Streamlit デモは、セマンティック ビジュアル検索とインタラクティブ ニューラル ネットワーク推論を 300 行のコードに組み合わせています。
アプリ全体の Python コードは 300 行のみで、そのほとんどは機械学習コードです。実際、アプリ全体で Streamlit コールは 23 件しかありません。以下を試すことができます: 機械学習チームとプロジェクトに携わる中で、私たちはこれらのシンプルなアイデアが多くの重要なメリットをもたらすことに気付きました。 Streamlit アプリは純粋な Python ファイルです。お好みのエディターとデバッガーを使用できます。
VSCode エディター (左) と Chrome (右) は、Streamlit を使用してアプリを構築するための私のお気に入りのエディターです。
純粋な Python コードは、コミット、プル リクエスト、問題、コメントなど、Git などのソース コード管理ソフトウェアとシームレスに接続できます。 Streamlit の基盤となる言語は Python なので、これらの共同作業ツールを無料で利用できます。
Streamlit アプリは Python スクリプトなので、Git を使用してバージョン管理を簡単に実行できます。
Streamlit は即時モードのプログラミング環境を提供します。 Streamlit がソース ファイルの変更を検出した場合は、[常に再実行] をクリックするだけです。
リアルタイムプログラミングを確実に行うには、「常に再実行」をクリックします。
キャッシュにより計算プロセスが簡素化されます。キャッシュ関数のチェーンにより、効率的な計算プロセスが自動的に作成されます。次のコードを試すことができます:
Streamlit での簡単な計算プロセス。上記のコードを実行し、手順を確認してください: https://gist.github.com/treuille/ac7755eb37c63a78fac7dfef89f3517e#gistcomment-3041436。
基本的に、このプロセスには、メタデータの読み込みからサマリーの作成までのステップ (load_metadata → create_summary) が含まれます。スクリプトが実行されるたびに、Streamlit はフローのサブセットのみを再計算する必要があります。
アプリの実行可能性を確保するために、Streamlit は UI を更新するために必要なものだけを計算します。
Streamlit は GPU 上で動作します。 Streamlit は、マシンレベルのプリミティブ (TensorFlow、PyTorch など) に直接アクセスし、これらのライブラリを補完できます。たとえば、次のデモでは、Streamlit のキャッシュに NVIDIA PGGAN 全体が保存されます。このアプローチにより、ユーザーが左のスライダーを更新したときに、アプリはほぼ瞬時に推論を実行できます。
この Streamlit アプリは、TL-GAN を使用した NVIDIA PGGAN の効果を示します。
Streamlit は、独自の Web アプリではなく、無料のオープン ソース ライブラリです。事前にご連絡いただくことなく、Streamlit アプリをローカルに展開できます。インターネットに接続せずに、ラップトップ上で Streamlit をローカルに実行することもできます。さらに、既存のプロジェクトでも Streamlit を段階的に使用できます。
Streamlit を段階的に使用するいくつかの方法。
上記は、Streamlit の機能のほんの一部です。最も興味深いのは、これらのプリミティブによって複雑なアプリを簡単に形成できるにもかかわらず、単純なスクリプトのように見えることです。これにはアーキテクチャの動作原理と機能が含まれますが、この記事では説明しません。
Streamlit コンポーネントの図。
私たちは Streamlit をコミュニティと共有できることを嬉しく思っており、Streamlit が Python スクリプトを美しく便利な機械学習アプリに簡単に変換するのに役立つことを願っています。