【pytorch】深度学习所需算力估算:flops及模型参数量

颢师傅 2024-06-29 08:01:02 阅读 52

目录

计算量的要求是在于芯片的floaps(指的是gpu的运算能力)参数量对应显存大小选型常见的英伟达显卡的FLOPS和显存规格pytorch中的floaps与显存计算方法

计算量的要求是在于芯片的floaps(指的是gpu的运算能力)

确定神经网络推理需要的运算能力需要考虑以下几个因素:

网络结构:神经网络结构的复杂度直接影响运算能力的需求。一般来说,深度网络和卷积网络需要更多的计算能力。

输入数据大小和数据类型:输入数据的大小和数据类型直接影响到每层神经网络的计算量和存储需求。例如,输入数据是较大的图像或视频,需要更多的内存和计算能力。

批量大小:批量大小决定了每次处理的样本数量,也会影响到计算能力的需求。一般来说,批量大小越大,需要的计算能力就越大。

计算网络结构的浮点运算量(FLOPs):可以使用现有的工具或代码库(如TensorFlow Profiler或PyTorch Profiler)来计算网络结构的FLOPs。

thop(pytorch-OpCounter)是一个用于计算 PyTorch 模型 FLOPs 和参数数量的 Python 库。在 thop 中,计算的是 FLOPs(Floating Point Operations)而不是 FLOPS(Floating Point Operations Per Second)

FLOPs 转换为 FLOPS 来确定所需的计算能力。

转换的方法是:将 FLOPs 除以每秒钟可以执行的浮点运算次数,即 FLOPs / FLOPS = 秒数。这个秒数表示模型需要的最短计算时间。例如,如果一个模型的 FLOPs 为 1000,计算机的处理能力为 10 FLOPS,那么需要的最短计算时间为 100 秒(1000 / 10 = 100)

参数量对应显存大小选型

PyTorch模型的参数量和GPU显存之间有一定的关系。模型参数越多,需要的显存也就越大。这是因为模型的参数需要存储在显存中,而在计算过程中,也会涉及到一些中间结果的存储和计算,所以需要足够的显存来支持模型的运行。

在部署时,需要考虑芯片的显存,是因为显存的大小限制了模型的最大批次大小。如果模型的批次大小超过了显存的大小,那么就无法将整个批次的数据同时加载到显存中,需要分批处理,这会增加模型推理的时间。因此,在部署时,需要选择适合芯片显存大小的模型和批次大小。

假设我们已知模型的参数量为100M,最大推理batchsize为32,现在需要选定适合的推理芯片显存大小。下面是一个简单的计算过程:

首先,我们需要计算出模型在最大推理batchsize下所需要的显存大小。假设模型的输入数据大小为[h, w],每个元素的数据类型为float32,那么模型每个batch的输入数据大小为[h, w, 32](32为batchsize),占用显存大小为h * w * 32 * 4(4为float32的字节大小,即4个字节),同理,输出数据大小也为[h, w, 32],占用显存大小也为h * w * 32 * 4,因此,模型在最大推理batchsize下所需要的显存大小为:

显存大小 = 输入数据大小 + 输出数据大小 + 模型参数大小

显存大小 = h * w * 32 * 4 + h * w * 32 * 4 + 100M * 4

注意,这里假设模型所有参数都是float32类型,所以模型参数大小是100M * 4,如果模型参数类型不是float32,需要相应地调整计算。

假设我们希望显存利用率达到80%,则最终选定的显存大小为:

显存大小 = (h * w * 32 * 4 + h * w * 32 * 4 + 100M * 4) / 0.8

接下来,我们需要根据计算结果选择适合的推理芯片显存大小。以NVIDIA的显卡为例,NVIDIA显卡的显存有不同的规格,例如8GB、16GB、32GB等。我们可以选择最接近计算结果的显存规格作为推理芯片的显存大小。

假设计算结果为3000MB,我们可以选择8GB的显存规格作为推理芯片的显存大小。因为8GB显卡的实际可用显存约为7500MB左右,可以满足模型在最大推理batchsize下的显存需求,同时还有一定的余量,可以保证模型能够正常运行。如果选择16GB或32GB的显存规格,虽然可以更好地满足显存需求,但是会造成显存的浪费,同时也会增加硬件成本。

一般一个参数是值一个float,也就是4个字节

1kb=1024字节

常见的英伟达显卡的FLOPS和显存规格

NVIDIA GeForce GTX 1080 Ti

FLOPS: 11.34 TFLOPS

显存: 11 GB GDDR5X

NVIDIA GeForce RTX 2080 Ti

FLOPS: 14.2 TFLOPS

显存: 11 GB GDDR6

NVIDIA Tesla V100

FLOPS: 7.5-15.7 TFLOPS (取决于精度)

显存: 16 GB HBM2

NVIDIA Tesla P100

FLOPS: 4.7-9.3 TFLOPS (取决于精度)

显存: 16 GB HBM2

NVIDIA Tesla T4

FLOPS: 8.1 TFLOPS

显存: 16 GB GDDR6

NVIDIA Quadro RTX 6000

FLOPS: 16.3 TFLOPS

显存: 24 GB GDDR6

pytorch中的floaps与显存计算方法

安装库:

pip install thop

执行代码:

# -- coding: utf-8 --

import torch

import torchvision

from thop import profile

# Model

print('==> Building model..')

model = torchvision.models.alexnet(pretrained=False)

dummy_input = torch.randn(1, 3, 224, 224)

flops, params = profile(model, (dummy_input,))

print('flops: ', flops, 'params: ', params)

print('flops: %.2f M, params: %.2f M' % (flops / 1000000.0, params / 1000000.0))

输出结果:

flops: 714206912.0 params: 61100840.0

flops: 714.21 M, params: 61.10 M

注:

FLOPS(Floating Point Operations Per Second)是一种计算机性能单位,用于表示每秒钟可以执行的浮点运算次数。它通常用于衡量计算机的处理速度和性能,特别是在科学计算、人工智能、大数据处理等领域。FLOPS的单位是每秒浮点运算次数,常用的前缀有k(千)、M(百万)、G(十亿)、T(万亿)等。

故在批次为1时,224*224的3通道输入,其计算量为714206912.0flops



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。