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)
| 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)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| 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.