news 2026/3/8 5:57:31

ChatGLM-6B开源大模型实战:基于model_weights目录的自定义微调准备

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ChatGLM-6B开源大模型实战:基于model_weights目录的自定义微调准备

ChatGLM-6B开源大模型实战:基于model_weights目录的自定义微调准备

1. 为什么从model_weights目录开始微调,而不是重新下载?

很多人第一次接触ChatGLM-6B时,会下意识去Hugging Face或ModelScope重新拉取模型——结果发现下载慢、容易中断、还可能因网络问题卡在半途。其实,你手头这个镜像里已经藏着一个“即开即用”的宝藏:/ChatGLM-Service/model_weights/目录。

它不是临时缓存,也不是简化版权重,而是完整、未经裁剪、可直接加载的FP16精度模型文件,包含pytorch_model.bintokenizer.modelconfig.json等全部必需组件。这意味着:你省掉了20分钟等待,跳过了环境兼容踩坑,直接站在了微调起点上。

更重要的是,这个目录结构干净、路径明确、权限规范,完全适配Hugging Face Transformers标准加载逻辑。不需要改代码、不需重命名、不需手动合并分片——打开就能用,改完就能训。对刚入门大模型微调的朋友来说,这一步的确定性,比任何教程都管用。

2. 看懂model_weights目录:不只是文件堆砌

2.1 目录内容逐项解析

进入/ChatGLM-Service/model_weights/后,你会看到这些关键文件:

ls -l /ChatGLM-Service/model_weights/

输出类似:

-rw-r--r-- 1 root root 12G Jan 15 10:22 pytorch_model.bin -rw-r--r-- 1 root root 32K Jan 15 10:22 config.json -rw-r--r-- 1 root root 18M Jan 15 10:22 tokenizer.model -rw-r--r-- 1 root root 24K Jan 15 10:22 tokenizer_config.json -rw-r--r-- 1 root root 12K Jan 15 10:22 special_tokens_map.json drwxr-xr-x 2 root root 4.0K Jan 15 10:22 quantization/

我们来挨个说清楚它们是干什么的,用你能听懂的方式:

  • pytorch_model.bin:模型的“大脑”——所有62亿参数的数值快照。它不是代码,而是一堆数字矩阵,但正是这些数字决定了模型怎么理解“苹果”和“iPhone”的关系。
  • config.json:模型的“说明书”。它告诉程序:这是ChatGLM架构、隐藏层有32层、词表大小是65024、最大上下文长度是2048……没有它,程序连模型多大都不知道。
  • tokenizer.model:中文分词的“字典+规则”。它知道“人工智能”该拆成一个词,还是“人工”+“智能”,也认识“的”“了”“吗”这些高频虚词。ChatGLM用的是SentencePiece,不是BERT那种WordPiece。
  • tokenizer_config.jsonspecial_tokens_map.json:补充说明哪些符号是特殊标记,比如[CLS][SEP]<|user|><|assistant|>——这些是ChatGLM对话格式的关键锚点。

小提醒:别急着复制整个目录!quantization/文件夹是为低显存推理准备的量化版本(如INT4),微调时必须用原始FP16权重,否则训练会失败或效果崩坏。

2.2 权限与路径安全检查

微调前务必确认两件事,否则训练脚本一运行就报错:

  1. 读写权限是否到位?

    # 检查当前用户能否读取权重(必须) ls -l /ChatGLM-Service/model_weights/pytorch_model.bin # 如果显示 "Permission denied",执行: chmod 644 /ChatGLM-Service/model_weights/*
  2. 路径中不能有空格或中文
    镜像默认路径/ChatGLM-Service/是安全的;但如果你把它软链接到/我的项目/chatglm/或复制到~/Downloads/ChatGLM 6B/,PyTorch会直接报OSError: Unable to open file。请坚持使用英文路径。

3. 微调前必备:三件套环境准备

别跳过这一步——90%的“微调失败”其实卡在环境没配对。

3.1 验证基础依赖已就位

镜像已预装PyTorch 2.5.0 + CUDA 12.4,但微调需要额外两个关键库:

pip install -U peft transformers datasets accelerate bitsandbytes
  • peft:高效微调核心库,支持LoRA、Prefix-Tuning等方法,让6B模型在单卡24G显存上也能训起来;
  • datasets:统一管理你的训练数据(CSV/JSON/Parquet),自动做tokenize和padding;
  • accelerate:自动处理多卡、混合精度、梯度累积,不用手写DistributedDataParallel
  • bitsandbytes:提供bnb_4bit_quant_type="nf4"等量化选项,进一步压显存。

验证安装成功:

from peft import LoraConfig from transformers import AutoTokenizer, AutoModelForCausalLM print("All libraries ready.")

3.2 创建专属微调工作区(推荐做法)

不要在/ChatGLM-Service/根目录下直接改代码。新建一个干净空间:

mkdir -p ~/chatglm-finetune cd ~/chatglm-finetune ln -s /ChatGLM-Service/model_weights ./base_model

这样做的好处:

  • base_model是只读链接,保护原始权重不被意外覆盖;
  • 所有训练日志、检查点、配置文件都集中在~/chatglm-finetune/,一目了然;
  • 后续换模型(比如升级到ChatGLM3-6B)只需改链接,不用挪数据。

4. 数据准备:用真实对话格式喂给模型

ChatGLM-6B不是通用语言模型,它是对话专家。它的训练数据全是<|user|>...<|assistant|>...这种严格格式。你给的数据如果写成“Q: 你好 A: 我好”,模型根本学不会。

4.1 正确的数据结构长这样

新建data/train.jsonl(注意是.jsonl,每行一个JSON对象):

{"instruction": "写一封辞职信,语气礼貌简洁", "input": "", "output": "尊敬的领导:\n\n您好!经过慎重考虑,我决定辞去目前担任的XX职位……"} {"instruction": "把下面这句话翻译成英文:今天天气真好", "input": "", "output": "The weather is really nice today."} {"instruction": "解释量子纠缠是什么,用中学生能听懂的话", "input": "", "output": "想象有一双魔法手套,左手戴一只,右手戴一只……"}

关键点:

  • 必须有instruction(任务描述)、input(可选补充信息)、output(理想回答)三个字段;
  • input字段留空字符串"",不是删掉它,也不是写null
  • 每行一个完整JSON,不加逗号,不包在数组里;
  • 中文标点用全角,英文用半角,保持一致性。

4.2 快速生成100条测试数据(实操技巧)

别手工写!用镜像自带的Gradio服务“反向生成”:

  1. 启动WebUI:supervisorctl start chatglm-service
  2. 本地访问http://127.0.0.1:7860
  3. 在输入框里依次输入:
    • “写5条电商客服常见问题及标准回复”
    • “生成10个Python编程面试题,附带答案”
    • “列出20个适合小红书发布的健身打卡文案”
  4. 复制输出内容,用Python脚本清洗成JSONL格式(示例代码见下节)

5. LoRA微调实战:12行代码跑通全流程

我们用最轻量、最稳妥的LoRA(Low-Rank Adaptation)方式——只训练0.1%的参数,却能达到全参数微调95%的效果。

5.1 编写微调脚本train_lora.py

# train_lora.py from transformers import AutoTokenizer, AutoModelForSeq2SeqLM, TrainingArguments, Trainer from peft import LoraConfig, get_peft_model from datasets import load_dataset import torch # 1. 加载基础模型和分词器(指向model_weights目录) model_name = "./base_model" tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True) model = AutoModelForSeq2SeqLM.from_pretrained( model_name, torch_dtype=torch.float16, trust_remote_code=True, device_map="auto" ) # 2. 配置LoRA:只训练attention层的Q/V投影矩阵 peft_config = LoraConfig( r=8, lora_alpha=32, target_modules=["q_proj", "v_proj"], lora_dropout=0.1, bias="none", task_type="CAUSAL_LM" ) model = get_peft_model(model, peft_config) # 3. 加载数据并tokenize dataset = load_dataset("json", data_files={"train": "data/train.jsonl"}) def preprocess_function(examples): texts = [f"<|user|>{instr}<|assistant|>{out}" for instr, out in zip(examples["instruction"], examples["output"])] return tokenizer(texts, truncation=True, padding=True, max_length=512) tokenized_dataset = dataset.map(preprocess_function, batched=True, remove_columns=["instruction", "input", "output"]) # 4. 训练配置 training_args = TrainingArguments( output_dir="./lora-checkpoint", per_device_train_batch_size=2, gradient_accumulation_steps=4, learning_rate=2e-4, num_train_epochs=3, logging_steps=10, save_steps=100, fp16=True, report_to="none" ) Trainer( model=model, args=training_args, train_dataset=tokenized_dataset["train"] ).train() # 5. 保存最终LoRA适配器 model.save_pretrained("./lora-finetuned")

5.2 运行与监控

# 安装依赖后,直接运行 python train_lora.py # 实时看显存和训练进度 nvidia-smi --query-gpu=memory.used,memory.total --format=csv tail -f ./lora-checkpoint/trainer_state.json | grep "epoch"

预期表现(单卡RTX 4090)

  • 显存占用:约18GB(远低于全参数微调的32GB+)
  • 每步耗时:1.2秒左右
  • 3轮训练总时长:约45分钟(100条数据)
  • 最终生成的./lora-finetuned/目录仅25MB,可随时注入原模型使用。

6. 验证微调效果:用Gradio快速对比

训练完别急着部署,先用最直观的方式验证——把新旧模型放一起比。

6.1 启动双模型WebUI(简易版)

创建demo_compare.py

import gradio as gr from transformers import AutoTokenizer, AutoModelForSeq2SeqLM from peft import PeftModel # 加载原始模型 base_tokenizer = AutoTokenizer.from_pretrained("./base_model", trust_remote_code=True) base_model = AutoModelForSeq2SeqLM.from_pretrained("./base_model", trust_remote_code=True, device_map="auto") # 加载微调后模型(LoRA + base) lora_tokenizer = AutoTokenizer.from_pretrained("./base_model", trust_remote_code=True) lora_model = AutoModelForSeq2SeqLM.from_pretrained("./base_model", trust_remote_code=True, device_map="auto") lora_model = PeftModel.from_pretrained(lora_model, "./lora-finetuned") def chat_both(prompt): inputs = base_tokenizer(f"<|user|>{prompt}<|assistant|>", return_tensors="pt").to("cuda") base_out = base_model.generate(**inputs, max_new_tokens=256, do_sample=True, temperature=0.7) lora_out = lora_model.generate(**inputs, max_new_tokens=256, do_sample=True, temperature=0.7) return ( base_tokenizer.decode(base_out[0], skip_special_tokens=True), lora_tokenizer.decode(lora_out[0], skip_special_tokens=True) ) gr.Interface( fn=chat_both, inputs="text", outputs=["text", "text"], title="ChatGLM-6B 原始 vs 微调效果对比", description="左侧为原始模型输出,右侧为LoRA微调后输出" ).launch(server_port=7861)

运行后访问http://127.0.0.1:7861,输入“帮我写一段朋友圈文案,推广新上市的咖啡机”,你会立刻看到:

  • 左边:泛泛而谈“咖啡机很好用,快来买”;
  • 右边:精准出现“#办公室神器 #30秒萃取 #冷凝水自动回收”等你训练数据里的关键词。

这就是微调生效的最真实信号。

7. 总结:从model_weights出发的微调心法

7.1 关键动作再强调

  • 路径即生产力/ChatGLM-Service/model_weights/是现成的高质量起点,别重复造轮子;
  • 格式即生命线:数据必须用<|user|>...<|assistant|>格式,这是ChatGLM的DNA;
  • LoRA是新手护城河:r=8足够应对大多数业务场景,显存友好、收敛稳定、体积小巧;
  • 验证要快准狠:用Gradio双模型对比,10分钟内确认效果,避免盲目训完才发现方向错了。

7.2 下一步你可以做什么

  • 把微调好的LoRA适配器打包进Docker镜像,一键部署到生产环境;
  • transformers.pipeline()封装成API服务,供公司内部系统调用;
  • 尝试QLoRA(4-bit量化LoRA),在12G显存的3090上也能跑;
  • 结合RAG技术,在微调基础上接入企业知识库,打造专属智能助手。

微调不是终点,而是你真正掌控大模型能力的起点。当你第一次看到模型按你的意图生成内容时,那种“我教会了它”的踏实感,远胜于任何参数指标。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/4 2:28:09

SenseVoice Small部署优化:Docker镜像体积压缩至1.8GB最佳实践

SenseVoice Small部署优化&#xff1a;Docker镜像体积压缩至1.8GB最佳实践 1. 为什么是SenseVoice Small&#xff1f; 在轻量级语音识别模型中&#xff0c;阿里通义千问推出的SenseVoice Small是个特别的存在。它不是简单地把大模型“砍一刀”做裁剪&#xff0c;而是从训练阶…

作者头像 李华
网站建设 2026/3/4 8:50:45

MediaPipe Hands实战教程:彩虹骨骼可视化实现步骤详解

MediaPipe Hands实战教程&#xff1a;彩虹骨骼可视化实现步骤详解 1. 学习目标与前置知识 本教程将带你从零开始&#xff0c;基于 Google 的 MediaPipe Hands 模型&#xff0c;实现一个支持 21个3D手部关键点检测 与 彩虹骨骼可视化 的完整手势识别系统。你将掌握&#xff1a…

作者头像 李华
网站建设 2026/3/7 10:42:06

SenseVoice Small多语言案例:日语技术分享会音频→精准转写+术语保留

SenseVoice Small多语言案例&#xff1a;日语技术分享会音频→精准转写术语保留 1. 为什么选SenseVoice Small做日语技术转写&#xff1f; 语音识别不是简单“听个大概”&#xff0c;尤其在技术分享场景里——日语专有名词密集、语速快、夹杂英文缩写&#xff0c;普通模型一碰…

作者头像 李华
网站建设 2026/3/2 22:32:50

零门槛集成vue-office:全格式兼容的Office文档预览解决方案

零门槛集成vue-office&#xff1a;全格式兼容的Office文档预览解决方案 【免费下载链接】vue-office 项目地址: https://gitcode.com/gh_mirrors/vu/vue-office Office文档预览是企业级Web应用的核心功能需求&#xff0c;vue-office作为专注于此场景的Vue组件库&#x…

作者头像 李华
网站建设 2026/3/4 6:22:09

FaceRecon-3D开箱即用:免配置3D人脸重建系统,一键生成UV纹理图

FaceRecon-3D开箱即用&#xff1a;免配置3D人脸重建系统&#xff0c;一键生成UV纹理图 【一键体验】&#x1f3ad; FaceRecon-3D - 单图3D人脸重建系统 达摩院高精度模型集成镜像&#xff5c;PyTorch3D与Nvdiffrast环境已预装&#xff5c;Gradio交互界面直连即用 镜像地址&…

作者头像 李华
网站建设 2026/3/3 21:30:09

Qwen2.5-7B模型加载失败?safetensors解析问题解决

Qwen2.5-7B模型加载失败&#xff1f;safetensors解析问题解决 1. 问题背景与场景描述 在部署通义千问团队发布的 Qwen2.5-7B-Instruct 模型时&#xff0c;部分开发者反馈在调用 AutoModelForCausalLM.from_pretrained() 加载模型权重时出现加载失败的问题。尽管模型文件完整且…

作者头像 李华