【AI大模型】Transformers大模型库(九):大模型微调之计算微调参数占比

简介: 【AI大模型】Transformers大模型库(九):大模型微调之计算微调参数占比

一、引言

这里的Transformers指的是huggingface开发的大模型库,为huggingface上数以万计的预训练大模型提供预测、训练等服务。

🤗 Transformers 提供了数以千计的预训练模型,支持 100 多种语言的文本分类、信息抽取、问答、摘要、翻译、文本生成。它的宗旨是让最先进的 NLP 技术人人易用。

🤗 Transformers 提供了便于快速下载和使用的API,让你可以把预训练模型用在给定文本、在你的数据集上微调然后通过 model hub 与社区共享。同时,每个定义的 Python 模块均完全独立,方便修改和快速研究实验。

🤗 Transformers 支持三个最热门的深度学习库: Jax, PyTorch 以及 TensorFlow — 并与之无缝整合。你可以直接使用一个框架训练你的模型然后用另一个加载和推理。

本文重点介绍如何打印微调参数,以及微调参数占比计算。

二、计算微调参数占比

2.1 概述

基于LoRA进行模型微调时,需要先冻结全部参数,再指定相应的Linear层进行微调,那么如何计算全部参数,如何计算微调参数以及如何计算微调参数占全部参数的比例呢?

2.2 模型参数结构一览

这里以Qwen2为例,在微调前,对大模型结构有所认知,对于QLoRA量化微调算法来说,只微调大模型的线性层(Linear层),后面会看到在LoRAConfig中,仅指定了"q_proj"、"k_proj"等线性层,这个很重要,微调哪些参数,心中要有数

Qwen2ForCausalLM(
  (model): Qwen2Model(
    (embed_tokens): Embedding(152064, 3584)
    (layers): ModuleList(
      (0-27): 28 x Qwen2DecoderLayer(
        (self_attn): Qwen2SdpaAttention(
          (q_proj): Linear4bit(in_features=3584, out_features=3584, bias=True)
          (k_proj): Linear4bit(in_features=3584, out_features=512, bias=True)
          (v_proj): Linear4bit(in_features=3584, out_features=512, bias=True)
          (o_proj): Linear4bit(in_features=3584, out_features=3584, bias=False)
          (rotary_emb): Qwen2RotaryEmbedding()
        )
        (mlp): Qwen2MLP(
          (gate_proj): Linear4bit(in_features=3584, out_features=18944, bias=False)
          (up_proj): Linear4bit(in_features=3584, out_features=18944, bias=False)
          (down_proj): Linear4bit(in_features=18944, out_features=3584, bias=False)
          (act_fn): SiLU()
        )
        (input_layernorm): Qwen2RMSNorm()
        (post_attention_layernorm): Qwen2RMSNorm()
      )
    )
    (norm): Qwen2RMSNorm()
  )
  (lm_head): Linear(in_features=3584, out_features=152064, bias=False)
)

2.3 微调参数占比计算

我们采用代码中的print_trainable_parameters计算全部参数、微调参数、微调参数占比,在这之前:

  • 首先,用第一个循环代码for param in model.parameters():将所有参数冻结(freeze),
  • 其次,通过get_peft_model和LoraConfig指定计划微调的Linear层
  • 最后,采用print_trainable_parameters计算param.requires_grad=True可梯度更新的参数量、总参数量和占比
for param in model.parameters():
    param.requires_grad = False  # freeze the model - train adapters later
    if param.ndim == 1:
        # cast the small parameters (e.g. layernorm) to fp32 for stability
        param.data = param.data.to(torch.float32)
 
class CastOutputToFloat(nn.Sequential):
    def forward(self, x):
        return super().forward(x).to(torch.float32)
 
model.lm_head = CastOutputToFloat(model.lm_head)
 
def print_trainable_parameters(model):
    """
    Prints the number of trainable parameters in the model.
    """
    trainable_params = 0
    all_param = 0
    for _, param in model.named_parameters():
        all_param += param.numel()
        if param.requires_grad:
            trainable_params += param.numel()
    print(
        f"trainable params: {trainable_params} || all params: {all_param} || trainable%: {100 * trainable_params / all_param}"
    )
 
config = LoraConfig(
    r=64,
    lora_alpha=16,
    target_modules=["q_proj", "v_proj", "v_proj", "o_proj", "gate_proj", "up_proj","down_proj"],
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM",
)
 
model = get_peft_model(model, config)
print_trainable_parameters(model)
  •  遍历模型参数: 使用for _, param in model.named_parameters():循环遍历模型中的所有参数。named_parameters()返回一个迭代器,每个元素包含参数的名称和参数本身,这里下划线_表示我们忽略了参数名称,直接使用参数值。
  • 计算参数数量: 对于每个参数,通过param.numel()计算其元素数量(即参数的大小),并累加到all_params以得到模型的总参数数。如果参数param.requires_grad为True,说明该参数在训练时是可更新的,于是将其大小累加到trainable_params。  

三、总结

本文先对Qwen2模型结构进行一览,做到心中有数,之后讲解如何编写print_trainable_parameters(model)方法,如何冻结所有参数,如何指定需要微调的参数以及计算占比,后续会详细讲LoRA微调方法,这里对计算微调参数占比方式进行记录。

目录
相关文章
|
5天前
|
数据采集 人工智能 自然语言处理
中文法律AI大模型!LaWGPT 一键生成法律文书,司法考试通过率提升50%
LaWGPT 是南京大学推出的中文法律大语言模型,基于 LLaMA 模型进行二次预训练,融入大量中文法律知识,适用于法律咨询、文书生成、司法考试辅助等多种场景。
125 22
中文法律AI大模型!LaWGPT 一键生成法律文书,司法考试通过率提升50%
|
4天前
|
人工智能 数据可视化 安全
Manus AI 站在巨人(大模型)肩膀上的AI助手
3月6日,Manus AI震撼登场,它不仅是一个聊天机器人,更是全能AI助手。能帮你筛选简历、进行房产调研、自动编写代码和数据分析,甚至创建并部署交互式网站。创始人是中国90后肖宏,毕业于华中科技大学。目前服务器已爆满,敬请期待其强大功能。
|
1天前
|
存储 人工智能 Cloud Native
小鹏汽车选用阿里云PolarDB,开启AI大模型训练新时代
PolarDB-PG云原生分布式数据库不仅提供了无限的扩展能力,还借助丰富的PostgreSQL生态系统,统一了后台技术栈,极大地简化了运维工作。这种强大的组合不仅提高了系统的稳定性和性能,还为小鹏汽车大模型训练的数据管理带来了前所未有的灵活性和效率。
|
8天前
|
人工智能 弹性计算 自然语言处理
5分钟部署,解锁100种和AI大模型的交互可能
在AI技术飞速发展的今天,个人大模型的部署与应用面临复杂流程和高门槛。阿里云推出高效、易用的个人AI大模型部署方案,支持多模型集成、灵活扩展和定制化主页,帮助用户快速搭建专属AI主页,实现智能化新体验,真正把“AI玩出花”。
|
6天前
|
人工智能 弹性计算 自然语言处理
5分钟部署,解锁100种和AI大模型的交互可能
阿里云弹性计算推出了一套高效、易用的个人AI大模型部署方案,帮助用户快速搭建专属的AI主页,开启智能化新体验,真正的实把“AI玩出花”。
|
7天前
|
机器学习/深度学习 人工智能 安全
AI大模型安全风险和应对方案
AI大模型面临核心安全问题,包括模型内在风险(如欺骗性对齐、不可解释性和模型幻觉)、外部攻击面扩大(如API漏洞、数据泄露和对抗性攻击)及生成内容滥用(如深度伪造和虚假信息)。应对方案涵盖技术防御与优化、全生命周期管理、治理与行业协同及用户教育。未来需关注动态风险适应、跨领域协同和量子安全预研,构建“技术+管理+法律”三位一体的防护体系,推动AI安全发展。
|
1天前
|
人工智能 自然语言处理 搜索推荐
AI大模型:职业教育在探索中的新航标
随着AI技术迅猛发展,AI大模型正成为职业教育变革的重要驱动力。职业院校积极探索AI大模型在教学中的应用,如广东科学技术职业学院的“知行大先生”大模型,助力助学、助教、助训、助管。然而,当前仍面临理解表面化、低水平重复等挑战。为解决这些问题,需紧贴行业需求,加强教师培训,并通过GAI认证提升个人AI应用能力,推动职业教育高质量发展。未来,期待更多AI大模型融入教学,培养适应社会需求的高端技术技能人才。
|
16天前
|
人工智能 Java API
Java也能快速搭建AI应用?一文带你玩转Spring AI可落地性
Java语言凭借其成熟的生态与解决方案,特别是通过 Spring AI 框架,正迅速成为 AI 应用开发的新选择。本文将探讨如何利用 Spring AI Alibaba 构建在线聊天 AI 应用,并实现对其性能的全面可观测性。
|
11天前
|
人工智能 弹性计算 Ubuntu
从零开始即刻拥有 DeepSeek-R1 满血版并使用 Dify 部署 AI 应用
本文介绍了如何使用阿里云提供的DeepSeek-R1大模型解决方案,通过Chatbox和Dify平台调用百炼API,实现稳定且高效的模型应用。首先,文章详细描述了如何通过Chatbox配置API并开始对话,适合普通用户快速上手。接着,深入探讨了使用Dify部署AI应用的过程,包括选购云服务器、安装Dify、配置对接DeepSeek-R1模型及创建工作流,展示了更复杂场景下的应用潜力。最后,对比了Chatbox与Dify的输出效果,证明Dify能提供更详尽、精准的回复。总结指出,阿里云的解决方案不仅操作简便,还为专业用户提供了强大的功能支持,极大提升了用户体验和应用效率。
705 19
从零开始即刻拥有 DeepSeek-R1 满血版并使用 Dify 部署 AI 应用
|
3天前
|
人工智能 前端开发 JavaScript
AI程序员:通义灵码 2.0应用VScode前端开发深度体验
AI程序员:通义灵码 2.0应用VScode前端开发深度体验,在软件开发领域,人工智能技术的融入正深刻改变着程序员的工作方式。通义灵码 2.0 作为一款先进的 AI 编程助手,与广受欢迎的代码编辑器 Visual Studio Code(VScode)相结合,为前端开发带来了全新的可能性。本文将详细分享通义灵码 2.0 在 VScode 前端开发环境中的深度使用体验。
76 2

热门文章

最新文章