Spaces:
Running on Zero
Running on Zero
| # Hugging Face deployment | |
| FeatureLens targets a **Gradio SDK Space** with ZeroGPU hardware. | |
| ## Runtime shape | |
| On Hugging Face, `FEATURELENS_EAGER_LOAD` defaults to `1`. The runtime loads: | |
| - `Qwen/Qwen3-1.7B-Base`; | |
| - Qwen-Scope SAE layers **4, 14, 26** only. | |
| The live app does not need every SAE layer from the full repository. | |
| `app.py` launches with `ssr_mode=False`, matching the deployment path that removed the earlier SSR/auth coroutine warning during Space testing. | |
| ## GPU-decorated actions | |
| Current live actions include: | |
| - concept-guided candidate feature discovery and candidate reuse; | |
| - completion-cue sensitivity scans; | |
| - bounded table/plot focus controls, descriptive PNG exports, and a persistent Workbench context banner; | |
| - **Inspect sparse features**; | |
| - **Run single-feature causal test**; | |
| - **Run scale dose-response**; | |
| - **Run contrastive preference test**; | |
| - **Run joint feature-set causal test**; | |
| - **Run 1/3/5-feature ablation sweep**; | |
| - **Run individual-vs-joint decomposition**; | |
| - **Inspect selected-feature geometry**; | |
| - **Trace feature across prompt tokens**; | |
| - **Run controlled concept contrast**; | |
| - **Compare paraphrase representations**; | |
| - **Compare layers**. | |
| Allocation durations in `app.py` are ceilings requested from ZeroGPU, not expected wall-clock runtimes. | |
| ## Batch-first causal execution | |
| FeatureLens deliberately batches related conditions so stronger diagnostics do not require a separate GPU callback for every condition. | |
| Examples: | |
| - scale dose-response stacks the six multipliers in one edited batch; | |
| - single-feature causal tests stack zero edit, one targeted SAE edit, and eight norm-matched random controls; | |
| - 1/3/5 feature-set sensitivity batches targeted edits and control ensembles; | |
| - individual-vs-joint decomposition batches all individual ablations plus the joint ablation; | |
| - controlled concept contrast evaluates its balanced prompt batch together; | |
| - contrastive preference reuses one targeted delta/control ensemble while scoring the two exact continuations in two compact batched forwards. | |
| The primary causal reference inside each experiment is a **batched zero-edit row**. This prevents batch-vs-single floating-point drift from being mistaken for an intervention effect. | |
| ## Greedy generation vs probability-level scoring | |
| The single-feature causal test retains baseline and edited greedy generation because the visible text comparison is useful in a public demo. | |
| The primary targeted causal metric uses teacher-forced **full-continuation** log-probability scoring. Greedy text may remain unchanged while probability-level metrics move. | |
| The heavier feature-set, set-size, interaction, and contrast panels avoid unnecessary free-running generations. | |
| ## Clipboard export | |
| Major output tables include a dedicated **Copy table with headers** action. The app serializes the result as tab-separated text before invoking the browser clipboard API. This makes pasted output self-describing and spreadsheet-friendly. | |
| On successful clipboard write, the clicked button briefly changes to **✓ Copied with headers**. If browser clipboard permission is unavailable, the frontend uses a temporary-textarea fallback. | |
| ## Embedded-Space layout | |
| The app uses: | |
| - `gr.Blocks(fill_width=True)`; | |
| - an explicitly centered desktop canvas up to 1600 px wide; | |
| - restrained serif typography with normalized control/table sizes; | |
| - consistent muted-teal action and copy buttons; | |
| - bounded result-table heights; | |
| - explicit bottom padding with no visible footer clutter; | |
| - a browser-side ResizeObserver/MutationObserver that requests a resize reflow after dynamic result-height changes. | |
| These changes reduce wasted horizontal space and mitigate the embedded-Space case where the outer page stopped extending after a large dynamic result. Hugging Face still owns the outer embedding frame, so compare with the direct `*.hf.space` URL if the parent page ever behaves differently. | |
| ## Offline benchmark | |
| Do **not** run the complete research benchmark as an interactive public-Space action. | |
| Run on separate CUDA compute: | |
| ```bash | |
| python3 experiments/run_all.py | |
| ``` | |
| Both causal runners accept a configurable random-control count. For more stable offline control estimates, increase the value if compute permits, for example: | |
| ```bash | |
| python3 -m experiments.run_causal --random-controls 16 | |
| python3 -m experiments.run_feature_sets --random-controls 16 | |
| ``` | |
| Then commit only the small report/catalog/CSV/figure artifacts intended for presentation. Large activation arrays remain gitignored. | |
| ## Local UI launch smoke | |
| Before pushing a release, run: | |
| ```bash | |
| python3 scripts/ui_smoke.py | |
| ``` | |
| This opens the real Gradio `launch()` path on a temporary localhost port and immediately closes it. It exists specifically so theme/launch integration errors are caught before Hugging Face rebuilds the Space. | |