File size: 6,229 Bytes
7c071a8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# Qwen1.5

## 目录
  - [1. 简介](#1-简介)
  - [2. 特性](#2-特性)
  - [3. 运行环境准备](#3-运行环境准备)
  - [4. 模型编译](#4-模型编译)
  - [5. 模型推理](#5-模型推理)

## 1. 简介
Qwen1.5 是Qwen的第二代版本,它是开源中英双语对话模型,关于它的特性,请前往源repo查看:https://huggingface.co/Qwen。本例程对Qwen进行移植,使之能在SOPHON BM1684X上进行推理测试。

该例程支持在V23.07.01(libsophon_0.4.9)及以上的SDK上运行,支持在插有1684X加速卡(SC7系列)的x86主机上运行,也可以在1684X SoC设备(如SE7、SM7、Airbox等)上运行。在SoC上运行需要额外进行环境配置,请参照[运行环境准备](#3-运行环境准备)完成环境部署。建议后续所有流程都在[提供的Docker](#32-docker-版本)中完成。

## 2. 特性
* 支持BM1684X(x86 PCIe、SoC)
* 支持FP16、INT8、INT4模型编译和推理
* 支持基于pybing推理的Python例程

## 3. 运行环境准备
在PCIe上无需修改内存,以下为soc模式相关:
对于1684X系列设备(如SE7/SM7),都可以通过这种方式完成环境准备,使得满足Qwen运行条件。首先,在1684x SoC环境上,参考如下命令修改设备内存。
```bash
cd /data/
mkdir memedit && cd memedit
wget -nd https://sophon-file.sophon.cn/sophon-prod-s3/drive/23/09/11/13/DeviceMemoryModificationKit.tgz
tar xvf DeviceMemoryModificationKit.tgz
cd DeviceMemoryModificationKit
tar xvf memory_edit_{vx.x}.tar.xz #vx.x是版本号
cd memory_edit
./memory_edit.sh -p #这个命令会打印当前的内存布局信息
./memory_edit.sh -c -npu 7615 -vpu 3072 -vpp 3072 #npu也可以访问vpu和vpp的内存
sudo cp /data/memedit/DeviceMemoryModificationKit/memory_edit/boot.itb /boot/boot.itb && sync
sudo reboot
```
> **注意:**
> 1. tpu总内存为npu/vpu/vpp三者之和,fp16模型应满足tpu内存 >= 12800 MB,int8应满足tpu内存 >= 7168MB,int4应满足tpu内存 >= 4608MB。
> 2. 更多教程请参考[SoC内存修改工具](https://doc.sophgo.com/sdk-docs/v23.07.01/docs_latest_release/docs/SophonSDK_doc/zh/html/appendix/2_mem_edit_tools.html)

### 3.1 mlir版本
  从sftp上获取TPU-MLIR压缩包
  ```bash
  pip3 install dfss --upgrade
  python3 -m dfss [email protected]:sophon-demo/Qwen/tpu-mlir_v1.6.113-g7dc59c81-20240105.tar.gz 
  tar -xf tpu-mlir_v1.6.113-g7dc59c81-20240105.tar.gz 
  ```

### 3.2 docker 版本
  TPU-MLIR使用的docker是sophgo/tpuc_dev:latest, docker镜像和tpu-mlir有绑定关系,少数情况下有可能更新了tpu-mlir,需要新的镜像。
  ```bash
  docker pull sophgo/tpuc_dev:latest
  # 这里将本级目录映射到docker内的/workspace目录,用户需要根据实际情况将demo的目录映射到docker里面
  # myname只是举个名字的例子, 请指定成自己想要的容器的名字
  docker run --name myname -v $PWD:/workspace -it sophgo/tpuc_dev:latest
  # 此时已经进入docker,并在/workspace目录下
  # 初始化软件环境
  cd /workspace/tpu-mlir_vx.y.z-<hash>-<date>
  source ./envsetup.sh
  ```
其中`tpu-mlir_vx.y.z-<hash>-<date>`的路径请使用[下载得到的mlir路径](#31-mlir版本),更多TPU-MLIR的教程请参考[算能官网](https://developer.sophgo.com/site/index/material/31/all.html)的《TPU-MLIR快速入门手册》和《TPU-MLIR开发参考手册》。

## 4. 模型编译
## 4.1 获取onnx
### 4.1.1 下载Qwen1.5官方代码

**注:** Qwen1.5-7B官方库50G左右,在下载之前,要确认自己有huggingface官网的access token或者SSH key。(Qwen1.5-1.8B / Qwen1.5-14B的操作相同,请保证满足对应内存需求),以下代码以Qwen1.5-7B为例

```bash
git lfs install
git clone https://huggingface.co/Qwen/Qwen1.5-7B-Chat
```
如果git clone完代码之后出现卡住,可以尝试`ctrl+c`中断,然后进入仓库运行`git lfs pull`### 4.1.2 修改官方代码:
本例程的`compile/files`对应模型的目录下提供了修改好之后的`config.json``modeling_qwen2.py`。(transformers请更新到4.38.2以上)可以直接替换掉原仓库的文件:

```bash
cp files/Qwen1.5-1.8B-Chat/config.json Qwen1.5-1.8B-Chat/
cp files/Qwen1.5-1.8B-Chat/modeling_qwen2.py /usr/local/lib/python3.10/dist-packages/transformers/models/qwen2/
```

### 4.1.3 导出onnx
- 导出所有onnx模型,如果过程中提示缺少某些组件,直接**pip install**组件即可
- (<strong>其中torch请勿使用2.1.1及以上版本,否则会出现SPDA相关报错,建议torch==2.0.1,transformers==4.38.2</strong>)

```bash
# 将/workspace/Qwen-7B-Chat换成docker环境中您的Qwen-7B-Chat仓库的路径
python3 compile/export_onnx.py --model_path /workspace/Qwen1.5-1.8B-Chat --seq_length your_sequence_length
```
此时有大量onnx模型被导出到本例程中`compile/tmp/onnx`的目录。

### 4.2 bmodel编译
首先需要在mlir工具下激活环境,如果之前没有下载mlir工具,[mlir下载地址可参考](./Qwen_Export_Guide.md/#212-下载并解压tpu-mlir)
```bash
cd tpu-mlir_v1.6.113-g7dc59c81-20240105
source envsetup.sh
```
目前TPU-MLIR支持1684x对Qwen1.5进行BF16(仅限Qwen-1.8B),INT8和INT4量化,使用如下命令生成bmodel。

```bash
./compile.sh --mode int4 --name qwen1.5-1.8b
```

其中,mode可以指定bf16/int8/int4,编译成功之后,模型将会存放在`compile`目录下。

### 4.3 准备tokenizer
tokenizer已经放在了`support`文件夹下

## 5. 模型推理
您可以使用我们已经编译好的模型进行自动化编译,也可以使用自己编译的模型进行推理
### 5.1 自动化测试
在Qwen1.5路径下执行(默认测试模型为Qwen1.5-1.8B)
```bash
./run_demo.sh
```
### 5.2 测试自己的模型
在python_demo中编译模型推理动态库
```bash
cd python_demo
mkdir build && cd build
cmake ..
make -j4
cp chat.cpython-310-x86_64-linux-gnu.so ..
cd ..
```

此时可以进行模型推理
```bash
source ../../../envsetup.sh # 模型推理前请确保在LLM-TPU的路径下激活环境变量`source envsetup.sh`.
python chat.py --devid '0' --model_path your_bmodel_path --tokenizer_path ../support/token_config/
```
其中`your_bmodel_path`请以实际路径为准