Root cause: torch.load() reads 6.9GB .ckpt into Python heap + model params in CPU RAM = ~14GB peak, exceeding 16GB system RAM → OOM Killer. Fix 1 - mmap=True on all torch.load() calls (torch 2.7 supports this): With mmap, checkpoint storage is file-backed (not heap). Only the model parameters (also ~7GB) exist in physical RAM during loading. Peak RAM drops from ~14GB to ~7GB — within safe limits on 16GB machines. Files changed: pipelines.py, hunyuan3ddit.py, model.py (×2), flow_matching_sit.py Fix 2 - malloc_trim(0) after every gc.collect(): Forces glibc to return freed heap pages to OS immediately, so Python's memory pool doesn't hoard freed model memory before the next load. Fix 3 - PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True: Prevents CUDA allocator fragmentation between model switches. Fix 4 - Adaptive threshold recalculated: With mmap loading, loading a model requires ~7.5GB (model params) not 14GB. CPU offload threshold lowered from 16GB → 10.5GB, enabling fast path on machines with more headroom. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
81 lines
3.1 KiB
HTML
81 lines
3.1 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
|
|
<head>
|
|
<!-- Import the component -->
|
|
<script src="https://cdn.jsdelivr.net/npm/@google/model-viewer@3.1.1/dist/model-viewer.min.js" type="module"></script>
|
|
|
|
<script>
|
|
document.addEventListener('DOMContentLoaded', () => {
|
|
const modelViewers = document.querySelectorAll('model-viewer');
|
|
const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
|
|
|
|
modelViewers.forEach(modelViewer => {
|
|
modelViewer.setAttribute(
|
|
"environment-image",
|
|
"/static/env_maps/gradient.jpg"
|
|
);
|
|
// if (!isSafari) {
|
|
// modelViewer.setAttribute(
|
|
// "environment-image",
|
|
// "/static/env_maps/gradient.jpg"
|
|
// );
|
|
// } else {
|
|
// modelViewer.addEventListener('load', (event) => {
|
|
// const [material] = modelViewer.model.materials;
|
|
// let color = [43, 44, 46, 255];
|
|
// color = color.map(x => x / 255);
|
|
// material.pbrMetallicRoughness.setMetallicFactor(0.1); // 完全金属
|
|
// material.pbrMetallicRoughness.setRoughnessFactor(0.7); // 低粗糙度
|
|
// material.pbrMetallicRoughness.setBaseColorFactor(color); // CornflowerBlue in RGB
|
|
// });
|
|
// }
|
|
// modelViewer.addEventListener('load', (event) => {
|
|
// const [material] = modelViewer.model.materials;
|
|
// let color = [43, 44, 46, 255];
|
|
// color = color.map(x => x / 255);
|
|
// material.pbrMetallicRoughness.setMetallicFactor(0.1); // 完全金属
|
|
// material.pbrMetallicRoughness.setRoughnessFactor(0.7); // 低粗糙度
|
|
// material.pbrMetallicRoughness.setBaseColorFactor(color); // CornflowerBlue in RGB
|
|
// });
|
|
});
|
|
});
|
|
</script>
|
|
|
|
<style>
|
|
body {
|
|
margin: 0;
|
|
font-family: Arial, sans-serif;
|
|
}
|
|
|
|
.centered-container {
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
border-radius: 8px;
|
|
border-color: #e5e7eb;
|
|
border-style: solid;
|
|
border-width: 1px;
|
|
}
|
|
</style>
|
|
</head>
|
|
|
|
<body>
|
|
<div class="centered-container">
|
|
<div class="column is-mobile is-centered">
|
|
<model-viewer id="modelviewer" style="height: 640px; width: 500px;"
|
|
rotation-per-second="10deg"
|
|
src="./white_mesh.glb/" disable-tap
|
|
environment-image="neutral"
|
|
camera-target="0m 0m 0m"
|
|
camera-orbit="0deg 90deg 8m"
|
|
orientation="0deg 0deg 0deg"
|
|
shadow-intensity=".9"
|
|
ar auto-rotate
|
|
camera-controls>
|
|
</model-viewer>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
|
|
</html> |