Skip to main content

Ferry

Run your Hunch experiments on a GPU machine, and bring every run home.

ferry add mybox user@gpu-box
ferry run --on mybox -m "bigger batch on the 3090" -- python train.py

Ferry sends your code to the machine, builds the environment there, starts the run so it survives a dropped connection, and copies it back into .hunch/ while it trains. hunch log and the PyCharm and VS Code plugins show it like any other run.

Status: 0.1, for your own machines over SSH. Part of Sigmoid IDE.

Install

pip install sigmoid-ferry

That gives you the ferry command, with Hunch. It also installs as a tool of its own: uv tool install sigmoid-ferry.

What the machine needs

Linux (x86_64 or aarch64), SSH and python3. Nothing is installed system-wide: Ferry keeps everything in ~/.ferry, including uv, which it downloads once and checks against a pinned checksum.

Running

ferry add shows the machine's host key the first time and pins it; a changed key stops Ferry until you remove the old one. Ferry uses your SSH setup as it is: ~/.ssh/config (with ProxyJump for a machine behind a jump host), your keys and ssh-agent. A key with a passphrase is asked for in the terminal.

ferry run records the run on your computer first (code, git branch, the run it builds on), then:

  • builds the environment on the machine from requirements.txt, or else from the packages in the project's own Python (an activated environment, or .venv), with torch matched to the machine's driver. Each environment is built once and reused;
  • sends only the code files the machine does not have yet;
  • starts the run in the same project folder you started it from, so relative paths work;
  • copies the run home while it trains, and checks every file when it ends.

Tokens and GPUs

Give a run what it needs from your environment with --env, and pick its GPUs with --gpus:

ferry run --on mybox --env HF_TOKEN --env WANDB_MODE=offline --gpus 1 -- python train.py

--env NAME sends the value NAME has here, so a token is never typed out or left in your shell history. It is handed to the run in memory and never saved in a file, on the machine or in .hunch/. --gpus takes the numbers nvidia-smi shows. Ferry refuses a GPU the machine does not have, which CUDA would answer by quietly running on the CPU, and says when another program already uses a GPU the run gets.

Data and outputs

Only your code goes to the machine on its own. Send data with --data:

ferry run --on mybox --data data/ -- python train.py

Data goes into a folder the project keeps on the machine and appears in every run's folder at the same path, so open("data/train.bin") works there as it does here. It is sent once: next time only new or changed files go.

What a run writes (checkpoints, plots) stays on the machine. Ferry lists it when the run ends; bring it home with:

ferry pull a7f3                       # what run a7f3 wrote
ferry pull a7f3 checkpoints --to out/

When the connection drops

The run keeps going. Ctrl+C stops copying, never the run. ferry attach a7f3 picks the copy up again, ferry stop a7f3 stops the run (and everything it started; after 30 seconds it is killed), and ferry ps asks each machine how its runs are doing. A run whose process on the machine dies without an end is marked crashed. If a machine is gone for good, ferry forget a7f3 stops counting its run as running, and Hunch shows it as lost; should the machine come back, ferry attach a7f3 picks the run up again.

Disk space

ferry clean mybox             # environments no run has asked for in 14 days
ferry clean mybox --outputs   # and what this project's ended runs wrote there, except runs you marked keep

Both say what they would remove and how much space that frees, and ask first. An environment is built again when a run needs it.

What stays where

Nothing secret goes into .hunch/ or to the machine: no keys, no passwords. Tokens passed with --env exist only in the run's memory. Ferry's own settings (the machines you added and their host keys) are in %APPDATA%\ferry on Windows and ~/.config/ferry elsewhere.

Metadata

Release files for sigmoid-ferry 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for sigmoid-ferry 0.1.1
File Size Uploaded Provenance Actions
sigmoid_ferry-0.1.1.tar.gz 37.3 kB Without provenance Details for sigmoid_ferry-0.1.1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for sigmoid-ferry 0.1.1
File Interpreter ABI Platform Actions
sigmoid_ferry-0.1.1-py3-none-any.whl Python 3 none any Details for sigmoid_ferry-0.1.1-py3-none-any.whl

Total release size: 80.0 kB

Release files / sigmoid_ferry-0.1.1.tar.gz

Download URL sigmoid_ferry-0.1.1.tar.gz
Size 37.3 kB
Tags Source
SHA-256 checksum
How to use checksums
fa4b61465205aa7d2a40af7a0c4d7f666383ea4b23d8b0c61d5c52899696d723
BLAKE2b-256 checksum
How to use checksums
f0edc08aaf8641ddb54b2361684a7539e1982371fe0bccb3d1d03070f1befba6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / sigmoid_ferry-0.1.1-py3-none-any.whl

Download URL sigmoid_ferry-0.1.1-py3-none-any.whl
Size 42.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e007176852d62d5c4e98b20a4a112d6059fa6daa672b173a9a680bfd6ff15796
BLAKE2b-256 checksum
How to use checksums
103245402a4e27377d80648eb744c1fed0e3fca81a5b340264569f4cdbc46f99
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for sigmoid-ferry 0.1.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page