This document is the working-context handoff for moving compositional-something to Della.
Last updated: 2026-04-18
The active project is the workshop paper and experiment stack for compositional self-improvement.
The current empirical story is:
run_lengthis the strong bit-string positive case.additionis the hard anchor.- For
addition, the only variant that showed a real gain waswith_carry_filtered. - The next hypothesis is that the
135Maddition run was still seed-limited, so the next step is to increase seed data and reuse a shared seed checkpoint.
Full copy:
cd /n/fs/cogai/cs1095
ssh cs1095@della-gpu.princeton.edu 'mkdir -p /scratch/gpfs/BRENDEN/changho'
rsync -aH --info=progress2 --partial --append-verify \
compositional-something \
cs1095@della-gpu.princeton.edu:/scratch/gpfs/BRENDEN/changho/Lighter copy without large artifacts:
cd /n/fs/cogai/cs1095
ssh cs1095@della-gpu.princeton.edu 'mkdir -p /scratch/gpfs/BRENDEN/changho'
rsync -aH --info=progress2 --partial --append-verify \
--exclude artifacts \
--exclude .pytest_cache \
compositional-something \
cs1095@della-gpu.princeton.edu:/scratch/gpfs/BRENDEN/changho/Current repo size is about 37G.
As of this handoff:
- there are no active or pending addition jobs in the current cluster queue
- the queued Qwen addition job was canceled
- the queued seed-only addition job was also canceled before migration
So Della can be treated as a clean restart point.
These are the most important experiment-side changes made locally and not yet turned into a clean top-level commit.
Previously, with_carry_filtered built a broad composed pool and then dropped many examples during pseudo-label construction.
Now, the composed pool itself can be constrained by a boundary-carry policy:
- file: core/addition_pipeline.py
- key additions:
matches_boundary_carry_policy(...)boundary_carry_policyargument incompose_to_length(...)boundary_carry_policyargument inbuild_composed_datasets(...)
Current behavior:
boundary_carry_policy="any": no restrictionboundary_carry_policy="no_boundary_carry": only keep composed examples whose component boundary does not induce carryboundary_carry_policy="boundary_carry": only keep composed examples with boundary carry
The addition task now maps:
with_carry_filtered -> no_boundary_carry- everything else ->
any
This means we now control composed-data size at dataset generation time instead of losing examples unpredictably later.
There is still a backward-compatible metadata fallback for old datasets that predate this explicit bucketing.
This test verifies that the composed dataset builder can produce a fixed-size no_boundary_carry bucket.
Test status before handoff:
pytest -q tests/test_self_improvement_tasks.pyResult: 14 passed
This launcher trains a seed-only addition model with:
- model:
HuggingFaceTB/SmolLM2-135M - digits:
3..7 - seed train per digit:
50000 - seed eval per digit:
100 - rounds:
0 - batch sizes: train
64, eval128 - precision:
bf16 - checkpoints kept
At the end it creates:
<OUT_ROOT>/seed_model -> <OUT_ROOT>/round_00
So later experiments can initialize from the same trained seed model.
This is the strongest bit-string positive result and is suitable for the paper story.
Corrected trusted run root:
Key finding:
run_length:composeextends cleanly while direct/self-training controls are weaker.
Useful result files:
Finished run roots:
- filtered:
- other baselines:
Main result:
with_carry_filteredis the only addition variant that gives a meaningful gain.short_only,direct,with_carry, andcompose_corruptall stay weak.
Final round-8 comparison:
with_carry_filtered:eval_accuracy = 0.556,stitched_eval_accuracy = 0.420short_only:0.270, stitched0.0588direct:0.261, stitched0.0525with_carry:0.262, stitched0.0625compose_corrupt:0.257, stitched0.0550
Key result file:
The likely bottleneck is that the addition seed regime was still not strong enough.
Round-0 seed-bucket held-out accuracy for the 135M addition runs:
3-digit:0.954-digit:0.955-digit:0.906-digit:0.857-digit:0.80
So the seed model was already weakening by 6-7 digits.
Source:
Interpretation:
- filtered composition helped a lot relative to the baselines
- but the seed model was not strong enough to reproduce the stronger result remembered from earlier runs
Run the new seed-only launcher first:
sbatch launchers/self/run_addition_seed_shared.sbatchThis should produce a reusable seed checkpoint under:
artifacts/runs/addition_seed_shared_135m_50kpd_<timestamp>/seed_model
The intended workflow is:
- train the seed-only model with
50000per digit - reuse that
round_00model as the initialization for later addition self-improvement runs
This is not yet wrapped in a dedicated launcher. The current seed launcher creates the reusable checkpoint, but a follow-up launcher still needs to be added or invoked manually.
The earlier Qwen run here was canceled before execution. If Della has better availability, Qwen3-0.6B can be retried there.
Practical estimate from current repo conventions:
- tiny custom bit-task model (
~14M): fine forMIG 10GB SmolLM2-135M: probably workable onMIG 10GBwith smaller batch sizesSmolLM2-360M: likely only workable onMIG 10GBin a very conservative setupQwen3-0.6Bfull fine-tuning: do not assume10GBis enough
Relevant evidence:
- existing MIG launcher:
- launchers/self/run_self_improvement_mig_boundary_eval.sbatch
- uses
SmolLM2-360Mwith batch sizes1/2and grad accumulation8
The workshop paper lives in the submodule:
Current paper repo HEAD:
f4dd9b5
Current local paper changes not yet pushed inside the submodule:
- appendix/experiment_details.tex
- appendix/theory_proofs.tex
- ref.bib
- related_work.bib
- sections/2_setup_and_method.tex
- sections/3_theoretical_analysis.tex
- untracked:
The paper already has:
- theory section condensed in main body
- fuller details moved to appendix
- first-page main figure
- merged single-file export
main_merged.tex
The top-level repo is still dirty and contains many local additions beyond the paper repo. Notable local changes include:
- core/addition_pipeline.py
- self/self_improvement_tasks.py
- tests/
- launchers/self/run_addition_seed_shared.sbatch
There are also many untracked launcher / notebook / experiment files. So the move to Della should be treated as copying a working directory, not a clean git snapshot.
This repository had two major layout changes:
78b17eccheckpoint before refactoringe2662basplit intow2s/core,w2s/self,w2s/meta,w2s/launchers,w2s/legacy- current layout removed the
w2s/namespace and moved those folders to repository root
w2s/core/->core/w2s/self/->self/w2s/meta/->meta/w2s/launchers/->launchers/w2s/legacy/->legacy/
python -m w2s.self.legacy.addition_self_improvement->python -m self.legacy.addition_self_improvementpython -m w2s.self.experiments.composition_error_sweep->python -m self.experiments.composition_error_sweeppython -m w2s.meta.train_meta_self_improvement_rope->python -m meta.train_meta_self_improvement_rope
artifacts/logs/artifacts/models/artifacts/runs/self_improvement/artifacts/runs/meta_self_improvement/