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

ste*_*ten 11 artificial-intelligence deep-learning gpt-3 large-language-model

我有三个问题:

给定 LLM 参数的数量(以十亿为单位),您如何计算出运行模型需要多少 GPU RAM?

如果您有足够的 CPU-RAM(即没有 GPU),您可以运行该模型,即使它很慢

你可以在混合 GPU-RAM 和 CPU-RAM 中运行 LLM 模型(如 h2ogpt、open-assistant)吗?

log*_*og0 13

多少显存?

推理通常以 float16 运行,这意味着每个参数 2 个字节。对于 7B 参数模型,您需要大约 14GB 的 RAM 才能以 float16 精度运行它。通常训练/微调是在 float16 或 float32 中完成的。在 float16 中,推理通常可以立即正常运行。在某些情况下,模型可以量化并在 8 位或更小的位上高效运行。

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

通常是的,但取决于模型和库。可能会出现某些层未针对 CPU 实现的情况。

可以在 CPU/GPU 混合模式下运行吗?

许多库现在支持在 CPU 上运行某些层,在 GPU 上运行其他层。例如,Huggingface 转换器库支持将图层自动映射到您的所有设备,这意味着它将尝试最大限度地填充您的 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")
Run Code Online (Sandbox Code Playgroud)


Bri*_*ian 8

如何计算所需的 RAM 量?我假设你的意思只是推理,没有训练。

论文“ Reducing Activation Recomputation in Large Transformer Models ”提供了有关计算 Transformer 层大小的详细信息。

b: batchsize
s: sequence length
l: layers
a: attention heads
h: hidden dimensions
p: bytes of precision
Run Code Online (Sandbox Code Playgroud)
activations per layer = s*b*h*(34 +((5*a*s)/h))
Run Code Online (Sandbox Code Playgroud)

该论文以 16 位精度进行了计算。上面是以字节为单位的,所以如果我们除以 2,我们可以稍后乘以后面使用的精度的字节数。

activations = l * (5/2)*a*b*s^2 + 17*b*h*s #divided by 2 and simplified

total = p * (params + activations)
Run Code Online (Sandbox Code Playgroud)

让我们以 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
Run Code Online (Sandbox Code Playgroud)

请注意,您可以大大减少量化所需的内存。通过位量化,您可以将其降至 8GB 多一点。

我希望这对您有所帮助,并且我没有错过任何重要的事情。

编辑:我找到了这个资源,不确定它有多准确,但看起来不错。 https://vram.asmirnov.xyz