我正在写一个使用张量流编辑距离的基于GPU的字符串匹配程序特征。通过了解匹配部分,我将提取详细信息,然后将其存储到数据表中,该数据表最终将保存为 csv 文件。详细信息如下:
我有 2 个清单。这较小的列表叫做测试字符串其中包含约9 words. The 较大的一个被称为参考字符串这基本上是将一个大文本文件拆分为每行一个单词。该文件最初是一个键值对。因此,在拆分时,键将在一行中,值将在下一行中。
我在用多处理/joblib to 并行读取文件并将读取列表作为 ref_string 列表传递,其中编辑距离比较在 GPU 中完成。
总共有4080 个文本文件每个文本文件包含大约10,000 字分裂时。
使用 tf 编辑距离将每个单词与 ref_words 进行匹配。这index哪里的编辑距离变成zero被注意到,然后(index+1)
用于提取其价值。
系统规格:Intel core i5、12GB RAM、Nvidia 940mx(2GB)、Tensorflow 1.10.0、Cuda 9.0、Cudnn 7.1。
我在这里使用 cpu 完成了一个类似的程序,我想看看使用 GPU 是否可以加快执行时间,可以找到here https://stackoverflow.com/questions/54050446/multiprocessing-so-slow.
这是小代码片段:
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 秒
代码有问题吗?我可以让它更快吗?我尝试使用 google colab 访问 tesla gpu,因为它有很大的内存,但性能仍然相同。代码有些地方没有优化。我将尝试进行分析并发布更新。
如果有人能指出我在哪里犯了错误,那将非常有帮助。谢谢!
Update:
通过将 n_jobs 数量增加到 4,我能够将 100 个文件的执行时间从 70 秒缩短到 8 秒。但是,当对 4080 个文件等大型数据集尝试相同操作时,会出现错误“CUDA 内存不足”。