本文将介绍一个任务,即部署几个开源的模型,并将本地经过全量微调的模型与开源模型进行效果对比。 部署的开源模型包括:星火13B,Baichuan2-13B, ChatGLM6B等。 其他两个模型基于transformers架构封装,因此推理服务启动还是十分丝滑,但星火13B是基于Megatron-DeepSpeed框架实现,启动推理服务的过程中发现启动13B的显卡占用71G-78G,有些反直觉。 此文将整理开源星火13B的显存及内存排查并优化的整理过程,至于哪家开源模型效果好,不在此文的讨论范围内。 直观上来说,13B的模型,数据类型为bf16,显卡占用大概在26G左右,但星火13B直接占用70G+,不可思议。排查原因的过程中,少不了源码的调试与分析。在排查的过程中,启动推理服务的文件run_iFlytekSpark_text_generation.py中,model_provider方法是初始化模型并加载模型文件的方法。 其中,加载权重文件可以看到,加载state_dict时,直接将权重文件加载到显卡中,而非加载至CPU,然后再执行to方法,转移到GPU。因此该处是一个潜在的优化点。 再打入iFlytekSparkModel内部,词表Embedding层,线性转换层,等初始化weight时,也是直接将weight分配在GPU上运行。 优化方案: 1. 模型初始化时,模型的Embedding,线性层的权重weight均直接加载至GPU,因此可以优化为先将这些weight加载至CPU。改进的方式也很简单,从上面的源码层面,可以看到,当增加参数” use_cpu_initialization”,将使用CPU进行初始化权重,因此只需要在启动推理服务的脚本中增加” --use-cpu-initialization”参数即可。 2. 加载模型文件时,直接加载至GPU,然后run_iFlytekSpark_text_generation.py中的get_model方法中,当模型加载完成后,会进行分配至GPU以及FP16的转换的操作。因此,优化的方式也很简单,可以优化为先加载至CPU,再运行get_model中的默认分配至GPU,加载完后,再使用垃圾回收机制清除CPU占用的内存即可。 效果对比: (1) 优化前的显卡占用: 71.5G (2) 优化前的内存占用: 虚拟内存占用94.5G (3) 优化后的显卡占用: 26G (4) 优化后的内存占用: 43.1G 总结: 本文主要是针对开源星火13B的显存及内存占用过大的一个代码优化。核心思想是使用CPU预加载模型,再转换至GPU。后期如有遇到此类问题,可以借鉴之。
显卡如果只看显存,那你就错了显卡显存! 显卡的参数很多,我把它分为四个,一个是流处理器,一个是位宽,一个是显存,一个是频率。在这四个里面最不重要的就是显存,如1060 6G,显存就是6G。当然我说的这些是有两个前提条件的,一是架构一样,也就是同系对比,如10系显卡之间的比较,像1050和1060,1070或者是1080TI这都是同系的。第二个条件就是,只针对大部分,比如游戏,不针对个别情况哦。 所有的参数当然是越高越好,这个不不容置疑,但还是有很多电脑新手看得不是很清楚,也不太明白。那么在这里我教大家一个最简单有效的方法: 只看位宽 同系显卡,位宽越大,性能越强。(相应的其它参数也会增加) 大家看下上面我发的四张10系显卡图,分别是1050,1060,1070,1080TI四个显卡的参数图。它们的显存位宽分别是128,192,256,352对吧,越往后越强。这也是我目前总结出一个最简单的方法了,大家以后在不清楚显卡性能高低时,看下它们的位宽就明了啦。 那么问题来了,1070,1070TI,1080这三个显卡那个更好呢? 这三个显卡的显存位宽都是256,这时我们就要看其它参数了,一样的很简单。其实看型号我们也知道1080比1070好,这个问题是很简单。 如果我让你说出好多少你知道吗? 大部分人不清楚,除非有专门的测试,这时我们还有一个方法,一分钱一分货,看价格,如微星红龙1070大概是3300元,1070TI大概是3600元,1080大概是4100元,从这三个价格来看,它们差别不大,相差只有几百块,可能就是10%左右。而它们的位宽一样,再从价格看一下,得出它们的性能其实没有相差多少。 我们再来看看10系显卡的位宽与价格的对应关系 1050TI (位宽128)价格为1200元 1066(位宽192)价格为2300元 1070(位宽256)价格为3300元 1070TI(位宽256)价格为3700元 1080(位宽256)价格分别为4100元 1080TI(位宽352)价格为6700元从上面的表格中,我们可以看出,位宽不一样,价格差别很大,1050TI到1060价格相差1100元,相差幅度接近50%,也就是一半,这是非常大的。再看1066和1070价格相差1000元,相差幅度也有30%,而1070和1070TI,相差只有10% ,1070TI和1080相差也只有10%,而这三个显卡的位宽都是256,是不是说明同系同位宽的显卡相差不大呢?再来看下1080和1080TI的差距,相差2600元,位宽也相差很多,所以说1080TI和1080不是一个型号,1080TI也不是1080的升级版,估计应该算1090了。这就是我从位宽和价格给大家分析出的结果,大家可以认真看下。 最后说一点,显存虽说在这几个参数中最不重要,但有些程序还是需要大显存的,如现在热门的吃鸡游戏。而且以后软件在设计时可能会针对显存,那么到时像8G,11G这种大显存可能还是有必要的。 如果觉得对你有用,请顺手点个赞,谢谢 关注玩电脑,教你玩硬件,玩组装。