LLM优化:开源星火13B显卡及内存占用优化

【LLM入门之 星火大模型】(一) 获取API_KEY 以及本地运行 本篇会介绍星火大模型API简单的调用。适合没有魔法的同学。需要新建一个应用,这里随便取名字后,直接下单就行。新用户注册会有免费的200w额度调用。按照自身条件领取或采购。右上角可以看到你的参数,按需保存和调用。然后进入控制台,点击大模型V3.5。以上就是简单的入门,后续会继续更新。最近就写点LLM入门的吧 =。 阅读详情

1. 背景

本qiang~这两天接了一个任务,部署几个开源的模型,并且将本地经过全量微调的模型与开源模型做一个效果对比。

部署的开源模型包括:星火13B,Baichuan2-13B, ChatGLM6B等

其他两个模型基于transformers架构封装,因此推理服务启动还是十分丝滑,但星火13B是基于Megatron-DeepSpeed框架实现,地址是:https://gitee.com/iflytekopensource/iFlytekSpark-13B,启动推理服务的过程中发现启动13B的显卡占用71G-78G,有些反直觉。

此文就是整理开源星火13B的显存及内存排查并优化的整理过程,至于哪家开源模型效果好,不在此文的讨论范围内。

2. 原因分析

直观上来说,13B的模型,数据类型为bf16,显卡占用大概在26G左右,但星火13B直接占用70G+,不可思议,怪不得网上关于星火开源模型的讨论少之又少,原因显而易见,这么大的显存占用只能用多卡或者A800等80G显卡才能适配。穷人家的孩子,哪有这么多余粮。

排查原因的过程中,少不了源码的调试与分析。在排查的过程中,启动推理服务的文件run_iFlytekSpark_text_generation.py中,model_provider方法是初始化模型并加载模型文件的方法。

def model_provider(pre_process=True, post_process=True):

    """Build the model."""

    print_rank_0('building iFlytekSpark model ...')

    args = get_args()

    config = core_transformer_config_from_args(args)

        

         ### 初始化星火模型

    model = iFlytekSparkModel(

        config,

        num_tokentypes=0,

        parallel_output=False,

        pre_process=pre_process,

        post_process=post_process,

        return_moe_loss=False

    )





    if args.from_pretrained is not None:

        assert os.path.exists(args.from_pretrained)

        ckpt_path = get_checkpoint_name(args.from_pretrained)

        print_rank_0('Loading from {} '.format(

                args.from_pretrained))

                  # 模型加载权重文件

        state_dict = torch.load(ckpt_path, map_location=f"cuda:{torch.cuda.current_device()}")

        if 'module' in state_dict:

            state_dict = state_dict['module']

        model.load_state_dict(state_dict)

    return model

其中,加载权重文件可以看到,加载state_dict时,直接将权重文件加载到显卡中,而非加载至CPU,然后再执行to方法,转移到GPU。因此该处是一个潜在的优化点。

再打入iFlytekSparkModel内部,词表Embedding层,线性转换层,等初始化weight时,也是直接将weight分配在GPU上运行。例如下例:

class RowParallelLinear(torch.nn.Module):
    def __init__(self, input_size: int, output_size: int, *,
                 config: ModelParallelConfig,
                 init_method: Callable,
                 bias: bool = True,
                 input_is_parallel: bool = False,
                 stride: int = 1,
                 keep_master_weight_for_test: bool = False,
                 skip_bias_add: bool = False,
                 moe=False, enable_expert_tensor_parallelism=False):
        super(RowParallelLinear, self).__init__()

        # .........
		
        if config.use_cpu_initialization:
            self.weight = Parameter(torch.empty(self.output_size,
                                                self.input_size_per_partition,
                                                dtype=config.params_dtype))
            if config.perform_initialization:
                self.master_weight = _initialize_affine_weight_cpu(
                    self.weight, self.output_size, self.input_size,
                    self.input_size_per_partition, 1, init_method,
                    stride=stride, return_master_weight=keep_master_weight_for_test,
                    params_dtype=config.params_dtype)
        else:
			# 默认按照启动sh命令,会走该分支
            self.weight = Parameter(torch.empty(
                self.output_size, self.input_size_per_partition,
                device=get_accelerator().current_device_name(), dtype=config.params_dtype))
            if config.perform_initialization:
                _initialize_affine_weight_gpu(self.weight, init_method,
                                              partition_dim=1, stride=stride)
        if bias:
            if config.use_cpu_initialization:
                self.bias = Parameter(torch.empty(self.output_size,
                                                  dtype=config.params_dtype))
            else:
				# 默认按照启动sh命令,会走该分支
                self.bias = Parameter(torch.empty(
                    self.output_size, device=get_accelerator().current_device_name(),
                    dtype=config.params_dtype))
            setattr(self.bias, 'sequence_parallel', self.sequence_parallel)

            if config.perform_initialization:
                # Always initialize bias to zero.
                with torch.no_grad():
                    self.bias.zero_()
        else:
            self.register_parameter('bias', None)

3. 优化方案

1. 模型初始化时,模型的Embedding,线性层的权重weight均直接加载至GPU,因此可以优化为先将这些weight加载至CPU。

改进的方式也很简单,从上面的源码层面,可以看到,当增加参数” use_cpu_initialization”,将使用CPU进行初始化权重,因此只需要在启动推理服务的脚本中增加” --use-cpu-initialization”参数即可。

2. 加载模型文件时,直接加载至GPU,然后run_iFlytekSpark_text_generation.py中的get_model方法中,当模型加载完成后,会进行分配至GPU以及FP16的转换的操作。如下代码所示。

def get_model(model_provider_func, model_type=ModelType.encoder_or_decoder, wrap_with_ddp=True):
    """Build the model."""
    args = get_args()
    args.model_type = model_type

    # ..........

    # GPU allocation.
    for model_module in model:
        model_module.to(get_accelerator().current_device_name())
 

    # Fp16 conversion.
    if args.fp16 or args.bf16:
        model = [Float16Module(model_module, args) for model_module in model]

    # .......

    return model

因此,优化的方式也很简单,可以优化为先加载至CPU,再运行get_model中的默认分配至GPU,加载完后,再使用垃圾回收机制清除CPU占用的内存即可。

话不多说,优化后的代码如下:

def model_provider(pre_process=True, post_process=True):
    """Build the model."""
    print_rank_0('building iFlytekSpark model ...')
    args = get_args()
    config = core_transformer_config_from_args(args)
    model = iFlytekSparkModel(
        config,
        num_tokentypes=0,
        parallel_output=False,
        pre_process=pre_process,
        post_process=post_process,
        return_moe_loss=False
    )


    if args.from_pretrained is not None:
        print(args.from_pretrained)
        assert os.path.exists(args.from_pretrained)
        ckpt_path = get_checkpoint_name(args.from_pretrained)
        print_rank_0('Loading from {} '.format(
                args.from_pretrained))

        # state_dict = torch.load(ckpt_path, map_location=f"cuda:{torch.cuda.current_device()}")
		# CPU进行加载
        state_dict = torch.load(ckpt_path, map_location=f"cpu")
        if 'module' in state_dict:
            state_dict = state_dict['module']
        model.load_state_dict(state_dict)
		
		# 加载完成,删除state_dict,并垃圾回收
        del state_dict
        gc.collect()
        torch.cuda.empty_cache()

    return model

4. 效果对比

(1) 优化前的显卡占用: 71.5G

(2) 优化前的内存占用: 虚拟内存占用94.5G

(3) 优化后的显卡占用: 26G

(4) 优化后的内存占用: 43.1G

5. 总结

一句话足矣~

本文主要是针对开源星火13B的显存及内存占用过大的一个代码优化。核心思想是使用CPU预加载模型,再转换至GPU。

后期如有遇到此类问题,可以借鉴之~

DeepSeek-llm-7B-Chat微调教程 DeepSeek系列大模型由杭州深度求索人工智能基础高性价比:DeepSeek-V2模型以其史无前例的性价比著称,推理成本被降到每百万token仅1块钱,约等于Llama3 70B的七分之一,的七十分之一。架构创新:DeepSeek对模型架构进行了全方位创新,提出崭新的MLA(一种新的多头潜在注意力机制)架构,把显存占用降到了过去最常用的MHA架构的5%-13%,同时,独创的DeepSeekMoESparse结构,也把计算量降到极致。 阅读详情

相关推荐

ROS 2 Slam Toolbox实战:从零跑通2D激光建图

SLAM(同步定位与地图构建)是移动机器人实现自主导航的基础技术,其核心在于通过传感器数据实时估计位姿并构建环境栅格地图。slam_toolbox作为ROS 2 Humble及后续LTS版本官方主推的2D SLAM后端,采用图优化+闭环检测架构,兼顾实时性、鲁棒性与工程可维护性。相比cartographer和hector_slam,它原生支持ROS 2、参数精简、诊断友好,特别适合硬件资源有限、缺乏IMU或深度相机的差速机器人平台。本文聚焦真实部署场景,覆盖RPLIDAR等常见2D激光雷达与TurtleBo

weixin_30596165的博客 357

科大讯飞星火开源大模型iFlytekSpark-13B GPU版部署方法

iFlytekSpark-13B: 讯飞星火开源-13B(iFlytekSpark-13B)拥有130亿参数,新一代认知大模型,一经发布,众多科研院所和高校便期待科大讯飞能够开源。最后说说硬件要求,我做完了以上配置就不报别的错了,只是还是显存溢出了,我的电脑是3090*2的,看来最低只能用40GB单卡,两个24GB由于各种原因会爆显存。需要注意的是,如上面repo里介绍的,由于模型太大所以使用Git LFS存储,如果直接用git clone是没法下载的。结合上面的博客,感觉有可能确实是分支的问题。

qysh123的专栏 5335

FLUKA软件在Ubuntu的安装指南(亲测有效)

FLUKA其强大的蒙特卡洛模拟能力使得用户能够模拟复杂的辐射相互作用过程

chencheng1127的博客 2886

Datawhale AI夏令营 - LLM技术:基于星火大模型的群聊对话分角色要素提取挑战赛#ai夏令营datawhale#夏令营

比赛链接:Datawhale提供了2个Baseline,其中第一个Baseline为线上Baseline,部署在飞桨的Aistudio里面,可以一键运行,第二个Baseline为大语言模型微调。AI夏令营 - LLM实践教程。

m0_51789661的博客 1552

LeGO-LOAM运行kitti数据集

文章目录1. kitti-lego-loam2. 改动3. 实验结果4. evo轨迹测评 1. kitti-lego-loam 链接:kitti-lego-loam kitti-lego-loam提供了将kitti序列转化成rosbag的代码,在kittibag中. 需要注意下数据文件的存放顺序,以00序列为例: datafolder          |____results          &

Zlp19970106的博客 8704

保姆级教程:用Wokwi玩转ESP32 MicroPython仿真(含库文件配置指南)

本教程详细介绍了如何使用Wokwi平台进行ESP32 MicroPython仿真开发,包括库文件配置、传感器数据模拟和REPL调试技巧。通过Wokwi的仿真调试系统,开发者可以在浏览器中快速验证代码逻辑,提高开发效率,特别适合物联网项目的快速迭代。

weixin_29195615的博客 443

LLM(大语言模型)——Springboot集成文心一言、讯飞星火、通义千问、智谱清言

目录 引言 代码完整地址 入参 出参 Controller Service Service实现类 模型Service 入参转换类 文心一言实现类 讯飞星火实现类 通义千问实现类 智谱清言实现类 引言 本文将介绍如何使用Java语言,结合Spring Boot框架,集成国内热门大模型API,包括文心一言、讯飞星火、通义千问、智谱清言。 在开始前,请确保您已经按照各模型官网的指引,完成了相应的资源申请和配置。这些资源是调用大模型API的必要凭证,务必妥善保管。接下来,我

telescopewang的博客 6724

新手也能玩转!用Panosim+MATLAB/Simulink搭建你的第一个智能驾驶仿真场景(保姆级图文)

本文为新手提供了使用Panosim和MATLAB/Simulink搭建智能驾驶仿真场景的详细教程。从环境准备、基础场景创建到仿真模型构建,一步步指导用户完成第一个智能驾驶仿真项目,帮助零基础用户快速上手并体验智能驾驶仿真的乐趣。

weixin_29090089的博客 182

科大讯飞首发开源大模型“星火开源-13B” 深度适配昇思MindSpore AI框架

在星火开源-13B训练过程中,开发团队利用昇思MindSpore AI框架将训练效率提升了40%。为各行各业提供了一种性价比高的解决方案。昇思MindSpore开源社区:https://xihe.mindspore.cn/modelzoo/iflytek/introduce启智社区:https://openi.pcl.ac.cn/iflytek/iFlytekSpark-13BGitee地址:https://gitee.com/iflytekopensource/iFlytekSpark-13B。

Kenji_Shinji的博客 1974

VsCode+JLink+GCC替代Keil开发GD32程序-个人总结

对个人使用vscode+Jlink开发GD32程序做了总结,供需要者参考。

MyCollege1999的博客 2762

【系统架构设计师】论文模板样例:论软件系统架构风格

本人于年月参与项目,该系统为*,在该项目组中我担任系统架构师岗位,主要负责系统整体架构设计。本文以该车联网项目为例,主要讨论了软件架构风格在该项目中的具体应用。底层架构风格我们采用了虚拟机风格中的解释器,因该公交共有几十种不同的数据协议,使用解释器风格可以满足整车数据协议兼容性需求;中间层关于应用层的数据流转采用了独立构件风格中的隐式调用,以减低系统间耦合度、简化软件架构,提高可修改性方面的架构属性;应用系统层采用了B/S的架构风格,统一解决公交行业性难题“实施推广难、维护难”问题。

数据知道的博客 9927

DeepSeek-llm-7B-Chat微调教程(使用SwanLab可视化工具)

高性价比:DeepSeek-V2模型以其史无前例的性价比著称,推理成本被降到每百万token仅1块钱,约等于Llama3 70B的七分之一,GPT-4 Turbo的七十分之一。架构创新:DeepSeek对模型架构进行了全方位创新,提出崭新的MLA(一种新的多头潜在注意力机制)架构,把显存占用降到了过去最常用的MHA架构的5%-13%,同时,独创的DeepSeekMoESparse结构,也把计算量降到极致。开源模型。

优快云_224022的博客 2278

TensorRT量化实战教程:从PTQ到QAT,让你的模型推理速度飞起来

无论是PTQ的“快速落地”,还是QAT的“精度极致”,TensorRT量化技术都能成为你模型部署路上的“性能引擎”。通过本教程的实战项目,你已掌握从技术原理到工程落地的全流程能力——现在,不妨将你的模型代入其中,亲眼见证它在速度与精度的双重提升中“焕发生机”。若你在实操中遇到任何卡点,随时可以针对具体问题交流,我会尽全力帮你突破量化部署的每一个瓶颈。

FJN110的博客 239

【一文搞定】DeepSeek-llm-7B-Chat微调教程_deepseek 微调实战源码全流程

高性价比:DeepSeek-V2模型以其史无前例的性价比著称,推理成本被降到每百万token仅1块钱,约等于Llama3 70B的七分之一,GPT-4 Turbo的七十分之一。架构创新:DeepSeek对模型架构进行了全方位创新,提出崭新的MLA(一种新的多头潜在注意力机制)架构,把显存占用降到了过去最常用的MHA架构的5%-13%,同时,独创的DeepSeekMoESparse结构,也把计算量降到极致。

大模型训练 1750

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

DeepSeek-llm-7B-Chat微调教程_deepseek 微调

高性价比:DeepSeek-V2模型以其史无前例的性价比著称,推理成本被降到每百万token仅1块钱,约等于Llama3 70B的七分之一,GPT-4 Turbo的七十分之一。架构创新:DeepSeek对模型架构进行了全方位创新,提出崭新的MLA(一种新的多头潜在注意力机制)架构,把显存占用降到了过去最常用的MHA架构的5%-13%,同时,独创的DeepSeekMoESparse结构,也把计算量降到极致。

Z4400840的博客 2229

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

AI Agent_学习04_Ollama 本地运行 AI 大模型的极简方案

想体验本地 AI 却怕配置复杂、显卡不够?Ollama 就是最优解!这款工具能让普通电脑秒变离线 AI 助手,无需高端硬件,核显 + 16G 内存就能轻松运行千问、浦语等轻量大模型。本文从安装部署、模型选择到路径迁移、国内镜像配置,手把手教你玩转 Ollama,全程无门槛,新手也能一次搞定。告别云端 AI 的隐私顾虑,摆脱显卡焦虑,用最简单的方式拥有专属本地 AI,满足办公、学习等多场景需求。

laowang的博客 1304

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

69个词看懂整个AI产业链

未来的AI一定会让世界天翻地覆,现在我们只看到了它的1%。AI 技术体系就像一块五层蛋糕,从触手可及的应用层,到提供动力的能源层,层层递进,缺一不可。

魏波 962

AI 编程不得不知道的二三事

目前AI编程越来越火,但是各类工具,名词越来越多,很多人对此一知半解,或者有的根本没听说过,在此笔者把ai编程相关的主流内容进行了简易的整理,希望给还对AI不熟悉的小伙伴带去一些帮助

零凌林的博客 1241

AI大模型入门指南:从核心概念到本地部署与微调实战

Transformer架构作为现代人工智能的基石,通过其核心的注意力机制,实现了对海量信息的并行处理与深度理解,奠定了大语言模型的技术基础。这一原理使得模型能够捕捉长距离语义依赖,从而在自然语言处理、代码生成和多模态任务中展现出强大的泛化能力。其技术价值在于将复杂的模式识别与生成任务转化为可规模化训练的数学模型,极大地推动了AIGC(人工智能生成内容)和智能助手等应用的发展。应用场景已从最初的文本补全,迅速扩展到编程辅助、创意写作、智能客服和科学研究等多个领域。本文聚焦于AI大模型的实际应用与定制化,深入探

weixin_30266885的博客 581

AI大模型高考数学评测:从148分到“宕机”的推理能力边界探索

这次我们来看一个关于AI大模型挑战高考数学题的现象级话题。最近,一个名为“大型纪录片《AI做高考题集体宕机》”的标题在网络上引发了广泛讨论,它以一种略带调侃的方式,揭示了当前AI在应对复杂、高难度推理任务时可能面临的挑战。这个话题的核心,并非指AI真的“宕机”,而是聚焦于主流大模型在高考数学这类高强度、高规范性考试中的实际表现、能力边界以及暴露出的问题。 根据网络搜索材料,近期确实有媒体对6款主流AI大模型(讯飞星火、DeepSeek、智谱、ChatGPT、Kimi、MiniMax)进行了一场高考数学模拟测

weixin_33738982的博客 420

国内替代Gemini的合规技术路径:本地模型与云平台实战指南

大语言模型多模态能力已成为AI应用的基础需求,其核心价值体现在长上下文理解、图文联合推理、代码生成与实时交互等维度。随着Gemini等国际模型在国内服务受限,开发者亟需可落地、可验证、符合数据安全法规的技术替代方案。本文从能力映射出发,系统梳理Qwen2-VL、Kimi、通义千问等主流国产模型在视觉语言理解、超长文档处理、结构化输出等方面的工程表现,并结合硬件选型、量化部署、API集成与成本效益分析,提供覆盖个人实验到企业级落地的完整技术路径。特别聚焦‘Gemini替代’与‘多模态本地部署’两大高频搜索场景

507

【LLM入门之 星火大模型】(二) 多轮对话

实现星火大模型的多轮对话

通过图灵测试的人类的博客_优快云_PYTHON_DeepLearning_数据挖掘 1362
上一篇: LLM应用实战:当KBQA集成LLM(二)
下一篇: LLM实战:LLM微调加速神器-Unsloth + LLama3
mengrennwpu
博客等级 码龄15年 262粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mengrennwpu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值