デモアプリの外部共有とトンネリング
構築した機械学習モデルのデモは、他者にアクセスしてもらって初めて価値を発揮する。Gradioには、Webサーバーを別途用意することなく、ローカルで起動したアプリケーションを一時的にパブリックアクセス可能なURLとして公開する機能が備わっている。
パブリックURLの有効化方法
アプリを外部に公開する設定は非常にシンプルで、launch()メソッドの引数にshare=Trueを追加するだけで完了する。
import gradio as gr
def process_text(user_input):
formatted_result = f"受信した文字列: {user_input}"
return formatted_result
ui_app = gr.Interface(
fn=process_text,
inputs=gr.Textbox(label="入力"),
outputs=gr.Textbox(label="出力")
)
ui_app.launch(share=True)
このスクリプトを実行すると、コンソール上にローカルホストのURLに加え、https://[ランダムなハッシュ].gradio.liveという形式のパブリックURLが出力される。このURLは認証なしで72時間有効であり、誰でもブラウザからデモにアクセス可能になる。
Running on local URL: http://127.0.0.1:7860
Running on public URL: https://a1b2c3d4e5f6.gradio.live
This share link expires in 72 hours. For free permanent hosting and GPU upgrades, run `gradio deploy` from Terminal to deploy to Spaces (https://huggingface.co/spaces)
frpcクライアントの導入
起動時にパブリックリンクの生成に失敗するケースがある。これは、Gradioの共有機能が内部でfrpcというリバースプロキシクライアントを使用しており、環境によってはその実行バイナリが欠落しているためである。エラーメッセージに従い、Hugging FaceのCDNから対象OS用のバイナリをダウンロードし、Gradioのパッケージディレクトリ内の指定パスへリネームして配置することで解決する。
Gradioのトンネリングにおける通信フロー
- パブリックリンクの割り当て: Gradioは外部ネットワークからアクセス可能な一意のURLを生成する。
- frpcによるリバースプロキシ: ローカル環境で動作するfrpcが、Gradioのパブリックサーバーとの間にトンネルを構築する。これにより、パブリックURLへのアクセスがローカルのポートへマッピングされる。
- ローカルサーバーの待受: GradioはローカルでHTTPサーバーを起動しており、frpcを経由して転送されてきたリクエストを待機する。
- 推論と応答: リクエストを受信したローカルサーバーはモデルの推論処理を実行し、結果を即座にトンネルを通じてクライアントに返却する。
- セッションの終了: アプリケーションが停止するか72時間の有効期限が切れると、トンネル用のポートは自動的に閉じられ、リソースが解放される。
FRP(Fast Reverse Proxy)のアーキテクチャ
Gradoの共有機能の根幹をなすFRPは、TCP、UDP、HTTP、HTTPSなど複数のプロトコルに対応した高性能なリバースプロキシソフトウェアである。パブリックIPを持つサーバーで動作するfrps(サーバー)と、プライベートネットワーク上のマシンで動作するfrpc(クライアント)の2つのコンポーネントで構成される。
通信の基本フローは以下の通りである:
frpsがパブリック側のメインポートでクライアントからの接続を待機する。frpcがサーバーに接続し、転送設定(プロトコルやポート番号など)を通知する。frpsはクライアントの要求に基づき、新たにポートを開放してリッスンを開始する。- 外部ユーザーがその開放されたポートへ接続すると、
frpsは確立済みのトンネルを通じてfrpcへデータを転送する。 frpcは受け取ったデータをローカルネットワーク内の対象サービスへ転送し、レスポンスを逆方向に送信することで外部からのアクセスを実現する。
この仕組みを応用することで、カスタムドメインを用いたWebサービスの公開や、SSH接続のトンネリングなど、NAT越えのネットワーク構成を柔軟に構築することが可能である。