add README
Browse files
README.md
ADDED
|
@@ -0,0 +1,186 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
license: apache-2.0
|
| 3 |
+
---
|
| 4 |
+
# witty-tune-model
|
| 5 |
+
|
| 6 |
+
## 介绍
|
| 7 |
+
基于openEuler-Intelligence构建了一个支持纯CPU部署推理的领域模型OS_model。我们针对智能调优这个相对复杂且专业的场景,进行领域模型构建,后续我们会在操作系统问答以及操作系统运维等模块进行微调泛化。
|
| 8 |
+
witty-tune-model当前是基于Qwen3-4b模型微调,本身并不强依赖基础模型,因此后续可以使用不同的基线大模型微调。
|
| 9 |
+
OS_model使用了云大数存场景历史性能调优语料进行微调,在大数据spark、数据库pgsql/mysql、分布式存储ceph、虚拟化nginx应用上分别测试了领域模型、deepseek_v31(671b)与Qwen3-4b原始模型,在EulerCopilot调优智能体上的效果。
|
| 10 |
+
1、领域模型调优相比开箱性能在大数据spark上提升**15%+**,数据库pgsql/mysql上提升**50%+**,虚拟化nginx上提升**150%+**、分布式存储ceph上提升**50%+**;
|
| 11 |
+
2、领域模型相对于满血版deepseek效果持平,在**部分应用上略优于deepseek满血版,全面领先Qwen3-4b**;
|
| 12 |
+
3、领域模型量化到INT4规模,纯CPU部署情况下,**相比FP16规模吞吐率提升2倍,达到小时级调优**,且性能基本无损。
|
| 13 |
+
| 应用 | deepseek_v31(671b)典型用例平均提升(%) | Qwen3-4b典型用例平均提升(%) | OS领域模型典型用例平均提升(%) | OS领域模型量化典型用例平均提升(%) |
|
| 14 |
+
| :---: | :---: | :---: | :---: | :---: |
|
| 15 |
+
| spark | 7.52 | 3.39 | 11.09 | **17.37** |
|
| 16 |
+
| nginx | **190.96** | 76.42 | 158.67 | 166.51 |
|
| 17 |
+
| ceph | 50.43 | 33.69 | 48.38 | **50.57** |
|
| 18 |
+
| pgsql | 101.66 | 104.56 | **119.83** | 116.24 |
|
| 19 |
+
| mysql | 49.17 | 40.01 | 50.47 | **51.49** |
|
| 20 |
+
|
| 21 |
+
## 推理部署
|
| 22 |
+
针对本地部署资源受限的痛点,我们使用CPU部署量化后的领域模型(同时也支持NPU/GPU部署);推荐选择llama.cpp作为CPU的推理框架,其优势在于安装方便,无需构建python库依赖,纯CPU部署性能良好,可充分利用CPU多核性能。
|
| 23 |
+
我们针对鲲鹏920/鲲鹏920B对llama.cpp进行了针对性优化,使用了异构融合os的绑核、指令集并行优化等技术,推理性能在920上提升40%(16.5tokens/s->23.15tokens/s),920B上提升74%(62.6tokens/s->108.98tokens/s)。
|
| 24 |
+
***测试条件:鲲鹏920使用32核部署领域模型(参数量4B+IQ4_NL量化),鲲鹏920B使用64核部署,prefill长度6144,decode长度2048***
|
| 25 |
+
| 部署平台 | prefill吞吐(tokens/s) | decode吞吐(tokens/s) | 推理过程吞吐(tokens/s) | 相对基线性能提升(%) |
|
| 26 |
+
| :---: | :---: | :---: | :---: | :---: |
|
| 27 |
+
| 鲲鹏920 | 115.73 | 4.62 | **16.50** | / |
|
| 28 |
+
| 鲲鹏920优化后 | 81.68 | 7.35 | **$\color{red} {23.15} $** | **$\color{red} {40.28} $** |
|
| 29 |
+
| 鲲鹏920B | 74.28 | 42.54 | **62.60** | / |
|
| 30 |
+
| 鲲鹏920B优化后 | 325.23 | 36.39 | **$\color{red} {108.98} $** | **$\color{red} {74.08} $** |
|
| 31 |
+
|
| 32 |
+
|
| 33 |
+
### 获取模型
|
| 34 |
+
推荐使用我们构建好的领域模型。
|
| 35 |
+
***当前我们的领域模型仅在只针对调优智能体进行了微调,我们会尽快将模型泛化到OS其他应用上***
|
| 36 |
+
|
| 37 |
+
```bash
|
| 38 |
+
# 克隆之前请先确认已经安装 git-xet
|
| 39 |
+
curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/huggingface/xet-core/refs/heads/main/git_xet/install.sh | sh
|
| 40 |
+
git xet install
|
| 41 |
+
git clone https://huggingface.co/openEuler/witty-tune-model
|
| 42 |
+
```
|
| 43 |
+
|
| 44 |
+
### 安装llama.cpp
|
| 45 |
+
#### 根据硬件形态从源码构建-备选
|
| 46 |
+
```bash
|
| 47 |
+
# 获取源码,Qwen3需要llama.cpp版本大于等于b5092
|
| 48 |
+
git clone https://github.com/ggml-org/llama.cpp
|
| 49 |
+
cd llama.cpp
|
| 50 |
+
cmake -B build # 构建CPU推理版本
|
| 51 |
+
cmake -B build -DGGML_CUDA=ON # 构建CUDA推理版本
|
| 52 |
+
cmake -B build -DGGML_CANN=on -DCMAKE_BUILD_TYPE=release # 构建CANN推理版本
|
| 53 |
+
cmake --build build --config Release -j $(nproc)
|
| 54 |
+
# 测试
|
| 55 |
+
./build/bin/llama-cli -m PATH_TO_MODEL -p "Building a website can be done in 10 steps:" -ngl 99
|
| 56 |
+
```
|
| 57 |
+
|
| 58 |
+
### 部署推理服务
|
| 59 |
+
llama-server 是一个简单的 HTTP 服务器,包含一组 LLM REST API 和一个简单的 Web 前端,用于通过 llama.cpp 与大型语言模型交互,可兼容openai的接口
|
| 60 |
+
```bash
|
| 61 |
+
./build/bin/llama-server -m witty-tune-model/loraplus_model_IQ4_NL.gguf --jinja -ngl 99 --temp 0.6 --top-k 20 --top-p 0.95 --min-p 0 -c 40960 -np 4 -n 32768 --no-context-shift -t 64 --host 0.0.0.0 --port 8000
|
| 62 |
+
测试
|
| 63 |
+
curl 'http://127.0.0.1:8000/v1/chat/completions' \
|
| 64 |
+
--header 'Content-Type: application/json' \
|
| 65 |
+
--data '{
|
| 66 |
+
"model": "witty-tune-model",
|
| 67 |
+
"messages": [
|
| 68 |
+
{"role": "user", "content": "你好"}
|
| 69 |
+
],
|
| 70 |
+
"stream": false
|
| 71 |
+
}'
|
| 72 |
+
```
|
| 73 |
+
默认情况下,服务器将在 http://localhost:8080 监听,可以通过传递 --host 和 --port 更改。
|
| 74 |
+
以下是对上述命令的一些解释:
|
| 75 |
+
模型:llama-cli 支持从本地路径、远程 URL 或 Hugging Face Hub 使用模型文件。
|
| 76 |
+
上面的 -m witty-tune-model/loraplus_model_IQ4_NL.gguf 表示我们使用本地的gguf。
|
| 77 |
+
|
| 78 |
+
速度优化:
|
| 79 |
+
CPU:llama-cli 默认会使用 CPU,您可以��过更改 -t 来指定希望使用的线程数,例如 -t64 表示使用 64 个线程。
|
| 80 |
+
GPU:如果程序包含 GPU 支持,您可以使用 -ngl,它允许将一些层卸载到 GPU 进行计算。如果有多个 GPU,它会卸载到所有 GPU 上。您可以使用 -dev 控制使用的设备,并使用 -sm 控制使用的并行类型。例如,-ngl 99 -dev cuda0,cuda1 -sm row 表示使用 row 切分将所有层卸载到 GPU 0 和 GPU 1。添加 -fa 也可能加速生成。
|
| 81 |
+
|
| 82 |
+
采样参数:llama.cpp 支持多种采样方法,并对其中许多方法有默认配置。建议根据实际情况调整这些参数,Qwen3 模型卡片中推荐的参数可作为参考。如果您遇到重复和无尽生成的情况,建议额外传递 --presence-penalty,最大值为 2.0。
|
| 83 |
+
|
| 84 |
+
上下文管理:llama.cpp 默认采用“轮换”上下文管理方式。-c 控制最大上下文长度(默认值 4096,0 表示从模型加载),-n 控制每次生成的最大长度(默认值 -1 表示无限生成直到结束,-2 表示直到上下文满)。当上下文已满但生成未结束时,初始提示中的前 --keep 个 token(默认值 0,-1 表示全部)会被保留,其余部分的前半部分会被丢弃。然后,模型基于新的上下文 token 继续生成。您可以设置 --no-context-shift 来防止这种轮换行为,一旦达到 -c,生成就会停止。
|
| 85 |
+
llama.cpp 支持 YaRN,可以通过 -c 131072 --rope-scaling yarn --rope-scale 4 --yarn-orig-ctx 32768 启用。
|
| 86 |
+
|
| 87 |
+
### 对接openEuler-Intelligence调优智能体
|
| 88 |
+
|
| 89 |
+
请先部署openEuler-Intelligence调优智能体
|
| 90 |
+
|
| 91 |
+
[openEuler-Intelligence调优智能体安装与使用指南](https://gitee.com/openeuler/A-Tune/tree/euler-copilot-tune/)
|
| 92 |
+
|
| 93 |
+
修改.env.yaml 配置文件内容(项目 config 目录下)
|
| 94 |
+
```bash
|
| 95 |
+
vim config/.env.yaml
|
| 96 |
+
```
|
| 97 |
+
|
| 98 |
+
修改以下部分:
|
| 99 |
+
```
|
| 100 |
+
LLM_KEY: "sk-123456" # 必填:模型服务的 API 密钥
|
| 101 |
+
LLM_URL: "http://172.168.178.107:8000" # 必填:LLM 服务的 API 接口地址,如 "https://api.deepseek.com"
|
| 102 |
+
LLM_MODEL_NAME: "witty-tune-model" # 必填:要调用的模型名,如 deepseek-chat
|
| 103 |
+
LLM_MAX_TOKENS: 8192 # 选填:生成文本的最大 token 数,如512或2048
|
| 104 |
+
```
|
| 105 |
+
随后可以开启调优主程序
|
| 106 |
+
```
|
| 107 |
+
euler-copilot-tune
|
| 108 |
+
```
|
| 109 |
+
|
| 110 |
+
## 训练微调过程
|
| 111 |
+
### 基线模型
|
| 112 |
+
我们当前选择Qwen3-4B作为我们的基线模型,事实上,对于我们的调优方法,基线模型可以根据使用策略调整。
|
| 113 |
+
```bash
|
| 114 |
+
# 下载基线模型
|
| 115 |
+
pip install modelscope
|
| 116 |
+
modelscope download --model Qwen/Qwen3-4B-Instruct-2507 --local_dir ./Qwen3-4B-Instruct-2507
|
| 117 |
+
# 或者使用 huggingface
|
| 118 |
+
pip install huggingface_hub
|
| 119 |
+
huggingface-cli download Qwen/Qwen3-4B-Instruct-2507 --local-dir ./Qwen3-4B-Instruct-2507
|
| 120 |
+
```
|
| 121 |
+
|
| 122 |
+
### 数据准备
|
| 123 |
+
依照目前Eulercopilot调优智能体的推理格式,参考知识蒸馏的模式,收集在调优任务上表现良好的大模型(deepseek_v3.1、qwen3-max、qwen3-235B-A22B等)的回答(业界小规模的大模型E2E训练也大多依赖此种方式构造数据)。调优的数据格式一般包含以下几种问答对:系统状态应用状态分析问答对、瓶颈分析问答对、调优思路分析问答对、推理参数问答对。
|
| 124 |
+
|
| 125 |
+
数据清洗:
|
| 126 |
+
- 正负样本均衡:收集正样本-调优效果较好的优化参数(性能提升超过5%+),保留5%总数据量的负样本-调优效果较差的优化参数(无提升或者负收益),以保证领域大模型具备针对调优结果较差场景具有反思能力。
|
| 127 |
+
- 标准格式强化:清洗json格式的输出,并添加15%总数据量的json强化问答对,以保证微调后的模型对json的理解能力。
|
| 128 |
+
- 领域知识高质量化:修正知识库中错误的知识,基于历史专家调优经验,知识库新增有显著性能影响的参数,并在描述中体现重要性。
|
| 129 |
+
|
| 130 |
+
### LLaMA-Factory
|
| 131 |
+
我们选择LLaMA-Factory作为微调框架,支持多模型、多种精度、多种算法、多种集成方法的LLM微调,部署/使用简单
|
| 132 |
+
```bash
|
| 133 |
+
# 下载源码
|
| 134 |
+
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
|
| 135 |
+
cd LLaMA-Factory
|
| 136 |
+
|
| 137 |
+
# 创建并激活conda环境
|
| 138 |
+
conda create -y -n llamafactory python=3.11
|
| 139 |
+
conda activate llamafactory
|
| 140 |
+
|
| 141 |
+
# 源码安装
|
| 142 |
+
# cuda环境
|
| 143 |
+
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu126 # 可选,根据cuda版本调整下载链接,也可直接执行下面的命令自动检测并部署
|
| 144 |
+
pip install -e ".[torch,metrics]" --no-build-isolation
|
| 145 |
+
# ascend npu环境
|
| 146 |
+
pip install -e ".[torch-npu,metrics]" -i https://pypi.tuna.tsinghua.edu.cn/simple
|
| 147 |
+
|
| 148 |
+
# 与构建镜像安装
|
| 149 |
+
#c uda环境
|
| 150 |
+
docker run -it --rm --gpus=all --ipc=host hiyouga/llamafactory:latest # 该镜像基于 Ubuntu 22.04(x86_64)、CUDA 12.4、Python 3.11、PyTorch 2.6.0 和 Flash-attn 2.7.4 构建。全部镜像:https://hub.docker.com/r/hiyouga/llamafactory/tags
|
| 151 |
+
# ascend npu环境(暂时不支持A3型号的ascend产品)
|
| 152 |
+
docker pull quay.io/ascend/llamafactory:latest-npu-a2
|
| 153 |
+
docker run -dit --ipc=host --network host --name 'llamafactory' --privileged -v /usr/local/Ascend/driver:/usr/local/Ascend/driver -v /usr/local/Ascend/firmware:/usr/local/Ascend/firmware -v /usr/local/sbin/:/usr/local/sbin/ -v /home/:/home/ quay.io/ascend/llamafactory:latest-npu-a2
|
| 154 |
+
docker exec -it llamafactory bash
|
| 155 |
+
|
| 156 |
+
# 安装校验
|
| 157 |
+
llamafactory-cli env
|
| 158 |
+
```
|
| 159 |
+
|
| 160 |
+
### LoRA+
|
| 161 |
+
我们选择使用LoRA+作为训练方法,LoRA+是LoRA的变种,通过为不同的矩阵设置不同的学习率,有效提高学习效率,能够提高性能(约1%-2%)和微调速度(约2倍)。
|
| 162 |
+
|
| 163 |
+
### 训练
|
| 164 |
+
LLaMA Factory提供一站式操作体验,LLaMA Board 可视化微调
|
| 165 |
+
```bash
|
| 166 |
+
llamafactory-cli webui
|
| 167 |
+
```
|
| 168 |
+
|
| 169 |
+
### 格式转换
|
| 170 |
+
GGUF是一种文件格式,用于存储运行模型所需的信息,包括但不限于模型权重、模型超参数、默认生成配置和tokenzier,适用于llama.cpp推理场景,vllm、sglang有限支持。
|
| 171 |
+
```bash
|
| 172 |
+
# 获取源码,Qwen3需要llama.cpp版本大于等于b5092
|
| 173 |
+
git clone https://github.com/ggml-org/llama.cpp
|
| 174 |
+
cd llama.cpp
|
| 175 |
+
# 格式转换需要构建python库依赖
|
| 176 |
+
pip install -r requirements/requirements-convert_hf_to_gguf.txt
|
| 177 |
+
python convert_hf_to_gguf.py witty-tune-model/loraplus_model --outfile witty-tune-model/loraplus_model.gguf
|
| 178 |
+
```
|
| 179 |
+
|
| 180 |
+
### 量化
|
| 181 |
+
建议选择IQ4_NL作为量化方式,该量化方式成本低,无需校准集,模型综合能力损失小于1%,在调优场景实测无精度损失,并且能提升模型对json的理解能力。
|
| 182 |
+
使用IQ4_NL量化后,相比bf16模型,推理速度提升150%;相比Q4_K_M量化,推理速度基本持平(其中prefill阶段推理速度仅降低13%,decode阶段推理速度提升25%),调优场景能力显著提升。
|
| 183 |
+
需要注意的是,使用llama.cpp量化后的gguf模型,无法使用vllm、sglang部署。
|
| 184 |
+
```bash
|
| 185 |
+
llama-quantize witty-tune-model/loraplus_model.gguf IQ4_NL
|
| 186 |
+
```
|