加载AutoTokenizer为何占用大量内存?
问题
我在测量脚本内存占用时发现,加载sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2对应的AutoTokenizer占用了约300MB内存,但分词器文件本身仅约9MB,请问原因是什么?
我进行了如下测试:
from transformers import AutoTokenizer from memory_profiler import profile @profile def load_tokenizer(): path = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2" tokenizer = AutoTokenizer.from_pretrained(path) return tokenizer load_tokenizer()
输出结果:
Line # Mem usage Increment Occurrences Line Contents ============================================================= 4 377.4 MiB 377.4 MiB 1 @profile 5 def load_tokenizer(): 6 377.4 MiB 0.0 MiB 1 path = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2" 7 676.6 MiB 299.2 MiB 1 tokenizer = AutoTokenizer.from_pretrained(path) 8 9 10 676.6 MiB 0.0 MiB 1 return tokenizer
原因分析
- 内存数据结构的构建:磁盘上的9MB是压缩存储的分词器文件,但加载后会在内存中生成大量高效查询的结构——比如词汇表的哈希映射、用于快速分词的前缀树(Trie)、特殊标记的索引映射等。多语言分词器的词汇表本身规模大,这些辅助结构会大幅增加内存占用。
- 初始化的额外开销:
AutoTokenizer.from_pretrained加载时,会初始化整个transformers生态的配套组件,包括分词器配置类、预处理逻辑、内部缓存对象等,这些都会占用额外内存。 - 内存测量的统计范围:
memory_profiler统计的是进程总内存增量,包含了加载过程中临时创建的对象、Python解释器的内存分配开销,甚至下载/缓存文件时的临时内存占用(哪怕磁盘文件小,加载时的内存拷贝、解压过程也会占内存)。 - 多语言特性的额外负担:这个分词器是多语言版本,内置了多种语言的子分词规则、字符映射表,这些针对不同语言的特殊处理逻辑,会显著增加内存占用规模。
内容的提问来源于stack exchange,提问作者Yanina Kolotilova
相关产品推荐
相关产品推荐

