Fix issue with memory manager on MPS devices
This commit is contained in:
1 parent
ea3afb405f
commit
609f3e5fa5
2 files changed
+17
-10
No files matched your search
@@ -31,7 +31,11 @@ from torch.utils.checkpoint import checkpoint
|
|||||||
|
|
||||||
|
|
||||||
def rope(pos: Tensor, dim: int, theta: float = 1e4, ntk: float = 1.0) -> Tensor:
|
def rope(pos: Tensor, dim: int, theta: float = 1e4, ntk: float = 1.0) -> Tensor:
|
||||||
scale = torch.arange(0, dim, 2, dtype=torch.float64, device=pos.device) / dim
|
# MPS has no float64
|
||||||
|
dt = torch.float32 if pos.device.type == "mps" else torch.float64
|
||||||
|
if dt is torch.float32:
|
||||||
|
pos = pos.to(dt)
|
||||||
|
scale = torch.arange(0, dim, 2, dtype=dt, device=pos.device) / dim
|
||||||
omega = 1.0 / ((theta * ntk) ** scale)
|
omega = 1.0 / ((theta * ntk) ** scale)
|
||||||
out = torch.einsum("...n,d->...nd", pos, omega)
|
out = torch.einsum("...n,d->...nd", pos, omega)
|
||||||
out = torch.stack(
|
out = torch.stack(
|
||||||
|
|||||||
@@ -457,15 +457,18 @@ class MemoryManager:
|
|||||||
gc.collect()
|
gc.collect()
|
||||||
torch.cuda.empty_cache()
|
torch.cuda.empty_cache()
|
||||||
|
|
||||||
# torch's pinned-host cache; private API, name varies by torch version
|
# torch's pinned-host cache; private API, name varies by torch version.
|
||||||
for fn_name in ("_accelerator_emptyHostCache", "_host_emptyCache"):
|
# Skipped on MPS: it segfaults there (pytorch/pytorch#197561), not catchable
|
||||||
fn = getattr(torch._C, fn_name, None)
|
on_mps = getattr(torch.backends, "mps", None) is not None and torch.backends.mps.is_available()
|
||||||
if fn is not None:
|
if not on_mps:
|
||||||
try:
|
for fn_name in ("_accelerator_emptyHostCache", "_host_emptyCache"):
|
||||||
fn()
|
fn = getattr(torch._C, fn_name, None)
|
||||||
break
|
if fn is not None:
|
||||||
except Exception:
|
try:
|
||||||
pass
|
fn()
|
||||||
|
break
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
# glibc keeps freed arenas mapped; CDLL(None) resolves malloc_trim in
|
# glibc keeps freed arenas mapped; CDLL(None) resolves malloc_trim in
|
||||||
# the running process where glibc is present and fails cleanly on
|
# the running process where glibc is present and fails cleanly on
|
||||||
|
|||||||
Reference in new issue
Block a user