最近在折腾把ChatGLM3-6B部署到阿里云ECS上,用的是V100(16G显存),按理说6B模型应该跑得动。我用的官方transformers+quantization加载的int4版本,单次推理大概要3-5秒才出结果,感觉比网上说的慢不少。试过vLLM框架,但装了一堆依赖报错,参数也不知道怎么调。现在主要跑一些长文本总结任务,输入大概2000tokens左右,输出100-200tokens。有没有大佬指点下,是我加载方式不对,还是需要改点batch size或者max_seq_len?还有哪些加速技巧可以试试,比如flash attention或者pytorch compile?先谢过各位了。
部署ChatGLM3-6B到阿里云服务器,显存够但推理好慢怎么办?
全部回复
共 105 条V100跑int4的6B模型,3到5秒确实偏慢,但你先别急着换框架,我怀疑瓶颈在transformers的默认实现上——它没开KV cache或者用了动态padding,长文本输入时计算量会翻倍。你可以先检查一下是否把pad_token_id设对了,然后试试把input里的padding去掉,用左padding或者干脆截断到固定长度,这个对速度影响特别大。vLLM装不上就别死磕了,它对量化模型支持一般,而且你这任务吃的是单请求延迟,不是吞吐,vLLM的优势反而发挥不出来。flash attention可以装,但记得要匹配你transformers版本,不然会静默失效,装完看一眼日志里有没有提示启用成功。pytorch compile倒是值得试,但第一次运行会卡很久做图优化,你得有耐心等它编译完。另外你输出100到200tokens,生成阶段是逐token的,可以看看是不是采样参数里把top_p和temperature设太高导致每次都要重新算概率分布,调低一点能快不少。最后确认下你的CUDA和torch版本是不是太老,V100要发挥好得用cu118以上的环境,老版本对int4的算子优化很差。
试试开flash attention和torch.compile,能提升不少,另外检查下是不是没开混合精度。
V100跑int4的6B慢在解码阶段,3-5秒确实偏高了。你试试把max_seq_len设成2048,batch size先固定1,影响最大的是transformers的KV cache没开,加use_cache=True能快不少。flash attention在V100上支持不太好,但pytorch compile值得试,我上次编译后延迟降了30%。另外vLLM报错多半是版本冲突,直接装vllm==0.3.1配合transformers4.38试试,别用最新版。
我这边刚用vLLM跑通GLM3,发现输入2000tokens时prefill占了快一半时间,如果你不急着要流式输出,可以关掉流式模式,能省点开销。另外检查下你是不是用了CPU offload,V100显存够的话别开,会拖慢不少。还有个小技巧,把输入文本用tokenizer的max_length参数截断,别让模型自己算位置编码,能避免一些内存碎片问题。
你这情况我怀疑是量化后的算子没有走CUDA优化,试试把quantization换成bitsandbytes的nf4,别用官方默认的int4,有时候速度差两倍。另外注意阿里云ECS的CPU核数和内存带宽,如果CPU瓶颈的话,加载模型时设low_cpu_mem_usage=True,能减少内存拷贝时间。
2000 tokens输入在int4下3-5秒其实不算太离谱,但确实还有压榨空间。你试试把max_seq_len调小到实际需要的长度,默认2048会浪费不少计算。另外flash attention对长文本提升挺明显的,装个flash-attn再开use_flash_attention_2试试。vLLM值得再折腾一下,长文本场景paged attention收益很大,报错多半是cuda和torch版本对不上。
V100跑int4的6B模型3-5秒确实有点慢,不过你用的是transformers原生加载吧?那个推理路径没做continuous batching和paged attention,长输入场景下KV cache膨胀很拖速度。vLLM装不上建议换autodl或者直接用官方docker镜像,省得跟依赖打架。flash attention对V100支持有限,可以先试试把max_seq_len卡到实际需要的长度,别默认给太大,另外pytorch compile在V100上收益一般,不如先搞定量化推理引擎。