Skip to content

Commit beca285

Browse files
authored
Release/v0.16.1 (#278)
1 parent 61838ae commit beca285

15 files changed

Lines changed: 75 additions & 22 deletions

CHANGELOG.md

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,61 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/).
1313
- Fixed for any bug fixes.
1414
- Security in case of vulnerabilities.
1515

16+
17+
## [v0.16.1]
18+
19+
### Additions
20+
- `rapidfireai/utils/mode_utils.py`: `get_installed_mode()` and `assert_mode_matches()` helpers for validating the installed RapidFire mode (`$RF_HOME/rf_mode.txt`).
21+
- New RF_API_WORKERS / RF_API_WORKER_CLASS / RF_API_THREADS / RF_API_TIMEOUT / RF_API_GRACEFUL_TIMEOUT / RF_API_KEEPALIVE env vars on DispatcherConfig to tune the dispatcher gunicorn server.
22+
- New include_decoded_config flag on RFDatabase.get_pipeline* / get_all_pipelines so HTTP callers can skip the expensive (and SIGSEGV-prone) dill decode of FAISS / embedder blobs.
23+
- Autopilot/chat-agent clone path now stamps requests with source: "autopilot" and refuses to launch a clone whose effective config duplicates an existing run.
24+
- Per-step intermediate checkpoint folders (`checkpoint-<step>`) for `save_strategy="chunk"`, preserving one snapshot per chunk.
25+
- Configurable eval generation via `generation_config`: `max_input_length`, `add_generation_prompt`, and `truncation_side`.
26+
- New `Status` column on the experiment runs table (pinned left after Run Name) showing dispatcher-vocabulary lifecycle state with per-state color.
27+
- New `Shards` column showing live shard / chunk progress (`current/total`) for both evals (per-shard) and fit (per-chunk-per-epoch) runs.
28+
- New mutable MLflow tags `rapidfire.progress.current` and `rapidfire.progress.total` emitted by both the fit and evals controllers; `MetricLogger.set_tag()` API across all backends.
29+
- Stranded-run recovery (`rf_db.py` `reset_all_tables` path) now also terminates orphaned MLflow runs as `FAILED`.
30+
- New unit-test suite `tests/test_mlflow_status_parity.py` covering every status-parity transition, idempotency path, and the new helpers.
31+
32+
### Changes
33+
- Experiment now validates that the installed mode matches the requested mode at initialization — before Ray/DB setup — blocking early with a clear, actionable error on a mismatch instead of silently producing a dead IC Ops panel.
34+
- `doctor` reads the installed mode via `get_installed_mode()` (single source of truth).
35+
- Dispatcher gunicorn defaults switched from sync worker to gthread (4 threads, 120 s timeout, 5 s keepalive) for both evals/ and fit/ dispatchers to survive long-lived polling connections.
36+
- HTTP polling endpoints (/get-all-pipelines, /get-all-runs, /get-pipeline, IC validate calls) no longer dill-decode the pipeline_config blob; get_all_runs recovers per-row instead of failing the whole poll.
37+
- Frontend proxy strips hop-by-hop headers, returns 502 for upstream failures, and absorbs ChunkedEncodingError / ProtocolError mid-stream instead of logging tracebacks.
38+
- Eval generation now left-pads and forwards an explicit `attention_mask`; input truncation length is derived from the tokenizer/model instead of a fixed 512 tokens.
39+
- Worker reads the user's `save_strategy` as the single source of truth; training args use a shallow copy so the `"chunk"` sentinel is preserved on `config_leaf`.
40+
- Changed default behavior for `rapidfireai init` to be `--evals`, to do training use `rapidfireai init --train`
41+
- Pin datasets==3.6.0 and pyarrow>=18.1.0
42+
- Remove output from rag-fiqa notebook
43+
- Dashboard relabels MLflow's native enum to the dispatcher's vocabulary across the experiment runs table and the run detail page: `Finished``COMPLETED`, `Killed``STOPPED`, `Running``ONGOING`, `Scheduled``NEW`.
44+
- `KILLED` (dispatcher `STOPPED`) now renders with a `StopCircleIcon` in warning amber instead of the red error icon used for `FAILED` — an intentional halt is no longer visually conflated with a failure.
45+
- `DateCellRenderer` no longer prefixes the timestamp with the run-status icon (the new `Status` column owns that signal).
46+
- `experiment_utils.create_experiment` / `end_experiment` and `MLflowMetricLogger.clear_context()` now read the active run's server-side status before calling `mlflow.end_run()` so a terminal state already set by the controller / worker / IC handler is preserved instead of being overwritten with `FINISHED`.
47+
- RunFit Notebooks updated with param mode='fit'
48+
49+
### Fixes
50+
- A missing `rf_mode.txt` no longer blocks `run_fit()`; it now defaults to fit mode, matching the dispatcher startup default (`run_evals()` remains correctly blocked in that case).
51+
- Fixes dispatcher worker WORKER TIMEOUT / "no URI read" SIGKILLs caused by the sync worker blocking on keep-alive sockets.
52+
- Fixes dispatcher worker SIGSEGVs when the autopilot polling loop re-hydrated ~25 FAISS-bearing pipeline blobs per poll.
53+
- Fixes Converge autopilot launching byte-identical duplicate clones and silently dropping cloned runs because their flattened_config was empty.
54+
- Fixes AttributeError in _transform_pipeline_to_run when SQLite returned NULL for string columns (.get(key, "") doesn't apply the default to None values).
55+
- Optuna label building no longer crashes on `dict`/`None` categorical knob choices (#268).
56+
- Optuna leaf configs now carry the `pipeline` key so the controller can launch them (#268).
57+
- Query actor reuses its inference engine only when it actually exists, fixing `AttributeError` under sharding (#268).
58+
- Replacement (relaunched) pipelines now inherit the parent's rate limiter and max-completion-tokens, fixing inference-engine init failures (#268).
59+
- Fixed intermediate checkpoints overwriting each other every chunk save.
60+
- Fixed `save_strategy="chunk"` being lost/mutated before the worker's save step.
61+
- Fixed corrupted batched eval generation when `pad_token_id == eos_token_id` (missing attention mask + right padding).
62+
- Fixed missing `add_generation_prompt` in eval chat templating, which degraded eval quality for instruction-tuned models.
63+
- Dashboard MLflow status now matches the dispatcher status shown in the notebook progress table across all terminal transitions in both `run_fit()` and `run_evals()`: clean completion, IC-stop, Optuna prune, worker exception, runtime / init / dispatch failure, create-run failure, and stranded-run recovery after a crash.
64+
- Reused query actors no longer mark a still-running pipeline as `FINISHED` on the MLflow server when switching to the next pipeline.
65+
- Orphaned `ONGOING` / `NEW` runs left over from a crashed experiment no longer remain stuck as `RUNNING` in MLflow after recovery.
66+
- Cloned pipelines (IC clone) and Optuna replacement runs now render shard progress in the `Shards` column instead of `-`.
67+
- Failed run-creation paths now record the MLflow run as `FAILED` instead of letting it default to `FINISHED`.
68+
- Downgrade `numpy` to 2.0.1 on Colab for SFT notebook issue with datasets
69+
70+
1671
## [v0.16.0]
1772

1873
### Additions
@@ -98,8 +153,6 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/).
98153
- Pins cupy-cuda12x to 14.0.1 to override issue in 14.1.0 that requires `pytest` the issue is fixed in `https://github.com/cupy/cupy/pull/9965` but there is not a current release with this fix.
99154

100155

101-
102-
103156
## [v0.15.2]
104157

105158
### Additions

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ pip install rapidfireai
6363

6464
rapidfireai --version
6565
# Verify it prints the following:
66-
# RapidFire AI 0.16.0
66+
# RapidFire AI 0.16.1
6767

6868
# Replace YOUR_TOKEN with your actual Hugging Face token
6969
# https://huggingface.co/docs/hub/en/security-tokens

docs/BUILD.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ rm -rf dist/ *.egg-info/ .eggs/ && python -m build
3434
rsync -av dist/ user:~/rapidfire
3535

3636
# from directory where dist/ folder is
37-
pip install rapidfireai-0.16.0-py3-none-any.whl
37+
pip install rapidfireai-0.16.1-py3-none-any.whl
3838

3939
export PATH="$HOME/.local/bin:$PATH"
4040

4141
rapidfireai --version
42-
# RapidFire AI 0.16.0
42+
# RapidFire AI 0.16.1
4343

4444
# install specific dependencies and initialize rapidfire
4545
rapidfireai init

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "rapidfireai"
7-
version = "0.16.0"
7+
version = "0.16.1"
88
authors = [
99
{name = "RapidFire AI Inc.", email = "support@rapidfire.ai"},
1010
]

rapidfireai/frontend/src/common/constants.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export const ErrorCodes = {
99
RESOURCE_CONFLICT: 'RESOURCE_CONFLICT',
1010
};
1111

12-
export const Version = '0.16.0';
12+
export const Version = '0.16.1';
1313

1414
const DOCS_VERSION = 'latest';
1515

rapidfireai/version.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
Version information for RapidFire AI
33
"""
44

5-
__version__ = "0.16.0"
6-
__version_info__ = (0, 16, 0)
5+
__version__ = "0.16.1"
6+
__version_info__ = (0, 16, 1)

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# version 0.16.0
1+
# version 0.16.1
22

33
# ml
44
pandas>=2.0.0,<2.3.0 # Colab compatibility (2.2.2) and cudf constraint

tests/staging/tutorial_notebooks/fine-tuning/rf-colab-tensorboard-tutorial.ipynb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
" import rapidfireai\n",
5959
" print(\"✅ rapidfireai already installed\")\n",
6060
"except ImportError:\n",
61-
" %pip install rapidfireai==0.16.0 # Takes 1 min\n",
61+
" %pip install rapidfireai==0.16.1 # Takes 1 min\n",
6262
" !rapidfireai init --train # Takes 1 min"
6363
]
6464
},

tests/staging/tutorial_notebooks/fine-tuning/trackio/rf-colab-tutorial-sft-trackio.ipynb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
" import rapidfireai\n",
5959
" print(\"✅ rapidfireai already installed\")\n",
6060
"except ImportError:\n",
61-
" %pip install rapidfireai==0.16.0 # Takes 1 min\n",
61+
" %pip install rapidfireai==0.16.1 # Takes 1 min\n",
6262
" !rapidfireai init --train # Takes 1 min"
6363
]
6464
},

tests/staging/tutorial_notebooks/rag-contexteng/rf-colab-rag-fiqa-tutorial.ipynb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,8 @@
106106
" import rapidfireai\n",
107107
" print(\"✅ rapidfireai already installed\")\n",
108108
"except ImportError:\n",
109-
" %pip install rapidfireai==0.16.0 # Takes 1 min\n",
110-
"!rapidfireai init # Takes 1 min"
109+
" %pip install rapidfireai==0.16.1 # Takes 1 min\n",
110+
" !rapidfireai init # Takes 1 min"
111111
]
112112
},
113113
{

0 commit comments

Comments
 (0)