我正在使用tensorflow编辑距离 功能编写基于 gpu的字符串匹配程序。通过了解匹配部分,我将提取详细信息,然后将其存储到数据表中,最终将其另存为csv文件。详细信息如下:
我有2个列表。 较小列表称为 test_string ,其中包含大约 9个字。 较大的称为 ref_string ,它基本上是将大文本文件每行分割成一个单词。该文件最初是键值对。因此,在拆分时,键将在一行中,而值将在下一行中。
我正在使用 muliprocessing / joblib 来并行读取文件,并将读取列表作为ref_string列表传递,在其中以gpu完成编辑距离比较。
总共有 4080个文本文件,每个文本文件在拆分时包含大约 10,000个字。
使用tf编辑距离,每个单词都与ref_words匹配。记录索引,其中编辑距离变为零,然后使用(index+1)
提取其值。
系统规格:英特尔酷睿i5、12gb ram,配备2gb的Nvidia 940mx,Tensorflow 1.10.0,Cuda 9.0,Cudnn 7.1。
我在这里使用cpu完成了一个类似的程序,我想看看使用gpu是否可以加快执行时间,here可以找到。
这是小代码段:
def main_prog(filenames):
try:
with open(path+filenames,'r') as f:
ref_string=f.readlines()
ref_string=[x.strip() for x in ref_string]
index=slicer(ref_string)
ref_string=ref_string[index[0]:(index[1]-1)]
for i in range(0,len(test_string)):
test_string1=test_string[i]
out=[x==test_string1 for x in ref_string]
out=[i for i, x in enumerate(out) if x]
if len(out)!=0:
# Comparing the data using tf with edit distance
with tf.Session(config=tf.ConfigProto(intra_op_parallelism_threads=10)) as sess:
test_string_sparse = create_sparse_vec(filler(test_string1,ref_string))
ref_string_sparse = create_sparse_vec(ref_string)
out=get_index(sess.run(tf.edit_distance(test_string_sparse, ref_string_sparse, normalize=True)))
df.set_value(0,test_string1,ref_string[out+1])
else:
df.set_value(0,test_string1,"nil")
return df
except:
return df
if __name__ == '__main__':
test_string=["name","Price","oPrice","discount","brand","id","seller","id","category"]
df=pd.DataFrame(columns=test_string)
filenames=os.listdir("/home/Desktop/Parallelise/mod_all_page/")
data=df.append((Parallel(n_jobs=2)(delayed(main_prog)(filenames[i]) for i in range(100))),ignore_index=True)
data.to_csv("/home/Desktop/final_out.csv")
该代码正在运行,但速度很慢。我可以看到CPU利用率平均约为80-90%。在检查nvidia-smi状态时,有2个作业正在运行,其中一个消耗了将近1.9gb。有时,由于内存故障,程序崩溃。在测试约100个输入文件时,我得到的执行时间约为70秒,而cpu版本代码则在18秒内提取了4080个文件。
- GPU版本(tensorflow-gpu)100个输入文件:70秒
- CPU版本(多处理)4080个输入文件:18秒。
代码是否有问题?我可以更快吗?我已经尝试过使用谷歌合作实验室访问tesla gpu,因为它具有较大的ram,但是性能仍然相同。该代码未经过优化。我将尝试进行分析并发布更新。
如果有人可以指出我犯了一个错误,那将非常有帮助。谢谢!
通过将n_jobs的数量增加到4,我能够将100个文件的执行时间从70秒减少到8秒。但是,当像这样的大型数据集尝试这样做时,则会出现错误“ CUDA内存不足” 4080个文件。