Address review on #6629:
- Cap the derived retention budget at a quarter of device capacity so a
large staged total cannot monopolize a small device; the multiplier
itself stays pending an instrumented target run.
- Log every release decision (reason, cached bytes, effective budget and
cap, staged total, free/total memory) and every staging OOM retry with
its staged byte total, so a single target run validates the headroom
multiplier directly.
- Make stager detach symmetric: set_cache_retention now shrinks the
previous cache's budget before growing the new one, so cache -> None ->
same cache counts the staged bytes exactly once (regression test added).
Signed-off-by: hsliuustc0106 <liuhongsheng4@huawei.com>
Replace BoundedAllocatorCache's device-capacity fraction bound (25% of
total memory) with a budget derived from the model topology: each attached
PinnedModuleStager reports its unique staged storage bytes once, and the
retention ceiling is that total times a fixed 2.0 headroom multiplier
covering allocator fragmentation and transient storages freed at component
boundaries. The 5% physically-free floor is unchanged.
The budget therefore scales with the staged components instead of device
capacity, so no user-chosen fraction is needed and behavior is identical
across differently sized devices with the same model. Re-attaching the
same cache does not double count; a second stager grows the budget by its
own bytes.
Signed-off-by: hsliuustc0106 <liuhongsheng4@huawei.com>