feat: Implement unified memory management for ONNX model inference

- Introduced a new memory management policy for ONNX Runtime to release temporary GPU memory after inference completion.
- Established a shared inference entry point for all ONNX models, differentiating between long-lived sessions and temporary memory arenas.
- Updated CUDA sessions to utilize a shrinkable memory arena, reclaiming GPU memory post-inference.
- Ensured consistent memory release semantics across BEN2, DA3, MoGe-2, and Upscale models while reusing existing sessions.
- Added lifecycle tests to validate temporary memory release and session reuse.
- Modified model adapters to integrate the new memory management features, ensuring backward compatibility with existing inference behavior.
- Enhanced unit tests to cover new memory release scenarios and verify correct behavior across different execution providers.
This commit is contained in:
2026-09-01 13:22:35 +08:00
parent 4d4b892d64
commit 2ff7b04f56
24 changed files with 767 additions and 32 deletions

View File

@@ -3,6 +3,7 @@ import tempfile
import unittest
from pathlib import Path
from types import SimpleNamespace
from unittest.mock import patch
import numpy as np
from PIL import Image
@@ -21,6 +22,9 @@ import onnx_da3
class FakeSession:
def get_providers(self):
return ["CPUExecutionProvider"]
def get_inputs(self):
return [SimpleNamespace(name="images"), SimpleNamespace(name="strategy")]
@@ -36,6 +40,27 @@ class FakeSession:
class Da3OnnxTest(unittest.TestCase):
def test_infer_forwards_memory_release_boundary(self):
with tempfile.TemporaryDirectory() as directory:
image_path = Path(directory) / "input.png"
Image.new("RGB", (80, 60)).save(image_path)
session = FakeSession()
with patch.object(
onnx_da3,
"run_session",
side_effect=lambda model, names, feeds, **_options: model.run(
names, feeds
),
) as run:
onnx_da3.infer(
session,
[image_path],
process_res=56,
release_memory=False,
)
self.assertFalse(run.call_args.kwargs["release_memory"])
def test_target_size_uses_patch_multiple(self):
self.assertEqual(
onnx_da3.target_size((800, 600), 504, "upper_bound_resize"),