虚拟内存管理机制主要是将地址和内存的概念分离。通过配置环境变量PYTORCH_NPU_ALLOC_CONF,使PyTorch自己管理虚拟内存和物理内存的映射,并允许多次申请使用连续内存,通过构建可扩展的内存段,动态调整内存块的大小,可以减少内存碎片的产生。对于有较多内存碎片的模型,可以降低设备内存占用率。
如图1所示,通过底层提供的接口,可以率先预留大块的虚拟地址空间作为一个内存块。用户不断申请内存时,可以得到在连续地址上的内存块,分别与不同地址的物理内存映射,释放内存时,连续地址的内存块可以合并成为一个内存块。
训练过程中出现内存溢出(Out Of Memory,OOM)时,或想降低模型内存占用率的情况下,可以考虑使用该特性。
环境变量PYTORCH_NPU_ALLOC_CONF=expandable_segments:<value>。
value可以取值为True或False。默认为False。
此环境变量使用详情请参考《环境变量参考》中的“PYTORCH_NPU_ALLOC_CONF”章节。
开启虚拟内存机制:
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
关闭虚拟内存机制:
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:False
expandable_segments特性需在Ascend HDK 23.0.0及以上版本上使用。