如何加快在tensorflow中运行的代码?

时间:2019-09-09 09:24:22

标签: tensorflow

The first is the pre-processing of data, the amount of data is particularly large, and the process of processing func is not slow, Python's multi-process can not be accelerated, but may also be slow (mainly consumed in serialization deserialization),

大工厂如何加快这部分过程的速度?

我现在看到的是:cython或numba可用于处理数值计算。 Spacy可以用于处理文本,但是spacy似乎与诸如正则表达式替换之类的正则处理不兼容。 (实际上,主要是文档看起来很累=。=) ” 在培训阶段,生成批处理的过程还会产生瓶颈。如果您不进行实时数据增强,则可以先处理数据来解决它。

但是如果您需要立即处理该怎么办?

我看到的方法是异步的,但是这样做似乎很麻烦。没有最佳做法可供参考。至少在pytorch的apex库中的示例感觉不对。因为在我的过程中加载和提供模型的过程是循环编写的,所以模型的操作和数据加载器的操作仍然是串行运行的。我尝试使用tensorflow的tf.data编写预取管道,但发现那里这是一个一定的速度问题,似乎我无法并行读取文件,可能是由于我使用的数据集。from_generator,在生成器的yield过程中无法并行处理。我考虑过使用pytorch的dataloader和tf.data嵌套。我发现我应该已经完成​​了此预取。我的测试代码在随附的html中。请纠正我,有更好的解决方案吗?还是代码中有更好的打包方法?     还有一个小问题,那就是最后生成的数据实际上是tf的张量,那么仍然需要串行运行两个步骤。将tf的张量转换为pytorch的张量,并将张量放入cuda中。如果可以,该如何使用?编写要预取的两个步骤? 代码如下:

import torch as t 
import tensorflow as tf
tf.compat.v1.enable_eager_execution()

from torch.utils.data import Dataset as Tset
from torch.utils.data import DataLoader as Tloader
from tensorflow.data import Dataset as TFset


!mkdir data

import os 

for i in range(1000):
    with open(f'data/{i}.txt', 'w') as writer:
        writer.write('sdfjoiwjeifojwoief')
import time

class tset(Tset):
    def __init__(self):
        self.files = [f'data/{i}' for i in os.listdir('data')]

    def __call__(self):
        for i in range(self.__len__()):
            yield self.__getitem__(i)

    def __len__(self):
        return len(self.files)

    def __getitem__(self, index):
        with open(self.files[index]) as reader:
            data = reader.readline()
        time.sleep(2)
        return data
class tloader:
    def __init__(self, dataset):
        self.dataset = dataset
        self.loader = Tloader(self.dataset, batch_size=4, num_workers=2)

    def __call__(self):
        for i in self.loader:
            yield i
t = tset()
tll = Tloader(t, batch_size=4 ,num_workers=2)
tl = tloader(t)
tfset = TFset.from_generator(tl, output_types=(tf.string))
def process(x):
    time.sleep(1)
    print('----')
    return x
tfset = tfset.prefetch(10)
from tqdm import tqdm
for i in tqdm(tfset):
    time.sleep(1)
    print(i)
for i in tqdm(tll):
    time.sleep(1)
    print(i)

0 个答案:

没有答案