/ChatGLM3-TPU

run chatglm3-6b in BM1684X

Primary LanguageCOtherNOASSERTION

[DEPRECATED]

This project is deprecated. Use LLM-TPU instead. Thank you.

ChatGLM3-TPU

本项目实现BM1684X部署语言大模型ChatGLM3-6B。通过TPU-MLIR编译器将模型转换成bmodel,并采用c++代码将其部署到BM1684X的PCIE环境,或者SoC环境。

在知乎上写了关于ChatGLM的解读,方便大家理解源码:

ChatGLM2流程解析与TPU-MLIR部署

开发环境

  1. 下载docker,启动容器,如下:
docker pull sophgo/tpuc_dev:latest

# myname1234 is just an example, you can set your own name
docker run --privileged --name myname1234 -v $PWD:/workspace -it sophgo/tpuc_dev:latest

后文假定环境都在docker的/workspace目录。

  1. 下载ChatGLM3-6B,比较大,会花较长时间
git lfs install
git clone git@hf.co:THUDM/chatglm3-6b

并对该工程做三点修改:

  • config.json文件中seq_length配置为512;

  • modeling_chatglm.py文件中的如下代码:

if attention_mask is not None:
    attention_scores = attention_scores.masked_fill(attention_mask, float("-inf"))

修改为:

if attention_mask is not None:
    attention_scores = attention_scores + (attention_mask * -10000.0)

这样修改可以提升效率,使用masked_fill效率低下;另一方面masked_fill转ONNX存在些bug。

  • modeling_chatglm.py文件中的如下代码:
pytorch_major_version = int(torch.__version__.split('.')[0])
if pytorch_major_version >= 2:

修改为:

pytorch_major_version = int(torch.__version__.split('.')[0])
if False:

这是因为ONNX无法支持torch.nn.functional.scaled_dot_product_attention算子的转换。

  1. 下载TPU-MLIR代码并编译,(也可以直接下载编译好的release包解压)
git clone git@github.com:sophgo/tpu-mlir.git
cd tpu-mlir
source ./envsetup.sh
./build.sh
  1. 下载本项目ChatGLM3-TPU,如下:
git clone git@github.com:sophgo/ChatGLM3-TPU.git

编译模型

  1. 指定ChatGLM3-6B的python路径
export PYTHONPATH=/workspace/chatglm3-6b:$PYTHONPATH
  1. 导出所有onnx模型,如果过程中提示缺少某些组件,直接pip install 组件即可
cd ChatGLM3-TPU/compile
python3 export_onnx.py

此时有大量onnx模型被导出到tmp目录。

  1. 对onnx模型进行编译

目前TPU-MLIR支持对ChatGLM3进行F16、INT8和INT4量化,且支持多芯分布式推理,默认情况下会进行F16量化和单芯推理,最终生成chatglm3-6b.bmodel文件

./compile.sh

若想进行INT8或INT4量化,则执行以下命令,最终生成chatglm3-6b_int8.bmodelchatglm3-6b_int4.bmodel文件,如下命令:

./compile.sh --mode int8 # or int4

若想进行2芯推理,则执行以下命令,最终生成chatglm3-6b_f16_2dev.bmodel文件,4芯8芯同理:

./compile.sh --num_device 2

编译程序(C++版本)

执行如下编译,默认是PCIE版本:

cd ChatGLM3-TPU/demo
mkdir build
cd build
cmake ..
make

如果是SoC版本,有两种编译方法:

方法1:直接将demo目录拷贝到SoC环境,按以上步骤编译(推荐)

方法2:docker中交叉编译,如下操作

wget https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
mv gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu /opt/aarch64-linux-gnu-7.5.0
cd ChatGLM3-TPU/demo
mkdir build
cd build
cmake .. -DTARGET_ARCH=soc
make -j

编译生成chatglm可执行程序,将chatglm放到/ChatGLM3-TPU/demo目录下,同时按照下列方式指定芯片数量和bmodel路径。 运行chatglm,默认单芯运行chatglm3-6b.bmodel:

./chatglm --model chatglm3-6b.bmodel

如果是要运行INT8或INT4模型,则命令如下:

./chatglm --model chatglm3-6b_int8.bmodel # same with int4

如果是2芯分布式推理,使用如下命令(比如指定在2号和3号芯片上运行, 用source /etc/profiel后使用bm-smi查询芯片id号):

./chatglm --model chatglm3-6b_f16_2dev.bmodel --devid 2,3

编译程序(Python Web版本)

pip install gradio==3.39.0
cd ChatGLM3-TPU/web_demo
mkdir build
cd build
cmake ..
make -j

编译成功会生成libtpuchat.so*, 在web_demo.py中指定bmodel_path token_path device_id, lib_path(编译生产的.so文件), 以及dev_id。

python web_demo.py --dev 0 --bmodel_path your_bmodel_path

即可成功运行web的demo。

如果是SoC环境,参考C++版本

PS:尽量下载gradio==3.39.0版本,不然会出现各种问题!!

运行效果

以下为单芯片下INT8量化模式的运行效果:

常见问题

sentencepiece是怎么来的

工程中已经有编译好的,所以不需要编译,如果好奇的话,参考如下步骤。

下载sentencepiece,并编译得到libsentencepiece.a

git clone git@github.com:google/sentencepiece.git
cd sentencepiece
mkdir build
cd build
cmake ..
make -j

如果要编译SoC环境,则参考demo的编译方式,在makefile中指定交叉编译器

demo程序无法正常运行

如果demo程序拷贝到运行环境提示无法运行,比如接口找不到等等错误。 原因是运行环境的库有所不同,将demo中的lib_pcie(PCIE)或者 lib_soc(SoC)里面的so文件拷贝到运行环境,链接到里面的so即可。

工具调用

参考:工具调用