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

从其他文件导入的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 00:57:25