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)
如何计算所需的 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