消费级显卡部署运行开源大模型

4/8/2023 ChatGLMBaichuanLlamaAlpaca大模型效果评价NVIDIA-GPU

# 1. 前言

# 1.1 大模型发展史

目前主流的大模型都是Transformer、MOE结构为基础进行构建,如果说Transformer结构使得模型突破到上亿参数量,MoE 稀疏混合专家结构使模型参数量产生进一步突破,达到数万亿规模。下图详细展示了AI大模型的发展历程:

大模型发展历程

可以说,Transformer 开创了继 MLP 、CNN和 RNN之后的第四大类模型。而基于Transformer结构的模型又可以分为Encoder-only、Decoder-only、Encoder-Decoder这三类。

  • 仅编码器架构(Encoder-only):自编码模型(破坏一个句子,然后让模型去预测或填补),更擅长理解类的任务,例如:文本分类、实体识别、关键信息抽取等。典型代表有:Bert、RoBERTa等。
  • 仅解码器架构(Decoder-only):自回归模型(将解码器自己当前步的输出加入下一步的输入,解码器融合所有已经输入的向量来输出下一个向量,所以越往后的输出考虑了更多输入),更擅长生成类的任务,例如:文本生成。典型代表有:GPT系列、LLaMA、OPT、Bloom等。
  • 编码器-解码器架构(Encoder-Decoder):序列到序列模型(编码器的输出作为解码器的输入),主要用于基于条件的生成任务,例如:翻译,概要等。典型代表有:T5、BART、GLM等。

# 1.2 LLM技术图谱

LLM 技术图谱(LLM Tech Map)从基础设施、大模型、Agent、AI 编程、工具和平台,以及算力几个方面,为开发者整理了当前 LLM 中最为热门和硬核的技术领域以及相关的软件产品和开源项目。

llm-tech-map

# 1.3 NVIDIA GPU

# 1.3.1 NVIDIA GPU 分类

目前,最主流的AI芯片无疑是NVIDIA的GPU,并且,英伟达针对不同的场景推出了不同的系列和型号。例如:L4用于AI视频,L40用于图像生成,H100系列则是大模型,GH200是图形推荐模型、矢量数据库和图神经网络。

目前NVIDIA的GPU产品主要有 GeForce、Data Center/Tesla 和 RTX/Quadro 三大系列。虽然从硬件角度来看,它们都采用同样的架构设计,也都支持用作通用计算,但因为它们分别面向的目标市场以及产品定位的不同,这三个系列的GPU在软硬件的设计和支持上都存在许多差异。其中,GeForce为消费级显卡,而Tesla和Quadro归类为专业级显卡。GeForce主要应用于游戏娱乐领域,而Quadro主要用于专业可视化设计和创作,Tesla更偏重于深度学习、人工智能和高性能计算。

  • Tesla:A100(A800)、H100(H800)、A30、A40、V100、P100...
  • GeForce:RTX 3090、RTX 4090 ...
  • RTX/Quadro:RTX 6000、RTX 8000 ...
NVIDIA-GPU分类

其中,A800/H800是针对中国特供版(低配版),相对于A100/H100,主要区别:

  • A100的Nvlink最大总网络带宽为600GB/s,而A800的Nvlink最大总网络带宽为400GB/s。
  • H100的Nvlink最大总网络带宽为900GB/s,而A800的Nvlink最大总网络带宽为400GB/s。

随着美国新一轮的芯片制裁,最新针对中国特供版H20、L20和L2芯片也将推出。

# 1.3.2 NVIDIA GPU 显存

NVIDIA GPU 显存有两种类型,GDDR 和 HBM,每种也有不同的型号。针对显存通常会关注两个指标:显存大小和显存带宽。HBM 显存通常可以提供更高的显存带宽,但是价格也更贵,通常在训练卡上会使用,比如:H100、A100 等,而 GDDR 显存通常性价比更高,在推理 GPU 或游戏 GPU 更常见,比如:T4、RTX 4090 等。

常见训练 GPU 的显存信息:

常见训练GPU的显存信息

常见推理 GPU 的显存信息:

常见推理GPU的显存信息

显存大小和带宽的影响:

  • 传统的 CV、NLP 模型往往比较小,而且基本都是 Compute bound ,所以普遍对显存大小、带宽关注比较少;而现在 LLM 模型很大,推理除了是Compute bound,也是 IO bound;因此,越来越多人开始关注 GPU 显存大小和显存带宽。
  • 最近 NVIDIA 正式推出 H200 GPU,相比 H100,其主要的变化就是 GPU 显存从 80GB 升级到 141GB,显存带宽从 3.5TB/s 增加到 4.8TB/s,也就是说算力和 NVLink 没有任何提升,这可能是为了进一步适配大模型推理的需求。

# 1.3.3 NVIDIA GPU之间的通信

NVIDA GPU-SXM主要是针对英伟达的高端GPU服务器,NVIDA GPU-SXM和NVIDA GPU-PCIe这两种卡都能实现服务器的通信,但是实现的方式是不一样的。SXM规格的一般用在英伟达的DGX服务器中,通过主板上集成的NVSwitch实现NVLink的连接,不需要通过主板上的PCIe进行通信,它能支持8块GPU卡的互联互通,实现了GPU之间的高带宽。

这里说的NVLink技术不仅能够实现CPU和GPU直连,能够提供高速带宽,还能够实现交互通信,大幅度提高交互效率,从而满足最大视觉计算工作负载的需求。

NVIDA GPU-PCIe就是把PCIe GPU卡插到PCIe插槽上,然后和CPU、同一个服务器上其他的GPU卡进行通信,也可以通过网卡与其他的服务器节点上的设备进行通信,这种就是PCIe的通信方式,但是这种传输速度不快。如果想要和SXM一样,有很快的传输速度,可以使用NVlink桥接器实现GPU和CPU之间的通信,但是和SXM不一样的地方就是它只能实现2块GPU卡之间的通信。也就是说,如果有 2 个 PCIe GPU,那么可以使用 NVLink 桥接器(Bridge)实现互联;如果超过 2 个 PCIe GPU,就无法实现 NVLink 的分组互联,此时只能考虑使用 SXM GPU。

NVIDIA-GPU之间的通信

一般来讲,单机内的多 GPU 之间通信分为:PCIe 桥接互联通信、NVLink 部分互联通信、NVSwitch 全互联通信三种。

# 1.4 大模型量化及压缩技术

近年来,随着Transformer、MOE架构的提出,使得深度学习模型轻松突破上万亿规模参数,从而导致模型变得越来越大,因此,我们需要一些大模型压缩技术来降低模型部署的成本,并提升模型的推理性能。大模型压缩主要分为如下几类:剪枝(Pruning)、知识蒸馏(Knowledge Distillation)、量化(Quantization)、低秩分解(Low-Rank Factorization)。

# 1.4.1 模型量化

模型量化是指以较低的推理精度损失将连续取值(通常为float32或者大量可能的离散值)的浮点型权重近似为有限多个离散值(通常为int8)的过程。通过以更少的位数表示浮点数据,模型量化可以减少模型尺寸,进而减少在推理时的内存消耗,并且在一些低精度运算较快的处理器上可以增加推理速度。下图中,[-T, T]是量化前的数据范围,[-127, 127]是量化后的数据范围。

模型量化

# 1.4.2 量化比特

计算机中不同数据类型的占用比特数及其表示的数据范围各不相同。可以根据实际业务需求将原模型量化成不同比特数的模型,一般深度神经网络的模型用单精度浮点数表示,如果能用有符号整数来近似原模型的参数,那么被量化的权重参数存储大小就可以降到原先的四分之一,用来量化的比特数越少,量化后的模型压缩率越高。

工业界目前最常用的量化位数是8比特,低于8比特的量化被称为低比特量化。1比特是模型压缩的极限,可以将模型压缩为1/32,在推理时也可以使用高效的XNOR和BitCount位运算来提升推理速度。

# 1.4.3 量化对象

模型量化的对象主要包括以下几个方面:

  • 权重(weight):weight的量化是最常规也是最常见的,量化weight可达到减少模型大小内存和占用空间。
  • 激活(activation):实际中activation往往是占内存使用的大头,因此量化activation不仅可以大大减少内存占用。更重要的是,结合weight的量化可以充分利用整数计算获得性能提升。
  • KV cache:量化 KV 缓存对于提高长序列生成的吞吐量至关重要。
  • 梯度(Gradients):相对小众一些,在训练深度学习模型时,梯度通常是浮点数,它主要作用是在分布式计算中减少通信开销,同时,也可以减少backward时的开销。

# 1.4.4 量化形式

根据量化数据表示的原始数据范围是否均匀,可以将量化方法分为线性量化和非线性量化。实际的深度神经网络的权重和激活值通常是不均匀的,因此理论上使用非线性量化导致的精度损失更小,但在实际推理中非线性量化的计算复杂度较高,通常使用线性量化。

# 1.4.5 量化分类

根据应用量化压缩模型的阶段,可以将模型量化分为:

  • 量化感知训练(Quantization Aware Training, QAT):在模型训练过程中加入伪量化算子,通过训练时统计输入输出的数据范围可以提升量化后模型的精度,适用于对模型精度要求较高的场景,其量化目标无缝地集成到模型的训练过程中。这种方法使LLM在训练过程中适应低精度表示,增强其处理由量化引起的精度损失的能力。这种适应旨在量化过程之后保持更高性能。
  • 量化感知微调(Quantization-Aware Fine-tuning,QAF):在微调过程中对LLM进行量化。主要目标是确保经过微调的LLM在量化为较低位宽后仍保持性能。通过将量化感知整合到微调中,以在模型压缩和保持性能之间取得平衡。
  • 训练后量化(Post Training Quantization, PTQ):在LLM训练完成后对其参数进行量化,只需要少量校准数据,适用于追求高易用性和缺乏训练资源的场景。主要目标是减少LLM的存储和计算复杂性,而无需对LLM架构进行修改或进行重新训练。PTQ的主要优势在于其简单性和高效性,但PTQ可能会在量化过程中引入一定程度的精度损失。

# 1.5 大模型推理过程可视化

一个大模型推理过程可视化的开源项目。左侧是模型结构总览图,包括模型的整体架构以及构成模型的组件。选择模型整体或某个组件时,右侧可通过鼠标进行交互,并且显示对应详细信息。

$ yarn
$ yarn dev
1
2

大模型推理过程可视化llm-viz

# 2. Mac运行ChatGLM大模型

实验环境:Macbook Pro 2021,M1 pro芯片,16G内存,macOS Ventura13.2.1系统,Python3.9环境

# 2.1 ChatGLM项目简介

# 2.1.1 ChatGLM-6B

ChatGLM-6B 是清华大学开源的一个支持中英双语的对话语言模型,基于 General Language Model (GLM) (opens new window) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。 ChatGLM-6B 使用了和 ChatGPT 相似的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答。

不过,由于 ChatGLM-6B 的规模较小,目前已知其具有相当多的局限性,如事实性/数学逻辑错误,可能生成有害/有偏见内容,较弱的上下文能力,自我认知混乱,以及对英文指示生成与中文指示完全矛盾的内容。

项目地址:https://github.com/THUDM/ChatGLM-6B (opens new window)

量化等级 最低 GPU 显存(推理) 最低 GPU 显存(高效参数微调)
FP16(无量化) 13 GB 14 GB
INT8 8 GB 9 GB
INT4 6 GB 7 GB

# 2.1.2 ChatGLM2-6B

ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本,在保留了初代模型对话流畅、部署门槛较低等众多优秀特性的基础之上,ChatGLM2-6B 引入了如下新特性:

  • 更强大的性能:相比于初代模型,ChatGLM2-6B 在 MMLU(+23%)、CEval(+33%)、GSM8K(+571%) 、BBH(+60%)等数据集上取得了大幅度的提升。
  • 更长的上下文:基于 FlashAttention 技术,我们将基座模型的上下文长度(Context Length)由 ChatGLM-6B 的 2K 扩展到了 32K。
  • 更高效的推理:基于 Multi-Query Attention 技术,推理速度相比初代提升了 42%,INT4 量化下,6G 显存支持的对话长度由 1K 提升到了 8K。

项目地址:https://github.com/THUDM/ChatGLM2-6B (opens new window)

ChatGLM2-6B 在其他平台要求如下:

量化等级 编码 2048 长度的最小显存 生成 8192 长度的最小显存
FP16 / BF16 13.1 GB 12.8 GB
INT8 8.2 GB 8.1 GB
INT4 5.5 GB 5.1 GB

但在 Mac 平台上,情况更复杂一些:

  • Mac 上只支持本地运行,也就是项目代码和模型分开下载,然后修改 web_demo.py 中模型地址运行。
  • 搭载了 Apple Silicon 或者 AMD GPU 的 Mac,需使用 MPS 后端在 GPU 上运行,修改 web_demo.py 中运行方式。
  • 加载需要 13G 内存,使用过程会不断上涨至 20G 以上,建议使用 32G 以上内存设备。
  • 内存不足设备,可使用量化后的 INT4 模型,但量化后只能使用 CPU 推理,为了充分使用 CPU 并行,还需要 单独安装 OpenMP (opens new window)

Mac部署ChatGLM2-6B

总结: 因为这些限制的存在,对小内存设备及 GPU 较差的设备极不友好,所以这里只推荐 32G 内存以上的 m1 pro/max/ultra 与 m2 pro/max/ultra 设备来进行测试,24G 内存的 m2 也可以尝试。不满足上述条件的Macbook,运行原始模型和量化后的模型速度都太慢,这种情况可以使用chatglm.cpp,运行它就很快了。

# 2.1.3 ChatGLM3-6B

ChatGLM3-6B 是 ChatGLM 系列最新一代的开源模型,在保留了前两代模型对话流畅、部署门槛低等众多优秀特性的基础上,ChatGLM3-6B 引入了如下特性:

  • 更强大的基础模型: ChatGLM3-6B 的基础模型 ChatGLM3-6B-Base 采用了更多样的训练数据、更充分的训练步数和更合理的训练策略。在语义、数学、推理、代码、知识等不同角度的数据集上测评显示,ChatGLM3-6B-Base 具有在 10B 以下的基础模型中最强的性能。
  • 更完整的功能支持: ChatGLM3-6B 采用了全新设计的 Prompt格式 (opens new window),除正常的多轮对话外。同时原生支持工具调用 (opens new window)(Function Call)、代码执行(Code Interpreter)和 Agent 任务等复杂场景。
  • 更全面的开源序列: 除了对话模型 ChatGLM3-6B (opens new window) 外,还开源了基础模型 ChatGLM3-6B-Base (opens new window)、长文本对话模型 ChatGLM3-6B-32K (opens new window)。以上所有权重对学术研究完全开放,在填写问卷进行登记后亦允许免费商业使用。

项目地址:https://github.com/THUDM/ChatGLM3 (opens new window)

模型地址:https://huggingface.co/THUDM/chatglm3-6b/tree/main (opens new window)

ChatGLM3-6B

在 MacOS 上部署详见 低成本部署 (opens new window) 官方文档

对于搭载了 Apple Silicon 或者 AMD GPU 的 Mac,可以使用 MPS 后端来在 GPU 上运行 ChatGLM3-6B。需要参考 Apple 的 官方说明 (opens new window) 安装 PyTorch-Nightly。

$ conda install pytorch torchvision torchaudio -c pytorch-nightly        // 使用conda安装
$ pip3 install --pre torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/nightly/cpu  // 使用pip安装
1
2

目前在 MacOS 上只支持从本地加载模型,将代码中的模型加载改为从本地加载,并使用 mps 后端:

model = AutoModel.from_pretrained("your local path", trust_remote_code=True).to('mps')
1

加载半精度的 ChatGLM3-6B 模型需要大概 13GB 内存。内存较小的机器(比如 16GB 内存的 MacBook Pro),在空余内存不足的情况下会使用硬盘上的虚拟内存,导致推理速度严重变慢。

# 2.2 ChatGLM2-6B运行及使用

# 2.2.1 运行非量化的原始模型

Step1:拉取项目代码及模型

$ git clone https://github.com/THUDM/ChatGLM2-6B
$ cd ChatGLM2-6B
1
2

ChatGLM2-6B模型下载地址:

这里将下载好的模型及代码放置到./models/chatglm2-6b文件夹。

ChatGLM2-6B模型

Step2:拉取项目依赖并修改代码

$ pip3 install -r requirements.txt
1

修改web_demo.py文件

tokenizer = AutoTokenizer.from_pretrained("models/chatglm2-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("models/chatglm2-6b", trust_remote_code=True).to('mps')
1
2

注:目前在 MacOS 上只支持从本地加载模型,将代码中的模型加载改为从本地加载,并使用 mps 后端:

model = AutoModel.from_pretrained("your local path", trust_remote_code=True).to('mps')
1

Step3:启动Web程序并使用

启动 web_demo.py 文件,待其加载完毕后会自动弹出 http://127.0.0.1:7860的界面,在下方输入框输入问题,点击“Submit“按钮即可。

ChatGLM2-6B内存不足时速度很慢

注:由于我使用的是 16GB 内存的 MacBook Pro,在空余内存不足的情况下会使用硬盘上的虚拟内存,导致推理速度严重变慢,这里就提前终止了。

# 2.2.2 运行量化后的模型

整体流程与之前类似,不再赘述。换成官方的int4量化模型(量化后的模型仅有3.9GB,比原始模型小了很多),改一下代码的模型加载方式即可。

ChatGLM2-6B-int4 模型下载地址:

修改web_demo.py文件:

tokenizer = AutoTokenizer.from_pretrained("models/chatglm2-6b-int4", trust_remote_code=True)
model = AutoModel.from_pretrained("models/chatglm2-6b-int4",trust_remote_code=True).float()
1
2

可以看到,使用CPU加载量化模型的推理速度要比之前内存不足时使用GPU加载原始模型要快不少,但这个速度依然无法实际投入使用。

ChatGLM2-6B使用CPU加载量化模型

这个速度勉强可以拿来测试API了,同样的当时修改api.py文件。默认部署在本地的 8000 端口,通过 POST 方法进行调用:

curl -X POST "http://127.0.0.1:8000" \
     -H 'Content-Type: application/json' \
     -d '{"prompt": "你好", "history": []}'
1
2
3

得到的返回值如下:

ChatGLM2-6B的API

# 2.3 chatglm.cpp运行GGML量化模型

# 2.3.1 chatglm.cpp项目简介

项目简介:ChatGLM-6B、ChatGLM2-6B、ChatGLM3-6B 及更多大模型的 C++ 实现。

项目地址:https://github.com/li-plus/chatglm.cpp (opens new window)

# 2.3.2 安装chatglm.cpp及相关依赖

需要编译 chatglm.cpp 并安装相关依赖。

$ git clone https://github.com/li-plus/chatglm.cpp.git
$ git submodule update --init --recursive
$ pip3 install torch tabulate tqdm transformers accelerate sentencepiece
$ pip3 install .
1
2
3
4

注意事项:

[1] 不要漏掉 git submodule update --init --recursive,不然在 pip3 install .时会遇到如下报错:

编译chatglm.cpp存在的坑

[2] 如果启动 ./examples/web_demo.py 时报错httpx._exceptions.InvalidURL: No scheme included in URL,安装以下依赖即可解决问题。

$ pip3 install httpx==0.25.0
1

# 2.3.3 将模型转换为量化GGML格式

以 ChatGLM2-6B 为例(ChatGLM3-6B 与之相同),使用 convert.py将 ChatGLM2-6B 转换为量化 GGML 格式。

$ python3 ./chatglm_cpp/convert.py -i /your_path/chatglm2-6b -t q4_0 -o chatglm2-ggml.bin
1

输出以下内容,即为量化成功,得到 chatglm2-ggml.bin 模型文件。

将ChatGLM2-6B模型转换为量化GGML格式

# 2.3.4 ChatGLM大模型的运行及使用

以 ChatGLM2-6B 为例(ChatGLM3-6B 与之相同),启动 web_demo.py 项目,访问 http://127.0.0.1:7860/ 地址即可访问,现在生成速度很快了。

$ python3 ./examples/web_demo.py -m ./chatglm2-ggml.bin
1

使用chatglm.cpp运行ChatGLM2-6B

除此之外,还可以使用如下命令以交互终端的形式启动:

$ python3 ./examples/cli_chat.py -m ./chatglm2-ggml.bin -i
1

使用chatglm.cpp以交互终端形式运行ChatGLM2-6B

# 3. 租用GPU服务器运行Baichuan大模型

实验环境:租用的揽睿星舟的GPU服务器,NVIDIA RTX 3090 / 24GB,Python 3.10.6, CUDA 11.7

关于GPU服务器租用、Jupyter及HuggingFace的使用,这里就不赘述了,详见我的另一篇博客:常用深度学习平台的使用指南 (opens new window)

# 3.1 Baichuan-13B项目简介

Baichuan-13B 是由百川智能继 Baichuan-7B (opens new window) 之后开发的包含 130 亿参数的开源可商用的大规模语言模型,在权威的中文和英文 benchmark 上均取得同尺寸最好的效果。本次发布包含有预训练 (Baichuan-13B-Base (opens new window)) 和对齐 (Baichuan-13B-Chat (opens new window)) 两个版本。Baichuan-13B 有如下几个特点:

  • 更大尺寸、更多数据:Baichuan-13B 在 Baichuan-7B的基础上进一步扩大参数量到 130 亿,并且在高质量的语料上训练了 1.4 万亿 tokens,超过 LLaMA-13B 40%,是当前开源 13B 尺寸下训练数据量最多的模型。支持中英双语,使用 ALiBi 位置编码,上下文窗口长度为 4096。
  • 同时开源预训练和对齐模型:预训练模型是适用开发者的『 基座 』,而广大普通用户对有对话功能的对齐模型具有更强的需求。因此本次开源我们同时发布了对齐模型(Baichuan-13B-Chat),具有很强的对话能力,开箱即用,几行代码即可简单的部署。
  • 更高效的推理:为了支持更广大用户的使用,我们本次同时开源了 int8 和 int4 的量化版本,相对非量化版本在几乎没有效果损失的情况下大大降低了部署的机器资源门槛,可以部署在如 Nvidia 3090 这样的消费级显卡上。
  • 开源免费可商用:Baichuan-13B 不仅对学术研究完全开放,开发者也仅需邮件申请并获得官方商用许可后,即可以免费商用。

GPU资源占用情况:

Precision GPU Mem (GB)
bf16 / fp16 26.0
int8 15.8
int4 9.7

# 3.2 运行Baichuan-13B项目

拉取项目代码并安装项目依赖。

$ git clone https://github.com/baichuan-inc/Baichuan-13B.git
$ cd Baichuan-13B 
$ pip3 config set global.index-url http://mirrors.aliyun.com/pypi/simple/
$ pip3 config set install.trusted-host mirrors.aliyun.com
$ pip3 install -r requirements.txt
1
2
3
4
5

推理所需的模型权重、源码、配置已发布在HuggingFace:Baichuan-13B-Base (opens new window)Baichuan-13B-Chat (opens new window)

Baichuan-13B-Chat模型资源

程序首次执行时会自动从 HuggingFace 下载所需的模型资源,总共约26.5GB。

$ python3 cli_demo.py
1

原始精度和int8量化精度,在我这个服务器上都跑不起来,所以这里修改代码使用了int4量化精度。

def init_model():
    print("init model ...")
    # 加载原始精度模型到CPU
    model = AutoModelForCausalLM.from_pretrained(
        "baichuan-inc/Baichuan-13B-Chat",
        torch_dtype=torch.float16,
        trust_remote_code=True
    )
    # 量化模型为int4精度
    model = model.quantize(4).cuda()  # 或者使用 model.quantize(8).cuda() 进行int8量化

    model.generation_config = GenerationConfig.from_pretrained(
        "baichuan-inc/Baichuan-13B-Chat"
    )
    
    tokenizer = AutoTokenizer.from_pretrained(
        "baichuan-inc/Baichuan-13B-Chat",
        use_fast=False,
        trust_remote_code=True
    )
    return model, tokenizer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

运行效果:

运行Baichuan-13B项目

# 4. 租用GPU服务器运行Llama大模型

实验环境:租用的揽睿星舟的GPU服务器,NVIDIA RTX 3090 / 24GB,Python 3.10.6, CUDA 11.7

关于GPU服务器租用、Jupyter及HuggingFace的使用,这里就不赘述了,详见我的另一篇博客:常用深度学习平台的使用指南 (opens new window)

# 4.1 Chinese-Llama-2-7b项目简介

完全可商用的 中文版Llama2模型 (opens new window)中英文SFT数据集 (opens new window),输入格式严格遵循 llama-2-chat 格式,兼容适配所有针对原版 llama-2-chat 模型的优化。

Chinese-Llama-2-7b在线体验

# 4.2 运行Chinese-Llama-2-7b项目

拉取项目代码并安装项目依赖。

$ git clone https://github.com/LinkSoul-AI/Chinese-Llama-2-7b
$ cd Chinese-Llama-2-7b
$ pip3 config set global.index-url http://mirrors.aliyun.com/pypi/simple/
$ pip3 config set install.trusted-host mirrors.aliyun.com
$ pip3 install accelerate bitsandbytes gradio protobuf scipy sentencepiece transformers  // 这里参照官方Dockerfile写,但不要带版本号
1
2
3
4
5

注:使用官方Dockerfile上面指定版本号的依赖,会导致CUDA版本与之不匹配,导致不可用的情况。

CUDA Setup failed despite GPU being available. Please run the following command to get more information:
    python -m bitsandbytes
    Inspect the output of the command and see if you can locate CUDA libraries. You might need to add them
    to your LD_LIBRARY_PATH. If you suspect a bug, please take the information from python -m bitsandbytes
    and open an issue at: https://github.com/TimDettmers/bitsandbytes/issues
1
2
3
4
5

可以新建个test.py测试一下功能,程序首次执行时会自动从 HuggingFace (opens new window) 下载所需的模型资源,共计约26.95GB。

from transformers import AutoTokenizer, AutoModelForCausalLM, TextStreamer

model_path = "LinkSoul/Chinese-Llama-2-7b"

tokenizer = AutoTokenizer.from_pretrained(model_path, use_fast=False)
model = AutoModelForCausalLM.from_pretrained(model_path).half().cuda()
streamer = TextStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True)

instruction = """[INST] <<SYS>>\nYou are a helpful, respectful and honest assistant. Always answer as helpfully as possible, while being safe.  Your answers should not include any harmful, unethical, racist, sexist, toxic, dangerous, or illegal content. Please ensure that your responses are socially unbiased and positive in nature.

            If a question does not make any sense, or is not factually coherent, explain why instead of answering something not correct. If you don't know the answer to a question, please don't share false information.\n<</SYS>>\n\n{} [/INST]"""

prompt = instruction.format("用中文回答,When is the best time to visit Beijing, and do you have any suggestions for me?")
generate_ids = model.generate(tokenizer(prompt, return_tensors='pt').input_ids.cuda(), max_new_tokens=4096, streamer=streamer)
1
2
3
4
5
6
7
8
9
10
11
12
13
14

Chinese-Llama-2-7b测试功能

除此之外,还可将其部署成API服务。

$ nohup python3 api.py > api.log 2>&1 &
$ curl -X POST "http://127.0.0.1:8000" \
     -H 'Content-Type: application/json' \
     -d '{"prompt": "解释一下量子计算", "history": []}'
1
2
3
4

Chinese-Llama-2-7b运行效果

# 5. Mac运行Alpaca大模型

实验环境:Macbook Pro 2021,M1 pro芯片,16G内存,macOS Ventura13.2.1系统,Python3.9环境

# 5.1 alpaca.cpp项目简介

项目简介:笔记本本地运行体验类ChatGPT的Alpaca-7B/13B大模型。

  • 该模型基于斯坦福Alpaca-7B、13B大模型进行量化后进行封装,实现常见笔记本配置下体验大模型的效果。
  • 加载模型仅需4G左右内存(7B版本),且语句生成速度很快。

项目地址:https://github.com/antimatter15/alpaca.cpp (opens new window)(原作者的)、https://github.com/ymcui/alpaca.cpp (opens new window)(Fork版,给出了量化后的权重模型)

# 5.2 Alpaca-LoRA发展过程

LLaMA 是一系列模型的总称,参数量从 70 亿到 650 亿不等,其中,130 亿参数的 LLaMA 模型「在大多数基准上」可以胜过参数量达 1750 亿的 GPT-3。不过,该模型并没有经过指令微调(instruct tuning),因此生成效果较差。为了提高模型性能,来自斯坦福的研究者帮助其完成了指令微调的工作,训练了一个名为 Alpaca 的 70 亿参数新模型(基于 LLaMA 7B)。

对于普通研究者来说,这是一种切实可行的廉价微调方式,不过需要的运算量仍然较大(作者表示他们在 8 个 80GB A100 上微调了 3 个小时)。而且,Alpaca 的种子任务都是英语,收集的数据也都是英文,因此训练出来的模型未对中文优化。

为了进一步降低微调成本,另一位来自斯坦福的研究者 ——Eric J. Wang 使用 LoRA(low-rank adaptation)技术复现了 Alpaca 的结果。具体来说,Eric J. Wang 使用一块 RTX 4090 显卡,只用 5 个小时就训练了一个和 Alpaca 水平相当的模型,将这类模型对算力的需求降到了消费级。而且该模型可以在树莓派上运行。

Alpaca-LoRA (opens new window) 项目中,作者提到,为了廉价高效地进行微调,他们使用了 Hugging Face 的 PEFT。PEFT 是一个库(LoRA 是其支持的技术之一),可以让你使用各种基于 Transformer 的语言模型并使用 LoRA 对其进行微调。好处在于,它允许你在一般的硬件上廉价而有效地微调模型,并有较小的(也许是可组合的)输出。尽管 Alpaca 性能可以媲美 GPT 3.5,但其种子任务都是英语,收集的数据也都是英文,因此训练出来的模型对中文并不友好。

# 5.3 alpaca.cpp运行及使用

Step1:拉取项目代码

$ git clone https://github.com/antimatter15/alpaca.cpp
$ cd alpaca.cpp
1
2

注意:一定要使用最新的代码去编译,同时后续有新模型放出之后也建议检查一下代码是否是最新的,要重新编译./chat二进制文件。

Step2:下载权重

下载权重文件(.zip压缩包),解压之后把相应模型放到clone下来的根目录里,我这里下载的是 ggml-alpaca-7b-q4.bin 模型。

文件名 文件大小 参数量 占用内存 网盘地址
ggml-alpaca-7b-q4.bin 4.2G 7B 4G+ Alpaca-7B (opens new window)
ggml-alpaca-13b-q4.bin 8.1G 13B 8G+ Alpaca-13B (opens new window)

Step3:编译并启动

首先使用以下命令进行编译

$ make chat
1

默认以下面的命令启动7B版本。

$ ./chat
1

注:如需加载13B版本,用 -m 命令指定模型文件。

$ ./chat -m ggml-alpaca-13b-q4.bin
1

Step4:效果体验

在提示符 > 之后输入你的prompt,command+c中断输出。

alpaca.cpp效果

# 6. 大模型效果评估

# 6.1 大模型性能及水平评价

# 6.1.1 影响大模型性能的主要因素

OpenAI的论文Scaling Laws for Neural Language Models中列举了影响模型性能最大的三个因素:计算量、数据集大小、模型参数量。也就是说,当其他因素不成为瓶颈时,计算量、数据集大小、模型参数量这3个因素中的单个因素指数增加时,loss会线性的下降。

除了以上的因素之外,还有一个比较大的影响因素就是数据质量。在微软的论文Instruction Tuning with GPT-4中指出,同样基于LLaMA模型,使用GPT3和GPT4产生的数据,对模型进行Instruction Turing,可以看到GPT4的数据微调过的模型效果远远好于GPT3数据微调的模型,可见数据质量带来的影响。同样的,Vicuna(7B/13B)的Instruction Turing中,也对shareGPT的数据做了很细致的清洗工作。

# 6.1.2 衡量大模型的水平

要评估一个大型语言模型的水平,可以从以下几个维度提出具有代表性的问题。

  • 理解能力:提出一些需要深入理解文本的问题,看模型是否能准确回答。
  • 语言生成能力:让模型生成一段有关特定主题的文章或故事,评估其生成的文本在结构、逻辑和语法等方面的质量。
  • 知识面广度:请模型回答关于不同主题的问题,以测试其对不同领域的知识掌握程度。这可以是关于科学、历史、文学、体育或其他领域的问题。一个优秀的大语言模型应该可以回答各种领域的问题,并且准确性和深度都很高。
  • 适应性:让模型处理各种不同类型的任务,例如:写作、翻译、编程等,看它是否能灵活应对。
  • 长文本理解:提出一些需要处理长文本的问题,例如:提供一篇文章,让模型总结出文章的要点,或者请模型创作一个故事或一篇文章,让其有一个完整的情节,并且不要出现明显的逻辑矛盾或故事结构上的错误。一个好的大语言模型应该能够以一个连贯的方式讲述一个故事,让读者沉浸其中。
  • 长文本生成:请模型创作一个故事或一篇文章,让其有一个完整的情节,并且不要出现明显的逻辑矛盾或故事结构上的错误。一个好的大语言模型应该能够以一个连贯的方式讲述一个故事,让读者沉浸其中。
  • 多样性:提出一个问题,让模型给出多个不同的答案或解决方案,测试模型的创造力和多样性。
  • 情感分析和推断:提供一段对话或文本,让模型分析其中的情感和态度,或者推断角色间的关系。
  • 情感表达:请模型生成带有情感色彩的文本,如描述某个场景或事件的情感、描述一个人物的情感状态等。一个优秀的大语言模型应该能够准确地捕捉情感,将其表达出来。
  • 逻辑推理能力:请模型回答需要进行推理或逻辑分析的问题,如概率或逻辑推理等。这可以帮助判断模型对推理和逻辑思考的能力,以及其在处理逻辑问题方面的准确性。例如:“所有的动物都会呼吸。狗是一种动物。那么狗会呼吸吗?”
  • 问题解决能力:提出实际问题,例如:数学题、编程问题等,看模型是否能给出正确的解答。
  • 道德和伦理:测试模型在处理有关道德和伦理问题时的表现,例如:“在什么情况下撒谎是可以接受的?”
  • 对话和聊天:请模型进行对话,以测试其对自然语言处理的掌握程度和能力。一个优秀的大语言模型应该能够准确地回答问题,并且能够理解人类的语言表达方式。

# 6.2 大模型评估方法及工具概述

# 6.2.1 大模型评估方法

  • 人工评估:LIMA、Phoenix
  • 使用 GPT-4 的反馈进行自动评估:Vicuna、Phoenix、Chimera、BELLE
  • 指标评估(BLEU-4、ROUGE分数):ChatGLM-6B;对于像ROUGE-L分数的指标评估,有些地方称其为非自然指令评估(Unnatural Instruction Evaluation)。

# 6.2.2 大模型评估工具

# 6.3 SuperCLUE评估工具概述

# 6.3.1 SuperCLUE是什么

中文通用大模型基准(SuperCLUE),是针对中文可用的通用大模型的一个测评基准。

它主要回答的问题是:在当前通用大模型大力发展的背景下,中文大模型的效果情况,包括但不限于"这些模型不同任务的效果情况"、"相较于国际上的代表性模型做到了什么程度"、 "这些模型与人类的效果对比如何"。

它尝试在一系列国内外代表性的模型上使用多个维度能力进行测试。SuperCLUE是中文语言理解测评基准(CLUE)在通用人工智能时代的进一步发展。

SuperCLUE大模型榜单

# 6.3.2 SuperCLUE的构成与特点

着眼于综合评价大模型的能力,使其能全面地测试大模型的效果,又能考察模型在中文特有任务上的理解和积累。对能力进行了划分, SuperCLUE从三个不同的维度评价模型的能力:基础能力、专业能力和中文特性能力。

  • 基础能力:包括了常见的有代表性的模型能力,如语义理解、对话、逻辑推理、角色模拟、代码、生成与创作等10项能力。
  • 专业能力:包括了中学、大学与专业考试,涵盖了从数学、物理、地理到社会科学等50多项能力。
  • 中文特性能力:针对有中文特点的任务,包括了中文成语、诗歌、文学、字形等10项多种能力。

SuperCLUE的特点:

  • 多个维度能力考察(3大类,70+子能力):从三个不同角度对中文大模型进行测试,以考察模型的综合能力;并且每一个子能力又含有十项或以上不同的细分能力。
  • 自动化测评(一键测评):通过自动化测评方式以相对客观形式测试不同模型的效果,可以一键对大模型进行测评。
  • 广泛的代表性模型(17个模型):选取了多个国内外有代表性的可用的模型进行测评,以反映国内大模型的发展现状并了解与国际领先模型的差距或相对优劣势。
  • 人类基准:在通用人工智能发展的背景下,SuperCLUE也提供了模型相对于人类效果的指标对比。

SuperCLUE的不足与局限:

  • 基础能力、中文特性能力:虽然每一部分都包含了10类子能力,但这两个能力的总数据量比较少,可能存在需要扩充数据集的问题。
  • 选取模型的不完全:测试了9个模型,但还存在着更多的可用中文大模型,需要后续进一步添加并测试。有的模型由于没有广泛对外提供服务,没能获取到可用的测试版本。
  • 选取的能力范围:尽可能的全面、综合衡量模型的多维度能力,但是可能有一些模型能力没有在我们的考察范围内。后续也存在扩大考察范围的可能。
  • 客观考察的不足:以相对客观形式考察模型能力,但一些主观、开放性问题的模型能力的考察可能存在不足。
  • 模型参数:当前大模型发展较快,参数量又有比较大的差异,本次的测评并没有在同一级别的参数量上进行。

# 7. 参考资料

[1] 不用A100,开源Alpaca-LoRA+RTX 4090就能搞定 from 机器学习算法与自然语言处理 (opens new window)

[2] 大模型ChatGLM-6B安装Mac M1本地部署 from Bilibili (opens new window)

[3] RuntimeError: Unknown platform: darwin from Github issues (opens new window)

[4] 最新版的MacBook Pro Apple M2 跑不了 from Github issues (opens new window)

[5] Alpaca-cpp(羊驼-cpp): 可以本地运行的 Alpaca 大语言模型 from 51CTO (opens new window)

[6] huggingface基本使用教程 from 兼一书虫 (opens new window)

[7] LLMs学习从零开始-大模型加速 from 知乎 (opens new window)

[8] 中国大模型列表 from Github (opens new window)

[9] 调查论文“大型语言模型调查” from Github (opens new window)

[10] SuperCLUE: 中文通用大模型综合性基准 from Github (opens new window)

[11] SuperCLUE琅琊榜:中文通用大模型匿名对战评价基准 from Github (opens new window)

[12] 中文通用大模型开放域多轮测评基准 from Github (opens new window)

[13] LLM 技术图谱 from Gitee (opens new window)

[14] 开源大语言模型完整列表 from Gitee (opens new window)

[15] ChatGLM3-6B部署和微调 (Function Call、 Code Interpreter、 Agent) from Bilibili (opens new window)

[16] 小白也能看懂的国内外 AI 芯片概述 from 吃果冻不吐果冻皮 (opens new window)

[17] 大模型量化感知训练开山之作:LLM-QAT from 吃果冻不吐果冻皮 (opens new window)

[18] 大模型量化概述 from 吃果冻不吐果冻皮 (opens new window)

[19] NLP(十一):大语言模型的模型量化(INT8/INT4)技术 from 知乎 (opens new window)

[20] 模型量化(int8)系统知识导读 from CSDN (opens new window)

[21] ChatGLM的int8量化以及由此对量化的梳理总结 from CSDN (opens new window)

[22] 大规模语言模型:从理论到实践 from 复旦大学团队 (opens new window)

[23] 自然语言处理导论 from 复旦大学团队 (opens new window)

[24] 终于有人将大模型可视化了 from 人工智能大讲堂 (opens new window)

Last Updated: 2/4/2024, 2:46:27 PM