如何使用张量流实现GPU并行性?

时间:2019-01-28 12:34:40

标签: python tensorflow multiprocessing gpu joblib

我正在使用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秒。
  •   

enter image description here

代码是否有问题?我可以更快吗?我已经尝试过使用谷歌合作实验室访问tesla gpu,因为它具有较大的ram,但是性能仍然相同。该代码未经过优化。我将尝试进行分析并发布更新。

如果有人可以指出我犯了一个错误,那将非常有帮助。谢谢!

更新:

通过将n_jobs的数量增加到4,我能够将100个文件的执行时间从70秒减少到8秒。但是,当像这样的大型数据集尝试这样做时,则会出现错误“ CUDA内存不足” 4080个文件。

0 个答案:

没有答案