微信克隆人,聊天记录训练专属AI(2.WeClone训练模型)

目录

0.引言

1.cuda12.6安装

2.环境配置

[2.1 uv安装依赖](#2.1 uv安装依赖)

[2.2 复制配置文件](#2.2 复制配置文件)

[2.3 测试](#2.3 测试)

[2.4 安装 FlashAttention(可选)](#2.4 安装 FlashAttention(可选))

3.模型下载

4.临时配置cuda

5.数据集微调

6.训练

[6.1 训练](#6.1 训练)

[6.2 训练显存不足](#6.2 训练显存不足)

[6.3 显存不变,增强效果](#6.3 显存不变,增强效果)

7.本地测试(可跳过)

8.web测试


0.引言

🚀 从聊天记录💡创建数字化身的一站式解决方案使用聊天日志微调 LLM 以捕捉您的独特风格,然后绑定到聊天机器人,让您的数字自我栩栩如生。从聊天记录创造数字分身的一站式解决方案

WeClone官网网址:WeClone/README.md 在 master ·xming521/微克隆

系列其他文章网址:

​​​​​微信克隆人,聊天记录训练专属AI(1.微信聊天导出)-CSDN博客

微信克隆人,聊天记录训练专属A(3.模型部署)-CSDN博客

1.cuda12.6安装

官方工程说是需要cuda12.6,具体可以看看文章:在ubuntu服务器下安装cuda和cudnn(笔记)_ubuntu安装cudnn-CSDN博客

复制代码
nvcc --version
export PATH=/usr/local/cuda-12.6/bin:$PATH
LD_LIBRARY_PATH=/usr/local/cuda-12.6/lib64:$LD_LIBRARY_PATH
nvcc --version

2.环境配置

2.1 uv安装依赖

官方建议用uv安装

复制代码
pip install pipx
pipx install uv

git clone https://github.com/xming521/WeClone.git && cd WeClone
uv venv .venv --python=3.10
source .venv/bin/activate # windows .venv\Scripts\activate
uv pip install --group main -e . 

运行source .venv/bin/activate,遇见的报错:

Git 在通过 HTTPS 拉取远端仓库时的网络/协议层错误

解决方案:

复制代码
git config --global http.version HTTP/1.1
git config --global http.postBuffer 524288000
rm -rf ~/.cache/uv/git-v0

2.2 复制配置文件

复制配置文件模板并将其重命名为 ,然后在此文件中进行后续配置更改:settings.jsonc

复制代码
cp examples/tg.template.jsonc settings.jsonc

2.3 测试

使用以下命令测试 CUDA 环境是否配置正确,是否能被 PyTorch 识别:

复制代码
  python -c "import torch; print('CUDA Available:', torch.cuda.is_available());"

2.4 安装 FlashAttention(可选)

安装 FlashAttention 以加速训练和推理:

复制代码
uv pip install flash-attn --no-build-isolation

3.模型下载

官方给的安装策略是

复制代码
sudo apt update && sudo apt install git-lfs
git lfs install
git clone https://huggingface.co/Qwen/Qwen2.5-VL-7B-Instruct models/Qwen2.5-VL-7B-Instruct

因为环境原因,我没有成功使用Git下载,我用的是ModelScope下载

复制代码
pip install modelscope
modelscope download --model Qwen/Qwen2.5-7B-Instruct --local_dir ./Qwen2.5-7B-Instruct

如果后面训练时说爆显存了,可以换用更小的模型/Qwen2.5-3B-Instruct

4.临时配置cuda

临时切换到 CUDA 12.6(在当前 shell 立即生效)

复制代码
# 可选:先保存当前值以便恢复
export OLD_CUDA_HOME="${CUDA_HOME:-}"
export OLD_PATH="$PATH"
export OLD_LD_LIBRARY_PATH="${LD_LIBRARY_PATH:-}"

# 指向 CUDA 12.6(按你实际安装路径调整)
export CUDA_HOME=/usr/local/cuda-12.6
export PATH="$CUDA_HOME/bin:$PATH"
export LD_LIBRARY_PATH="$CUDA_HOME/lib64${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"

可以用以下代码查看是否修改成功

复制代码
nvcc --version

5.数据集微调

将上个文章的数据集放在该welone的dataset/csv文件夹下,然后还有修改settings.jsonc文件内容的路径,我的settings.jsonc文件如下

复制代码
{
    "version": "0.3.02",
    "common_args": {
        "model_name_or_path": "/home/ubuntu/workdir/weixin/WeClone/Qwen2.5-3B-Instruct",
        "adapter_name_or_path": "./model_output",
        "template": "qwen",
        "default_system": "请你扮演一名人类,不要说自己是人工智能",
        "media_dir": "dataset/media",
        "finetuning_type": "lora",
        "enable_thinking": false,
        "trust_remote_code": true
    },
    "cli_args": {
        "full_log": false,
        "log_level": "INFO"
    },
    "make_dataset_args": {
        //数据处理配置
        "platform": "chat", //chat,telegram
        "language": "zh", // 聊天常用语言: zh(中文) 或 en(英文)
        "telegram_args": {
            "my_id": "user1234567890"
        },
        "include_type": [
            "text"
        ],
        "blocked_words": [ // 禁用词
            "例如 姓名",
            "例如 密码",
            "//....."
        ],
        "add_time": false,
        "single_combine_strategy": "time_window", // 单人组成单句策略
        "qa_match_strategy": "time_window", // 组成qa策略
        "single_combine_time_window": 2, // 单人组成单句时间窗口(分钟),
        "qa_match_time_window": 5, // 组成qa时间窗口(分钟),
        "combine_msg_max_length": 2048, // 组合后消息最大长度 配合cutoff_len 使用
        "messages_max_length": 2048, // messages最长字符数量 配合cutoff_len 使用
        "clean_dataset": {
            "enable_clean": false,
            "clean_strategy": "llm",
            "llm": {
                "accept_score": 2, //可以接受的llm打分阈值,1分最差,5分最好,低于此分数的数据不会用于训练
                "enable_thinking": true
            }
        },
        "online_llm_clear": false,
        "base_url": "https://xxx/v1",
        "llm_api_key": "xxxxx",
        "model_name": "xxx", //建议使用参数较大的模型,例如DeepSeek-V3
        "clean_batch_size": 10,
        "vision_api": {
            "enable": false, // 设置为 true 来开启此功能
            "api_key": "xxx",
            "api_url": "https://xxx/v1", // 兼容OpenAI的API地址
            "model_name": "xxx", // 要使用的多模态模型名称,例如qwen-vl-max
            "max_workers": 5 // 并行调用API的线程数,最多不要超过8
        }
    },
    "train_sft_args": {
        //微调配置
        "stage": "sft",
        "dataset": "chat-sft",
        "dataset_dir": "./dataset/res_csv/sft",
        "use_fast_tokenizer": true,
        "lora_target": "q_proj,v_proj",
        "lora_rank": 8,
        "lora_dropout": 0.25,
        "weight_decay": 0.1,
        "overwrite_cache": true,
        "per_device_train_batch_size": 2,
        "gradient_accumulation_steps": 16,
        "lr_scheduler_type": "cosine",
        "cutoff_len": 2048,
        "logging_steps": 10,
        "save_steps": 100,
        "learning_rate": 1e-4,
        "warmup_ratio": 0.1,
        "num_train_epochs": 2,
        "plot_loss": true,
        "fp16": true,
        "flash_attn": "fa2",
        "gradient_checkpointing": true
        // "deepspeed": "ds_config.json" //多卡训练
    },
    "infer_args": {
        "repetition_penalty": 1.2,
        "temperature": 0.5,
        "max_length": 256,
        "top_p": 0.65
    },
    "vllm_args": {
        "gpu_memory_utilization": 0.9,
        // "data_parallel_size": 2,
        // "quantization": "bitsandbytes", 
        // "load_format": "bitsandbytes"
    },
    "test_model_args": {
        "test_data_path": "dataset/eval/test_data-zh.json"
    }
}

然后运行下述代码进行微调数据集,微调结果的数据集文件在dataset/res_csv/sft/sft-my.json

复制代码
weclone-cli make-dataset

6.训练

6.1 训练

单卡训练:

复制代码
weclone-cli train-sft

多卡训练:

复制代码
 CUDA_VISIBLE_DEVICES=4,5,6,7 deepspeed --num_gpus 4 weclone/train/train_sft.py

6.2 训练显存不足

显存不足时,可以按下表参数修改

项目 当前值 修改建议 影响
per_device_train_batch_size 2 ↓ 改为 1 显著减少显存占用,训练更慢
cutoff_len 2048 ↓ 改为 1024 或 1536 减少输入序列长度
lora_rank 8 ↓ 改为 4 降低LoRA参数量
gradient_accumulation_steps 32 ↑ 改为 64 通过累积梯度代替更大batch
flash_attn "fa2" 改为 "none" 或 "disabled" 兼容性好但稍慢
gradient_checkpointing true ✅ 保持开启 节省显存,略增训练时间
fp16 true ✅ 保持开启 半精度节省约40%显存
enable_thinking false ✅ 保持关闭 不启用额外推理层
deepspeed 关闭 可启用 ZeRO-2 模式(如 ds_config.json) 多卡分担显存压力

如果怎么改都不行,可以改用换用更小的模型/Qwen2.5-3B-Instruct

复制代码
modelscope download --model Qwen/Qwen2.5-3B-Instruct --local_dir ./Qwen2.5-3B-Instruct

也可以选用官网的给的模型

6.3 显存不变,增强效果

参数名 当前值 建议修改范围 作用与说明
learning_rate 8e-5 6e-5 ~ 1e-4 调整学习率曲线。
warmup_ratio 0.12 0.1 ~ 0.15 增加 warmup 比例让模型更平滑地进入训练.
weight_decay 0.05 0.06 ~ 0.08 轻微增加正则强度可以减少过拟合,提高泛化性。
num_train_epochs 3 4 ~ 6 多训练几轮,不增加显存,只增加训练时间,效果通常明显提升。
lr_scheduler_type cosine_with_restarts 可改"cosine""linear" 不同调度器可微调学习率变化曲线,影响最终精度。cosine 更平滑,linear 收敛更快。
gradient_accumulation_steps 32 保持或略增(40) 改善有效 batch 统计稳定性。
lora_dropout 0.25 0.1 ~ 0.3 调整 LoRA dropout 改变泛化能力:小 dropout 精度更高,大 dropout 泛化更强。
fp16 true ✅ 保持 节省显存且速度快,无负面影响。
gradient_checkpointing true ✅ 保持 节省显存,不影响训练效果。
plot_loss true ✅ 保持 方便可视化观察收敛情况。

7.本地测试(可跳过)

新建个文件,然后放入以下代码,有需要可修改路径,然后运行

复制代码
# python
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
import re

def load_default_system(path: str) -> str:
    with open(path, "r", encoding="utf-8") as f:
        for line in f:
            match = re.search(r'"default_system"\s*:\s*"([^"]*)"', line)
            if match:
                return match.group(1)
    return ""

default_system = load_default_system("settings.jsonc")
messages = [
    {"role": "system", "content": default_system or "你是一个有帮助的助手。"},
    {"role": "user", "content": "你在干嘛。"},
]

tokenizer = AutoTokenizer.from_pretrained("./model_output", trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained("./model_output", trust_remote_code=True, device_map="auto")

prompt_text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(prompt_text, return_tensors="pt").to(model.device)
out = model.generate(**inputs, max_new_tokens=128, temperature=0.5, top_p=0.9)
print(tokenizer.decode(out[0], skip_special_tokens=True))

运行效果如下:

8.web测试

因为我是在服务器上运行的,服务器不直接支持打开web页面,所以使用禁止服务器打开浏览器,使用 SSH 隧道从本地访问。

复制代码
export WECLONE_WEB_INBROWSER=false
export WECLONE_WEB_SHARE=false
weclone-cli webchat-demo

要是本地支持打开web页面,可以直接运行

复制代码
weclone-cli webchat-demo

测试出合适的温度和top_p值,然后在 settings.jsonc 中进行修改,以便后续推理使用。

实际使用效果可以如下

相关推荐
Xi xi xi3 小时前
苏州唯理科技近期也正式发布了国内首款神经腕带产品
大数据·人工智能·经验分享·科技
熊猫钓鱼>_>3 小时前
基于知识图谱的智能会议纪要系统:从语音识别到深度理解
人工智能·语音识别·知识图谱
拓端研究室4 小时前
专题:2025年游戏科技的AI革新研究报告:全球市场趋势研究报告|附130+份报告PDF、数据仪表盘汇总下载
人工智能
Gitpchy4 小时前
Day 20 奇异值SVD分解
python·机器学习
CSTechEi4 小时前
【SPIE/EI/Scopus检索】2026 年第三届数据挖掘与自然语言处理国际会议 (DMNLP 2026)
人工智能·自然语言处理·数据挖掘
GJGCY4 小时前
技术剖析:智能体工作流与RPA流程自动化的架构差异与融合实现
人工智能·经验分享·ai·自动化·rpa
UMI赋能企业4 小时前
制造业流程自动化提升生产力的全面分析
大数据·人工智能
MediaTea5 小时前
Python 第三方库:matplotlib(科学绘图与数据可视化)
开发语言·python·信息可视化·matplotlib
说私域5 小时前
“开源AI大模型AI智能名片S2B2C商城小程序”视角下的教育用户策略研究
人工智能·小程序