跳转到内容

输入关键词开始搜索

    资料摘要:personal chatgpt 03 — LoRA fine-tune 大语言模型(peft、bloom 7b)

    视频摘要更新 2026-08-02置信度 high待阅读原始来源 ↗#深度#大模型#课程#personal-chatgpt

    本讲由真实视频转录与作者 notebook/代码交叉整理。原始层:🔒 带时间戳视频转录;课程总览:personal chatgpt — LLMs 实践系列

    本讲把第 2 讲的 LoRA 原理落成一条 Hugging Face 训练流水线:以 bigscience/bloom-7b1 为基础模型,用 bitsandbytes 8-bit 方式加载,冻结原始参数,注入 LoRA adapter;再把英文名言数据整理成“quote → tags”的因果语言建模文本,使用 Trainer 完成训练并调用 model.generate() 推理。

    课程的两条主线是:

    1. 模型侧:冻结基础权重、数值稳定性处理、LoRA 配置和可训练参数统计;
    2. 数据/训练侧:Dataset → 文本任务格式 → tokenizer → data collator → Trainer → generation。
    model = AutoModelForCausalLM.from_pretrained(
    "bigscience/bloom-7b1",
    load_in_8bit=True,
    device_map="auto",
    )
    tokenizer = AutoTokenizer.from_pretrained("bigscience/bloom-7b1")
    • load_in_8bit=True 由 bitsandbytes 提供低精度线性层支持。
    • device_map='auto' 让 Accelerate/Transformers 自动放置模型层。
    • 课程观察 BLOOM 为 GPT 类 Causal LM:embedding 后堆叠 30 个 BloomBlock,每层包含 self-attention 与 MLP,最后是词表分类头。

    2. 冻结基础参数与数值稳定性处理

    Section titled “2. 冻结基础参数与数值稳定性处理”

    课程代码逐项设置:

    for param in model.parameters():
    param.requires_grad = False
    if param.ndim == 1:
    param.data = param.data.to(torch.float32)

    并启用:

    model.gradient_checkpointing_enable()
    model.enable_input_require_grads()

    输出头通过自定义 CastOutputToFloat 转成 FP32。

    这些处理的课程意图是:

    • 只训练 adapter;
    • 对 LayerNorm 等一维参数和最终输出使用 FP32,提高数值稳定性;
    • 用 gradient checkpointing 换取更低激活显存,代价是反向时重算部分前向。
    config = LoraConfig(
    r=16,
    lora_alpha=32,
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM",
    )
    model = get_peft_model(model, config)
    • r=16 决定低秩瓶颈维度。
    • lora_alpha=32 控制 LoRA 分支缩放。
    • task_type='CAUSAL_LM' 选择适合生成模型的 PEFT wrapper。
    • BLOOM 默认目标模块是 query_key_value 投影。
    • 视频展示注入后可训练参数约 700 万,相对约 71 亿基础参数约为千分之一量级;这是讲者环境中的打印结果。

    课程加载:

    dataset = load_dataset("Abirate/english_quotes")

    每条记录包含 quote、author、tags。课程构造:

    row["prediction"] = row["quote"] + " ->: " + str(row["tags"])

    然后批量 tokenize:

    dataset = dataset.map(
    lambda samples: tokenizer(samples["prediction"]),
    batched=True,
    )

    这把原本结构化的多标签信息改写成自回归文本续写任务。视频称其为“多分类”教学任务,但实际训练接口使用的是 Causal LM 文本建模;不能把它等同于独立分类头训练。

    trainer = Trainer(
    model=model,
    train_dataset=dataset["train"],
    args=TrainingArguments(
    per_device_train_batch_size=4,
    gradient_accumulation_steps=4,
    warmup_steps=100,
    max_steps=200,
    learning_rate=2e-4,
    fp16=True,
    logging_steps=1,
    output_dir="outputs",
    ),
    data_collator=DataCollatorForLanguageModeling(tokenizer, mlm=False),
    )
    model.config.use_cache = False
    trainer.train()
    • 每设备 batch size 为 4,梯度累积 4 步;课程按单设备口径解释为每次参数更新累计 16 个样本。
    • max_steps=200 被设置后,训练由步数主导。
    • mlm=False 选择 Causal LM collator;课程源码讲解指出 CLM 的 labels 基于 input IDs 构造,而 MLM 会额外 mask。
    • use_cache=False 用于训练时避免生成 cache 与 gradient checkpointing 等路径冲突。

    课程在 CUDA AMP 上调用:

    with torch.cuda.amp.autocast():
    output_tokens = model.generate(**batch, max_new_tokens=50)

    视频中的第一个测试输出较差,第二个长句能生成若干相关 tags,但后半部分也出现质量问题。课程并没有据此证明该模型达到稳定可用的标签系统,只展示端到端流程可以接通。

    有效 batch size(在单设备且不考虑分布式倍数时):

    Beffective=Bper device×Naccumulation=4×4=16B_{effective}=B_{per\ device}\times N_{accumulation} =4\times4=16

    可训练参数比例:

    trainable ratio=LoRA trainable paramsall params\text{trainable ratio} =\frac{\text{LoRA trainable params}}{\text{all params}}

    课程打印函数遍历 named_parameters(),只统计 requires_grad=True 的参数。

    • 00:35:本讲目标:冻结基础模型、注入 LoRA、完成 NLP 流水线。
    • 01:33:开发版 Transformers/PEFT 与 BLOOM-7B1 加载。
    • 04:31:BLOOM Causal LM 结构、30 层 block 与词表头。
    • 05:31:冻结参数、LayerNorm/输出转 FP32。
    • 08:06LoraConfig 的 rank、alpha、dropout。
    • 10:01:注入后约 700 万可训练参数和 LoRA A/B 形状。
    • 12:00:英文名言数据集的字段与索引方式。
    • 14:00:把 quote 和 tags 拼成训练文本。
    • 16:30Trainer、batch size、梯度累积与训练参数。
    • 18:30DataCollatorForLanguageModeling 的 CLM/MLM 差异。
    • 23:32:讲者观察训练 loss 从约 3.2 降到约 2;仅为视频演示记录。
    • 24:59model.generate() 推理及输出质量观察。
    • notebook 保存的历史环境包括 PyTorch 2.0/CUDA、bitsandbytes 0.38.1、开发版 PEFT/Transformers;当前 API 可能漂移。
    • 37 个 code cell 中只有少量保存执行计数,不能把整条 notebook 当作当前仓库已完整复跑验证。
    • 关键路径依赖 CUDA bitsandbytes、7B 权重、fp16=Truetorch.cuda.amp;macOS/MPS 不能按原样运行。
    • 安装命令直接跟随 GitHub main,没有固定 commit,不具严格可复现性。
    • 本讲不是 QLoRA 的完整教学;课程实际展示的是 8-bit 加载基础模型并训练 LoRA adapter,未讲 4-bit NF4、double quantization 等 QLoRA 要素。
    • ASR 把 PEFT、BLOOM、Causal LM、Dataset、Trainer、gradient 等识别为近音词;本稿按 notebook 校正。
    • 第 2 讲 → 本讲:低秩增量从数学公式变成 PEFT 配置和训练代码。
    • 本讲 → 第 4 讲:进一步解释 get_peft_model 如何找到并替换 BLOOM 的 query_key_value 层。
    • 与第 7 讲:本讲使用 fp16=True/AMP,但自动混合精度细节到第 7 讲才展开。
    • 与第 10 讲:这里初步使用 Dataset.map,第 10 讲系统比较 memory mapping 与 streaming。
    1. 为什么课程在注入 LoRA 前把基础模型参数的 requires_grad 设为 False
    2. r=16lora_alpha=32lora_dropout=0.05 分别控制什么?
    3. per_device_train_batch_size=4gradient_accumulation_steps=4 时,单设备一次更新累计多少样本?
    4. DataCollatorForLanguageModeling(tokenizer, mlm=False) 为什么适合 BLOOM?
    5. 为什么本讲不能仅凭 notebook 文件存在,就认定整条 7B 训练流程已在当前环境复现?
    • 滴答清单抓取时学习状态:已完成
    • 视频正文采用自动语音识别;关键术语已用标题、notebook 与源码校正,无法确认的口语细节不扩写。
    • notebook 未执行的 CUDA、权重下载、训练或外部 API 单元,不表述为已复现实验。