从其他文件导入的Python函数加载缓慢且崩溃问题求助
问题分析与解决思路
核心性能问题:重复加载Tokenizer
你的embed_answers函数里,每次调用都会执行BertTokenizer.from_pretrained('...')——这意味着处理DataFrame的每一行时,都会重新加载一次BERT分词器模型。模型加载本身需要读取磁盘文件、初始化权重,重复执行会导致严重的性能损耗,甚至因为内存重复占用引发崩溃。
解决方法:把Tokenizer初始化移到函数外部,全局只加载一次:
from transformers import BertTokenizer import pandas as pd # 补上缺失的pandas导入 # 全局初始化Tokenizer,只加载一次 tokenizer = BertTokenizer.from_pretrained('...') def embed_answers(ans, length): sentence_embeddings = [] # 直接用全局的tokenizer,不再重复加载 embeddings = tokenizer.encode(ans, max_length=length, padding='max_length') sentence_embeddings.extend(embeddings) return sentence_embeddings def get_dataset(vec_type): vec_dict = {"large": 1000, "medium": 500, "small": 150} if vec_type.lower() not in vec_dict: raise Exception("Invalid vector type!") df = pd.read_hdf('...', mode='r') vec_length = vec_dict[vec_type] df['embeddings_col'] = df['answer'].apply(embed_answers, length=vec_length) return df
语法错误隐患
你提供的代码里,sentence_embeddings.extend(embeddings.encode(...))这一行缺少了闭合的右括号,虽然你说直接运行正常,但这是明显的语法问题,可能是粘贴时的遗漏,需要确保实际代码里括号完整。
缺失模块导入
helper_file.py中使用了pd.read_hdf但没有导入pandas,如果main.py里已经导入了pandas,直接在main里运行函数时不会报错,但单独导入helper模块时会触发NameError,这也可能是崩溃的诱因之一,必须补上import pandas as pd。
额外优化建议
df.apply本身是逐行处理,效率较低,数据量大时可以改用批量处理的方式,进一步提升性能:
def embed_answers_batch(answers, length): return tokenizer(answers.tolist(), max_length=length, padding='max_length', return_tensors='pt').input_ids.numpy().tolist() # 在get_dataset里替换apply为批量处理 df['embeddings_col'] = embed_answers_batch(df['answer'], vec_length)
内容的提问来源于stack exchange,提问作者Kalamazoo
相关产品推荐
相关产品推荐

