interp-engine 1.4.0__tar.gz → 1.5.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. {interp_engine-1.4.0 → interp_engine-1.5.0}/.gitignore +3 -1
  2. {interp_engine-1.4.0 → interp_engine-1.5.0}/PKG-INFO +19 -7
  3. {interp_engine-1.4.0 → interp_engine-1.5.0}/README.md +17 -5
  4. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/probe.py +6 -2
  5. interp_engine-1.5.0/interp_engine/memory.py +2519 -0
  6. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/model.py +42 -39
  7. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/vllm_capture/static.py +10 -20
  8. {interp_engine-1.4.0 → interp_engine-1.5.0}/pyproject.toml +18 -5
  9. interp_engine-1.5.0/tests/test_gpu_sizer.py +226 -0
  10. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_load.py +22 -14
  11. interp_engine-1.5.0/tests/test_memory.py +931 -0
  12. {interp_engine-1.4.0 → interp_engine-1.5.0}/LICENSE +0 -0
  13. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/README.md +0 -0
  14. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/__init__.py +0 -0
  15. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/bench_spec.py +0 -0
  16. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/cells.py +0 -0
  17. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/probe_lens_stream.py +0 -0
  18. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/publish.py +0 -0
  19. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/report_bench.py +0 -0
  20. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/results/deepseek-v4-flash-0731__eager.json +0 -0
  21. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/results/deepseek-v4-flash-0731__vllm-cudagraph.json +0 -0
  22. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/results/deepseek-v4-flash-0731__vllm-dspark-cudagraph.json +0 -0
  23. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/results/deepseek-v4-flash-0731__vllm-dspark.json +0 -0
  24. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/results/deepseek-v4-flash-0731__vllm-static.json +0 -0
  25. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/results/deepseek-v4-flash-0731__vllm.json +0 -0
  26. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/results/gemma-2-2b__eager.json +0 -0
  27. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/results/gemma-2-2b__vllm-cudagraph.json +0 -0
  28. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/results/gemma-2-2b__vllm-static.json +0 -0
  29. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/results/gemma-2-2b__vllm.json +0 -0
  30. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/results/llama-3.1-8b__eager.json +0 -0
  31. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/results/llama-3.1-8b__vllm-cudagraph.json +0 -0
  32. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/results/llama-3.1-8b__vllm-static.json +0 -0
  33. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/results/llama-3.1-8b__vllm.json +0 -0
  34. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/results/qwen3-4b__eager.json +0 -0
  35. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/results/qwen3-4b__vllm-cudagraph.json +0 -0
  36. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/results/qwen3-4b__vllm-static.json +0 -0
  37. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/results/qwen3-4b__vllm.json +0 -0
  38. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/results/qwen3.8-27b__eager.json +0 -0
  39. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/results/qwen3.8-27b__vllm-cudagraph.json +0 -0
  40. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/results/qwen3.8-27b__vllm-static.json +0 -0
  41. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/results/qwen3.8-27b__vllm.json +0 -0
  42. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/results-latest.md +0 -0
  43. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/run_all.sh +0 -0
  44. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/run_bench.py +0 -0
  45. {interp_engine-1.4.0 → interp_engine-1.5.0}/benchmarks/workloads.py +0 -0
  46. {interp_engine-1.4.0 → interp_engine-1.5.0}/docs/AGENT_INTEGRATION.md +0 -0
  47. {interp_engine-1.4.0 → interp_engine-1.5.0}/docs/ARCHITECTURE_QUIRKS.md +0 -0
  48. {interp_engine-1.4.0 → interp_engine-1.5.0}/docs/COMPATIBILITY.md +0 -0
  49. {interp_engine-1.4.0 → interp_engine-1.5.0}/docs/ENGINE_HOOK_MAPPINGS.md +0 -0
  50. {interp_engine-1.4.0 → interp_engine-1.5.0}/docs/GRADIENTS.md +0 -0
  51. {interp_engine-1.4.0 → interp_engine-1.5.0}/docs/INTERNALS.md +0 -0
  52. {interp_engine-1.4.0 → interp_engine-1.5.0}/docs/PERFORMANCE.md +0 -0
  53. {interp_engine-1.4.0 → interp_engine-1.5.0}/docs/PORTING.md +0 -0
  54. {interp_engine-1.4.0 → interp_engine-1.5.0}/docs/README.md +0 -0
  55. {interp_engine-1.4.0 → interp_engine-1.5.0}/docs/SUPPORTED_POINTS.md +0 -0
  56. {interp_engine-1.4.0 → interp_engine-1.5.0}/docs/USAGE.md +0 -0
  57. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/__init__.py +0 -0
  58. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/_loop.py +0 -0
  59. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/address.py +0 -0
  60. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/arch.py +0 -0
  61. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/attn_config.py +0 -0
  62. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/attn_scores.py +0 -0
  63. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/autograd_support.py +0 -0
  64. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/capture.py +0 -0
  65. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/chat_compose.py +0 -0
  66. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/chat_conventions.py +0 -0
  67. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/chat_formatters.py +0 -0
  68. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/cuda_preflight.py +0 -0
  69. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/dispatch.py +0 -0
  70. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/facts.py +0 -0
  71. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/hooks.py +0 -0
  72. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/lens.py +0 -0
  73. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/load.py +0 -0
  74. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/mappers.py +0 -0
  75. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/moe_routing.py +0 -0
  76. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/notebook_stdout.py +0 -0
  77. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/points.py +0 -0
  78. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/protocol.py +0 -0
  79. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/residual_basis.py +0 -0
  80. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/select.py +0 -0
  81. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/steer.py +0 -0
  82. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/steer_specs.py +0 -0
  83. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/sync.py +0 -0
  84. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/tokenize.py +0 -0
  85. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/vllm_backend.py +0 -0
  86. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/vllm_capture/__init__.py +0 -0
  87. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/vllm_capture/_demux.py +0 -0
  88. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/vllm_capture/_hooks.py +0 -0
  89. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/vllm_capture/_payload.py +0 -0
  90. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/vllm_capture/_tree.py +0 -0
  91. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/vllm_capture/attn.py +0 -0
  92. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/vllm_capture/capture.py +0 -0
  93. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/vllm_capture/graphs.py +0 -0
  94. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/vllm_capture/lens/__init__.py +0 -0
  95. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/vllm_capture/lens/intervene.py +0 -0
  96. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/vllm_capture/lens/readout.py +0 -0
  97. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/vllm_capture/lens/unembed.py +0 -0
  98. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/vllm_capture/mhc.py +0 -0
  99. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/vllm_capture/native.py +0 -0
  100. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/vllm_capture/requests.py +0 -0
  101. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/vllm_capture/steering.py +0 -0
  102. {interp_engine-1.4.0 → interp_engine-1.5.0}/interp_engine/vllm_plugin.py +0 -0
  103. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/conftest.py +0 -0
  104. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/harness.py +0 -0
  105. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/model_expectations.yaml +0 -0
  106. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/synthetic_families.py +0 -0
  107. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_address.py +0 -0
  108. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_attn_config_tripwire.py +0 -0
  109. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_attn_probs_indexing.py +0 -0
  110. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_attn_scores.py +0 -0
  111. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_attn_z_gqa.py +0 -0
  112. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_autograd_support.py +0 -0
  113. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_bench_workloads.py +0 -0
  114. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_capability_refusals.py +0 -0
  115. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_capture_addressing.py +0 -0
  116. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_chat_compose.py +0 -0
  117. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_chat_formatters.py +0 -0
  118. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_chat_templates.py +0 -0
  119. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_core.py +0 -0
  120. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_cuda_preflight.py +0 -0
  121. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_doc_code_fences.py +0 -0
  122. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_eager_autograd.py +0 -0
  123. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_facts.py +0 -0
  124. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_family_points.py +0 -0
  125. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_gated_attn_out.py +0 -0
  126. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_head_contributions.py +0 -0
  127. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_hook_call_conventions.py +0 -0
  128. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_layer_kinds.py +0 -0
  129. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_logit_transform.py +0 -0
  130. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_mappers.py +0 -0
  131. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_mlp_internals.py +0 -0
  132. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_model_expectations.py +0 -0
  133. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_moe.py +0 -0
  134. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_multimodal_arch.py +0 -0
  135. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_new_models_gpu.py +0 -0
  136. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_no_chat_template.py +0 -0
  137. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_normalized_hook.py +0 -0
  138. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_notebook_stdout.py +0 -0
  139. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_packaging.py +0 -0
  140. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_parity_gpt2.py +0 -0
  141. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_per_layer_attn_dims.py +0 -0
  142. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_points_registry.py +0 -0
  143. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_protocol.py +0 -0
  144. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_published_benchmarks.py +0 -0
  145. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_qk_norm.py +0 -0
  146. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_qkv_layout.py +0 -0
  147. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_reasoning_spans.py +0 -0
  148. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_release.py +0 -0
  149. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_resid_mid.py +0 -0
  150. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_residual_basis.py +0 -0
  151. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_sandwich_norms.py +0 -0
  152. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_select.py +0 -0
  153. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_sliding_window_attn.py +0 -0
  154. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_small_models_gpu.py +0 -0
  155. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_static_dsv4_gpu.py +0 -0
  156. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_static_parity_gpu.py +0 -0
  157. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_static_set.py +0 -0
  158. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_static_warmup.py +0 -0
  159. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_steer_context.py +0 -0
  160. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_steer_math_parity.py +0 -0
  161. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_sync_loop.py +0 -0
  162. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_sync_parity.py +0 -0
  163. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_unified_free_functions.py +0 -0
  164. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_unresolved_families.py +0 -0
  165. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_vllm_capture_gpu.py +0 -0
  166. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_vllm_capture_scales.py +0 -0
  167. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_vllm_engine_loop.py +0 -0
  168. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_vllm_graph_path.py +0 -0
  169. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_vllm_graphs_on_gpu.py +0 -0
  170. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_vllm_hook_availability.py +0 -0
  171. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_vllm_hyper_connections.py +0 -0
  172. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_vllm_kv_isolation.py +0 -0
  173. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_vllm_new_points.py +0 -0
  174. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_vllm_only_families.py +0 -0
  175. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_vllm_plugin.py +0 -0
  176. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_vllm_wire_grammar.py +0 -0
  177. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_vocabulary_boundary.py +0 -0
  178. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_worker_lens_capture_readout.py +0 -0
  179. {interp_engine-1.4.0 → interp_engine-1.5.0}/tests/test_worker_lens_readout.py +0 -0
@@ -36,4 +36,6 @@ plans/
36
36
  *.plan.md
37
37
 
38
38
  logs/*
39
- logs/
39
+ logs/
40
+
41
+ HANDOFF.md
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: interp-engine
3
- Version: 1.4.0
3
+ Version: 1.5.0
4
4
  Summary: A fast, standardized, and easy to use interpretability engine.
5
5
  Project-URL: Homepage, https://github.com/decoderesearch/interp-engine
6
6
  Project-URL: Repository, https://github.com/decoderesearch/interp-engine
@@ -26,7 +26,7 @@ Provides-Extra: quant
26
26
  Requires-Dist: accelerate>=1.0; extra == 'quant'
27
27
  Requires-Dist: kernels<0.17.0,>=0.15.2; extra == 'quant'
28
28
  Provides-Extra: vllm
29
- Requires-Dist: vllm>=0.27.1; (sys_platform == 'linux') and extra == 'vllm'
29
+ Requires-Dist: vllm>=0.28.0; (sys_platform == 'linux') and extra == 'vllm'
30
30
  Description-Content-Type: text/markdown
31
31
 
32
32
  # interp-engine
@@ -60,6 +60,7 @@ This repo contains:
60
60
 
61
61
  1. [`validator/`](validator/), which compares/validates it against TransformerLens, and nnsight/nnterp on real architectures.
62
62
  2. [`visualizer-web/`](visualizer-web/), a "cheat sheet" hosted at [interp-engine.org](https://interp-engine.org) of each 'point' (eg `resid_post.16`), standardized across architectures.
63
+ 3. [`gpu-sizer/`](gpu-sizer/), which finds the GPU/config you need to fit an interp-engine model (and what performance you'll get), to avoid OOMing while working. [docs](https://interp-engine.org/docs/gpu-sizer) | [API](https://interp-engine.org/docs/gpu-sizer-api)
63
64
 
64
65
  ## Installation
65
66
 
@@ -139,12 +140,15 @@ We verify correctness in two main ways:
139
140
  1. A test suite that checks results across several models - what each check is designed to catch is in [INTERNALS.md](docs/INTERNALS.md#correctness).
140
141
  2. A full `validator` comparison engine that checks most hook points across 50+ models, at early, middle and late layers - fully reproducible, with detailed results saved in the git repo at [`validator/`](validator/).
141
142
 
142
- ## Known Issues
143
+ ## GPU-Sizer
143
144
 
144
- - **Gemma 4 requires transformers 5.14.1** because 5.15 moved `head_dim` into `per_layer_config` and vLLM's config read dies before a weight loads ([vllm#51744](https://github.com/vllm-project/vllm/issues/51744)).
145
- - **Gemma 4 26B refuses `mlp_out`**, because `layer.mlp` there is one branch of a two-branch feed-forward; `mlp_out_post` is the residual contribution and is served ([ARCHITECTURE_QUIRKS.md](docs/ARCHITECTURE_QUIRKS.md#moe-tap-the-block-not-the-experts)).
146
- - **DeepSeek-V2 on transformers older than 5.15.0** captures a wrong attention temperature — the engine warns at load, and upgrading is the fix ([COMPATIBILITY.md](docs/COMPATIBILITY.md)).
147
- - **MXFP4 checkpoints (gpt-oss) need `interp-engine[quant]`**, which the `[vllm]` extra does not include; without it transformers dequantizes them to bf16 at roughly 3x the weights, which can turn a model that fits into one that does not.
145
+ <p align="center">
146
+ <img src="https://neuronpedia.s3.amazonaws.com/site-assets/gpu-sizer.gif" alt="interp-engine demo gif" width="100%">
147
+ </p>
148
+
149
+ [docs](https://interp-engine.org/docs/gpu-sizer) | [API](https://interp-engine.org/docs/gpu-sizer-api)
150
+
151
+ Never OOM again - `interp-engine` includes gpu-sizer, an intuitive UI which tells you what GPU(s) and configs you need to get the best performance out of your selected model. For example, [interp-engine.org/sizer/Qwen/Qwen3.6-27B](https://interp-engine.org/sizer/Qwen/Qwen3.6-27B) shows that you can run `Qwen3.6-27B` with interp-engine's vllm-static backend for max speed while keeping it in a single 80GB A100, and have ~40k tokens for the KV Cache.
148
152
 
149
153
  ## Why use an Interpretability Engine instead of building from scratch?
150
154
 
@@ -152,6 +156,14 @@ We verify correctness in two main ways:
152
156
  2. **Standardization + Verification**: Eliminate ambiguity when referring to points, plus a full test suite included.
153
157
  3. **Faster Dev / Fewer Tokens Used**: You could spend ten million tokens and have your AI write, test, and make production-ready an interpretability engine. Or you could just `pip install interp-engine[vllm]`.
154
158
 
159
+ ## Caveats
160
+
161
+ - **Gemma 4 requires transformers 5.14.1** because 5.15 moved `head_dim` into `per_layer_config` and vLLM's config read dies before a weight loads ([vllm#51744](https://github.com/vllm-project/vllm/issues/51744)).
162
+ - **DeepSeek-V2 on transformers older than 5.15.0** captures a wrong attention temperature — the engine warns at load, and upgrading is the fix ([COMPATIBILITY.md](docs/COMPATIBILITY.md)).
163
+ - **MXFP4 checkpoints (gpt-oss) need `interp-engine[quant]`**, which the `[vllm]` extra does not include; without it transformers dequantizes them to bf16 at roughly 3x the weights, which can turn a model that fits into one that does not.
164
+
165
+ Per-architecture structural quirks — which points a family serves and why — are not caveats but facts about the architecture, and live in [ARCHITECTURE_QUIRKS.md](docs/ARCHITECTURE_QUIRKS.md).
166
+
155
167
  ## Development / Contributing
156
168
 
157
169
  Activate the shared git hooks once per clone — they format staged Python, rebuild the generated files, and run CI's static checks before a push. Details in [CONTRIBUTING.md](CONTRIBUTING.md).
@@ -29,6 +29,7 @@ This repo contains:
29
29
 
30
30
  1. [`validator/`](validator/), which compares/validates it against TransformerLens, and nnsight/nnterp on real architectures.
31
31
  2. [`visualizer-web/`](visualizer-web/), a "cheat sheet" hosted at [interp-engine.org](https://interp-engine.org) of each 'point' (eg `resid_post.16`), standardized across architectures.
32
+ 3. [`gpu-sizer/`](gpu-sizer/), which finds the GPU/config you need to fit an interp-engine model (and what performance you'll get), to avoid OOMing while working. [docs](https://interp-engine.org/docs/gpu-sizer) | [API](https://interp-engine.org/docs/gpu-sizer-api)
32
33
 
33
34
  ## Installation
34
35
 
@@ -108,12 +109,15 @@ We verify correctness in two main ways:
108
109
  1. A test suite that checks results across several models - what each check is designed to catch is in [INTERNALS.md](docs/INTERNALS.md#correctness).
109
110
  2. A full `validator` comparison engine that checks most hook points across 50+ models, at early, middle and late layers - fully reproducible, with detailed results saved in the git repo at [`validator/`](validator/).
110
111
 
111
- ## Known Issues
112
+ ## GPU-Sizer
112
113
 
113
- - **Gemma 4 requires transformers 5.14.1** because 5.15 moved `head_dim` into `per_layer_config` and vLLM's config read dies before a weight loads ([vllm#51744](https://github.com/vllm-project/vllm/issues/51744)).
114
- - **Gemma 4 26B refuses `mlp_out`**, because `layer.mlp` there is one branch of a two-branch feed-forward; `mlp_out_post` is the residual contribution and is served ([ARCHITECTURE_QUIRKS.md](docs/ARCHITECTURE_QUIRKS.md#moe-tap-the-block-not-the-experts)).
115
- - **DeepSeek-V2 on transformers older than 5.15.0** captures a wrong attention temperature — the engine warns at load, and upgrading is the fix ([COMPATIBILITY.md](docs/COMPATIBILITY.md)).
116
- - **MXFP4 checkpoints (gpt-oss) need `interp-engine[quant]`**, which the `[vllm]` extra does not include; without it transformers dequantizes them to bf16 at roughly 3x the weights, which can turn a model that fits into one that does not.
114
+ <p align="center">
115
+ <img src="https://neuronpedia.s3.amazonaws.com/site-assets/gpu-sizer.gif" alt="interp-engine demo gif" width="100%">
116
+ </p>
117
+
118
+ [docs](https://interp-engine.org/docs/gpu-sizer) | [API](https://interp-engine.org/docs/gpu-sizer-api)
119
+
120
+ Never OOM again - `interp-engine` includes gpu-sizer, an intuitive UI which tells you what GPU(s) and configs you need to get the best performance out of your selected model. For example, [interp-engine.org/sizer/Qwen/Qwen3.6-27B](https://interp-engine.org/sizer/Qwen/Qwen3.6-27B) shows that you can run `Qwen3.6-27B` with interp-engine's vllm-static backend for max speed while keeping it in a single 80GB A100, and have ~40k tokens for the KV Cache.
117
121
 
118
122
  ## Why use an Interpretability Engine instead of building from scratch?
119
123
 
@@ -121,6 +125,14 @@ We verify correctness in two main ways:
121
125
  2. **Standardization + Verification**: Eliminate ambiguity when referring to points, plus a full test suite included.
122
126
  3. **Faster Dev / Fewer Tokens Used**: You could spend ten million tokens and have your AI write, test, and make production-ready an interpretability engine. Or you could just `pip install interp-engine[vllm]`.
123
127
 
128
+ ## Caveats
129
+
130
+ - **Gemma 4 requires transformers 5.14.1** because 5.15 moved `head_dim` into `per_layer_config` and vLLM's config read dies before a weight loads ([vllm#51744](https://github.com/vllm-project/vllm/issues/51744)).
131
+ - **DeepSeek-V2 on transformers older than 5.15.0** captures a wrong attention temperature — the engine warns at load, and upgrading is the fix ([COMPATIBILITY.md](docs/COMPATIBILITY.md)).
132
+ - **MXFP4 checkpoints (gpt-oss) need `interp-engine[quant]`**, which the `[vllm]` extra does not include; without it transformers dequantizes them to bf16 at roughly 3x the weights, which can turn a model that fits into one that does not.
133
+
134
+ Per-architecture structural quirks — which points a family serves and why — are not caveats but facts about the architecture, and live in [ARCHITECTURE_QUIRKS.md](docs/ARCHITECTURE_QUIRKS.md).
135
+
124
136
  ## Development / Contributing
125
137
 
126
138
  Activate the shared git hooks once per clone — they format staged Python, rebuild the generated files, and run CI's static checks before a push. Details in [CONTRIBUTING.md](CONTRIBUTING.md).
@@ -41,10 +41,14 @@ class EnvStamp:
41
41
  #: rather than where it runs. ``VLLM_DEEP_GEMM_WARMUP=skip`` is set by ``run_bench`` on every sweep
42
42
  #: (see ``skip_broken_deepgemm_warmup``) and moves DeepGEMM's first compile out of startup and into
43
43
  #: the first forward, which is a real difference in ``warmup_s`` on the FP8 rows.
44
+ #:
45
+ #: Only variables the installed vLLM still reads belong here. ``VLLM_ATTENTION_BACKEND`` and
46
+ #: ``VLLM_USE_V1`` were dropped from vLLM (the backend moved to the ``attention_config`` engine
47
+ #: argument, and V0 is gone), and neither name appears anywhere in 0.28.0. Stamping one annotated a
48
+ #: run with a setting that had no effect -- the one reading somebody chasing a discrepancy would
49
+ #: trust, and the worst kind to be wrong.
44
50
  _RECORDED_ENV: tuple[str, ...] = (
45
51
  "VLLM_DEEP_GEMM_WARMUP",
46
- "VLLM_ATTENTION_BACKEND",
47
- "VLLM_USE_V1",
48
52
  "CUDA_VISIBLE_DEVICES",
49
53
  )
50
54