mirror of
https://github.com/vectorize-io/hindsight.git
synced 2026-09-14 19:31:49 +08:00
b045794817
Cuts the within-batch semantic link pass to float32 and one reused buffer.
The batch was widened to float64, but PackedEmbedding is array("f") and pgvector's
vector column stores float32, so the extra 32 bits were padding nothing downstream
could read. Dropping to float32 halves the working set and puts BLAS on SGEMM;
normalising in place, deriving validity from the row norms instead of an (n, dim)
isfinite mask, and reusing one similarity buffer across blocks remove three further
copies. Peak transient falls 74-86% (at 5,000 facts, 235 MB -> 48 MB). argpartition
replaces a full sort that existed only to discard all but top_k, and the self-link
mask and score unboxing move out of the Python loop: 1.7-2.2x on a realistic
clustered batch, up to 4.8x when nearly every pair clears the threshold.
Norms are accumulated in float64 via einsum, since a float32 sum of 1536 squares
overflows above ~1e19 and flushes to zero below ~1e-22. The batch is copied with
np.array rather than aliased with asarray, as it is now normalised in place.
Verified against the float64 implementation across 120 randomised batches plus
NaN/inf/zero embeddings, degenerate magnitudes and all-ties: identical link pairs,
scores within 1e-6.
102 lines
3.3 KiB
TOML
102 lines
3.3 KiB
TOML
[build-system]
|
|
requires = ["hatchling"]
|
|
build-backend = "hatchling.build"
|
|
|
|
[project]
|
|
name = "hindsight-dev"
|
|
version = "0.9.2"
|
|
description = "Development utilities for Hindsight"
|
|
requires-python = ">=3.11"
|
|
dependencies = [
|
|
"hindsight-api==0.9.2",
|
|
"python-fasthtml>=0.12.33",
|
|
"streamlit>=1.54.0",
|
|
"openai>=1.0.0",
|
|
"rich>=13.0.0",
|
|
"pydantic>=2.0.0",
|
|
"httpx>=0.27.0",
|
|
"numpy>=1.26.0",
|
|
]
|
|
|
|
[project.optional-dependencies]
|
|
test = [
|
|
"pytest>=8.0.0",
|
|
"httpx>=0.27.0",
|
|
"python-dotenv>=1.0.0",
|
|
]
|
|
|
|
[tool.hatch.build.targets.wheel]
|
|
packages = ["hindsight_dev", "benchmarks", "upgrade_tests"]
|
|
|
|
[tool.uv.sources]
|
|
hindsight-api = { workspace = true }
|
|
|
|
[project.scripts]
|
|
generate-openapi = "hindsight_dev.generate_openapi:generate_openapi_spec"
|
|
generate-bank-template-schema = "hindsight_dev.generate_bank_template_schema:main"
|
|
generate-changelog = "hindsight_dev.generate_changelog:main"
|
|
sync-cookbook = "hindsight_dev.sync_cookbook:main"
|
|
generate-llms-full = "hindsight_dev.generate_llms_full:main"
|
|
check-openapi-compatibility = "hindsight_dev.check_openapi_compatibility:main"
|
|
cli-coverage-check = "hindsight_dev.cli_coverage_check:main"
|
|
client-coverage-check = "hindsight_dev.client_coverage_check:main"
|
|
perf-test = "benchmarks.perf.system_perf:main"
|
|
token-count-bench = "benchmarks.micro.token_counting:main"
|
|
vector-serialization-bench = "benchmarks.micro.vector_serialization:main"
|
|
semantic-within-batch-bench = "benchmarks.micro.semantic_within_batch:main"
|
|
entity-resolver-bench = "benchmarks.micro.entity_resolver_bench:main"
|
|
find-duplicate-observations = "hindsight_dev.obs_dedup.cli:main"
|
|
|
|
[dependency-groups]
|
|
dev = [
|
|
"ruff>=0.8.0",
|
|
"ty>=0.0.1",
|
|
]
|
|
|
|
[tool.ruff]
|
|
line-length = 120
|
|
target-version = "py311"
|
|
|
|
[tool.ruff.lint]
|
|
select = [
|
|
"E", # pycodestyle errors
|
|
"W", # pycodestyle warnings
|
|
"F", # Pyflakes
|
|
"I", # isort
|
|
]
|
|
ignore = [
|
|
"E501", # line too long (handled by formatter)
|
|
"E402", # module import not at top of file
|
|
"E712", # avoid equality comparisons to False (intentional for optional bools)
|
|
"F403", # star imports (fasthtml uses this pattern)
|
|
"F405", # may be undefined from star imports (fasthtml uses this pattern)
|
|
"F811", # redefined while unused
|
|
"F821", # undefined name (forward references in type hints)
|
|
"W291", # trailing whitespace (in multiline strings)
|
|
"W293", # blank line contains whitespace (in multiline strings)
|
|
]
|
|
|
|
[tool.ruff.format]
|
|
quote-style = "double"
|
|
indent-style = "space"
|
|
|
|
[tool.ty]
|
|
# Type checking configuration
|
|
# ty is an extremely fast Python type checker from Astral (same team as ruff/uv)
|
|
|
|
[tool.ty.environment]
|
|
python-version = "3.11"
|
|
|
|
[tool.ty.rules]
|
|
# Disable noisy rules
|
|
invalid-argument-type = "ignore" # Too many false positives
|
|
invalid-return-type = "ignore" # Often intentional
|
|
# missing-argument and unknown-argument are enabled (default)
|
|
invalid-parameter-default = "ignore" # Optional params with None default
|
|
possibly-missing-attribute = "ignore" # Common with Optional types
|
|
unsupported-operator = "ignore" # Pandas DataFrame operations
|
|
unresolved-reference = "ignore" # Forward references
|
|
unresolved-import = "ignore" # Dynamic imports
|
|
invalid-assignment = "ignore" # Intentional monkey-patching
|
|
no-matching-overload = "ignore" # Complex generic issues
|