确定运行LLM模型的一般规格

10

我有三个问题:

如果给定了十亿级别的LLM参数数量,如何确定需要多少GPU内存才能运行模型?

如果你有足够的CPU-RAM(即没有GPU),即使速度很慢,你也可以运行模型吗?

是否可以在混合GPU-RAM和CPU-RAM中运行LLM模型(例如h2ogpt,open-assistant)?

2个回答

11

显存有多少?

推理通常以float16运行,即每个参数占用2个字节。对于一个7B参数的模型,您需要大约14GB的内存以float16精度运行它。通常训练/微调是以float16或float32进行的。推理通常在float16下立即运行良好。在某些情况下,模型可以量化并以8位或更小的精度高效运行。

假设有足够的RAM,您能在CPU上运行该模型吗?

通常可以,但取决于模型和库。有时候某些层可能没有为CPU实现。

您能在CPU/GPU混合模式下运行吗?

现在许多库都支持在CPU上运行部分层,而其他层在GPU上运行。例如,Huggingface transformers库支持将层自动映射到所有设备,这意味着它将尽量充分利用您的GPU,并将剩余部分转移到CPU上。在加载模型时,将device_map设置为auto即可实现此功能。

from transformers import AutoModelForCausalLM, AutoTokenizer   
tokenizer = AutoTokenizer.from_pretrained("OpenAssistant/stablelm-7b-sft-v7-epoch-3")
model = AutoModelForCausalLM.from_pretrained("OpenAssistant/stablelm-7b-sft-v7-epoch-3",
                                             device_map="auto")

3

如何计算所需的RAM数量?我假设你指的是推理过程,而不是训练。

论文 "减少大型Transformer模型中的激活重新计算" 对计算Transformer层大小有很好的信息。

b: batchsize
s: sequence length
l: layers
a: attention heads
h: hidden dimensions
p: bytes of precision

activations per layer = s*b*h*(34 +((5*a*s)/h))

这篇论文以16位精度进行了计算。 上述是以字节为单位的,所以如果我们除以2,之后可以再乘以使用的精度字节数。
activations = l * (5/2)*a*b*s^2 + 17*b*h*s #divided by 2 and simplified

total = p * (params + activations)

让我们以llama2 7b为例来看一下:
params = 7*10^9

p = 32   #precision
b = 1    #batchsize 
s = 2048 #sequence length
l = 32   #layers
a = 32   #attention heads
h = 4096 #hidden dimension

activations => 10,880,024,576
p * (activations + params) => about 66 GB

请注意,通过量化可以大幅减少所需的内存。在位量化下,内存需求可以降低到略高于8GB。
希望这对您有所帮助,也希望我没有漏掉任何重要的内容。

1
不错的资源,但是如果明确指出p * (activations + params)的输出单位是比特,并且需要转换为字节(即除以8)才能得到你所报告的GB测量结果,那么你的公式会更清晰。此外,你提到的论文是关于训练的,其中激活值是用来计算梯度的。在推理过程中,不需要保留过去的激活值。你对此有什么评论吗? - joeDiHare
1
@joeDiHare 你有没有其他的资源或经验法则可以帮助确定加载、推理、训练和使用基础模型所需的计算要求? - undefined
是的,对于完全未优化的训练的估计也会非常有用。 - undefined
我正在努力弄清楚通过一些模型进行推理所需的内存量。在这种情况下,"量化"到底意味着什么,以及如何实现呢? - undefined

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