BitCPM-CANN-8B-unquantized:革命性1.58位大语言模型的量化感知训练完整指南

【免费下载链接】BitCPM-CANN-8B-unquantized BitCPM-CANN-8B-unquantized 是 BitCPM-CANN-8B 的未量化量化感知训练(QAT)检查点,专为持续预训练和微调而设计。它保留了全精度的潜在权重,并通过 modeling.py 中定义的三元伪量化器(权重 → {-1, 0, 1},带有分组缩放,通过 STE 进行训练),使模型能够在量化约束下继续学习 【免费下载链接】BitCPM-CANN-8B-unquantized 项目地址: https://ai.gitcode.com/OpenBMB/BitCPM-CANN-8B-unquantized

BitCPM-CANN-8B-unquantized是OpenBMB社区推出的革命性1.58位大语言模型量化感知训练检查点,专为持续预训练和微调而设计。这款模型采用三元伪量化技术,将权重压缩到{-1, 0, 1}三个值,同时保持全精度潜在权重,让开发者能够在量化约束下继续训练模型,实现极致的模型压缩与性能平衡。🚀

什么是量化感知训练(QAT)?

量化感知训练是一种先进的模型压缩技术,它在训练过程中模拟量化效果,让模型"感知"量化带来的精度损失,从而学习适应量化后的权重分布。与传统后训练量化不同,QAT在训练阶段就考虑了量化约束,能够显著减少量化带来的精度损失。

BitCPM-CANN-8B-unquantized通过modeling_minicpm.py中定义的三元伪量化器,在训练时自动将权重映射到{-1, 0, 1}三个离散值,配合分组缩放技术,使用STE(Straight-Through Estimator)进行梯度传播,实现了真正的量化感知训练。

为什么选择BitCPM-CANN-8B-unquantized?🤔

核心优势

  1. 极致压缩:1.58位权重表示,相比传统32位浮点模型,存储需求减少约95%
  2. 训练友好:保留全精度潜在权重,支持继续训练和微调
  3. 硬件兼容:同时支持GPU和NPU训练,提供完整的训练脚本
  4. 无缝转换:训练后可通过qat-convert.py一键转换为推理模型

技术亮点

  • 三元量化:权重仅取{-1, 0, 1}三个值,实现超低比特表示
  • 分组缩放:按组进行缩放因子计算,平衡精度与压缩率
  • STE训练:使用直通估计器解决量化不可微问题

快速开始:环境配置与安装

环境要求

# 使用华为NPU环境(910C)
docker pull swr.cn-south-1.myhuaweicloud.com/ascendhub/mindspeed-llm:openeuler22.03-mindspeed-llm-2.3.0-a3-arm

# 安装依赖
pip install -r example/requirements.txt

对于GPU环境,无需特殊镜像,直接安装依赖即可。

模型加载

from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

model_path = 'openbmb/BitCPM-CANN-8B-unquantized'
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
    model_path,
    torch_dtype=torch.bfloat16,
    trust_remote_code=True  # 必须设置为True
)

关键提示:加载模型时必须设置trust_remote_code=True,因为模型使用了自定义的前向传播逻辑。

完整训练流程详解 📊

1. 持续预训练(CPT)

持续预训练允许您在现有模型基础上继续训练,适应特定领域数据。BitCPM-CANN-8B-unquantized提供了完整的训练脚本:

cd example
bash run.sh

持续预训练损失曲线 GPU上的持续预训练损失曲线 - 展示了模型在C4-Pro数据集上的稳定收敛过程

配置文件说明

  • example/run.sh:训练启动脚本
  • example/train.py:基于HuggingFace Trainer + DeepSpeed的预训练脚本
  • example/ds_config.json:DeepSpeed ZeRO-3配置
  • example/ds_config_z2.json:DeepSpeed ZeRO-2配置

2. 监督微调(SFT)

监督微调用于对齐模型输出与人类偏好:

cd example
bash run_sft.sh

监督微调损失曲线 GPU上的监督微调损失曲线 - 在UltraChat 200k数据集上的优化表现

数据集支持

  • CPT:C4-Pro数据集
  • SFT:UltraChat 200k数据集

多硬件支持:GPU vs NPU对比

BitCPM-CANN-8B-unquantized在GPU和NPU上都有出色的训练表现:

GPU训练结果

GPU预训练损失 GPU上的持续预训练损失曲线

GPU SFT损失 GPU上的监督微调损失曲线

NPU训练结果

NPU预训练损失 NPU上的持续预训练损失曲线

NPU SFT损失 NPU上的监督微调损失曲线

一致性验证:从损失曲线可以看出,GPU和NPU的训练结果高度一致,证明了模型的跨硬件兼容性。

训练后转换:从QAT到推理模型

训练完成后,需要将QAT检查点转换为推理模型:

python qat-convert.py \
    --input_bin <path-to-finetuned-pytorch.bin> \
    --output <path-to-output-pseudo-quantized-pytorch.bin> \
    --quant_type ternary \
    --group_size -1

转换流程

BitCPM-CANN-8B-unquantized
        ↓ 训练(DeepSpeed / LLaMA Factory / HF Trainer)
微调后的检查点(包含未融合的QAT参数)
        ↓ python qat-convert.py --quant_type ternary --group_size -1
伪量化推理模型(与BitCPM-CANN-8B相同格式)

转换脚本位置qat-convert.py

支持的训练框架

BitCPM-CANN-8B-unquantized兼容多种主流训练框架:

1. DeepSpeed(推荐)

# 使用example目录中的完整脚本
cd example && bash run.sh

2. HuggingFace Trainer

from transformers import Trainer, TrainingArguments

training_args = TrainingArguments(
    output_dir="./results",
    per_device_train_batch_size=4,
    gradient_accumulation_steps=4,
    num_train_epochs=3,
    logging_dir="./logs",
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    data_collator=data_collator,
)

3. LLaMA Factory

# 配置文件中指定模型路径和trust_remote_code
model_name_or_path: openbmb/BitCPM-CANN-8B-unquantized
trust_remote_code: true

技术架构深度解析 🔧

三元伪量化器实现

modeling_minicpm.py中,三元伪量化器的核心实现如下:

class SteTernaryQuantizer(nn.Module):
    def __init__(self, group_size):
        super().__init__()
        self.group_size = group_size

    def forward(self, x):
        org_w_shape = x.shape
        if self.group_size > 0:
            assert x.shape[-1] % self.group_size == 0
            x = x.reshape(-1, self.group_size)
        elif self.group_size == -1:
            x = x.reshape(-1, x.shape[-1])
        
        assert x.dim() == 2
        scales = 1.0 / (x.abs().mean(dim=1, keepdim=True).clamp_(min=1e-5))
        x_q = (torch.clamp(torch.round(x * scales),-1,1) / scales)
        
        x = x.reshape(org_w_shape)
        x_q = x_q.reshape(org_w_shape)
        return x + (x_q - x).detach()

量化感知线性层

class LinearQuantizer(nn.Linear):
    def __init__(self, in_features, out_features, bias=False, 
                 quant_type="ternary", bit=4, group_size=-1):
        super().__init__(in_features, out_features, bias)
        self.quantizer = get_quantizer(quant_type, bit, group_size)
    
    def forward(self, x):
        weight_tensor = self.quantizer(self.weight)
        x = torch.nn.functional.linear(x, weight_tensor)
        if self.bias is not None:
            x = x + self.bias
        return x

最佳实践与注意事项 ⚠️

训练建议

  1. 学习率调整:建议使用较小的学习率开始训练
  2. 批量大小:根据硬件内存调整,确保稳定训练
  3. 梯度累积:使用梯度累积模拟更大的批量大小
  4. 混合精度:建议使用bfloat16或fp16混合精度训练

常见问题解决

Q:训练时出现梯度爆炸? A:降低学习率,使用梯度裁剪,检查数据预处理

Q:模型收敛缓慢? A:调整学习率调度器,检查数据质量,增加训练轮数

Q:内存不足? A:使用DeepSpeed ZeRO优化,减少批量大小,使用梯度检查点

模型家族概览

BitCPM-CANN提供多个规模的模型供选择:

模型规模 推理版本 训练版本
0.5B BitCPM-CANN-0.5B BitCPM-CANN-0.5B-unquantized
1B BitCPM-CANN-1B BitCPM-CANN-1B-unquantized
3B BitCPM-CANN-3B BitCPM-CANN-3B-unquantized
8B BitCPM-CANN-8B BitCPM-CANN-8B-unquantized

总结与展望 🎯

BitCPM-CANN-8B-unquantized代表了1.58位大语言模型量化感知训练的前沿技术,为开发者提供了在超低比特约束下继续训练模型的能力。通过本文的完整指南,您应该能够:

  1. ✅ 理解三元量化的核心原理
  2. ✅ 配置GPU/NPU训练环境
  3. ✅ 执行持续预训练和监督微调
  4. ✅ 将QAT模型转换为推理模型
  5. ✅ 在不同框架中集成使用

无论您是希望压缩模型部署到边缘设备,还是需要在资源受限环境中训练大型语言模型,BitCPM-CANN-8B-unquantized都提供了完美的解决方案。立即开始您的1.58位大语言模型训练之旅吧!🚀

重要提醒:本模型仅用于训练,推理请使用对应的伪量化版本openbmb/BitCPM-CANN-8B

【免费下载链接】BitCPM-CANN-8B-unquantized BitCPM-CANN-8B-unquantized 是 BitCPM-CANN-8B 的未量化量化感知训练(QAT)检查点,专为持续预训练和微调而设计。它保留了全精度的潜在权重,并通过 modeling.py 中定义的三元伪量化器(权重 → {-1, 0, 1},带有分组缩放,通过 STE 进行训练),使模型能够在量化约束下继续学习 【免费下载链接】BitCPM-CANN-8B-unquantized 项目地址: https://ai.gitcode.com/OpenBMB/BitCPM-CANN-8B-unquantized

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐