You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Llama 3.1 70B模型在Nvidia A40显卡上部署的显存需求及设备分配问题咨询

Llama 3.1 70B模型在Nvidia A40显卡上部署的显存需求及设备分配问题咨询

嘿,我来帮你捋捋这个问题~ 先从理论显存需求说起,再看看你的代码可能踩了哪些坑。

首先算清楚基础显存账:Llama 3.1 70B用4bit量化的话,模型本身的显存占用大概是70B × 4bit = 35GB左右,但实际推理时还要算上输入输出张量、推理缓存、临时运算空间,一般得预留5-10GB的余量,所以单卡跑的话40-45GB显存就够。单张A100 80G完全没问题,而A40单卡48G,理论上其实也能塞下——但你说多卡反而OOM,这大概率是设备分配或者量化没生效的问题,不是显存总量不够。

接下来看你的代码问题:你用了device_map="auto"load_in_4bit=True,按道理transformers应该自动把模型分片到多张GPU上,但出现OOM还怀疑是多份模型,可能是这几个原因:

  • 先检查依赖库版本:旧版的transformersaccelerate或者bitsandbytes可能存在多卡设备映射的bug,建议先升级到最新版:
    pip install --upgrade transformers accelerate bitsandbytes
    
  • 确认bitsandbytes安装正确:4bit量化依赖这个库,如果安装时没匹配你的CUDA版本,会导致量化失效,模型默认按FP16加载——那70B的FP16模型要140GB显存,3张A40加起来144GB刚够,但算上余量就会OOM,这时候看起来像是每张卡都加载了部分,但实际是量化没起作用。
  • 试试明确量化配置+补全必要参数:Llama系列默认没有pad token,推理时可能会额外占用显存,而且明确量化配置能避免自动加载的歧义,修改后的代码如下:
    from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
    
    # 明确指定4bit量化配置,提升显存效率
    bnb_config = BitsAndBytesConfig(
        load_in_4bit=True,
        bnb_4bit_use_double_quant=True,
        bnb_4bit_quant_type="nf4",
        bnb_4bit_compute_dtype=torch.bfloat16
    )
    
    model_id = 'meta-llama/Meta-Llama-3.1-70B-Instruct'
    
    model = AutoModelForCausalLM.from_pretrained(
        model_id,
        device_map="auto",
        quantization_config=bnb_config,
        trust_remote_code=True
    )
    
    tokenizer = AutoTokenizer.from_pretrained(model_id, padding_side="left")
    tokenizer.pad_token = tokenizer.eos_token  # Llama默认无pad token,必须手动设置
    model_inputs = tokenizer(["A list of colors: red, blue"], return_tensors="pt").to("cuda")
    
    generated_ids = model.generate(**model_inputs, max_new_tokens=50)
    answer = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)
    print(answer)
    

再回到“需要多少张A40”的问题:如果4bit量化正常工作,单张A40就能跑(48G足够装下量化模型加余量);如果量化失效按FP16加载,那至少需要3张A40(140GB左右需求,3张144GB刚够,但余量紧张)。但你的情况是多卡反而OOM,肯定是设备分配或量化的问题,不是显存总量不够。

最后可以用print(model.hf_device_map)查看模型层的分配情况:如果输出里各层分散在不同GPU,就是正确分片;如果出现重复层,那就要再检查库的安装和版本了。

备注:内容来源于stack exchange,提问作者Soerendip

火山引擎 最新活动