【2025】最适合小白的DeepSeek微调教程来了!从零基础到精通,精通收藏这篇就够了!

如何把DeepSeek R1模型微调成为某个场景的模型 将DeepSeek R1模型微调为适用于特定场景的模型是一个多步骤的过程,涉及环境配置、数据准备、模型加载、预处理、微调、强化学习和评估等步骤。 阅读详情
AI摘要

本文是DeepSeek微调教程,先解释大模型微调概念,以生活案例和乐高城堡改造为例说明。介绍尝试的硬件配置,详细阐述微调工作,包括数据集准备、无框架纯手搓的模型微调代码及代码详细讲解,最后分享了AGI大模型学习路线、报告合集等资料。

开门见山,直接给大家展示微调前后的效果。

微调前:

微调后:

在此处可以看到很明显大模型进行微调后口吻已经发生了更改。据笔者使用下来的记录表示,微调后的大模型思考时间更加短暂。

接下来,让我们一起逐步完成微调实践,共同优化模型性能!

一、什么是大模型微调?

微调就像给一个“学霸”补课,让它从“通才”变成某个领域的“专家”。

此处以本文进行微调的医学数据进行举例: 假设你有一个很聪明的朋友,他读过全世界的书(相当于大模型的预训练阶段),能和你聊历史、科学、文学等各种话题。 但如果你需要他帮你看医学报告段),能和你聊历史、科学、文学等各种话题。 但如果你需要他帮你看医学报告,虽然他懂一些基础知识,但可能不够专业。这时候,你给他一堆医学书籍和病例,让他专门学习这方面的知识(这就是微调),他就会变得更擅长医疗领域的问题。

📖 故事解释:

想象你有一个会画小猫的机器人🤖(这就是预训练模型)。现在你想让它学会画戴帽子的小猫🎩🐱。不需要从头教它画画,只需要给它看很多"戴帽子小猫"的图片,然后说:“保持原来的画画能力,但要学会加帽子哦!” 这就是微调!

📖 生活案例解释:

案例1:智能音箱调方言

  • 基础版音箱只会普通话(预训练模型)

  • 给它听 100 句四川话(微调数据)

  • 现在能听懂"摆龙门阵"(方言理解能力↑)

案例2:相机滤镜原理

  • 原始相机拍所有场景(通用模型)

  • 加载“美食滤镜”参数(微调后的模型)

  • 拍食物时自动增强饱和度(专业能力强化)

加强版解释:乐高城堡改造成儿童医院

第一步:原有结构 —— 通用乐高城堡

[通用城堡]

▸ 比喻:就像网购的"标准款城堡积木套装",有城墙、塔楼、尖顶,能当普通房子用。

▸ 对应技术:预训练模型(比如 ChatGPT),已经学会通用语言能力,但不够专业。


第二步:局部改造 —— 低成本改装

① 拆尖顶 → 改圆顶

[尖顶改圆顶]

▸ 操作:把塔顶的尖积木换成圆积木,更温和可爱。

▸ 技术含义:微调模型顶层参数(比如修改分类头),让输出风格更适合儿童对话。

② 加装旋转门[旋转门]

▸ 操作:在门口插入一个可旋转的积木模块,不破坏原有门结构。

▸ 技术含义:插入适配器模块(Adapter),让模型新增儿科医学术语理解能力,且不干扰原有知识。

③ 涂装医院标志

[医院标志]

▸ 操作:在城堡外墙贴上"十字符号"和卡通动物贴纸。

▸ 技术含义:特征空间偏移(Feature Shift),调整模型内部表示,让它更关注医疗相关词汇和童趣表达。


第三步:新功能 —— 变身儿童医院

[儿童医院]

▸ 成果:改装后的城堡能接待小患者,有玩具区、温和的医生(圆顶),还有专用医疗设备(旋转门)。

▸ 技术含义:通过轻量改造,通用模型变成"儿科医疗问答机器人",专精儿童健康咨询。

二、当前尝试过的硬件配置

显卡:NVIDIA GeForce RTX 4060

CPU:Intel Core i7-13700H

内存:16 G(因为家庭电脑所以日常状态是 8.8/15.7 GB)

三、微调工作

(1) 数据集准备

本文数据集来源,魔搭社区的 medical-o1-reasoning-SFT。

本文主要说明,数据集格式是:

在 DeepSeek 的蒸馏模型微调过程中,数据集中引入 Complex_CoT(复杂思维链)是关键设计差异。若仅使用基础问答对进行训练,模型将难以充分习得深度推理能力,导致最终性能显著低于预期水平。这一特性与常规大模型微调的数据要求存在本质区别。

(2) 模型微调代码(此处是无框架纯手搓)——直接上了,后面会有细节讲解



`需要引入的库:``pip install torch transformers peft datasets matplotlib accelerate safetensors`




`import torch``import matplotlib.pyplot as plt``from transformers import (`    `AutoTokenizer,`    `AutoModelForCausalLM,`    `TrainingArguments,`    `Trainer,`    `TrainerCallback``)``from peft import LoraConfig, get_peft_model``from datasets import load_dataset``import os``   ``# 配置路径(根据实际路径修改)``model_path = r"你的模型路径"  # 模型路径``data_path = r"你的数据集路径"  # 数据集路径``output_path = r"你的保存微调后的模型路径"  # 微调后模型保存路径``   ``# 强制使用GPU``assert torch.cuda.is_available(), //"必须使用GPU进行训练!"``device = torch.device("cuda")``   ``# 自定义回调记录Loss``class LossCallback(TrainerCallback):`    `def __init__(self):`        `self.losses = []``   `    `def on_log(self, args, state, control, logs=None, **kwargs):`        `if "loss" in logs:`            `self.losses.append(logs["loss"])``   ``# 数据预处理函数``def process_data(tokenizer):`    `dataset = load_dataset("json", data_files=data_path, split="train[:1500]")``   `    `def format_example(example):`        `instruction = f"诊断问题:{example['Question']}\n详细分析:{example['Complex_CoT']}"`        `inputs = tokenizer(`            `f"{instruction}\n### 答案:\n{example['Response']}<|endoftext|>",`            `padding="max_length",`            `truncation=True,`            `max_length=512,`            `return_tensors="pt"`        `)`        `return {"input_ids": inputs["input_ids"].squeeze(0), "attention_mask": inputs["attention_mask"].squeeze(0)}``   `    `return dataset.map(format_example, remove_columns=dataset.column_names)``   ``# LoRA配置``peft_config = LoraConfig(`    `r=16,`    `lora_alpha=32,`    `target_modules=["q_proj", "v_proj"],`    `lora_dropout=0.05,`    `bias="none",`    `task_type="CAUSAL_LM"``)``   ``# 训练参数配置``training_args = TrainingArguments(`    `output_dir=output_path,`    `per_device_train_batch_size=2,  # 显存优化设置`    `gradient_accumulation_steps=4,  # 累计梯度相当于batch_size=8`    `num_train_epochs=3,`    `learning_rate=3e-4,`    `fp16=True,  # 开启混合精度`    `logging_steps=20,`    `save_strategy="no",`    `report_to="none",`    `optim="adamw_torch",`    `no_cuda=False,  # 强制使用CUDA`    `dataloader_pin_memory=False,  # 加速数据加载`    `remove_unused_columns=False  # 防止删除未使用的列``)``   ``def main():`    `# 创建输出目录`    `os.makedirs(output_path, exist_ok=True)``   `    `# 加载tokenizer`    `tokenizer = AutoTokenizer.from_pretrained(model_path)`    `tokenizer.pad_token = tokenizer.eos_token``   `    `# 加载模型到GPU`    `model = AutoModelForCausalLM.from_pretrained(`        `model_path,`        `torch_dtype=torch.float16,`        `device_map={"": device}  # 强制使用指定GPU`    `)`    `model = get_peft_model(model, peft_config)`    `model.print_trainable_parameters()``   `    `# 准备数据`    `dataset = process_data(tokenizer)``   `    `# 训练回调`    `loss_callback = LossCallback()``   `    `# 数据加载器`    `def data_collator(data):`        `batch = {`            `"input_ids": torch.stack([torch.tensor(d["input_ids"]) for d in data]).to(device),`            `"attention_mask": torch.stack([torch.tensor(d["attention_mask"]) for d in data]).to(device),`            `"labels": torch.stack([torch.tensor(d["input_ids"]) for d in data]).to(device)  # 使用input_ids作为labels`        `}`        `return batch``   `    `# 创建Trainer`    `trainer = Trainer(`        `model=model,`        `args=training_args,`        `train_dataset=dataset,`        `data_collator=data_collator,`        `callbacks=[loss_callback]`    `)``   `    `# 开始训练`    `print("开始训练...")`    `trainer.train()``   `    `# 保存最终模型`    `trainer.model.save_pretrained(output_path)`    `print(f"模型已保存至:{output_path}")``   `    `# 绘制训练集损失Loss曲线`    `plt.figure(figsize=(10, 6))`    `plt.plot(loss_callback.losses)`    `plt.title("Training Loss Curve")`    `plt.xlabel("Steps")`    `plt.ylabel("Loss")`    `plt.savefig(os.path.join(output_path, "loss_curve.png"))`    `print("Loss曲线已保存")``   ``if __name__ == "__main__":`    `main()`


(3) 代码详细讲解

1. 导入必要的库和模块

功能总结:导入项目依赖的第三方库,包括 PyTorch 基础库、HuggingFace 工具库、可视化库等。



`import torch``import matplotlib.pyplot as plt``from transformers import (  # HuggingFace Transformer模型工具`    `AutoTokenizer,`    `AutoModelForCausalLM,`    `TrainingArguments,`    `Trainer,`    `TrainerCallback``)``from peft import LoraConfig, get_peft_model  # 参数高效微调库``from datasets import load_dataset  # 数据集加载工具``import os  # 系统路径操作`


有关类库介绍:

1. torch (PyTorch 库的核心模块)
  • 功能:深度学习框架,提供张量计算和神经网络构建功能。

  • 代码中的作用:

  • 管理GPU设备 (torch.cuda.is_available() 检查GPU可用性)

  • 定义模型训练时的张量操作

  • 控制混合精度训练 (torch.float16)


2. matplotlib.pyplot (Matplotlib 绘图库)
  • 功能:数据可视化工具库。

  • 代码中的作用:

  • 绘制训练损失曲线 (plt.plot(losses))

  • 生成并保存训练过程的Loss变化图 (loss_curve.png)


3. transformers (HuggingFace Transformers 库)
  • 核心组件:

  • AutoTokenizer:自动加载预训练模型对应的分词器

  • 用于将文本转换为模型可理解的 token ID 序列

  • AutoModelForCausalLM:自动加载因果语言模型(如GPT系列)

  • 提供基础的大语言模型结构

  • TrainingArguments:定义训练超参数

  • 控制批次大小、学习率、日志频率等

  • Trainer:封装训练流程的类

  • 自动处理训练循环、梯度下降、日志记录等

  • TrainerCallback:训练回调基类

  • 用于实现自定义训练监控逻辑(如示例中的损失记录)


4. peft (Parameter-Efficient Fine-Tuning)
  • 功能:实现参数高效微调方法的库。

  • 核心组件:

  • LoraConfig:LoRA(Low-Rank Adaptation)的配置类

  • 定义秩®、目标模块(target_modules)等关键参数

  • get_peft_model:将基础模型转换为 PEFT 模型

  • 仅需训练原模型约 0.1% 的参数即可实现有效微调

  • 代码中的作用:

  • 对 LLaMA 等大模型进行轻量化微调

  • 显存占用量减少约 60-70%,适合消费级 GPU


5. datasets (HuggingFace Datasets 库)
  • 功能:高效数据集加载与处理工具。

  • 核心方法:

  • load_dataset:加载多种格式的数据

  • 支持 JSON/CSV/Parquet 等格式(示例中使用 JSON)

  • map:数据预处理流水线

  • 应用自定义的格式化函数 (format_example)

  • 代码中的作用:

  • 从本地文件加载医疗问答数据集

  • 将原始数据转换为模型需要的输入格式


6. os (操作系统接口)
  • 功能:提供操作系统相关功能。

  • 代码中的作用:

  • 创建输出目录 (os.makedirs)

  • 处理文件路径相关操作

  • 确保模型保存路径的有效性

2. 配置路径和硬件检查

功能总结:配置模型/数据路径,强制检查GPU可用性



`# 配置路径(根据实际路径修改)``model_path = r"你的模型路径"  # 预训练模型存放路径``data_path = r"你的数据集路径"  # 训练数据路径(JSON格式)``output_path = r"你的保存微调后的模型路径"  # 微调后模型保存位置``   ``# 强制使用GPU(确保CUDA可用)``assert torch.cuda.is_available(), "必须使用GPU进行训练!"``device = torch.device("cuda")  # 指定使用CUDA设备`


3.自定义训练回调类

功能总结:实现自定义回调,在模型训练过程中,实时记录损失值(Loss)的变化。损失值是用来衡量模型预测结果与真实结果之间的差距的,损失值越小,说明模型的表现越好。



`class LossCallback(TrainerCallback):`    `def __init__(self):`        `self.losses = []  # 存储损失值的列表``   `    `# 当训练过程中有日志输出时触发`    `def on_log(self, args, state, control, logs=None, **kwargs):`        `if "loss" in logs:  # 过滤并记录损失值`            `self.losses.append(logs["loss"])`


4. 数据预处理函数

功能总结:加载并格式化训练数据,将原始数据集转换为模型可以理解的格式。



`def process_data(tokenizer):`    `# 从JSON文件加载数据集(仅取前1500条)`    `dataset = load_dataset("json", data_files=data_path, split="train[:1500]")``   `    `# 单条数据格式化函数`    `def format_example(example):`        `# 拼接指令和答案(固定模板)`        `instruction = f"诊断问题:{example['Question']}\n详细分析:{example['Complex_CoT']}"`        `inputs = tokenizer(`            `f"{instruction}\n### 答案:\n{example['Response']}<|endoftext|>",  # 添加结束符`            `padding="max_length",  # 填充至最大长度`            `truncation=True,       # 超长截断`            `max_length=512,        # 最大序列长度`            `return_tensors="pt"    # 返回PyTorch张量`        `)`        `# 返回处理后的输入(移除batch维度)`        `return {"input_ids": inputs["input_ids"].squeeze(0),``                "attention_mask": inputs["attention_mask"].squeeze(0)}``   `    `# 应用格式化函数并移除原始列`    `return dataset.map(format_example, remove_columns=dataset.column_names)`


‍关键代码

1.拼接指令和答案
  • 作用:将问题(Question)和详细分析(Complex_CoT)拼接成一个指令。

  • 示例:

  • 输入:Question=“发烧怎么办?”, Complex_CoT=“可能是感冒引起的。”

  • 输出:“诊断问题:发烧怎么办?\n详细分析:可能是感冒引起的。”

  • 类比:就像把问题和分析写在一张纸上。



`instruction = f"诊断问题:{example['Question']}\n详细分析:{example['Complex_CoT']}"`



2.使用分词器处理文本
  • 作用:将拼接后的文本转换为模型可以理解的格式。

  • 参数说明:

  • padding=“max_length”:将文本填充到固定长度(512)。

  • truncation=True:如果文本超过 512 个 token,就截断。

  • max_length=512:最大长度为 512。

  • return_tensors=“pt”:返回 PyTorch 张量。

  • 示例:

  • 输入:“诊断问题:发烧怎么办?\n详细分析:可能是感冒引起的。\n### 答案:\n多喝水,休息。”

  • 输出:input_ids=[101, 234, 345, …, 102], attention_mask=[1, 1, 1, …, 1]

  • 类比:就像把文字翻译成机器能懂的数字。



`inputs = tokenizer(`    `f"{instruction}\n### 答案:\n{example['Response']}<|endoftext|>",  # 添加结束符`    `padding="max_length",  # 填充至最大长度`    `truncation=True,       # 超长截断`    `max_length=512,        # 最大序列长度`    `return_tensors="pt"    # 返回PyTorch张量``)`



3.返回处理后的输入
  • 作用:返回处理后的输入数据,并移除多余的维度。

  • 参数说明:

  • input_ids:文本对应的 token ID 序列。

  • attention_mask:标记哪些位置是有效 token(1 表示有效,0 表示填充)。

  • 类比:就像把翻译好的数字整理成一张表格。



`return {"input_ids": inputs["input_ids"].squeeze(0), ``        "attention_mask": inputs["attention_mask"].squeeze(0)}`



4.应用格式化函数
  • 作用:对整个数据集应用格式化函数,并移除原始列。

  • 参数说明:

  • format_example:格式化函数。

  • remove_columns=dataset.column_names:移除原始列(如 Question、Complex_CoT 等)。

  • 类比:就像把整本书的每一页都翻译成机器能懂的格式。



`return dataset.map(format_example, remove_columns=dataset.column_names)`


5. LoRA微调配置

功能总结:配置LoRA参数,指定要适配的模型模块。



`peft_config = LoraConfig(`    `r=16,               # LoRA秩(矩阵分解维度)`    `lora_alpha=32,      # 缩放系数(控制适配器影响强度)`    `target_modules=["q_proj", "v_proj"],  # 要适配的注意力模块(查询/值投影)`    `lora_dropout=0.05,  # 防止过拟合的Dropout率`    `bias="none",        # 不训练偏置参数`    `task_type="CAUSAL_LM"  # 任务类型(因果语言模型)``)`


1. r=16:LoRA 的秩
  • 作用:控制低秩矩阵的维度。秩越小,参数越少,计算量越小。

  • 解释:

  • 秩(r)是低秩矩阵的分解维度,决定了低秩矩阵的大小。

  • 例如,r=16 表示低秩矩阵的维度是 16。

  • 影响:

  • 较小的 r 会减少参数量,但可能会降低模型的表现。

  • 较大的 r 会增加参数量,但可能会提高模型的表现。

  • 比喻:

“相当于给AI的‘学习笔记’设置 16 页的篇幅限制”

→ 页数少(r小):学得快但可能漏细节

→ 页数多(r大):学得细但速度慢

  • 默认值:通常设置为 8 或 16。并非越大越好。LoRA 秩的选择需要平衡模型的适应能力和计算效率。较大的秩可以提供更强的表达能力,但会增加计算量和显存占用,同时可能导致过拟合。对于简单任务,通常推荐使用较小的秩(如 4 或 8),而对于复杂任务,可能需要更高的秩(如 16 或 32)

2. lora_alpha=32:缩放系数
  • 作用:控制低秩矩阵对原始模型的影响强度。

  • 解释:

  • lora_alpha 是一个缩放因子,用于调整低秩矩阵的输出。

  • 具体来说,低秩矩阵的输出会乘以 lora_alpha / r。

  • 影响:

  • 较大的 lora_alpha 会让低秩矩阵的影响更强。

  • 较小的 lora_alpha 会让低秩矩阵的影响更弱。

  • 比喻:

就像是,音量旋钮的大小决定了声音的响亮程度。如果旋钮转得太大,声音可能会震耳欲聋,甚至让人难以忍受;如果旋钮转得太小,声音又可能太小,听不清楚。

过大的 lora_alpha 可能会导致模型的训练变得不稳定,就像声音太大可能会让人感到不适一样。可能会导致过拟合,因为模型对训练数据的细节调整过于敏感。

较小的 lora_alpha 会导致模型在训练过程中会更保守地调整权重,训练过程更稳定,但适应新任务的速度可能会较慢。

  • 默认值:通常设置为 32。

3. target_modules=[“q_proj”, “v_proj”]:目标模块
  • 作用:指定需要插入低秩矩阵的模型模块。

  • 解释:

  • q_proj 和 v_proj 是 Transformer 模型中的注意力机制模块:

  • q_proj:查询(Query)投影矩阵。

  • v_proj:值(Value)投影矩阵。

  • LoRA 会在这两个模块中插入低秩矩阵。

  • 影响:

  • 选择不同的模块会影响微调的效果。

  • 通常选择 q_proj 和 v_proj 是因为它们对模型的表现影响较大。


4. lora_dropout=0.05:Dropout 率
  • 作用:防止过拟合。

  • 解释:

  • Dropout 是一种正则化技术,随机丢弃一部分神经元,防止模型过度依赖某些特征。

  • lora_dropout=0.05 表示在训练过程中,有 5% 的低秩矩阵参数会被随机丢弃。

  • 影响:

  • 较大的 Dropout 率会增加模型的鲁棒性,但可能会降低训练效率。

  • 较小的 Dropout 率会减少正则化效果,但可能会提高训练速度。


5. bias=“none”:偏置参数
  • 作用:控制是否训练偏置参数。偏置参数的作用是为模型的输出提供一个基线偏移(baseline offset),使得模型能够更好地拟合数据。

  • 解释:

  • bias=“none” 表示不训练偏置参数。

  • 其他选项包括 “all”(训练所有偏置参数)和 “lora_only”(只训练 LoRA 相关的偏置参数)。

  • 影响:

  • 不训练偏置参数可以减少参数量,但可能会影响模型的表现。


6. task_type=“CAUSAL_LM”:任务类型
  • 作用:指定任务类型。

  • 解释:

  • CAUSAL_LM 表示因果语言模型(Causal Language Model),即生成式任务(如 GPT)。

  • 其他任务类型包括序列分类(SEQ_CLS)、序列到序列(SEQ_2_SEQ)等。

  • 影响:

  • 不同的任务类型会影响 LoRA 的实现方式。

训练参数配置

功能总结:设置训练超参数和硬件相关选项。



`training_args = TrainingArguments(`    `output_dir=output_path,        # 输出目录(模型/日志)`    `per_device_train_batch_size=2, # 单GPU批次大小(显存优化)`    `gradient_accumulation_steps=4, # 梯度累积步数(等效batch_size=8)`    `num_train_epochs=3,            # 训练轮次`    `learning_rate=3e-4,            # 初始学习率`    `fp16=True,                     # 启用混合精度训练(节省显存)`    `logging_steps=20,              # 每隔20步记录日志`    `save_strategy="no",            # 不保存中间检查点`    `report_to="none",              # 禁用第三方报告(如W&B)`    `optim="adamw_torch",           # 优化器类型`    `no_cuda=False,                 # 强制使用CUDA`    `dataloader_pin_memory=False,   # 禁用锁页内存(加速数据加载)`    `remove_unused_columns=False    # 保留未使用的列(避免数据错误)``)`


1. output_dir=output_path:输出目录
  • 作用:指定训练过程中模型和日志的保存路径。此处的 output_path 之前已经写在了最前面的变量之中。

  • 解释:

  • 训练过程中生成的模型检查点、日志文件等都会保存到这个目录。

  • 示例:

  • 如果 output_path = “./output”,所有文件都会保存到 ./output 目录下。


2. per_device_train_batch_size=2:单 GPU 批次大小
  • 作用:设置每个 GPU 上的训练批次大小。

  • 解释:

  • 批次大小是指每次输入模型的样本数量。

  • 较小的批次大小可以节省显存,但可能会降低训练速度。

  • 示例:

  • 如果使用 1 个 GPU,每次训练会输入 2 条数据。


3. gradient_accumulation_steps=4:梯度累积步数


4. num_train_epochs=3:训练轮次
  • 作用:设置模型在整个数据集上训练的轮次。

  • 解释:

  • 1个轮次(epoch)表示模型完整地遍历一次训练数据集。

  • 这里设置为 3,表示模型会训练 3 轮。

  • 示例:

  • 如果数据集有 1000 条数据,模型会遍历这 1000 条数据 3 次。


5. learning_rate=3e-4:初始学习率


6. fp16=True:混合精度训练
  • 作用:启用混合精度训练,节省显存并加速训练。

  • 解释:

  • 混合精度训练是指同时使用 16 位(半精度)和 32 位(单精度)浮点数。

  • 16 位浮点数占用更少的显存,计算速度更快。

  • 示例:

  • 如果显存不足,启用 fp16 可以显著减少显存占用。


7. logging_steps=20:日志记录频率
  • 作用:设置每隔多少步记录一次日志。

  • 解释:

  • 日志包括损失值、学习率等信息。

  • 这里设置为 20,表示每隔 20 步记录一次日志。

  • 示例:

  • 如果总训练步数是 1000,会记录 50 次日志(1000 / 20 = 50)。


8. save_strategy=“no”:保存策略
  • 作用:设置是否保存中间检查点。

  • 解释:

  • “no” 表示不保存中间检查点。

  • 其他选项包括 “epoch”(每轮保存一次)和 “steps”(每隔一定步数保存一次)。

  • 示例:

  • 如果设置为 “epoch”,每轮训练结束后会保存一次模型。


9. report_to=“none”:禁用第三方报告
  • 作用:禁用第三方日志报告工具(如Weights & Biases)。

  • 解释:

  • 如果不需要使用第三方工具记录日志,可以设置为 “none”。

  • 示例:

  • 如果设置为 “wandb”,日志会同步到 Weights & Biases平台。


10. optim=“adamw_torch”:优化器类型
  • 作用:指定优化器类型。

  • 解释:

  • adamw_torch 是一种常用的优化器,结合了 Adam 和权重衰减(Weight Decay)。

  • 适合大多数深度学习任务。

  • 示例:

  • 如果训练不稳定,可以尝试其他优化器,如 sgd[Stochastic Gradient Descent(随机梯度下降]。SGD 是一种用于优化模型参数的算法,通过计算损失函数的梯度并更新参数,使损失函数最小化。


11. no_cuda=False:强制使用 CUDA
  • 作用:强制使用 GPU 进行训练。

  • 解释:

  • no_cuda=False 表示使用 GPU。

  • 如果设置为 True,则会使用 CPU(不推荐)。

  • 示例:

  • 如果GPU可用,模型会自动使用 GPU 进行训练。


12. dataloader_pin_memory=False:禁用锁页内存
  • 作用:设置是否使用锁页内存(Pinned Memory)加速数据加载。

  • 解释:

  • 锁页内存可以提高数据加载速度,但会占用更多主机内存。

  • 这里设置为 False,表示禁用锁页内存。

  • 示例:

  • 如果主机内存充足,可以设置为 True 以加速训练。


13. remove_unused_columns=False:保留未使用的列
  • 作用:设置是否移除数据集中未使用的列。

  • 解释:

  • 如果设置为 True,会移除数据集中未被模型使用的列。

  • 这里设置为 False,表示保留所有列。

  • 示例:

  • 如果数据集中包含一些额外的信息(如 ID),可以保留这些列。

主函数(训练流程)

功能总结:整合所有组件,执行完整训练流程。

def main():`    `# 创建输出目录(如果不存在)`    `os.makedirs(output_path, exist_ok=True)``   `    `# 加载Tokenizer并设置填充符`    `tokenizer = AutoTokenizer.from_pretrained(model_path)`    `tokenizer.pad_token = tokenizer.eos_token  # 使用EOS作为填充符``   `    `# 加载预训练模型(半精度+指定GPU)`    `model = AutoModelForCausalLM.from_pretrained(`        `model_path,`        `torch_dtype=torch.float16,       # 半精度加载(节省显存)`        `device_map={"": device}          # 指定使用的GPU设备`    `)`    `# 应用LoRA适配器`    `model = get_peft_model(model, peft_config)`    `model.print_trainable_parameters()   # 打印可训练参数量``   `    `# 准备训练数据集`    `dataset = process_data(tokenizer)``   `    `# 初始化损失记录回调`    `loss_callback = LossCallback()``   `    `# 数据整理函数(构造批次)`    `def data_collator(data):`        `batch = {`            `"input_ids": torch.stack([torch.tensor(d["input_ids"]) for d in data]).to(device),`            `"attention_mask": torch.stack([torch.tensor(d["attention_mask"]) for d in data]).to(device),`            `"labels": torch.stack([torch.tensor(d["input_ids"]) for d in data]).to(device)  # 标签=输入(因果LM任务)`        `}`        `return batch``   `    `# 初始化Trainer`    `trainer = Trainer(`        `model=model,`        `args=training_args,`        `train_dataset=dataset,`        `data_collator=data_collator,  # 自定义数据整理`        `callbacks=[loss_callback]     # 添加回调`    `)``   `    `# 执行训练`    `print("开始训练...")`    `trainer.train()``   `    `# 保存微调后的模型`    `trainer.model.save_pretrained(output_path)`    `print(f"模型已保存至:{output_path}")``   `    `# 绘制损失曲线`    `plt.figure(figsize=(10, 6))`    `plt.plot(loss_callback.losses)`    `plt.title("Training Loss Curve")`    `plt.xlabel("Steps")`    `plt.ylabel("Loss")`    `plt.savefig(os.path.join(output_path, "loss_curve.png"))  # 保存为PNG`    `print("Loss曲线已保存")``   ``if __name__ == "__main__":`    `main()
关键代码:
1. 加载 Tokenizer 并设置填充符
  • 作用:加载预训练模型的分词器,并设置填充符。

  • 解释:

  • AutoTokenizer.from_pretrained:自动加载与模型匹配的分词器。

  • tokenizer.pad_token = tokenizer.eos_token:将结束符(EOS)作为填充符(Pad Token)。

  • 示例:

  • 如果输入序列长度不足,会用 EOS 填充。

tokenizer = AutoTokenizer.from_pretrained(model_path)``tokenizer.pad_token = tokenizer.eos_token  # 使用EOS作为填充符
2.加载预训练模型
  • 作用:加载预训练的语言模型,并配置硬件相关设置。

  • 解释:

  • AutoModelForCausalLM.from_pretrained:加载因果语言模型(如 GPT)。

  • torch_dtype=torch.float16:使用半精度(16 位浮点数)加载模型,节省显存。

  • device_map={“”: device}:将模型加载到指定的 GPU 设备上。

  • 示例:

  • 如果 device = “cuda:0”,模型会加载到第一个 GPU 上。

model = AutoModelForCausalLM.from_pretrained(`    `model_path,`    `torch_dtype=torch.float16,       # 半精度加载(节省显存)`    `device_map={"": device}          # 指定使用的GPU设备``)
3.数据整理函数
  • 作用:将多条数据整理成一个批次。

  • 解释:

  • input_ids:输入序列的 token ID。

  • attention_mask:标记有效 token 的位置。

  • labels:因果语言模型的标签与输入相同(模型需要预测下一个 token)。

  • 示例:

  • 如果输入是 [“诊断问题:发烧怎么办?”, “诊断问题:头痛怎么办?”],会被整理成一个批次。

def data_collator(data):`    `batch = {`        `"input_ids": torch.stack([torch.tensor(d["input_ids"]) for d in data]).to(device),`        `"attention_mask": torch.stack([torch.tensor(d["attention_mask"]) for d in data]).to(device),`        `"labels": torch.stack([torch.tensor(d["input_ids"]) for d in data]).to(device)  # 标签=输入(因果LM任务)`    `}`    `return batch
4.初始化 Trainer
  • 作用:创建训练器对象,管理训练过程。

  • 解释:

  • model:要训练的模型。

  • args:训练参数(如批次大小、学习率等)。

  • train_dataset:训练数据集。

  • data_collator:自定义的数据整理函数。

  • callbacks:训练回调(如损失记录)。

trainer = Trainer(`    `model=model,`    `args=training_args,`    `train_dataset=dataset,`    `data_collator=data_collator,  # 自定义数据整理`    `callbacks=[loss_callback]     # 添加回调``)

四、完结感言

非常感谢 Deepseek 官网满血版在本章的代码修改、资料收集以及文章润色方面提供的宝贵帮助!

本章的微调部分目前还较为基础,导致损失函数的收敛效果不够理想,仍有较大的优化空间。

## AI大模型学习福利

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

2025最新版优快云大礼包:《AGI大模型学习资源包》免费分享

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

2025最新版优快云大礼包:《AGI大模型学习资源包》免费分享

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

2025最新版优快云大礼包:《AGI大模型学习资源包》免费分享

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

2025最新版优快云大礼包:《AGI大模型学习资源包》免费分享

四、AI大模型商业化落地方案

img

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

2025最新版优快云大礼包:《AGI大模型学习资源包》免费分享

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

deepseek 本地实现微调代码详细教程 阅读详情

相关推荐

从婴儿学步到工业级应用:VLA的‘隐式标定‘原理通俗图解

本文深入解析VLA(Vision-Language-Action)模型的'隐式标定'原理,通过类比婴儿学习机制,揭示其如何替代传统手眼标定技术。文章对比了工业机器人传统标定与VLA数据驱动方法的差异,并可视化神经网络注意力机制,展示其在空间关系编码上的突破性进展。最后探讨了VLA在工业应用中的优势与混合架构解决方案。

pz890123456的博客 323

DeepSeek大模型微调实战(理论篇)

在大模型的微调过程中,**LoRA(低秩适配)**参数设置是提升训练效率和性能的关键。通过减少需更新的参数量,LoRA能够在维持模型性能的同时显著降低计算成本。然而,LoRA并非唯一影响训练效果的因素。诸如。

python1222_的博客 8941

Python虚拟环境实战:如何在不同conda环境中共享CUDA的libcupti.so.12文件

本文深入探讨了在Python虚拟环境中解决`ImportError: libcupti.so.12`报错的工程化方案。通过分析动态链接库的搜索机制,提供了环境变量法、软链接法和系统级配置法三种解决方案,帮助开发者在不同conda环境中高效共享CUDA动态链接库,确保深度学习项目的顺利运行。

weixin_29094775的博客 238

DeepSeek大模型微调实战(超详细实战篇)

*

2401_85325726的博客 4万+

瑞芯微RK809音频驱动

瑞芯微RV1126中的RK809音频驱动开发

m0_61899715的博客 5220

Unity事件总线第一篇:为什么你的游戏需要一个事件总线?

本文探讨了游戏开发中常见的跨模块调用导致代码强耦合的问题。通过一个攻击按钮触发角色攻击、怪物掉血和血条更新的案例,分析了直接调用方式带来的维护困难、扩展性差和模块重用性低等弊端。文章提出使用事件总线(Event Bus)作为解决方案,通过发布-订阅模式实现模块解耦。重构后的代码中,各模块只需与事件总线交互,彼此不再直接依赖。这种设计使得新增功能(如音效)无需修改现有代码,大大提高了系统的可维护性和扩展性,同时增强了模块的重用性,完美体现了开闭原则。

qq_46348216的博客 1297

java安装教程详细,零基础入门到精通,收藏这篇就够了

指定的是jdk下的bin目录。

leah126的博客 1736

SIMULIA-Simpack 2022x新功能介绍

增加库伦摩擦类型力元95 Coulomb Friction增加了3种新的摩擦方向类型用于模拟平面、圆柱和球面摩擦。针对平移和旋转摩擦改进了滑动到粘着过渡阶段的检测,增加一个参数定义两种不同的滑移-粘滞过渡模式,即“Unloaded stick stiffness”和“Preload stick with last slip”。新增加124'Applied Load’力元允许用户将力或扭矩作为恒定值或通过激励元素施加到To Marker点上。该力元建模操作方便,效率高。支持线性柔性体装配。

crystalzhan的博客 1046

#零基础入门:DeepSeek微调教程来了!(非常详细)从零基础到精通,收藏这篇就够了!

微调就像给一个“学霸”补课,让它从“通才”变成某个领域的“专家”。此处以本文进行微调的医学数据进行举例: 假设你有一个很聪明的朋友,他读过全世界的书(相当于大模型的预训练阶段),能和你聊历史、科学、文学等各种话题。但如果你需要他帮你看医学报告段),能和你聊历史、科学、文学等各种话题。但如果你需要他帮你看医学报告,虽然他懂一些基础知识,但可能不够专业。这时候,你给他一堆医学书籍和病例,让他专门学习这方面的知识(这就是微调),他就会变得更擅长医疗领域的问题。功能:深度学习框架,提供张量计算和神经网络构建功能。

leah126的博客 811

AF3​​​​​​​ Msa、TemplateHit、HitMetadata类解读

Msa:处理 多序列比对 (MSA) 结果,为 AlphaFold3 提供 序列进化信息。 TemplateHit:存储 查询序列与模板结构的比对信息,用于 筛选模板。 HitMetadata:提供 比对模板的 PDB 结构信息,帮助 解析和使用模板数据。

qq_27390023的博客 818

Dify使用教程3:Dify创建工作流

Dify使用教程3:Dify创建工作流 接着,我们连接下一个节点:“LLM”填入上下文变量为:result。这时候知识库就添加成功了。添加新节点:结束节点。

拥抱具身智能,昇腾Ascend C 5128

完整攻略:如何用好DeepSeek,一文汇总!(非常详细)从零基础到精通,收藏这篇就够了!

本文从DeepSeek的独特优势出发,全面分享了DeepSeek的使用方法,包括:扔掉提示词模板的正确方式、让其 “说人话” 的方法、深度思考技能、强大文风转换器运用,以及使用禁区。《DeepSeek使用攻略》如下:注:本文所有技巧均来自真实案例,所有提示词都经过反复验证。如果你还在用各种"专业提示词"和"模板",那就是走错了方向。为什么?因为它的核心是大模型,不是大模型。让我用一个真实案例来说明,我们社群一位运营同学的实测,进行新能源行业分析,用于准备与比亚迪供应商谈判。

Javachichi的博客 7244

基于C++和Basler SDK的相机开发详解

Basler相机是德国Basler公司生产的高性能工业相机,具有高分辨率、高帧率和低噪声的特点。Basler相机广泛应用于机器视觉、工业自动化、医疗影像和安防监控等领域。高分辨率和高帧率:能够捕捉清晰、细腻的图像。多种接口:支持USB、GigE、Camera Link等多种接口,方便不同应用场景的需求。丰富的配置选项:支持多种图像格式、分辨率和帧率的配置,适应不同的应用需求。本文详细介绍了如何基于C++和Basler SDK进行相机开发,涵盖了从环境搭建、相机连接、图像采集到图像处理的完整过程。

qq_38334677的博客 2094

DeepSeek 超全面指南!入门 DeepSeek 必看(非常详细)从零基础到精通,收藏这篇就够了!

最近,AI界出现了一匹黑马——DeepSeek。这个名字可能对很多人来说还比较陌生,但它已经在全球范围内引发了巨大的关注,甚至让一些科技巨头感到了压力。今天,就让我们一起走进DeepSeek的世界,看看它到底有多厉害!DeepSeek(中文名:深度求索)是一款由杭州深度求索人工智能基础技术研究有限公司开发的人工智能模型。它的英文名“DeepSeek”可以读作“深思”(Deep)和“探索”(Seek),寓意着通过深度学习技术探索未知的领域。

Python_0011的博客 5万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【2025版】最新手把手搭建DeepSeek本地大模型,零基础入门到精通,收藏这篇就够了

比如DeepSeek-R1:1.5B,这里的1.5B指的是参数集规模,B是Billion(十亿)的缩写,1.5B指的是15亿参数集规模。当然,有了Open WebUI之后,我们还能很方便的选择其它大模型,或者与大模型语音交互。能聊天的大模型,除了DeepSeek,还是阿里云的通义千问(Qwen2/Qwen2.5),好玩的模型还有很多。大型语言模型(Large Language Models,简称LLM),是一种基于深度学习的自然语言处理模型,通过大规模语料库的训练,能够生成、理解和处理复杂的文本数据。

Libra1313的博客 3479

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【大模型入门】用大白话讲讲什么是蒸馏,量化,微调?零基础入门到精通,收藏这篇就够了

今天对大模型蒸馏,量化,微调的介绍就到这里啦。蒸馏大师擅长知识传递,量化大师精于压缩体积,微调大师则专注于精细调整。他们各有千秋,适合不同的场景。如果你想要一个轻便的小模型,蒸馏和量化是不错的选择。如果你需要模型在特定任务上表现更好,微调是你的不二之选。当然,你也可以把这三位大师结合起来使用,打造一个既轻便又强大的模型。毕竟,谁不想拥有一个既聪明又灵活的AI助手呢?2025最新版优快云大礼包:《AGI大模型学习资源包》免费分享**

Javachichi的博客 1632

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

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

DeepSeek入门基础教程(非常详细),DeepSeek入门到精通,收藏这一篇就够了!

DeepSeek模型横空出世,掀起行业浪潮。无论是硬件端还是软件端,近期,多家上市公司先后宣布接入 DeepSeek,加速自身 AI 应用产品的升级。2025 年将是 AI 应用落地的黄金时代,AI 技术将成为推动经济增长的核心引擎,特别是在金融、医疗和教育等领域,AI 的渗透率正在快速提升。

weixin_58753619的博客 899

RAG本地知识库搭建,从入门到精通!DeepSeek实战教程,看这篇就够了!

本文来自“DeepSeek+RAG本地知识库搭建实战”,DeepSeek与检索增强生成(RAG)技术的结合,为搭建本地知识库提供了强大的技术支持。DeepSeek+RAG本地知识库技术是一种结合深度求索(DeepSeek)大模型与检索增强生成(RAG)技术的创新方案,旨在构建高效、智能的本地化知识库系统。

weixin_58753619的博客 1014

DeepSeek+运维,爆了!大模型让运维‘躺平’成真?(非常详细)从零基础到精通,收藏这篇就够了!

2025年,DeepSeek的爆火不仅掀起了AI技术的普惠化浪潮,更在运维领域引发了一场“静默革命”。传统运维长期受困于人力依赖度高、故障响应慢、知识沉淀难等痛点,而DeepSeek凭借其强大的推理能力、低成本优势及开源生态,正成为撬动运维智能化转型的“技术杠杆”。。传统运维依赖工程师的经验积累,而DeepSeek通过知识图谱整合数千个运维节点(如故障代码、解决方案、历史工单),结合多跳推理算法,实现跨系统级故障的闭环分析。

Javachichi的博客 2120

Java好资源网址推荐,零基础入门到精通,收藏这篇就够了

Java官方教程Version 11 API Specification 所有包的层次结构官网中文Java 全栈知识体系how2j初学者教程,英文(包括Java、C++、Pathon)一个适合小白学习的英文网站,不只是Java。

leah126的博客 4544

分步指南:在VSCode中本地部署DeepSeek,打造强大私密的AI编程助手(非常详细)从零基础到精通,收藏这篇就够了!

原本准备日更的,没想到昨天晚上给私教课学员下课后,紧赶慢赶还是没来得及 24:00 写完发布。今天就早点发出来吧~在我这里,我将会把别人付费传递的知识分享给你们!有任何编程知识的需要,在我范围内都会悉数分享,可以在评论区留言祈愿。这份分步指南将向您展示如何在本地安装并运行 DeepSeek,如何使用 CodeGPT 进行配置,以及如何开始利用 AI 提升软件开发工作流程—all without relying on cloud-based services(无需依赖云端服务)。

Python_0011的博客 2099

大模型定制六大秘籍,RAG、Agent、微调,总有一款适合你!(非常详细)从零基础入门到精通,收藏这篇就够了

各位猿媛、攻城狮们,还在为网络安全大模型的“水土不服”而烦恼吗?还在苦苦寻找让大模型更懂“黑话”,更贴近业务的独门绝技吗?今天,就让咱来扒一扒网络安全领域大模型定制的六大绝招,从理论到实践,包教包会,让你也能玩转AI,成为朋友圈最靓的仔!大语言模型(LLM),这玩意儿就像个饱读诗书的“学霸”,啥都知道一点,但要让它成为网络安全领域的“专家”,还得咱们亲自调教。这些模型基于自监督学习预训练,数据量大到没朋友,参数多到数不清。

Javachichi的博客 1088

打造“懂行”智能客服,从入门到精通!微调实战教程,看这篇就够了!

是不是经常觉得,虽然现在的AI很强大,但一问到专业问题它就开始胡言乱语?比如问个法律条款解读,或者咨询个医疗建议,它回答得看似有理有据,但你根本不敢信?这是因为通用大模型虽然“读书破万卷”,但缺乏行业深度。

m0_59163425的博客 818

【2025必学】大模型应用开发学习路线图+全套资料,收藏这篇就够了!2025普通人想转AI大模型应用开发

文章提供了AI大模型应用开发的系统学习路线,分为四个阶段:大模型基础、RAG应用开发、Agent应用架构和微调与私有化部署。推荐了从基础到实战的全套教程,涵盖大模型核心原理、RAG、Agent、LangChain、微调部署等技术,并通过实际项目帮助学习者掌握技能。即使零基础小白也能通过系统学习掌握大模型开发,成为求职加分项。

2401_84494441的博客 1191
上一篇: 【2025版】最全面的AIGC算法工程师面经,从零基础到精通,精通收藏这篇就够了!
下一篇: 从蜜罐发展看攻击欺骗应用趋势,从零基础到精通,收藏这篇就够了!
黑客大白
博客等级 码龄5年 1万+粉丝 3206原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值