We’ve created a Neptune compatibility layer that enables dual-logging to both Neptune and Pluto simultaneously. This allows you to gradually migrate your experiment tracking without disrupting existing workflows.
We are working on a tool to migrate your existing runs from Neptune to Pluto. Interested? Please contact us at [email protected]
Quick Start
Enable dual-logging by adding a single import to your existing Neptune scripts:
import pluto.compat.neptune # Add this line
import neptune # Your existing Neptune import
# Your existing Neptune code works unchanged
run = neptune.init_run(project="my-workspace/my-project")
run["parameters"] = {"lr": 0.001, "batch_size": 32}
run["train/loss"].log(0.5)
run.stop()
That’s it. Your metrics will now log to both Neptune and Pluto.
Configuration
Required Environment Variable
| Variable | Description |
|---|
PLUTO_PROJECT | Master switch that enables dual-logging. Set to your Pluto project name. |
export PLUTO_PROJECT="my-pluto-project"
Optional Environment Variables
| Variable | Description |
|---|
PLUTO_API_KEY | Authentication credentials. Falls back to keyring if not set. |
PLUTO_URL_APP | App endpoint for self-hosted instances |
PLUTO_URL_API | API endpoint for self-hosted instances |
PLUTO_URL_INGEST | Ingest endpoint for self-hosted instances |
DISABLE_NEPTUNE_LOGGING | Set to true to disable Neptune logging entirely (post-sunset mode) |
Supported Operations
The compatibility layer wraps Neptune API calls and translates them to the equivalent pluto calls. Below are the Neptune Run APIs and the corresponding pluto API we monkeypatch against.
import pluto.compat.neptune should be sufficient for sending data to both Neptune and Pluto. The information below is purely informational about which APIs we have wrapped.
These were tested against neptune-scale==0.30.0
Initialization
| Neptune | pluto |
|---|
neptune.init_run(project="workspace/project") | run.init(project="project") |
Configs
| Neptune | pluto |
|---|
run.log_configs({"lr": 0.001}) | run.update_config({"lr": 0.001}) |
Metric Logging
| Neptune | pluto |
|---|
run["train/loss"].log(0.5) | run.log({"train/loss": 0.5}) |
run["train/loss"].log(0.5, step=100) | run.log({"train/loss": 0.5}, step=100) |
run["parameters"] = {"lr": 0.001} | pluto.log({"parameters": {"lr": 0.001}}) |
File and Image Logging
| Neptune | pluto |
|---|
run["images"].upload("path/to/image.png") | run.log({"images": pluto.Image("path/to/image.png")}) |
run["artifacts"].upload_files("path/to/file") | run.log_file("path/to/file") |
| Neptune | pluto |
|---|
run.add_tags(tags=["experiment-v1"]) | run.add_tags(["experiment-v1"]) |
Tags are synchronized to the Pluto server and can be used to filter and organize runs in the dashboard.
Histograms
| Neptune | pluto |
|---|
run["distributions/weights"].log(histogram_data) | run.log({"distributions/weights": pluto.Histogram(histogram_data)}) |
Post-Sunset Mode
When you’re stop sending data to Neptune, set the kill switch:
export DISABLE_NEPTUNE_LOGGING=true
This converts your code to Pluto-only mode without requiring any code changes. All Neptune API calls will be intercepted and redirected to Pluto.