资料摘要:personal chatgpt 03 — LoRA fine-tune 大语言模型(peft、bloom 7b)
本讲由真实视频转录与作者 notebook/代码交叉整理。原始层:🔒 带时间戳视频转录;课程总览:personal chatgpt — LLMs 实践系列。
本讲把第 2 讲的 LoRA 原理落成一条 Hugging Face 训练流水线:以 bigscience/bloom-7b1 为基础模型,用 bitsandbytes 8-bit 方式加载,冻结原始参数,注入 LoRA adapter;再把英文名言数据整理成“quote → tags”的因果语言建模文本,使用 Trainer 完成训练并调用 model.generate() 推理。
课程的两条主线是:
- 模型侧:冻结基础权重、数值稳定性处理、LoRA 配置和可训练参数统计;
- 数据/训练侧:Dataset → 文本任务格式 → tokenizer → data collator → Trainer → generation。
1. 8-bit 加载 BLOOM-7B1
Section titled “1. 8-bit 加载 BLOOM-7B1”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 换取更低激活显存,代价是反向时重算部分前向。
3. LoRA 配置与注入
Section titled “3. LoRA 配置与注入”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 亿基础参数约为千分之一量级;这是讲者环境中的打印结果。
4. 把数据集变成语言模型任务
Section titled “4. 把数据集变成语言模型任务”课程加载:
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 文本建模;不能把它等同于独立分类头训练。
5. Trainer 与 CLM data collator
Section titled “5. Trainer 与 CLM data collator”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 = Falsetrainer.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,但后半部分也出现质量问题。课程并没有据此证明该模型达到稳定可用的标签系统,只展示端到端流程可以接通。
公式 / 代码
Section titled “公式 / 代码”有效 batch size(在单设备且不考虑分布式倍数时):
可训练参数比例:
课程打印函数遍历 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:06:LoraConfig的 rank、alpha、dropout。10:01:注入后约 700 万可训练参数和 LoRA A/B 形状。12:00:英文名言数据集的字段与索引方式。14:00:把 quote 和 tags 拼成训练文本。16:30:Trainer、batch size、梯度累积与训练参数。18:30:DataCollatorForLanguageModeling的 CLM/MLM 差异。23:32:讲者观察训练 loss 从约 3.2 降到约 2;仅为视频演示记录。24:59:model.generate()推理及输出质量观察。
运行边界与可复现性
Section titled “运行边界与可复现性”- notebook 保存的历史环境包括 PyTorch 2.0/CUDA、bitsandbytes 0.38.1、开发版 PEFT/Transformers;当前 API 可能漂移。
- 37 个 code cell 中只有少量保存执行计数,不能把整条 notebook 当作当前仓库已完整复跑验证。
- 关键路径依赖 CUDA bitsandbytes、7B 权重、
fp16=True和torch.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 校正。
与前后讲关系
Section titled “与前后讲关系”- 第 2 讲 → 本讲:低秩增量从数学公式变成 PEFT 配置和训练代码。
- 本讲 → 第 4 讲:进一步解释
get_peft_model如何找到并替换 BLOOM 的query_key_value层。 - 与第 7 讲:本讲使用
fp16=True/AMP,但自动混合精度细节到第 7 讲才展开。 - 与第 10 讲:这里初步使用
Dataset.map,第 10 讲系统比较 memory mapping 与 streaming。
- 为什么课程在注入 LoRA 前把基础模型参数的
requires_grad设为False? r=16、lora_alpha=32和lora_dropout=0.05分别控制什么?per_device_train_batch_size=4、gradient_accumulation_steps=4时,单设备一次更新累计多少样本?DataCollatorForLanguageModeling(tokenizer, mlm=False)为什么适合 BLOOM?- 为什么本讲不能仅凭 notebook 文件存在,就认定整条 7B 训练流程已在当前环境复现?
- 视频:LoRA fine-tune 大语言模型(peft、bloom 7b)
- 转录:🔒 personal chatgpt 03 视频转录
- 课件 / 代码:🔒 03_lora_practice.ipynb
- 滴答清单抓取时学习状态:已完成。
- 视频正文采用自动语音识别;关键术语已用标题、notebook 与源码校正,无法确认的口语细节不扩写。
- notebook 未执行的 CUDA、权重下载、训练或外部 API 单元,不表述为已复现实验。