指南

内存管理

v3.8
管理持久化服务的内存

spaCy 维护了一些内部缓存以提高速度,但这会导致内存随时间略微增加。如果您运行的是不需要长期存活的批处理任务,内存使用量的增加通常不是问题。然而,如果在Web服务中运行spaCy,您通常希望spaCy的内存使用保持稳定。Transformer模型有时也可能遇到内存问题,特别是在GPU上使用时。

记忆区域

你可以通过使用Language.memory_zone上下文管理器,指示spaCy释放其内部缓存(特别是Vocab)中的数据。进入该上下文管理器并在其中处理文本,spaCy将在代码块结束时重置其内部缓存(释放相关内存)。内存区域中创建的spaCy对象在内存区域结束后不得再被访问。

使用内存区域

spaCy需要内存区域上下文管理器,因为处理管道无法跟踪哪些Doc对象引用了共享Vocab缓存中的数据。例如,当spaCy遇到新词时,新的Lexeme条目会存储在Vocab中,而Doc对象指向这个共享数据。当Doc超出作用域时,Vocab无法知道这个Lexeme是否不再被使用。

内存区域通过允许您告知处理管道,在两个点之间创建的所有数据不再使用,从而解决了这个问题。遵守这一协议取决于您自己。如果您访问本应不再使用的对象,可能会因无效的内存访问而遇到段错误。

内存区域的一个常见用例将在Web服务内部。处理管道可以只加载一次,作为上下文变量或全局变量,每个请求都可以在内存区域内处理:

使用FastAPI实现内存区域

清理transformer张量和其他Doc属性

TransformerTok2Vec 组件在解析过程中会在 Doc 对象上设置中间值。如果同时将多个 Doc 对象保留在内存中,这可能导致 GPU 内存耗尽。

要解决这个问题,您可以在流水线中添加doc_cleaner组件。默认情况下, 这将清理Doc._.trf_data扩展属性和Doc.tensor属性。 您还可以让它清理在自定义流水线组件中使用的其他中间扩展属性。

添加doc_cleaner