Files
deepseek-r1-kunlun-INT8/image_build/README.md

92 lines
3.7 KiB
Markdown
Raw Normal View History

2026-10-30 17:29:26 +08:00
# 昆仑芯 DeepSeek INT8 修复镜像
基础镜像:用户已提交的 `xc-llm-kunlun:v0.25.1`。
输出镜像:`xc-llm-kunlun:v0.25.1-int8-fixed`。
## 修改内容
1. `vllm_kunlun/quantization/compressed_tensors/compressed_tensors_moe.py`:
INT8 MoE 从 RoutedExperts 实例读取 scoring_func、num_expert_group、topk_group、e_score_correction_bias 和 routed_scaling_factor,替代旧接口的默认值。避免 DeepSeek sigmoid 分组路由被错误地执行成 softmax;尊重外层 runner 的缩放分工,不硬编码 2.5。
2. `vllm_kunlun/ops/_custom_ops.py`:
两个 sigmoid 路由包装函数向 kunlun_ops 传参时,将 `block_static=block_static` 改为 `block_statistic=block_static`。保留上层 Torch 注册接口的 block_static 名称。
补丁可重复执行。构建时检查版本、语法、路由参数与底层函数签名,不导入 torch/vllm、不使用 XPU。文件原本已修复时只验证,不重复插入。
MLA 接口并未修复,启动脚本使用 `VLLM_MLA_DISABLE=1` 绕过当前 FlashMLAImpl 缺少 forward_mha/forward_mqa 的问题。使用 `VLLM_KUNLUN_ENABLE_INT8_BMM=0`,与已转换权重中的 BF16 kv_b_proj 一致。首测使用 TP=8、不启用 EP、eager、单并发、4096 上下文、每卡 4 GiB KV cache。
模型权重不打入镜像。当前转换结果中,路由专家和部分 MLA 投影为 INT8,kv_b_proj、Dense MLP 与共享专家为 BF16;MTP 已排除。
## 构建
在 172.28.4.201 宿主机执行:
```bash
cd /mnt/disk1/quant_tools/deepseek_r1_image
docker build --pull=false \
--build-arg BASE_IMAGE=xc-llm-kunlun:v0.25.1 \
-t xc-llm-kunlun:v0.25.1-int8-fixed .
```
仅针对内置文件验证补丁,不挂卡、不挂模型:
```bash
docker run --rm xc-llm-kunlun:v0.25.1-int8-fixed \
/opt/vllm_kunlun/bin/python /opt/kunlun-deepseek-fixes/apply_patches.py --check
```
## 启动与验证
切换服务前先停止旧服务,释放设备和端口。若旧服务由 srx_test 承载,可停止旧容器后再启动新容器:
```bash
docker stop srx_test
cd /mnt/disk1/quant_tools/deepseek_r1_image
bash run_container.sh xc-llm-kunlun:v0.25.1-int8-fixed deepseek_int8_fixed
```
run_container.sh 挂入八张 XPU、xpuctrl、32 GiB 共享内存,使用 host 网络,沿用实际宿主机映射:
```text
/mnt/disk0 -> /mnt/data0
/mnt/disk1 -> /mnt/data1
```
执行真实 P800 路由数值检查(小张量,不加载模型):
```bash
docker exec deepseek_int8_fixed \
/opt/vllm_kunlun/bin/python /opt/kunlun-deepseek-fixes/test_route_p800.py
```
启动完整服务(该命令前台运行,测试请求另开终端):
```bash
docker exec -it deepseek_int8_fixed \
bash /opt/kunlun-deepseek-fixes/serve_deepseek.sh
```
确认模型文件存在于宿主机 `/mnt/disk1/deepseek-r1-INT8`。镜像内脚本使用容器路径 `/mnt/data1/deepseek-r1-INT8`。
服务启动后:
```bash
curl -sS http://127.0.0.1:8000/v1/models
curl -sS --max-time 300 http://127.0.0.1:8000/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model":"/mnt/data1/deepseek-r1-INT8","messages":[{"role":"user","content":"北京是哪个国家的首都?请简短回答。"}],"temperature":0,"max_tokens":2048}'
```
查看 content、reasoning 和 finish_reason。完整输出质量需实际业务问题验证,算子数值检查不能代替该步骤。
## 导出与回滚
```bash
docker save -o /mnt/disk1/xc-llm-kunlun-v0.25.1-int8-fixed.tar \
xc-llm-kunlun:v0.25.1-int8-fixed
# 另一台同架构、驱动兼容的 P800 机器:
docker load -i /path/to/xc-llm-kunlun-v0.25.1-int8-fixed.tar
```
镜像归档不包含挂载模型;迁移时模型目录需要单独准备。
回滚时停止新服务/容器,再使用原镜像或启动原容器;旧镜像标签保持不变。