当前位置: 首页 > news >正文

unsloth FastLanguageModel类主要函数详解,具体作用和参数

FastLanguageModelUnsloth 框架里的一个核心类,用于快速加载、微调和推理大语言模型(LLMs)

功能方法作用说明
加载模型 + tokenizerfrom_pretrained(...)支持量化模型,快速加载 HF 模型和 tokenizer。
LoRA 微调get_peft_model(...)在指定层插入 LoRA adapter,实现高效微调。
推理加速for_inference(model)合并 LoRA 权重、禁用 dropout,推理速度提升约 2×。
扩展词表add_new_tokens(...)向 tokenizer 和 embedding 层添加自定义 token(表情、特殊符号等)。

1. FastLanguageModel.from_pretrained(...)

  作用:加载预训练的语言模型(支持 4-bit/8-bit 量化),并同时返回 tokenizer。

model, tokenizer = FastLanguageModel.from_pretrained(model_name="unsloth/Meta-Llama-3.1-8B-bnb-4bit",  # 模型名称或路径max_seq_length=2048,   # 最大序列长度,影响训练/推理dtype=None,            # torch 数据类型,如 torch.float16 / bfloat16load_in_4bit=True,     # 是否使用 4-bit 量化 (节省显存)trust_remote_code=True # 允许加载带自定义代码的模型
)

  1.参数:

model_name:HF Hub 模型名称,或本地路径。max_seq_length:输入的最大 token 数,显存与速度都受影响。dtype:控制推理时的精度(float16/bfloat16)。load_in_4bit:是否用 QLoRA 常见的 4bit 量化。trust_remote_code:加载带自定义层的模型时要设为 True。

trust_remote_code这个参数其实是 Hugging Face Transformers 里的,不是 Unsloth 独有的。

  • 默认情况下,from_pretrained 只会加载 标准的模型结构(BERT、LLaMA、GPT-2 等官方支持的)。

  • 但很多社区模型有自定义模块(比如新的注意力机制、新的层、新的 forward 逻辑)。

  • 如果不开启 trust_remote_code=True,Transformers 会拒绝执行这些自定义代码,以防止执行恶意代码。

 开启后,Transformers 才会下载并运行模型作者在 Hugging Face Hub 上附带的 modeling_xxx.pyconfiguration_xxx.py 等 Python 脚本。

2.from_pretrained 的内部流程

   1.下载 / 读取权重
  1. 如果是 "unsloth/Meta-Llama-3.1-8B-bnb-4bit" 这种名字:
    • → 会从 Hugging Face Hub 拉取权重。

    • 如果是本地路径:
      → 直接从本地 pytorch_model.bin / safetensors 里加载。

  2. 构建模型骨架
    • 调用 HF 的 AutoModelForCausalLM.from_pretrained(...)

    • 如果设置了量化参数,就会替换掉默认的 Linear 层为 bitsandbytes 的量化层

    • 加载权重到 GPU(或 CPU)。

  3. 应用 Unsloth 优化
    • 替换掉一些计算热点层(attention, norm 等),用更高效的 CUDA kernel;

    • 修改 forward 函数,兼容 LoRA/QLoRA;

    • 预先做一些显存分配优化。

  4. 加载 tokenizer
    • 调用 AutoTokenizer.from_pretrained(model_name)

    • 设置 padding_side="right"truncation=True

    • max_seq_length 写入 config。

代码效果:返回一个 HuggingFace transformers.PreTrainedModel 和一个 tokenizer,可以立即进行训练或推理。

2. FastLanguageModel.get_peft_model(...)

        作用:调用 get_peft_model → 给模型插入 LoRA 层;

1.参数:

model = FastLanguageModel.get_peft_model(model,r=16,                         # LoRA rank,控制可训练参数规模lora_alpha=16,                # LoRA 缩放因子target_modules=["q_proj","v_proj"], # 需要应用 LoRA 的模块(通常是注意力层的 q/v 投影)lora_dropout=0.05,            # dropout 比例bias="none",                  # LoRA 是否训练 bias (一般设 "none")use_gradient_checkpointing=True, # 是否启用梯度检查点,节省显存random_state=42               # 随机种子,保证可复现
)
  • r:LoRA 的秩,决定低秩矩阵的大小。越大,可学习的自由度越多。

  • lora_alpha:缩放系数,用来调节 LoRA 贡献的权重:ΔW=α/r ​A⋅B

        例子

    lora_alpha=16(常见默认值),保证更新量适中。

    lora_alpha=128,更加强调 LoRA 对原模型的影响,但可能忘记原来的技能。

  • target_modules:指定在哪些模块插入 LoRA

        LLaMA / Mistral: 

                注意力机制:q_projk_projv_projo_proj

        GPT-2: c_attn (这是 q, k, v 合并的一个大矩阵), c_proj (输出投影)

        多层感知机 (MLP) 层:有时为了更强的微调能力,也会把 FFN 层的投影矩阵加入。例如,在         QLoRA 中常见:

                前馈网络: gate_projup_projdown_proj 

target_modules=['q_proj', 'k_proj', 'v_proj', 'o_proj', 'gate_proj', 'up_proj', 'down_proj']

        这会同时微调注意力层和FFN层,参数量更大,效果可能更好,但也会更耗显存。

  • lora_dropout:在 LoRA 层引入 dropout,防止过拟合。

        在 LoRA 的 A⋅B 输出中随机丢弃部分单元,增加正则化。

  • bias:在 LoRA 微调过程中如何处理线性层中的偏置项

bias 的可选值"none":不训练任何 bias(默认,最省显存和参数)。"lora_only":只训练 LoRA 层里的 bias。"all":训练所有 bias(模型原本层里的 bias 也会更新)。

bias 参数如何选择,取决你是否需要精准度非常高的任务,具体可以看以下例子

1.分类任务 (bias="all" 常见)

        例子:情感分类(正面 / 负面)、新闻类别分类(体育 / 财经 / 娱乐)。

                原因

                分类任务往往对输出 logits 的“微小偏移”很敏感。

                bias 直接控制某一类的“基准倾向”,训练 bias 可以帮助模型更好区分类别。

                用 "all" 往往能显著提升分类精度。


        2. 风格化任务 (bias="none" 常见)

                例子:把普通文本改写成“莎士比亚风格”、生成“古文风格”、改写成“幽默风格”。

                原因

                        风格迁移本质上依赖上下文模式(attention)而不是单个 bias。

                        风格特征通常分布在高维 embedding / attention 权重中,
LoRA adapter 就能学到。

                        bias 并不是关键,所以大多数情况下 "none" 足够。


        3. 结构化任务 (bias=可选 lora_only)

                例子

                        信息抽取(NER:从文本里抽出人名/地名/机构)。

                        对话槽位填充(slot filling:识别时间、地点、数字)。

                原因

                        这类任务需要局部 bias 来调整 token 级别的倾向。

                        不一定需要改动全局 bias,但在 LoRA adapter 层的 bias 可以帮忙。

                        适合 "lora_only"


        4. 生成任务 (bias="none")

                例子:故事生成、代码生成、问答对话。

                原因

                        生成任务依赖上下文建模,而不是 logits 的整体偏移。

                        bias 基本没用,还可能增加过拟合风险。

                        推荐 "none"

  • use_gradient_checkpointing:开启梯度检查点,节省显存。

        原理:在反向传播时不保存中间激活,而是重新计算,从而减少显存占用。

如何理解get_peft_model

  • 你有一本很厚的字典(大模型权重),但你只需要学习其中几个专业领域的表达方式。

  • 与其把整本字典改写(全量微调),你只是在字典边缘贴了几个便利贴(LoRA 适配器)。

  • 训练时,你只改这些便利贴(更新少量参数),节省时间和精力;

  • 用的时候,你查字典+便利贴,一样能得到新的表达能力。

 代码效果:在模型的注意力层插入 LoRA adapter,准备进行 PEFT 微调。


3. FastLanguageModel.for_inference(model)

🔹 作用:把训练好的模型切换到 推理模式,并自动开启 2× 加速

用法:

FastLanguageModel.for_inference(model)
  • 函数会:

    • 禁用 dropout

    • 合并 LoRA 权重

    • 启用 Unsloth 的推理优化

代码效果:模型进入高效推理状态,内存占用减少,推理速度提升 2 倍左右。


4. add_new_tokens(model, tokenizer, new_tokens=[...])

🔹 作用:给 tokenizer 和模型添加新的 token(比如 <custom>、领域专用符号)。

1.用法:

from unsloth import add_new_tokensmodel, tokenizer = add_new_tokens(model,tokenizer,new_tokens=["<NEW_TOKEN_1>", "<NEW_TOKEN_2>"],special_tokens=True  # 是否作为特殊 token 添加
)
参数类型说明默认值
modeltransformers.PreTrainedModel需要扩展 token 的模型必填
tokenizertransformers.PreTrainedTokenizer模型对应的 tokenizer必填
new_tokensList[str]要添加的字符串列表,每个元素是一个新 token必填
special_tokensbool是否将这些 token 作为特殊 token(如 <BOS><EOS>),特殊 token 在 tokenizer 内部处理方式略有不同True
verbosebool是否打印添加 token 的数量和新 vocab 大小True

2.add_new_tokens 是 Unsloth 提供的一个工具函数,用于向现有 tokenizer 和模型添加新的 token

  • 目的:当你希望模型理解领域特定的词、符号或特殊标记(例如 <USER><SPECIAL_TOKEN>、自定义 emoji 等)时,需要扩展 tokenizer 的词表,并同步扩展模型的 embedding 层。

  • 应用场景

    • 新增特殊符号(对话开始/结束标记、任务标记)

    • 自定义领域词汇(医学、法律、金融术语)

    • 新语言或方言的 token

    • 让模型识别(⁄ ⁄•⁄ω⁄•⁄ ⁄)为害羞的表情

3.底层流程

  • Tokenizer 增加 token

    tokenizer.add_tokens(new_tokens, special_tokens=special_tokens)
    
    • new_tokens 被加入 tokenizer 的词表

    • 返回增加的 token 数量

  • 模型 embedding 层扩张

    old_embedding = model.get_input_embeddings()
    new_embedding = nn.Embedding(old_vocab_size + len(new_tokens), hidden_size)
    new_embedding.weight.data[:old_vocab_size] = old_embedding.weight.data
    model.set_input_embeddings(new_embedding)
    
    • 原 embedding 数据保留

    • 新 token 对应 embedding 随机初始化

    • 如果有输出层 tied embedding(输入输出共享),也同步扩张

  • 可训练性

    • 新 embedding 默认参与梯度更新

    • 与 LoRA 或其他 adapter 兼容

      

⚠️ 注意:要在 调用 LoRA 前 添加,否则新 token 的 embedding 不会被训练到。


文章转载自:

http://ze1Tj9Pc.fmjfz.cn
http://vLW0xBDm.fmjfz.cn
http://Nc0yeeHz.fmjfz.cn
http://3pnbsL1x.fmjfz.cn
http://QYCQDP4R.fmjfz.cn
http://xQ5dd4lB.fmjfz.cn
http://1H7C0S8o.fmjfz.cn
http://BtZaf1UV.fmjfz.cn
http://Yru81Jff.fmjfz.cn
http://UtOqesWA.fmjfz.cn
http://dNw6ftu2.fmjfz.cn
http://mVqIaMoq.fmjfz.cn
http://emnTnczk.fmjfz.cn
http://x1MQRnpR.fmjfz.cn
http://AxufjftK.fmjfz.cn
http://2lcCemC1.fmjfz.cn
http://Y4kwXWAS.fmjfz.cn
http://9X16C5DY.fmjfz.cn
http://DpqzdU0g.fmjfz.cn
http://yOidMFbc.fmjfz.cn
http://sTIy4rBo.fmjfz.cn
http://fLZgnzO7.fmjfz.cn
http://n8thsjbG.fmjfz.cn
http://oH8mWAR3.fmjfz.cn
http://mfPB28L6.fmjfz.cn
http://vtnLXGcm.fmjfz.cn
http://hwPPSaWp.fmjfz.cn
http://8468GKwg.fmjfz.cn
http://40MGH7XU.fmjfz.cn
http://ytjExZWW.fmjfz.cn
http://www.dtcms.com/a/372139.html

相关文章:

  • HTTPS协议——对于HTTP的协议的加密
  • Qwen2.5-VL翻译
  • 碳纤维和短切碳纤维(中)
  • unsloth 笔记: training的时候进行evaluation
  • 【linux kernel 常用数据结构和设计模式】【数据结构 1】【如何表达数据之间的一对一、一对多、多对多关系】
  • 【软件架构设计(19)】软件架构评估二:软件架构分析方法分类、质量属性场景、软件评估方法发展历程
  • 在OpenHarmony上适配图形显示【1】——确认drm是否正常
  • 四大金刚之计算机组成原理
  • 第 15 篇:PCA与降维——如何在信息爆炸的时代,抓住“主要矛盾”?
  • 《沈南鹏传 - 做最擅长的事》(中篇)读书笔记
  • 还在重启应用改 Topic?Spring Boot 动态 Kafka 消费的“终极形态”
  • 纸飞机飞行漂流瓶小游戏抖音快手微信小程序看广告流量主开源
  • 《沈南鹏传 - 做最擅长的事》(下篇)读书笔记
  • 网易UU远程,免费电脑远程控制软件
  • Prometheus 存储学习
  • 八.迪杰斯特拉(Dijkstra)算法
  • 大模型术语
  • Python入门教程之关系运算符
  • 9. Mono项目与Unity的关系
  • 【C#】 资源共享和实例管理:静态类,Lazy<T>单例模式,IOC容器Singleton我们该如何选
  • 【C语言】函数指针的使用分析:回调、代码逻辑优化、代码架构分层
  • SQLAlchemy ORM-表与表之间的关系
  • 系统架构性能优化与容灾设计深度解析
  • K8s ConfigMap配置管理全解析
  • 【Beetle RP2350】人体运动感应警报系统
  • tomcat下载
  • 数据结构精讲:栈与队列实战指南
  • 风电设备预测性维护方案:AIoT驱动的风电运维智能化转型​
  • Shell脚本监控系统资源详解
  • Vue基础知识-脚手架开发-Vue Router路由及params、query传参