「Jupyter APIを使用してノートブックをスケジュールして呼び出す」

Using Jupyter API to schedule and call notebooks

サーバーレスクラウドサービス、例えばGCP CloudRunnerやCloud Functionsのおかげで、ノートブックをデプロイし定期的に実行するために、高価な仮想マシンやサーバーを管理する必要はありません。Jupyter APIを使用することで、ノートブックをクラウドに移行し、Webサービスに変換し、スケジューリングと統合することができます。

著者によって指示されたMidJourneyによって生成されたクラウドでスケジュールされたPythonノートブック

ただし、最も一般的に使用されるアプローチ(Vertex AIやSageMakerのようなクラウドネイティブサービスを使用していない限り)は、nbconvertを使用してノートブックをPythonコードに変換し、それを新しくブートストラップされたTornadoまたはFlaskのカスタムWebアプリケーションに追加することです。

著者によるPythonノートブックの従来のコンテナ化

これにはいくつかのコーディングと外部ライブラリが含まれますが、良いニュースは、Jupyter開発コンテナにコードを残しておいて、Jupyter Rest APIを使用して直接トリガーできるということです。

Web APIを介してノートブックにアクセスする

Jupyter APIの使用方法の詳細に入る前に、アーキテクチャがどのように機能するかを示します。まず、テストに使用する簡単なノートブックを取り上げましょう。

「すべてがうまくいけば「15」と返すシンプルなテストノートブック

Jupyterを使用してローカルで実行するための最も簡単な方法は、Jupyter Labコンテナで実行することです:

# テストワークブックのダウンロードwget https://raw.githubusercontent.com/tfoldi/vizallas/main/notebooks/JupyterAPI_Test.ipynb# トークン認証を使用して新しいJupyter Labインスタンスを生成します(XSRFなし)docker run -it --rm -p 8888:8888 \  -e JUPYTER_TOKEN=ab30dd71a2ac8f9abe7160d4d5520d9a19dbdb48abcdabcd \  --name testnb -v "${PWD}":/home/jovyan/work jupyter/base-notebook \  jupyter lab --ServerApp.disable_check_xsrf=true

サービスが開始されると、JUPYTER_TOKEN環境変数で渡されたトークンを使用して、http://127.0.0.1:8888/lab/tree/workでノートブックにアクセスできるようになります。

コマンドラインからノートブックを呼び出す

コマンドラインからは、この小さなスクリプトをダウンロードすることができます(requestswebsocket-clientパッケージが必要です)またはDockerコンテナを介して実行することができます:

# 以前に開始した「testnb」コンテナのIPアドレスを確認しますdocker inspect testnb | grep IPAddress            "SecondaryIPAddresses": null,            "IPAddress": "172.17.0.2",                    "IPAddress": "172.17.0.2",# ノートブックを呼び出します。以下のIPアドレスを前の手順で取得したものに置き換えてください。docker run -it --rm \  -e JUPYTER_TOKEN=ab30dd71a2ac8f9abe7160d4d5520d9a19dbdb48abcdabcd \  tfoldi/jupyterapi_nbrunner 172.17.0.2:8888 /work/JupyterAPI_Test.ipynbhttp://172.17.0.2:8888/api/kernelsに新しいカーネルが作成されました各セルに対して実行リクエストを送信します{'data': {'text/plain': '15'}, 'execution_count': 3, 'metadata': {}}処理が終了しました。WebSocket接続を閉じますカーネルを削除します

このスクリプトは、新しく作成したJupyterLabサーバーに接続し、ノートブックを実行し、最後のセルの結果を返し、その後終了します。ノートブックのコードや追加のライブラリの修正は必要ありませんで、Webプロトコルを介して手順全体が行われます。

内部機構

残念ながら、Jupyter APIにはノートブックを完全に実行するための単一のエンドポイントはありません。まず、新しいカーネルを初期化するか(または既存のカーネルを使用するか)、ノートブックのメタデータを取得し、すべてのコードセルを取得し、それぞれに対してexecute_requestを送信する必要があります。

結果を取得するためには、WebSocketチャネルでの受信メッセージを監視する必要があります。すべてのコードの実行が終了する「すべてのコードの実行終了」メッセージがないため、実行に送ったコードブロックの数と実際に完了した数を手動で追跡する必要があります。これは、execute_replyタイプのメッセージを数えることで行います。すべての実行が完了した後、カーネルを停止するか、将来の実行のためにアイドル状態にしておくことができます。

次の図は完全なフローを示しています:

Rest APIを使用してJupyterノートブックを実行する手順。ノートブックレベルのアクションはRest APIを使用し、セルレベルの呼び出しはWebSocketsで行います。画像の提供:作者

認証された状態を維持するために、すべてのHTTPおよびWebSocketの呼び出しにAuthorizationヘッダーを渡す必要があります。

ノートブックを実行するためにやや冗長な手順のように感じるかもしれませんが、理解します。Jupyter Server内に複雑さを減らすための高レベルの関数を実装することは有用であると思います。

完全なスクリプトはこちらにあり、アプリケーションで使用する準備ができています。

GCPでワークブックを無料(ほぼ無料)でスケジュールする

ノートブックをホストするための多くのオプションがありますが、最も費用対効果の高い方法はGoogle CloudのCloud Runサービスを活用することです。Cloud Runでは、ジョブの実行時間のみを支払うため、頻繁にトリガーされないタスクや追加のパッケージや追加のSaaSベンダー(Google以外)を必要としない場合には、コスト効率の良い選択肢となります。また、一行のコードも書かずに済みます。

アーキテクチャと呼び出しのフローは次のようになります:

コストを抑えるためにサーバーレスサービスのみを使用します。画像の提供:作者

まず、GCP Cloud Runにノートブックをデプロイする必要があります。Cloud Runサービスにファイルを追加するための複数の方法がありますが、最も簡単な方法の1つは、ノートブックをDockerコンテナにコピーすることです。

# Jupyter Server上でノートブックをホストするためのシンプルなDockerfileFROM jupyter/base-notebookCOPY JupyterAPI_Test.ipynb /home/jovyan/workspaces/

ビルドしてコンテナをCloud Runで利用できるようにするには、gcloud run deploy--sourceオプションを指定し、ノートブックとDockerfileが保存されているディレクトリを指定するだけです。

# JupyterノートブックとDockerfileのソースコードを取得するgit clone https://github.com/tfoldi/jupyterapi_nbrunner.git# テストノートブックをjupyter/base-notebookコンテナにデプロイする # DockerfileとJupyterAPI_Test.ipynbファイルはtests/test_notebookフォルダにありますgcloud run deploy test-notebook --region europe-west3 --platform managed \  --allow-unauthenticated --port=8888 \  --source tests/test_notebook \  --set-env-vars=JUPYTER_TOKEN=ab30dd71a2ac8f9abe7160d4d5520d9a19dbdb48abcdabcd   [...]Service [test-notebook] revision [test-notebook-00001-mef] has been deployed and is serving 100 percent of traffic.Service URL: https://test-notebook-fcaopesrva-ey.a.run.app

JupyterLabはサービスURLで利用可能です。Google Cloud RunはSSL証明書と、要求に応じて展開を開始または一時停止するメカニズムを提供します。

Cloud Schedulerから新しくデプロイされたノートブックをトリガーするためには、PubSubトピックに紐づけられたCloud Functionを作成する必要があります。次のコマンドは、このリポジトリからmain.pyrequirements.txtをデプロイします。 main.pyは、以前にコマンドラインからコードをトリガーするために使用したスクリプトと同じです。

# https://github.com/tfoldi/jupyterapi_nbrunner.gitのコンテンツをクローンしたディレクトリと同じディレクトリにいることを確認してください gcloud functions deploy nbtrigger --entry-point main --runtime python311 \  --trigger-resource t_nbtrigger --trigger-event google.pubsub.topic.publish \  --timeout 540s --region europe-west3 \  --set-env-vars=JUPYTER_TOKEN=ab30dd71a2ac8f9abe7160d4d5520d9a19dbdb48abcdabcd

次は、適切なパラメータを持つメッセージをt_nbtriggerトピックに送信して、新しいCloud Functionをテストしてみましょう。コマンドラインと同様に行います。

gcloud pubsub topics publish t_nbtrigger \  --message="test-notebook-fcaopesrva-ey.a.run.app:443        /workspaces/JupyterAPI_Test.ipynb --use-https"

nbtrigger Cloud Functionのログを確認すると、トピックへのレコードの送信がノートブックの実行をトリガーしたことがわかるかもしれません。

The logs show the successful execution of our notebook. Image by the author.

最後のステップは、指定した時間に実行されるスケジュールを作成することです。この場合、ノートブックを毎時実行します。

gcloud scheduler jobs create pubsub j_hourly_nbtrigger \  --schedule "0 * * * *" --topic t_nbtrigger --location europe-west3 \  --message-body "test-notebook-fcaopesrva-ey.a.run.app:443 /workspaces/JupyterAPI_Test.ipynb --use-https --verbose"   

準備完了です-最初のJupyter Notebookをサーバーレスでスケジュールしました。

CloudRun automatically shuts down our container after the job execution. The “idle” state is also free of charge in case we do not specify min-instances.

私たちのノートブックは1日にわずか数セントしか消費せず、このデプロイ方法はGoogle Cloudで最も費用効果の高い方法の1つです。

After few days of execution the costs are around three cents.

結論

以前は、JupyterノートブックをPythonコードに変換してクラウドネイティブツールで利用したり、Vertex AIやSageMakerのようなより複雑で高価なサービスを利用する必要がありました。しかし、Jupyter Rest APIを利用してノートブックとその「開発環境」をデプロイすることで、余分な手順を省略し、ノートブックに対してWebサービス呼び出しやスケジューリングを可能にすることができます。

このアプローチは、大規模なプロジェクトやコンピュートに重い長時間実行のノートブックには適していませんが、ホームオートメーションや趣味のプロジェクトなどでは、インフラストラクチャに(過)多額の費用をかけずに十分に利用できます。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

機械学習

「CREATORと出会ってください:ドキュメントとコードの実現を通じて、LLMs自身が自分のツールを作成するための革新的なAIフレームワーク」

大規模言語モデル(LLMs)は、最近の数年間で大きな進歩を遂げています。GPT-3、Codex、PaLM、LLaMA、ChatGPT、そしてより現...

機械学習

AIの聴覚スキルを革命化する:清華大学とバイトダンスが、高度なオーディオ処理のための画期的なマルチモーダルニューラルネットワーク「SALMONN」を発表

さまざまな自然言語処理アプリケーションでは、テキストベースの大規模言語モデルが印象的であり、人間に近いパフォーマンス...

機械学習

Amazon Lexの新しい生成AI機能で、セルフサービスアシスタントを向上させましょう

この投稿では、生成AIが会話型AI業界を変えて、新しい顧客とボットビルダーの体験を提供し、これらの進歩を活用するアマゾン...

AIニュース

マルチモーダルAIがデジタルのつながりを作り出す

「複数の要素とデータストリームを組み合わせることにより、マルチモーダルAIはよりスマートで人間らしいシステムの可能性を...

データサイエンス

進歩のために曲を作るためのデータ利用

シニアのアナニヤ・グルムルシは、音楽の才能を数学とコンピューターサイエンスの学習に加え、データを社会変革のために利用...