我有三个问题:
如果给定了十亿级别的LLM参数数量,如何确定需要多少GPU内存才能运行模型?
如果你有足够的CPU-RAM(即没有GPU),即使速度很慢,你也可以运行模型吗?
是否可以在混合GPU-RAM和CPU-RAM中运行LLM模型(例如h2ogpt,open-assistant)?
我有三个问题:
如果给定了十亿级别的LLM参数数量,如何确定需要多少GPU内存才能运行模型?
如果你有足够的CPU-RAM(即没有GPU),即使速度很慢,你也可以运行模型吗?
是否可以在混合GPU-RAM和CPU-RAM中运行LLM模型(例如h2ogpt,open-assistant)?
显存有多少?
推理通常以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")
如何计算所需的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))
activations = l * (5/2)*a*b*s^2 + 17*b*h*s #divided by 2 and simplified
total = p * (params + activations)
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
p * (activations + params)
的输出单位是比特,并且需要转换为字节(即除以8)才能得到你所报告的GB测量结果,那么你的公式会更清晰。此外,你提到的论文是关于训练的,其中激活值是用来计算梯度的。在推理过程中,不需要保留过去的激活值。你对此有什么评论吗? - joeDiHare