AIGC:【LLM(七)】——Baichuan2:真开源可商用的中文大模型

news2025/3/5 10:36:21

文章目录

  • 一.模型介绍
  • 二.模型部署
    • 2.1 CPU部署
    • 2.2 GPU部署
  • 三.模型推理
    • 3.1 Chat 模型推理
    • 3.2 Base 模型推理
  • 四.模型量化
    • 4.1 量化方法
    • 4.2 在线量化
    • 4.3 离线量化
    • 4.4 量化效果
  • 五.模型微调
    • 5.1 依赖安装
    • 5.2 单机训练
    • 5.3 多机训练
    • 5.4 轻量化微调

一.模型介绍

Baichuan 2 是百川智能推出的新一代开源大语言模型,采用 2.6 万亿 Tokens 的高质量语料训练。其在多个权威的中文、英文和多语言的通用、领域 benchmark 上取得同尺寸最佳的效果。
在这里插入图片描述
在这里插入图片描述

目前开源发布的包含有 7B、13B 的 Base 和 Chat 版本,并提供了 Chat 版本的 4bits 量化。所有版本对学术研究完全开放。同时,开发者通过邮件申请并获得官方商用许可后,即可免费商用。
在这里插入图片描述
下载链接
【Baichuan2-7B-Base】:https://huggingface.co/baichuan-inc/Baichuan2-7B-Base
【Baichuan2-13B-Base】:https://huggingface.co/baichuan-inc/Baichuan2-13B-Base
【Baichuan2-7B-Chat】:https://huggingface.co/baichuan-inc/Baichuan2-7B-Chat
【Baichuan2-13B-Chat】:https://huggingface.co/baichuan-inc/Baichuan2-13B-Chat
【Baichuan2-7B-Chat-4bits】:https://huggingface.co/baichuan-inc/Baichuan2-7B-Chat-4bits
【Baichuan2-13B-Chat-4bits】:https://huggingface.co/baichuan-inc/Baichuan2-13B-Chat-4bits

除了模型的全面公开之外,百川智能还开源了模型训练的 Check Point,并公开了 Baichuan 2 技术报告,详细介绍了模型的训练细节。
【代码仓库】:https://github.com/baichuan-inc/Baichuan2
【技术报告】:https://cdn.baichuan-ai.com/paper/Baichuan2-technical-report.pdf
在这里插入图片描述

二.模型部署

2.1 CPU部署

Baichuan 2 模型支持 CPU 推理,但需要强调的是,CPU 的推理速度相对较慢。需按如下方式修改模型加载的方式。

# Taking Baichuan2-7B-Chat as an example
model = AutoModelForCausalLM.from_pretrained("baichuan-inc/Baichuan2-7B-Chat", torch_dtype=torch.float32, trust_remote_code=True)

2.2 GPU部署

依靠 streamlit 运行以下命令,会在本地启动一个 web 服务,把控制台给出的地址放入浏览器即可访问。

streamlit run web_demo.py

三.模型推理

3.1 Chat 模型推理

>>> import torch
>>> from transformers import AutoModelForCausalLM, AutoTokenizer
>>> from transformers.generation.utils import GenerationConfig
>>> tokenizer = AutoTokenizer.from_pretrained("baichuan-inc/Baichuan2-13B-Chat", use_fast=False, trust_remote_code=True)
>>> model = AutoModelForCausalLM.from_pretrained("baichuan-inc/Baichuan2-13B-Chat", device_map="auto", torch_dtype=torch.bfloat16, trust_remote_code=True)
>>> model.generation_config = GenerationConfig.from_pretrained("baichuan-inc/Baichuan2-13B-Chat")
>>> messages = []
>>> messages.append({"role": "user", "content": "解释一下“温故而知新”"})
>>> response = model.chat(tokenizer, messages)
>>> print(response)
"温故而知新"是一句中国古代的成语,出自《论语·为政》篇。这句话的意思是:通过回顾过去,我们可以发现新的知识和理解。换句话说,学习历史和经验可以让我们更好地理解现在和未来。
这句话鼓励我们在学习和生活中不断地回顾和反思过去的经验,从而获得新的启示和成长。通过重温旧的知识和经历,我们可以发现新的观点和理解,从而更好地应对不断变化的世界和挑战。

3.2 Base 模型推理

>>> from transformers import AutoModelForCausalLM, AutoTokenizer
>>> tokenizer = AutoTokenizer.from_pretrained("baichuan-inc/Baichuan2-13B-Base", trust_remote_code=True)
>>> model = AutoModelForCausalLM.from_pretrained("baichuan-inc/Baichuan2-13B-Base", device_map="auto", trust_remote_code=True)
>>> inputs = tokenizer('登鹳雀楼->王之涣\n夜雨寄北->', return_tensors='pt')
>>> inputs = inputs.to('cuda:0')
>>> pred = model.generate(**inputs, max_new_tokens=64, repetition_penalty=1.1)
>>> print(tokenizer.decode(pred.cpu()[0], skip_special_tokens=True))
登鹳雀楼->王之涣
夜雨寄北->李商隐

四.模型量化

为了让不同的用户以及不同的平台都能运行 Baichuan 2 模型,百川智能针对 Baichuan 2 模型做了相应地量化工作(包括 Baichuan2-7B-Chat 和 Baichuan2-13B-Chat),方便用户快速高效地在自己的平台部署 Baichuan 2 模型。

4.1 量化方法

Baichuan 2 的采用社区主流的量化方法:BitsAndBytes。该方法可以保证量化后的效果基本不掉点,目前已经集成到 transformers 库里,并在社区得到了广泛应用。BitsAndBytes 支持 8bits 和 4bits 两种量化,其中 4bits 支持 FP4 和 NF4 两种格式,Baichuan 2 选用 NF4 作为 4bits 量化的数据类型。基于该量化方法,Baichuan 2 支持在线量化和离线量化两种模式。

4.2 在线量化

对于在线量化, Baichuan 2支持 8bits 和 4bits 量化,使用只需要先加载模型到 CPU 的内存里,再调用quantize()接口量化,最后调用 cuda()函数,将量化后的权重拷贝到 GPU 显存中。实现整个模型加载的代码非常简单,以 Baichuan2-7B-Chat 为例:
8bits 在线量化

model = AutoModelForCausalLM.from_pretrained("baichuan-inc/Baichuan2-7B-Chat", torch_dtype=torch.float16, trust_remote_code=True)
model = model.quantize(8).cuda() 

4bits 在线量化

model = AutoModelForCausalLM.from_pretrained("baichuan-inc/Baichuan2-7B-Chat", torch_dtype=torch.float16, trust_remote_code=True)
model = model.quantize(4).cuda() 

需要注意的是,在用 from_pretrained 接口的时候,用户一般会加上 device_map=“auto”,在使用在线量化时,需要去掉这个参数,否则会报错。

4.3 离线量化

为了方便用户的使用,Baichuan2提供了离线量化好的 4bits 的版本 Baichuan2-7B-Chat-4bits,供用户下载。 用户加载 Baichuan2-7B-Chat-4bits 模型很简单,只需要执行:

model = AutoModelForCausalLM.from_pretrained("baichuan-inc/Baichuan2-7B-Chat-4bits", device_map="auto", trust_remote_code=True)

对于 8bits 离线量化,Hugging Face transformers 库提供了相应的 API 接口,可以很方便的实现 8bits 量化模型的保存和加载。用户可以自行按照如下方式实现 8bits 的模型保存和加载:

# Model saving: model_id is the original model directory, and quant8_saved_dir is the directory where the 8bits quantized model is saved.
model = AutoModelForCausalLM.from_pretrained(model_id, load_in_8bit=True, device_map="auto", trust_remote_code=True)
model.save_pretrained(quant8_saved_dir)
model = AutoModelForCausalLM.from_pretrained(quant8_saved_dir, device_map="auto", trust_remote_code=True)

4.4 量化效果

量化前后显存占用对比 (GPU Mem in GB):
在这里插入图片描述

量化后在各个 benchmark 上的结果和原始版本对比如下:
在这里插入图片描述

五.模型微调

5.1 依赖安装

git clone https://github.com/baichuan-inc/Baichuan2.git
cd Baichuan2/fine-tune
pip install -r requirements.txt
  • 如需使用 LoRA 等轻量级微调方法需额外安装 peft
  • 如需使用 xFormers 进行训练加速需额外安装 xFormers

5.2 单机训练

下面是一个微调 Baichuan2-7B-Base 的单机训练例子。
训练数据:data/belle_chat_ramdon_10k.json,该样例数据是从 multiturn_chat_0.8M 采样出 1 万条,并且做了格式转换。主要是展示多轮数据怎么训练,不保证效果。

hostfile=""
deepspeed --hostfile=$hostfile fine-tune.py  \
    --report_to "none" \
    --data_path "data/belle_chat_ramdon_10k.json" \
    --model_name_or_path "baichuan-inc/Baichuan2-7B-Base" \
    --output_dir "output" \
    --model_max_length 512 \
    --num_train_epochs 4 \
    --per_device_train_batch_size 16 \
    --gradient_accumulation_steps 1 \
    --save_strategy epoch \
    --learning_rate 2e-5 \
    --lr_scheduler_type constant \
    --adam_beta1 0.9 \
    --adam_beta2 0.98 \
    --adam_epsilon 1e-8 \
    --max_grad_norm 1.0 \
    --weight_decay 1e-4 \
    --warmup_ratio 0.0 \
    --logging_steps 1 \
    --gradient_checkpointing True \
    --deepspeed ds_config.json \
    --bf16 True \
    --tf32 True

5.3 多机训练

多机训练只需要给一下 hostfile ,内容类似如下:

ip1 slots=8
ip2 slots=8
ip3 slots=8
ip4 slots=8
....

同时在训练脚本里面指定 hosftfile 的路径:

hostfile="/path/to/hostfile"
deepspeed --hostfile=$hostfile fine-tune.py  \
    --report_to "none" \
    --data_path "data/belle_chat_ramdon_10k.json" \
    --model_name_or_path "baichuan-inc/Baichuan2-7B-Base" \
    --output_dir "output" \
    --model_max_length 512 \
    --num_train_epochs 4 \
    --per_device_train_batch_size 16 \
    --gradient_accumulation_steps 1 \
    --save_strategy epoch \
    --learning_rate 2e-5 \
    --lr_scheduler_type constant \
    --adam_beta1 0.9 \
    --adam_beta2 0.98 \
    --adam_epsilon 1e-8 \
    --max_grad_norm 1.0 \
    --weight_decay 1e-4 \
    --warmup_ratio 0.0 \
    --logging_steps 1 \
    --gradient_checkpointing True \
    --deepspeed ds_config.json \
    --bf16 True \
    --tf32 True

5.4 轻量化微调

代码已经支持轻量化微调如 LoRA,如需使用仅需在上面的脚本中加入以下参数:

--use_lora True

LoRA 具体的配置可见 fine-tune.py 脚本。使用 LoRA 微调后可以使用下面的命令加载模型:

from peft import AutoPeftModelForCausalLM
model = AutoPeftModelForCausalLM.from_pretrained("output", trust_remote_code=True)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/999563.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Learning From Data 中英文对照 1.THE LEARNING PROBLEM (第6页)

1.1. PROBLEM SETUP 图1.3:在二维输入空间中直线可分数据的感知器分类(A)一些训练示例将被错误分类(红色区域的蓝色点,反之亦然),用于定义分离线的权重参数的某些值。(B)。最后一种假设将所有的训练样本分类正确。(O是1,x是-1) …

基于Python和mysql开发的今天吃什么微信小程序(源码+数据库+程序配置说明书+程序使用说明书)

一、项目简介 本项目是一套基于Python和mysql开发的今天吃什么微信小程序(,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Python学习者。 包含:项目源码、项目文档、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目…

Android USB电源管理

The USB peripheral detects the lack of 3 consecutive SOF packets as a suspend request from the USB host. 1 驱动shutdown顺序 系统关机或重启的过程中,会调用设备驱动的shutdown函数来完成设备的关闭操作,有需要的设备可以在驱动中定义该函数。其…

【实操干货】如何开始用Qt Widgets编程?(五)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 在本文中&#xff0…

PHPWord 模板输出checkbox复选框和checked已勾选状态,以及 模板替换时数据如何分行

PHPWord 模板输出checkbox复选框和checked已勾选状态,以及 模板替换时数据如何分行 期望目标 和 模板配置复选框代码数据分行显示在使用PHPWORD模板替换时,经常会有 动态渲染选择项 和 选择项需要被勾选的要求,以及动态数据分行显示等要求。 本文根据 空复选框、勾选复选框…

加强身份验证安全性:深入了解身份证二要素核验API

前言 在数字化时代,随着在线业务和电子交易的不断增加,确保用户的身份安全变得至关重要。身份验证是许多行业的核心要素,从金融机构到电子商务,从社交媒体到医疗保健,都需要有效的方式来确认用户的真实身份。传统的用…

《向量数据库指南》——向量数据库的底层原理是什么?

向量数据库的底层实现原理可以根据具体的数据库系统和索引方法而有所不同。不同的向量数据库可能使用不同的数据结构和算法来支持高效的向量存储和相似性搜索。以下是一些常见的底层实现原理和概念: 1、向量存储: 数据结构:向量数据库通常使用数据结构来存储向量数据。这些数…

MOTOROLA MVME5500 电源模块

MOTOROLA MVME5500 MOTOROLA MVME5500 电源模块通常是用于 MVME5500 控制主板模块的附属设备,其主要功能是为主板和相关外围设备提供电力供应和管理。以下是通常情况下MOTOROLA MVME5500 电源模块的产品功能: 电源输出:MOTOROLA MVME5500 电源…

在Ubuntu上建立博客网站,利用Cpolar+Inis快速实现专业写作

文章目录 前言1. Inis博客网站搭建1.1. Inis博客网站下载和安装1.2 Inis博客网站测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道(云端设置)2.3.Cpolar稳定隧道(本地设置) 3. 公网访问测试总…

从 Clickhouse 到 Apache Doris:有赞业务场景下性能测试与迁移验证

本文导读: 当前,电商运营的主要痛点不仅来自多变的市场和客户需求,也受困于碎片化用户触达等带来的竞争与挑战。为了深度挖掘用户价值、培养用户忠诚度、实现业绩增长,有赞为商家搭建了全方位 OLAP 分析系统,提供实时…

mysql技术文档--mysql锁专精--锁全解!!!

简单认识: 在使用MySQL数据库时,锁可用于控制并发访问和修改数据库中的数据。它们确保在某个事务正在读取或修改数据时,其他事务不能同时对同一数据进行读取或修改操作。 MySQL提供了多种类型的锁,包括共享锁(Shared …

Spring Cloud学习笔记【消息总线-SpringCloud Bus】

SpringCloud Bus概述 概述 Spring Cloud Bus是Spring Cloud生态系统中的一个组件,用于实现微服务架构中的消息总线。它利用了轻量级消息代理(如RabbitMQ或Kafka)作为通信中间件,实现了在分布式系统中的消息传递和事件广播。 Sp…

FOXBORO FBM230 P0926GU通讯卡

通信接口:FBM230 P0926GU 通讯卡通常支持多种通信接口,如以太网、Modbus、Profibus、DeviceNet 等,以便与其他设备和控制系统进行数据通信和集成。 数据传输:它们用于在自动化系统中传输数据,包括监测和控制数据、传感…

网安周报|Chaes恶意软件的新Python变种针对银行和物流行业

1、Chaes恶意软件的新Python变种针对银行和物流行业 银行和物流业正受到名为Chaes的恶意软件的重新设计变种的冲击。Chaes于2020年首次出现,它的目标是拉丁美洲(尤其是巴西)的电子商务客户,以窃取敏感的财务信息。该恶意软件的最新…

Xcode 真机调试之Unable to install “xxx“,Code: -402653103

背景 Xcode14.0,使用Cocoapods引入三方库后编译成功运行项目报无法安装 Details DetailsUnable to install "HHTestGenerate" Domain: com.apple.dt.MobileDeviceErrorDomain Code: -402653103 User Info: {DVTErrorCreationDateKey "2023-09-11 0…

Pytorch框架详解

文章目录 引言1. 安装与配置1.1 如何安装PyTorch1.2 验证安装 2. 基础概念2.1 张量(Tensors)2.1.1 张量的基本特性2.1.2 创建张量2.1.3 张量操作 2.2 自动微分(Autograd)2.2.1 基本使用2.2.2 计算梯度2.2.3 停止追踪历史2.2.4 自定…

uniapp h5 微信缓存,解决版本更新还是旧版本

文章目录 一、微信缓存是什么?二、如何解决1.打包入口文件解决2.给请求url加时间戳3.给打包的js文件添加时间戳并修改打包后的css文件夹 总结 一、微信缓存是什么? 微信缓存是指微信客户端为了提高用户的使用体验,会在用户使用微信过程中将一…

张量的连续性、contiguous函数

在pytorch中,tensor的实际数据以一维数组(storage)的形式存储于某个连续的内存中,以“行优先”进行存储。 tensor的连续性 tensor连续(contiguous)是指tensor的storage元素排列顺序与其按行优先时的元素排…

非科班菜鸡算法学习记录 | 代码随想录算法训练营完结!

这俩月终于结束了233333,之后就是反复复习和背八股了吧,然后整整项目春招再投投投,感觉大部分题都有思路了但是做过的题也会没思路,还是要复习 总结 数组: 双指针用的很多,一般一个指向遍历位置&#xff0…

解决微信开发者工具企业微信小程序模式下模拟器白屏问题

前一天晚上没有关电脑,第二天发现电脑自己重启了,然后微信开发者工具就出了问题,在企业微信小程序模式下,模拟器出现了白屏,只有上方title可以正常显示。点击模拟器右上角三个点都不出弹出菜单,并且在调试器…