見出し画像

Paperspace Notebookインスタンスへのトンネリング通信

Paperspace GradientでWeb UIを実行していると多少気になるのがGradioサーバー(gradio.io, gradio.live)との通信速度が遅い点、たまに通信がロストしてボタンが効かなくなる等のバグが発生する点です。これを解決するにはGradioを使用せずに自前でトンネリング通信を確立し、Notebook内で起動中のWeb UI(http://127.0.0.1:7860)に外部から接続する必要があります。

Cyberes氏が、ratholeを用いてPaperspace Gradientへのトンネリング通信を実現する方法を公開しているので紹介します。

基本的にPaperspace Gradientへの外部からのトンネリング通信は許可されておらず、Paperspaceに該当トラフィックを検出されるとアカウント停止処分を受けることになります。しかしCyberes氏によると独自サーバーでratholeを使えばPaperspaceはトラフィックを検出出来ないとのことでした。

Gradioのリバースプロキシサービスはクソです。WebUIプログラムは、この問題を解決するためにngrokを統合していますが、Paperspaceはngrokのようなトンネリングプロキシサービスを使用するとアカウントをロックします。具体的に禁止されているサービスの数は不明です。

簡単な解決策は存在せず、Paperspaceが把握していない独自のサーバーをホストする必要があります。筆者は、4ドルのDigitalOcean VPS上で「rathole」サーバーを実行しています。

Paperspaceはrathole方法に気づくかもしれませんが、すべての外部接続をブロックし、ratholeトラフィックを検出するためにディープパケット検査を実行しない限り、彼らができることはあまりありません。

Tunneling Proxy for Paperspace

試したところ確かにアカウントがロックされることなく使用出来ているので軽く内容を紹介しておきます。ただし、もしアカウント停止などになった場合にPaperspaceとコンタクトを取り技術的な詳細内容を英語で説明しなければいけません。ネットワークの知識のある方限定、かつ自己責任でお願いします。

使用サーバー

  • AWS Lightsail - 512 MB RAM / 1 vCPU / 20 GB SSD / Ubuntu

グローバルIPアドレスを固定して運用可能であれば何でも可です。私はLightsailで最小構成月額$3.5のインスタンスを別目的で契約していたのでそのまま使用しました。OSはDebian系であれば間違いありません。

ファイアウォールはratholeクライアント(Paperspace)からの接続用にTCP8823番ポートを開放、トンネリングしたサービスへのアクセス用に9001番ポートを開放になります(公開にcloudflaredを使用すれば9001番ポートの開放は不要)。

Lightsail側セットアップ

systemdのユニットファイルなどを用意するのが面倒なのでDocker Composeを使用しました。予めDocker, Docker Composeのインストールが必要です。

ファイル構成

  • rathole/

    • docker-compose.yaml

    • server.toml

キーペアの生成

Private Key はサーバー用、Public Keyはクライアント用です。

$ docker run -it --rm rapiz1/rathole --genkey
Private Key:
sNfhX5ueFn8ez+kUMFnneB4X/R/8q8qNfhjF28y0Mls=

Public Key:
s2QpqpRsgshMmk4WZPC5GuOLCN4LMjBuMxB3xL2G9Gw=

server.toml (rathole設定ファイル)

local_private_key に上記コマンドで生成した Private Key を設定、token は任意のパスワードを設定します。

[server]
bind_addr = "0.0.0.0:8823"

[server.transport]
type = "noise"

[server.transport.noise]
local_private_key = "sNfhX5ueFn8ez+kUMFnneB4X/R/8q8qNfhjF28y0Mls="

[server.services.webui]
token = "use_a_secret_that_only_you_know"
bind_addr = "0.0.0.0:9001"

docker-compose.yaml

version: '3.7'

services:
  rathole:
    image: rapiz1/rathole
    restart: unless-stopped
    volumes:
      - ./server.toml:/app/server.toml
    ports:
      - "8823:8823"
      - "9001:9001"
    command: --server /app/server.toml

起動

restart: unless-stopped としているのでサーバーを再起動しても自動で立ち上がります。

$ cd rathole/
$ docker-compose up -d

停止

$ cd rathole/
$ docker-compose down

Paperspace側セットアップ

ファイル構成

  • /notebooks/rathole/

    • rathole (実行ファイル)

    • client.toml

実行ファイルの取得

sudo apt install unzip
mkdir -p /notebooks/rathole/
LATEST_RELASE=$(curl -s https://api.github.com/repos/rapiz1/rathole/releases/latest | grep browser_download_url | cut -d '"' -f 4 | grep "rathole-x86_64-unknown-linux-gnu.zip")
TMP=$(mktemp -d)
wget "$LATEST_RELASE" -O $TMP/rathole-x86_64-unknown-linux-gnu.zip
sudo unzip $TMP/rathole-x86_64-unknown-linux-gnu.zip -d /notebooks/rathole/
rm -rf $TMP

client.toml (rathole設定ファイル)

remote_addr にLightsailのグローバルIPアドレスを設定(例として192.0.2.1にしています)、remote_public_key にキーペアの生成で得られたPublic Key、
token はサーバーと同じものを設定します。

[client]
remote_addr = "192.0.2.1:8823"

[client.transport]
type = "noise"

[client.transport.noise]
remote_public_key = "s2QpqpRsgshMmk4WZPC5GuOLCN4LMjBuMxB3xL2G9Gw="

[client.transport.tcp]
keepalive_secs = 10
keepalive_interval = 5

[client.services.webui]
token = "use_a_secret_that_only_you_know"
local_addr = "127.0.0.1:7860"

起動

$ /notebooks/rathole/rathole -c /notebooks/rathole/client.toml

rathole起動用にipynbを作成して以下の様なコードブロックを追加しておくと楽です。

!/notebooks/rathole/rathole -c /notebooks/rathole/client.toml
rathole起動用にipynbを作成

接続

webui.py に --port 7860 オプションを付けて起動すると http://127.0.0.1:7860 でweb UIが起動、Lightsailの9001番ポートからweb UIにアクセス可能になります。私はこの方法でAuto-Photoshop-StableDiffusion-Pluginも使用出来ています。

http://127.0.0.1:7860 でWeb UIを起動

cloudflaredの使用

Lightsailでcloudflared(Cloudflare Tunnel)を使用すると9001番ポートの開放が不要になるほか、任意のドメインへの割り当てやTLS化、認証設定なども出来るのでおすすめです(公開ドメインへの割り当てはドメインの保有とCloudflareのNS使用が必要)。なお、Paperspaceでcloudflaredを起動すると即アカウント停止になるので気をつけてください。

Cloudflare Accessでトンネルを追加。設定はダッシュボードで完結し、サーバーでの作業はインストールのみ。
http://localhost:9001 に独自ドメインのFQDNを付与して公開。
独自ドメインからTLSでWeb UIに接続。Gradioより安定動作します。

この記事が気に入ったらサポートをしてみませんか?