Skip to main content

Execute code on a remote JupyterHub kernel from any terminal — zero dependencies.

Project description

jupyterhub-exec

Execute code on a remote JupyterHub kernel from any terminal — zero external dependencies.

pip install jupyterhub-exec

Why

JupyterHub provides GPU compute. Your agent terminal does not. jh-exec bridges the two using the Jupyter kernel protocol over a raw WebSocket — no browser, no notebook UI, no library dependencies beyond the Python standard library.

┌─────────────────────────┐        WebSocket         ┌──────────────────────────┐
│   Agent Terminal (CPU)  │ ───────────────────────► │  JupyterHub Kernel (GPU) │
│   Claude Code / CLI     │ ◄─────────────────────── │  PyTorch / CUDA          │
└─────────────────────────┘        stdout stream      └──────────────────────────┘

Usage

# Execute a script on the remote GPU kernel
jh-exec run train.py

# Execute inline code
jh-exec exec "import torch; print(torch.cuda.is_available())"

# List running kernels
jh-exec kernels

# Start a new kernel
jh-exec new-kernel

Configuration

Set via environment variables or a .env file in the working or home directory:

Local GPU server (HTTP):

JH_HOST=192.168.1.100
JH_PORT=8000
JH_USER=agent-01
JH_TOKEN=your_token_here
JH_SSL=false
JH_TIMEOUT=600

Public JupyterHub (HTTPS):

JH_HOST=hub.example.com
JH_PORT=443
JH_USER=agent-01
JH_TOKEN=your_token_here
JH_SSL=true
JH_TIMEOUT=600

Or pass directly:

jh-exec --host hub.example.com --port 443 --ssl --user agent-01 --token your_token run script.py

Python API

from jh_exec import execute, list_kernels, new_kernel

# Execute code, stream output to stdout
execute("import torch; print(torch.cuda.get_device_name(0))")

# List running kernels
kernels = list_kernels()

# Start a new kernel, get its ID
kid = new_kernel()

Dedicated GPU per agent

In jupyterhub_config.py:

def assign_gpu(spawner):
    gpu_map = {
        "agent-01": "0",
        "agent-02": "1",
        "agent-03": "2",
    }
    spawner.environment["CUDA_VISIBLE_DEVICES"] = gpu_map.get(spawner.user.name, "")

c.Spawner.pre_spawn_hook = assign_gpu

Benchmark

Validated on NVIDIA GeForce GTX TITAN X via gpu_demo.py:

GPU: NVIDIA GeForce GTX TITAN X  (11.9 GiB)  torch 2.5.1+cu121
8192x8192 matmul: 235.9 ms  (4.7 TFLOP/s)
checksum: 890989.3125
allocated: 776 MiB

Full GPU offload from a Claude Code terminal — zero local GPU, zero dependencies.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

jupyterhub_exec-0.1.1.tar.gz (8.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

jupyterhub_exec-0.1.1-py3-none-any.whl (8.4 kB view details)

Uploaded Python 3

File details

Details for the file jupyterhub_exec-0.1.1.tar.gz.

File metadata

  • Download URL: jupyterhub_exec-0.1.1.tar.gz
  • Upload date:
  • Size: 8.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.2

File hashes

Hashes for jupyterhub_exec-0.1.1.tar.gz
Algorithm Hash digest
SHA256 0383639e8c75fb9027c6c22467bb68251db5f0308ca19b3e4e43f8a180536ebe
MD5 bcf65cb9ba3ce08ea5354c7c7e3827c0
BLAKE2b-256 29055de6776b377b3c47785011c4b1574905d7269801ca4112b7fc6ae89762ef

See more details on using hashes here.

File details

Details for the file jupyterhub_exec-0.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for jupyterhub_exec-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 c97c16e25cfd3eb8e425a252ae68a8539fff3bff988c2e00e653bc761c908495
MD5 a24a9197566dea5291a814f9a70f1bbe
BLAKE2b-256 3cfdfe19e8ff6d121d41e0c65c286f2e29fe3903c77d4aaca932d7d59c4de49d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page