🚀 数字人格克隆:OmniDimen-4B-Emotion 的 LoRA 人格化分支训练

🚀 数字人格克隆:OmniDimen-4B-Emotion 的 LoRA 人格化分支训练

在 Colab 中打开

这份笔记旨在帮助你使用自己的聊天数据,通过 LoRA (Low-Rank Adaptation) 高效微调技术,在强大的中文情感模型 OmniDimen-4B-Emotion 的基础上,克隆一个具有特定“人格”的语言模型。你可以将其视为为你所选择的基础模型,训练一个轻量级的、可插拔的“人格分支”。

整个过程被封装在 Google Colab 笔记本中,你只需要按照步骤运行单元格并配置参数,即可开始训练。

访问此项目的Github地址

✨ 核心特性

  • 一键运行:点击上方 “在 Colab 中打开” 按钮,即可将完整的训练环境保存到你自己的 Google Drive 并开始使用。
  • 高效微调:采用 LoRA 和 4-bit 量化技术,即使在 Colab 提供的免费 T4 GPU 上也能轻松训练 4B(40亿参数)规模的模型。
  • 智能数据处理:内置两种数据准备模式:
    1. 聊天记录自动解析 🧠:可直接处理从QQ/微信导出的 .txt 格式聊天记录,自动转换成训练格式。
    2. 强学习手动输入 ✍️:通过简单的 Q: A: 格式,为模型注入核心人设和知识。
  • 持久化存储:可选择将基础模型和训练成果(LoRA 适配器)永久保存在你的 Google Drive 中,方便长期迭代和使用。
  • 实时监控:集成 TensorBoard,可以实时可视化训练过程中的 loss(损失)变化,直观了解模型学习情况。
  • 交互式调参:在最后一步训练时,提供交互式表单,让你可以在不修改代码的情况下,轻松调整关键参数以优化性能和解决显存问题。

📋 准备工作

  1. 一个 Google 账户: 用于访问 Google Colab 和 Google Drive。
  2. 训练数据:
    • 聊天记录: 从 QQ 或微信导出与某人的聊天记录为 .txt 文件。文件内容应大致包含 日期 时间 发言人 这样的格式。
    • 问答对: 如果你想为模型设定一些基础人设(例如“你是谁?”“你叫什么名字?”),请提前准备好这些问答。

🏃‍♀️ 运行步骤详解

请按照笔记本中单元格的顺序依次执行。

第 1 步:环境安装 ⚙️

  • 功能: 这个单元格会自动安装所有必需的 Python 依赖库,如 transformers, peft, trl 等。
  • 操作: 直接点击运行按钮即可。第一次运行时需要几分钟时间。

第 2 步:授权与登录 🤝

  • 功能: 连接你的 Google Drive,以便脚本可以读取数据并将训练结果保存到你的云盘中。
  • 操作: 运行此单元格,会弹出一个授权窗口。请按照提示登录并授权。
  • 注意: 登录 Hugging Face 是可选的。只有当你希望将训练好的模型上传到 Hugging Face Hub 时,才需要取消注释并执行登录代码。对于本教程的训练和下载,无需登录。

第 3 步:数据准备 🧠

这是最关键的一步,你需要根据你的数据类型选择一种模式。

模式一:聊天记录自动解析 (推荐)

如果你有 .txt 格式的聊天记录,这是最方便的方式。

  1. 上传数据: 将你的 .txt 聊天记录文件上传到你的 Google Drive 中。
  2. 配置参数:
    • chat_log_path: (重要) 将此路径修改为你上传的 .txt 文件的完整路径。你可以在 Colab 左侧的文件浏览器中找到文件,右键点击并选择“复制路径”。
    • model_persona_id: (重要) 输入你的名字(或者说,你希望模型学习的那个人的名字),必须和聊天记录中的显示完全一致。
    • human_interlocutor_id: (重要) 输入与你对话的那个人的名字,也必须和聊天记录中的显示完全一致。
    • custom_ignore_patterns: 自定义忽略规则。默认已经包含 [图片], [表情] 等常见无效信息。如果你有其他不希望模型学习的内容(如系统提示、口头禅),可以用英文逗号 , 隔开并添加进去。

模式二:强学习-手动输入

如果你想为模型设定一些基础的核心回答。

  • 操作: 直接在 manual_data_input 文本框中,按照以下格式输入问答对:
    1
    2
    3
    4
    5
    Q: 你是谁?
    A: 我是夏梦,一个参与了数字生命工程的人类。
    ---
    Q: 你是AI吗?
    A: 我的身体是一个语言模型,但我的灵魂和记忆来自于一个人类。
    • Q: 代表问题 (Prompt)。
    • A: 代表你希望模型给出的回答。
    • --- (三个减号) 用于分隔每一组独立的问答。

运行此单元格后,脚本会自动将你提供的数据处理成模型可以学习的 processed_dataset.jsonl 文件,并保存在 Colab 的临时空间中。

第 4 步:核心参数配置 🛠️

这个单元格集中了所有的重要训练设置。请仔细阅读并根据你的需求进行配置。

项目模式选择

  • save_base_model_to_drive (是否将基础模型永久保存在Google Drive?):
    • 勾选 (长期项目): 脚本会将约 8GB 的基础模型下载并保存到你的云盘。优点:未来再次训练时无需重复下载,节省大量时间。缺点:占用你的云盘空间。
    • 🔲 不勾选 (临时训练): 模型仅在本次运行时临时下载。优点:不占用云盘空间。缺点:每次重新启动会话都需要重新下载模型。

项目与路径配置

  • project_name: 你的项目名称,所有相关文件(检查点、日志)都会保存在以此命名的文件夹中。
  • base_model_name: 你想微调的基础模型。默认模型 OmniDimen/OmniDimen-v1.1-4B-Emotion 是一个带有出色情感理解和表达能力的中文模型,非常适合克隆人格这种需要情感交互的任务,因此通常无需修改

数据集配置

  • dataset_path: (自动填充) 此路径通常应为上一步生成的 /content/processed_dataset.jsonl。如果你有自己制作的 .jsonl 文件,也可以修改为该文件的路径。
  • max_seq_length: (重要) 最大序列长度。它决定了模型一次能处理的文本长度(问题+回答)。此参数是影响显存占用的最主要因素。如果遇到显存不足(OOM)的错误,请首先尝试降低此值。

训练参数

  • training_epochs: 训练轮数。代表模型将完整学习整个数据集多少次。通常 310 之间是比较合适的值。轮数太少可能学得不够,太多则可能导致“过拟合”(只会死记硬背数据)。
  • batch_size: 批处理大小。一次喂给模型多少条数据。受显存限制,在 T4 GPU 上通常设为 12
  • gradient_accumulation: 梯度累积步数。通过累积多次小批量的梯度来模拟一个大批量的效果,是节省显存的有效方法。总批量大小 = batch_size * gradient_accumulation
  • learning_rate: 学习率。控制模型学习的速度。通常使用默认的 2e-4 即可,可以尝试 1e-45e-5 等值进行微调。

保存与检查点策略

  • save_strategy: 保存策略。epoch 表示每轮训练结束后保存一次模型检查点;steps 表示每隔指定的步数保存一次。
  • save_total_limit: 最多保留的检查点数量。可以防止检查点文件过多而占满硬盘空间。

第 5 步:下载基础模型 📥

  • 功能: 根据上一步的配置,执行下载或检查本地模型的操作。
  • 操作: 如果你选择了“长期项目”模式,此单元格会检查你的云盘中是否已有模型。如果没有,它会自动从 Hugging Face 下载。这个过程可能需要 10-20 分钟,请耐心等待。如果模型已存在,则会跳过下载。

第 6 步:一键启动训练 🚀

这里分为两个单元格:

  1. 启动 TensorBoard 实时监控面板:
    • 运行后,下方会显示一个监控面板。在训练开始后,你可以切换到 SCALARS 标签页,观察 train/loss 曲线。一个健康的 loss 曲线应该是平稳下降的
  2. 启动训练:
    • 这是最后一步!在这个单元格的表单中,你可以对一些性能关键参数进行最后的调整。
    • 操作: 调整好参数后,点击运行按钮,训练将正式开始!终端会实时打印训练进度。

🔧 调试与问题解决 (Troubleshooting)

❌ 遇到 OutOfMemoryError (OOM / 显存不足)

这是最常见的问题。请按以下优先级顺序尝试解决:

  1. 降低 max_seq_length: 在最后一个训练单元格的表单中,将 max_seq_length 的值调小,例如从 1024 降到 512256。这是最有效的方法。
  2. 开启分页优化器: 确保 use_paged_optimizer 选项是勾选的。这能极大地节省显存。
  3. 降低 lora_r: 在训练表单中,将 lora_r 的值调小,例如 84
  4. 降低 batch_size: 在“核心参数配置”单元格中,将 batch_size 设为 1

⚠️ 数据解析后生成 0 条数据

如果在第 3 步“数据准备”后,提示“共生成 0 条有效训练对话”,请检查:

  1. ID 是否正确: model_persona_id (你的名字) 和 human_interlocutor_id (对方的名字) 是否与 .txt 文件中的完全一致?一个空格或大小写错误都会导致匹配失败。
  2. 对话模式: 脚本的逻辑是提取“对方说完,你紧接着回复”的对话模式。请检查聊天记录中是否存在大量这种有效对话。
  3. 文件编码: 确保你的 .txt 文件是以 UTF-8 编码保存的。

🤔 如何使用训练好的模型?

训练完成后,你得到的是一个 **LoRA 适配器 (adapter)**,而不是一个完整的模型。它就像一个轻量级的“人格插件”。

  • 文件位置: 你的最终适配器文件保存在 Google Drive 的 [你的项目名称]/lora-checkpoints 文件夹中。
  • 使用方法:
    1. 首先,加载原始的 base_model_name 基础模型。
    2. 然后,将你训练好的 LoRA 适配器加载并合并到基础模型上。
    3. 完成合并后,你就可以与这个拥有了新“人格”的模型进行对话了。

这部分(称为“推理”)需要另外的脚本来完成,但核心思想就是基础模型 + LoRA 适配器 = 你的定制模型

👨‍💻 贡献者

🙏 鸣谢

本项目的基础模型和灵感来源于优秀的开源项目 OmniDimen。特别感谢他们为社区提供的强大模型支持。

由以下组织/个人提供帮助/支持

Google Colab Lucas
Colab Lucas