Merge origin/master: bf16 precision, chunked attention, seg-reuse, mimalloc purge
Adopts master as the standard for all overlapping work. Master's landed optimizations supersede server-edition's own fp16 experiment: - Unified --precision fp32|bf16 knob (bgfilter/precision.py) driving all three models: ViTMatte weight cast + both BiRefNets via autocast, with a hardware gate (falls back to fp32 off native-bf16 CPUs) and an AutocastCPU fp32 shim for torchvision deform_conv2d. - Query-chunked ViTMatte global attention (bgfilter/attn_chunk.py), exact and bitwise-identical, caps the N^2 spike (~19 -> ~4 GB at 2048). - Cross-check HR-matting forward reused as the seg mask (birefnet backend only), skipping the primary seg model; MIMALLOC_PURGE_DELAY=0. - inference_mode and the detect_background_color removal converge with server-edition's earlier equivalents. Conflict resolution (favoring master, preserving server-only features): - vitmatte_infer/segmentation: dropped server's device-derived fp16 for master's precision path, kept resolve_model_source (local weights). - service.py: cross-check SegmentationSettings now passes precision so the HTTP service honors bf16 like the CLI's _second_opinion does. Verified on CPU: default fp32 pipeline loads 2 models (seg-reuse active) and bf16 path runs (autocast + deform_conv2d shim) — both exit 0. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+20
-3
@@ -85,6 +85,7 @@ class MattingPipeline:
|
||||
model_name=check.model_name,
|
||||
device=self.settings.segmentation.device,
|
||||
input_size=check.input_size,
|
||||
precision=check.precision,
|
||||
)
|
||||
)
|
||||
return self._cross_checker.mask(rgb)
|
||||
@@ -135,8 +136,24 @@ def _process_rgb(rgb: np.ndarray, pipeline: MattingPipeline) -> MattingResult:
|
||||
bg_confidence, model = compute_bg_confidence(
|
||||
rgb, settings=settings.chroma, screen_color=screen_color
|
||||
)
|
||||
second_alpha = None
|
||||
if settings.segmentation.enabled:
|
||||
seg_mask = pipeline._segment(rgb)
|
||||
reuse = (
|
||||
settings.cross_check.enabled
|
||||
and settings.cross_check.reuse_as_seg
|
||||
# Reuse swaps one BiRefNet-family model for another (validated
|
||||
# equivalent topology). A different backend chosen explicitly
|
||||
# (anime-seg) keeps its own forward; cross-check still runs
|
||||
# independently on top of it.
|
||||
and settings.segmentation.backend == "birefnet"
|
||||
)
|
||||
if reuse:
|
||||
# One HR-matting forward serves both the trimap topology and the
|
||||
# cross-check second opinion; the primary seg model is never loaded.
|
||||
second_alpha = pipeline._second_opinion(rgb)
|
||||
seg_mask = second_alpha
|
||||
else:
|
||||
seg_mask = pipeline._segment(rgb)
|
||||
mode = settings.trimap.mode
|
||||
if mode == "seg":
|
||||
trimap, trimap_stats = fuse_trimap(seg_mask, bg_confidence, settings.trimap)
|
||||
@@ -163,10 +180,10 @@ def _process_rgb(rgb: np.ndarray, pipeline: MattingPipeline) -> MattingResult:
|
||||
raw_alpha=raw_alpha if alpha_source == "vitmatte" else None,
|
||||
)
|
||||
alpha = clean_alpha(alpha, trimap, settings.alpha_post)
|
||||
second_alpha = None
|
||||
if settings.cross_check.enabled:
|
||||
lab = convert_color_spaces(rgb)[1]
|
||||
second_alpha = pipeline._second_opinion(rgb)
|
||||
if second_alpha is None:
|
||||
second_alpha = pipeline._second_opinion(rgb)
|
||||
alpha = cross_check_alpha(
|
||||
alpha,
|
||||
second_alpha,
|
||||
|
||||
Reference in New Issue
Block a user