You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两种方式加载Llama3到MPS为何内存占用存在差异?

问题原因与解决方案

内存差异的原因

两种加载方式的核心区别在于模型权重的加载路径:

  • 方式一:通过device_map="mps"参数,Hugging Face的Accelerate库会直接将模型权重加载到MPS设备,全程不会在CPU内存中留存完整的权重副本,因此进程的CPU内存占用仅为必要的运行时开销,加上MPS显存的16GB,活动监视器显示总占用约16GB。
  • 方式二:先将完整的模型权重加载到CPU内存(8B参数的float16模型权重约16GB),再通过.to("mps")转移到MPS设备。此时CPU内存中会残留未被及时回收的权重张量副本——即使你删除了原模型变量,PyTorch的内存管理机制可能因存在隐藏引用(如加载过程中生成的临时张量、内部缓存)而无法立刻释放这部分内存,导致进程CPU内存额外占用约4GB,总内存显示为20GB。

torch.mps.current_allocated_memory()仅统计MPS设备的显存占用,因此两种方式返回值一致,无法反映CPU内存的残留情况。

清除残留内存的方法

  1. 优先使用方式一加载:这是最彻底的解决方案,直接避免CPU内存残留,代码如下:
llm = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Meta-Llama-3-8B-Instruct",
    torch_dtype=torch.float16,
    device_map="mps",
    token=True,
)
  1. 若必须先加载到CPU再转移:手动清理CPU内存的步骤如下:
# 先加载到CPU
llm_cpu = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Meta-Llama-3-8B-Instruct",
    torch_dtype=torch.float16,
    token=True,
)
# 转移到MPS
llm = llm_cpu.to("mps")
# 删除CPU模型的引用
del llm_cpu
# 强制触发垃圾回收
import gc
gc.collect()
# 清空PyTorch的CPU内存缓存
torch.empty_cache()

注意:如果仍有残留,可能是Accelerate或PyTorch内部的隐藏缓存导致,此时建议切换到方式一加载。

内容的提问来源于stack exchange,提问作者Owen D

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 17:01:06