Skip to content

add LoMAP #13

Open
haoruilee wants to merge 23 commits into
Chongjie-Si:mainfrom
haoruilee:codex/add-lomap
Open

add LoMAP #13
haoruilee wants to merge 23 commits into
Chongjie-Si:mainfrom
haoruilee:codex/add-lomap

Conversation

@haoruilee

Copy link
Copy Markdown

haoruilee and others added 23 commits May 31, 2026 17:49
…eval

Core changes:
- loralib/layers.py: add map_norm_scope (global/column/row/row_column) and
  map_detach_denom to LoRALayer/_unit_frobenius for normalization ablations
- CR_MR/finetune.py: expose map_beta_init, map_eps, map_norm_scope,
  map_detach_denom as CLI args; pass them through to LoraConfig
- CR_MR/peft/tuners/lora.py: add map_norm_scope and map_detach_denom to LoraConfig
- NLU/modeling_deberta_v2.py: add lora_type="map" (LoMAPLinear) support for
  all attention/FFN modules
- NLU/run_glue.py: enable map_alpha/map_beta as trainable when lora_type=map

New scripts:
- NLU/scripts/run_lomap_glue_all.sh: LoMAP on all 8 GLUE tasks
- CR_MR/scripts_for_ablation/: epsilon, beta_0, rank, norm_scope, detach ablations
- CR_MR/scripts_for_baselines/: DeLoRA, BiDoRA, LoRA-GA, RandLoRA, GraLoRA
  reproduction scripts using official repos / HF PEFT
- CR_MR/finetune_peft.py: minimal HF-PEFT wrapper for baseline training
- SdG/eval_dreambooth.py: CLIP-T, CLIP-I, DINO, LPIPS quantitative eval
- SdG/eval.sh: batch eval across methods

Paper (paper-aaai/AAAI_MAP/sec/):
- 4_exp.tex: fix misleading "outperforms all" claim at r=16 (no DoRA result there)
- 3_method.tex: add \label{sec:method}, initialization choices paragraph
  (beta_0 alternatives, detach discussion, ablation pointer)
- 2_related.tex: add formal comparison table (DoRA/BoRA/BiDoRA/DeLoRA/MAP)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…Layer and kwargs

- LoraLayer.__init__: add map_norm_scope and map_detach_denom params
- LoraLayer._unit_frobenius: implement all 4 scope modes with detach support
- Linear.__init__: forward map_norm_scope/map_detach_denom to LoraLayer
- LoraModel._inject_adapter: add map_norm_scope/map_detach_denom to kwargs dict

Verified with unit tests: all 14 checks pass.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ntation

- ablation_epsilon.sh: was not passing --map_eps to finetune.py (critical bug)
- ablation_rank.sh: passed wrong --adapter LoRA for LoMAP eval (would crash)
- commonsense_evaluate.py: add LoMAP, DeLoRA, BiDoRA, LoRA-GA, RandLoRA, GraLoRA
  to --adapter choices; route HF-PEFT checkpoints past manual merge logic
- finetune.py: add --seed param, call transformers.set_seed(), propagate seed to
  TrainingArguments; add tensorboard as default logging backend (not just wandb)
- finetune_peft.py: fix val_set_size (was silently ignored, val split now used);
  add tensorboard; add loraga via init_lora_weights='lora-ga'
- run_bidora_cr.sh: BiDoRA official repo is NLU-only; replaced with DoRA proxy
  and clear note; added run_bidora_glue.sh for official BiDoRA on GLUE
- run_loraga_cr.sh: official repo uses Hydra, not compatible; replaced with HF
  PEFT lora-ga init inside our finetune_peft.py pipeline
- run_delora_cr.sh: add --seed, fix output dir, use --adapter DeLoRA in eval
- All ablation scripts: add SEED variable (default 42) and --seed $SEED
- aggregate_results.py: new script to parse multi-seed eval outputs and print
  mean±std table in LaTeX and CSV formats
- README.md: document data leakage in commonsense_170k (HellaSwag 29%,
  WinoGrande 26% test overlap — known issue in LLM-Adapters protocol); document
  BiDoRA/LoRA-GA integration strategy

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Required for DeLoRA, RandLoRA, GraLoRA, LoRA-GA baselines.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- setup_envs.sh: creates lomap-cr / lomap-nlu / lomap-sdg conda envs
  with correct deps per task (avoids accelerate version conflicts)
- run_cr.sh: single entry point for all CR adapters (lomap/lora/delora/
  loraga/randlora/gralora), handles train→eval pipeline, seed param
- run_nlu.sh: all 8 GLUE tasks with correct per-task hyperparams, seed param
- run_sdg.sh: DreamBooth train + quantitative eval (CLIP-T/I, DINO, LPIPS)
  for lora/lomap/dash, accepts subject and GPU args
- run_ablations.sh: one command runs any/all ablation experiments
- QUICKSTART.md: step-by-step guide from clone to results table

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…rect python launch

- run_glue.py: eagerly import triton, triton.knobs, triton.runtime, and
  torch._dynamo at module load time before any tqdm activity starts.
  On PyTorch 2.12+cu126, the lazy C-extension load of triton/_C/libtriton
  triggered by the first optimizer.step() races with tqdm's background monitor
  thread, causing a concurrent dlopen SIGSEGV.
- run_nlu_local.sh: new convenience launcher; calls python directly instead
  of torch.distributed.launch to avoid the --local-rank/--local_rank conflict
  with HfArgumentParser.

Verified: LoMAP r=2 on CoLA (25 epochs, seed 6) → eval_matthews_correlation=0.6458

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Key fixes vs prior version:
- run_nlu_local.sh: switch from fixed warmup_steps to warmup_ratio=0.1 (matches
  paper Table 4); add per-task metric_for_best_model + greater_is_better so
  checkpoint selection uses task metric (mcc/pearson/accuracy) not loss;
  support multi-seed runs via comma-separated or "all" seed argument with
  automatic per-task average ± std printout
- summarize_nlu.py: prints a full comparison table (our results vs paper values)
  once all seeds are available; works incrementally as seeds complete
- run_full_nlu_suite.sh: one-shot launcher for complete LoMAP+LoRA r=2 suite
- run_nlu_continue.sh: resumes from sst2 after cola seeds finish

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… to model

- run_glue.py: add CLI args --map_beta_init, --map_eps, --map_norm_scope,
  --map_detach_denom; wire them into AutoConfig so they reach LoMAPLinear.
  Enables sensitivity analysis from paper §5 without code changes.
- modeling_deberta_v2.py: pass map_norm_scope and map_detach_denom from config
  to all 6 LoMAPLinear instantiations (query/key/value/attn_out/intermediate/out).
  Previously only map_beta_init and map_eps were forwarded.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
deploy/h100_kit/ packages everything needed to reproduce the paper on a PBS
H100 cluster: rsync the repo, run h100_setup.sh once, then submit_all.sh.

Coverage:
- NLU Table 1: DeBERTa-v3 base/large × r=2/8 × {LoMAP, LoRA} × 3 seeds
- CR Table 2:  LLaMA-7B (r=4/8/16/32) and LLaMA3-8B (r=16/32) × {LoMAP, LoRA, DoRA}
- §5 ablations: β₀, ε, detach_denom, norm_scope sensitivity sweeps

Scripts dispatch (method × task × seed) jobs round-robin across 8 GPUs per
node; auto-skip already-completed runs (idempotent resume); use
--skip_memory_metrics + sparse save_steps for I/O hygiene on long tasks.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- dependency_versions_table.py: drop the <0.11 cap on tokenizers; the fork
  pinned to tokenizers<0.11 (May 2021), which conflicts with current
  transformers/datasets versions on Python 3.10+
- modeling_deberta.py: pass output.dtype (not output) as the 4th arg to
  _softmax_backward_data; the signature changed in PyTorch >=1.10 and the
  old form silently ran with a wrong type, breaking gradients on H100.

These are environment-compat fixes; no behavioral change for older PyTorch.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…(frd/svd)

The NLU fork's run_glue.py expects --lora_type values frd (=standard LoRA),
svd (=AdaLoRA), or map (=LoMAP). Both the local launcher and the H100 grid
were forwarding user-facing names like --lora_type lora, which trips the
"Unimplemented Lora Type" check inside modeling_deberta_v2.py and crashes
every LoRA-baseline run silently.

Add a translation layer in run_nlu_local.sh and run_nlu_grid.sh so users can
pass lora|adalora|map (the legacy frd|svd still work).

Also add preflight_verify.sh — three single-seed runs on the local 4080
that smoke-test FP16 LoMAP + the LoRA (frd) path before committing to the
H100 sweep.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Robustness fixes from running the suite on a 16GB 4080 that kept rebooting:

- run_nlu_local.sh: scale train/eval batch by sequence length to avoid OOM in
  DeBERTa-v2 disentangled attention (O(seq^2) memory). qnli (seq 512) uses
  train_bs=8 + grad_accum=4 to keep effective batch 32; rte/qqp/mnli use 16+2.
  Eval batch shrunk for long-seq tasks. Add PYTORCH_CUDA_ALLOC_CONF=
  expandable_segments:True to cut fragmentation.
- fix_corrupted_results.sh: delete truncated/zero-byte checkpoints left by an
  abrupt power-cut, and restore best_metric into all_results.json via ATOMIC
  write (temp+fsync+rename) so a mid-write power loss can't corrupt the JSON.
  Refuses to run while a live run_glue.py exists (--force to override).
- watchdog_lomap.sh: judge failure by "restart didn't bring the chain up within
  8 min", NOT by "no new completed run" (a single big task legitimately runs
  30+ min with no completions). flock single-instance; GPU-free guard.
- boot_resume.sh: cron @reboot entrypoint; waits for GPU, repairs corruption,
  restarts both tmux sessions; only cleans watchdog pid/lock when its PID is dead.
- overnight_baselines.sh: defer qnli (and large-task LoRA) to H100 — too slow on
  4080 (~4h/run at seq 512). Local time goes to HP tuning instead.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Carry the robustness fixes discovered while running locally into the H100 kit
so a spot-instance preemption or node reboot can't silently corrupt results:

- run_nlu_grid.sh: run fix_corrupted_results.sh before building the job list
  (deletes truncated checkpoints, atomically restores best_metric), so a torn
  all_results.json is neither treated as "done" nor crashes the resume. Add
  PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True. Sequence-length-aware batch
  sizing for DeBERTa-large (qnli seq 512 → bs 16 + accum 2) keeps effective
  batch 32 and stays safe on smaller cards too.
- run_cr_grid.sh / run_ablation_grid.sh: treat a present-but-tiny (<1KB)
  adapter_model.bin as corrupt and re-queue it, instead of skipping it as done.
  Add expandable_segments alloc conf.

device_map="auto" in finetune.py is safe under the grids because each job runs
with CUDA_VISIBLE_DEVICES pinned to a single card, so "auto" never shards
across GPUs that another job is using.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
RESULTS_LOCAL.md captures the full local run:
- Main r=2 comparison (3 seeds): LoMAP beats our well-tuned LoRA by a mean +0.39
  across 4 complete tasks (CoLA +1.00, STS-B +0.40, RTE +0.48, MRPC -0.33), with
  consistently lower variance. Reproduces/exceeds paper LoMAP numbers, but our
  LoRA baseline is 0.8-2.5pt above the paper's, shrinking the claimed gap.
- §5 sensitivity ablation: LoMAP is insensitive to beta_init/detach/norm_scope;
  the apparent +2.7 from map_lr_scale=0.1 was single-seed noise and did NOT hold
  under 3-seed confirmation (71.02 tuned vs 71.46 default on CoLA).
- Engineering verifications all pass (formula 1e-6 match, 0.180% params, etc.)

Honest takeaway recorded for paper framing: lead with non-inferiority + lower
variance + geometric motivation + HP robustness, not an inflated accuracy delta.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
commonsense_evaluate.py validates --adapter against argparse choices
['LoRA','DoRA','LoMAP',...]. The grid was passing tr-uppercased LORA/DORA/LOMAP
which would crash every eval. Map method->exact-case explicitly.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Step-by-step: rsync, setup, smoke test, submit_all, per-track expected scores
(local anchors + paper targets), red-flag thresholds, failure recovery table,
and a decision gate keyed on whether CR reproduces the paper's larger gaps.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…values

Per plan, RESULTS_LOCAL.md now records only our own LoMAP r=2 results (cola/sst2/
mrpc/rte/stsb, 3 seeds) plus the §5 ablation. LoRA/baseline comparisons reference
the published paper values rather than our re-runs. SST-2 LoMAP now complete
(96.06±0.18). Local phase done; remainder deferred to H100.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
commonsense_evaluate.py reads test sets via the relative path
dataset/<bench>/test.json and writes experiment/<...>.json. The training
subshells cd'd into CR_DIR, but the eval loops run in the main shell whose cwd
under PBS is REPO_ROOT — so every eval would fail to find dataset/*/test.json
and silently produce no scores.

Add `cd "$CR_DIR"` before both eval loops (run_cr_grid.sh and
run_ablation_grid.sh). All other paths in those loops ($out, $DATA, $JOBS_FILE)
are absolute, so the cd is safe.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… r=2 to 5 seeds

- RESULTS_LOCAL.md: keep CoLA seed6 = 72.05 (original sample) and add an explicit
  reproducibility caveat — a same-seed re-run gave 69.29 (2.76-pt swing from
  cuDNN nondeterminism on this high-variance 8.5k-example task). No single CoLA
  seed is trustworthy to ±2pt; headline evidence should come from lower-variance
  tracks (SST-2/STS-B) and CR(LLaMA), not CoLA point estimates.
- nlu_base_r2.pbs: run 5 seeds (6,7,8,9,10) instead of 3 for the cheapest NLU
  cell, so small high-variance tasks get tighter mean±std on H100.
- run_glue.py / boot_resume.sh: carry the previously-staged LoMAP knobs
  (--map_freeze_alpha, --map_lr_scale custom optimizer) and the hp-tuning-first
  chain order used during local tuning.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- CR_MR/peft lora.py: add use_delora / delora_s (W* = W + s·AB/‖AB‖_F)
- CR_MR/finetune.py: add adapter_name="delora" branch
- CR_MR/commonsense_evaluate.py: include DeLoRA in merge path
- deploy/h100_kit/: run_delora_cr.sh, run_delora_nlu_grid.sh,
  run_delora_nlu.py (HF PEFT), submit_delora.sh one-shot entry (~35 GPU·h)
- paper-aaai 4_exp.tex: fix "surpassing DoRA 78.4" (LoMAP r=16=77.9<78.4)
- paper-aaai X_suppl.tex: add §A ablation tables (ε, β₀, detach, norm scope)
  fulfilling the supplementary promise in §3

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Bug 1 (FATAL): run_delora_nlu.py used LoraConfig(use_dora=True) which runs DoRA, not
DeLoRA. Replaced with DeloraConfig(r=rank, delora_lambda=15) from HF PEFT ≥0.19.
Also cleaned up dead imports and the now-unnecessary target-module discovery loop.

Bug 2 (FATAL): delora_s initialized when self.weight is still random (before pretrained
weights are loaded). Fixed in lora.py _replace_module: re-initialize delora_s from
old_module.weight's Frobenius norm after the weight is assigned.

Bug 3 (SERIOUS): run_delora_cr.sh called aggregate_results.py with a positional arg
it does not accept (requires --method). Replaced with an inline Python snippet that
reads the CR output files directly and prints per-rank averages.

Bug 4 (MINOR): submit_delora.sh still referenced the old aggregate_results.py call.
Updated summary message to match the new approach.

Bug 5 (MEDIUM): summarize_nlu.py hardcoded only LoMAP and LoRA methods. Added
("delora", "DeLoRA") so results appear in the table after the NLU grid finishes.

Also bumped required peft version from >=0.14 to >=0.19 everywhere (DeloraConfig
shipped in 0.19).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ents

Covers: env setup, data download (GLUE/commonsense170k/LLaMA-7B), training,
TensorBoard curve export (tar + CSV), result summary, expected numbers,
and failure playbook. Standalone document for the Japan H100 cluster.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant