神经网络推理时间缓慢

3

我用Pytorch编写了一个简单的全连接神经网络。然后我使用LibTorch将模型保存并在C++中加载,但是对于我的应用领域而言,推理时间非常慢。目前推理时间大约为10毫秒。这正常吗?还是我做错了什么?

我首先只在Python上测量了推理时间。然后为了使它更快,我在C++上加载了这个网络,但是并没有起到帮助作用。

以下是网络代码:

class network(nn.Module):
    def __init__(self):
        super(network,self).__init__()
        input_nodes = 362
        hidden_nodes1 = 50
        hidden_nodes2 = 30
        output_nodes = 1

    self.fc1 = nn.Linear(input_nodes,hidden_nodes1)
    nn.init.xavier_uniform_(self.fc1.weight)
    self.bn1 = nn.BatchNorm1d(num_features=hidden_nodes1)

    self.fc2 = nn.Linear(hidden_nodes1,hidden_nodes2)
    nn.init.xavier_uniform_(self.fc2.weight)
    self.bn2 = nn.BatchNorm1d(num_features = hidden_nodes2)

    self.fc3 = nn.Linear(hidden_nodes2,output_nodes)
    nn.init.xavier_uniform_(self.fc3.weight)

    self.out_act = nn.Sigmoid();

def forward(self,X):
    X = F.relu(self.bn1(self.fc1(X)))
    X = self.fc2(X)
    X = F.dropout2d(X,p=0.3)
    X = F.relu(X)
    X = self.fc3(X)
    out = self.out_act(X)
    return out

我希望推理花费大约0.01毫秒的时间。


你是如何测量时间的?如果你能提供一个可工作的代码,那就太好了。 - Berriel
你是在GPU还是CPU上进行推理时间的测试?我遇到了类似的问题,希望能够在使用Mobilenet架构的情况下,在50毫秒内对图像进行推理。 - Jodh Singh
@Berriel 我正在测量网络前向函数的执行时间。 - raghav sood
(抱歉晚了一点才回复……):在推理之前,您尝试通过调用 eval() 将网络切换到评估模式了吗? - Jan Ca
2个回答

1
如果您只使用了几个数据点进行推理,那么Python和C++之间的执行时间可能没有太大差异。也许可以尝试使用更多的数据?此外,您正在使用的架构很简单;它可能非常适合在CPU上运行推理。不要忘记反馈您的测试结果!我也想知道发生了什么。 :)

1
关于我的网络使用。我只提供单个输入进行推断,而不是一批输入。我不能使用批处理,因为我的下一个输入取决于上一个推断。此外,我没有处理图像,所以我认为我不需要更深层次的网络。 - raghav sood
我明白了。我没有表达清楚:更深层次的架构只是为了观察执行时间的变化,但我认为现在没有任何意义。也许这与你的系统有关?你是否在C++和Python上以完全相同的方式跟踪执行时间?尝试在1000个示例上跟踪时间,例如在Python和C++上,并检查差异... - Paulo Mann
好的,我会尝试并告诉你结果。 - raghav sood
我尝试对1000个输入批次运行推理,整个批次的运行时间约为72毫秒。 - raghav sood
我认为你报告的10毫秒可能是由于加载模型、堆叠函数参数等开销造成的。但是,当你看到一批数据的运行时间时,与执行1000个输入相比,这种开销并不重要。72毫秒是指C++实现吗? - Paulo Mann

0

Libtorch确实比pytorch慢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接