---
title: AutoTrust-JEV-27B-v1.1-w8a8
canonical_url: "https://www.modelscope.cn/models/doable/AutoTrust-JEV-27B-v1.1-w8a8"
md_url: "https://www.modelscope.cn/models/doable/AutoTrust-JEV-27B-v1.1-w8a8.md"
repository: doable/AutoTrust-JEV-27B-v1.1-w8a8
chinese_name: AutoTrust-JEV-27B-v1.1-w8a8
last_updated: 2026-10-30
license: apache-2.0
pipeline_tag: text-classification
tasks:
  - text-classification
model_type:
  - qwen3_5
architectures:
  - Qwen3_5ForConditionalGeneration
parameters: 27.4B
tensor_type:
  - F32
  - I8
  - BF16
library_name:
  - safetensors
  - pytorch
frameworks:
  - pytorch
downloads: 9
stars: 3
tags:
  - text-classification
  - decision-model
  - classification
  - structured-decisions
  - multimodal
  - vision-language
  - image-input
  - w8a8
  - quantization
  - ascend
  - vllm
  - safetensors
---

# AutoTrust-JEV-27B-v1.1-w8a8

> AutoTrust-JEV-27B-v1.1-w8a8 - doable 在 ModelScope 开源的模型。AutoTrust-JEV-27B-v1.1决策模型的-w8a8量化版本，使用昇腾NPU服务器，在华为昇腾800IA2完成的量化工作，并稳定910B4*64GB单卡运行

doable/AutoTrust-JEV-27B-v1.1-w8a8 是 ModelScope 魔搭社区上的 27.4B 参数text-classification模型，采用 apache-2.0 许可。

- **Repository**: doable/AutoTrust-JEV-27B-v1.1-w8a8
- **License**: apache-2.0
- **Tasks**: text-classification
- **Parameters**: 27.4B
- **Tags**: text-classification, decision-model, classification, structured-decisions, multimodal, vision-language, image-input, w8a8, quantization, ascend, vllm, safetensors
- **Downloads**: 9
- **Stars**: 3
- **Last updated**: 2026-10-30

Source: https://www.modelscope.cn/models/doable/AutoTrust-JEV-27B-v1.1-w8a8

---

# AutoTrust-JEV-27B-v1.1-W8A8

**AutoTrust-JEV-27B-v1.1 决策模型的 W8A8 动态量化版（Ascend 910B4 / vLLM-Ascend）。**

与 bf16 原版相比：**决策结果逐条一致（53/53 用例 argmax 100% 相同），权重显存 54GB → 29GB，单卡即可部署，延迟更低**。

| 项 | bf16 原版 | 本量化版 |
|---|---|---|
| 权重显存 | 54 GB（2 卡 TP2） | **29 GB（1 卡即可）** |
| 单请求延迟 p50 | 301 ms | **240 ms** |
| 64 并发吞吐 | — | **27.8 req/s（1 卡）/ 45~49 req/s（2 卡 DP2）** |
| 23k token 长 prompt | 5.5 s | **5.2 s** |
| 决策一致率（53 条 A/B） | 基线 | **53/53，平均概率漂移 0.0062** |

> 本模型是**决策/分类模型**，不是聊天模型：一次请求 = 一道题 + 一组选项 → 每个选项一个概率。自由文本生成不在设计范围内（`lm_head` 只有 255 行有效权重，词表其余行严格为 0）。基座模型介绍与完整评测见 [AutoTrust-JEV-27B-v1.1](https://www.modelscope.cn/models/autotrust/AutoTrust-JEV-27B-v1.1)。

> **输入支持多模态**：文本决策走 `/v1/completions`；**带图像的决策走 `/v1/chat/completions`**（视觉塔完整保留、未量化，调用方式见第 5.3 节）。此前的说明文档误写为「服务端已禁用图像输入」，已更正。

---

## 1. 模型概览

| 项 | 值 |
|---|---|
| 架构 | `Qwen3_5ForConditionalGeneration`（dense 27B，混合注意力：48 层 linear attention + 16 层 full attention） |
| 隐藏层 / 层数 | 5120 / 64 |
| 词表 | 248320 |
| 原始精度 | bfloat16（54 GB） |
| 量化后精度 | W8A8 动态（int8 权重 + int8 激活），**29 GB**（视觉塔保持 bf16） |
| 视觉塔 | ViT 27 层 / hidden 1152（`Qwen3VLProcessor` + `Qwen2VLImageProcessorFast`），**未量化，可正常读图** |
| 输入模态 | 纯文本决策；文本 + 图像（单图或多图）决策 |
| 量化框架 | msModelSlim 26.1.0（MindStudio） |
| 推理框架 | vLLM-Ascend 0.27.1（`quantization=ascend`，自动识别） |
| 目标硬件 | Ascend 910B4（CANN 8.3.RC1，torch_npu 2.10） |
| 输出方式 | 255 路答案码（`A`…`Z`、`AA`…`JT`）上的概率分布 |

文件清单：

```
quant_model_weights-0000{1..8}-of-00008.safetensors   # 8 个分片，共 30 GB
quant_model_weights.safetensors.index.json             # 权重索引
quant_model_description.json                          # 逐张量量化类型表（vLLM 靠它加载）
config.json / tokenizer* / vllm_readout.json          # 与基座一致
jev_format.py / jev_vllm_engine.py / chat_template.jinja
```

---

## 2. 量化方案

**W8A8_DYNAMIC**：权重 int8 per-channel 对称量化（minmax），激活 int8 per-token 动态量化。动态激活量化**不需要校准数据集**，离线只计算权重的 scale/offset。

### 2.1 量化范围

| 模块 | 处理 | 说明 |
|---|---|---|
| `self_attn.{q,k,v,o}_proj` | **W8A8** | 16 个 full attention 层 |
| `mlp.{gate,up,down}_proj` | **W8A8** | 全部 64 层 |
| `linear_attn.{in_proj_qkv, in_proj_z}` | **W8A8** | 48 个 linear attention 层 |
| `lm_head` | **保持 bf16** | 255 路决策 readout，量化会直接破坏决策概率 |
| `embed_tokens`、全部 LayerNorm | **保持 bf16** | 低秩敏感，业界惯例不量化 |
| `linear_attn.{out_proj, conv1d, A_log, dt_bias, in_proj_a, in_proj_b}` | **保持 bf16** | 线性注意力的状态递推/门控项，对量化噪声敏感 |
| 视觉塔（`model.visual.*`） | **保持 bf16** | 多模态读图能力完整保留（ViT 27 层）；视觉塔占比小、量化收益低，且 int8 会影响图文决策精度，故排除 |

量化后共 **1057 个张量 W8A8_DYNAMIC，832 个 FLOAT**（含 scale/offset 派生项）。

### 2.2 为什么 `lm_head` 必须保 bf16

本模型的 `lm_head` 不是普通投影：248320 行中**只有 255 行非零**（对应 255 个答案码），其余行严格为 0，决策概率就是这 255 行 logit 的 softmax。量化这 255 行等于直接改写决策函数，因此：

1. 配方中显式排除；
2. 量化完成后对 `lm_head.weight` 做了**逐位比对**（见第 4 节）。

---

## 3. 量化过程

### 3.1 环境

- 镜像：`quay.io/ascend/vllm-ascend:v0.27.1rc1-openeuler`（CANN 8.3.RC1，torch_npu 2.10.0.post4）
- 工具：`msmodelslim==26.1.0`（PyPI，纯 Python 包）
- 硬件：1 × Ascend 910B4（64 GB）

### 3.2 命令

```bash
msmodelslim quant \
  --model_type Qwen3.5-27B \
  --model_path  /path/to/AutoTrust-JEV-27B-v1.1 \
  --save_path   /path/to/output-w8a8 \
  --config_path jev27_w8a8.yaml \
  --device npu --trust_remote_code True
```

配方（`multimodal_vlm_modelslim_v1`，基于官方 `qwen3_6_27B_w8a8` 最佳实践修改）：

```yaml
spec:
  process:
    - type: "linear_quant"
      qconfig:
        act:    {scope: "per_token",   dtype: "int8", symmetric: true, method: "minmax"}
        weight: {scope: "per_channel", dtype: "int8", symmetric: true, method: "minmax"}
      include:
        - "*self_attn*"
        - "*mlp*"
        - "*linear_attn.in_proj_qkv*"
        - "*linear_attn.in_proj_z*"
      exclude:
        - "*linear_fc2*"
        - "*visual*"          # 视觉塔有意保留 bf16：保证多模态读图能力
  save:
    - type: "ascendv1_saver"
      part_file_size: 4
```

### 3.3 耗时与资源

- **总耗时 7.5 分钟**（64 层 × ~6 秒/层），逐层 load → quantize → save，峰值显存远低于整模型加载
- 输出 30 GB（8 分片）

---

## 4. 质量验证

### 4.1 权重级校验

| 检查项 | 结果 |
|---|---|
| `lm_head.weight` 与基座逐位一致 | **bit-exact = True** |
| `lm_head` 非零行数 | **255**（其余 248065 行严格为 0），与 `vllm_readout.json` 的 `readout_token_ids` 完全对应 |
| `embed_tokens` / `out_proj` / `q_norm` / final norm | 全部 bit-exact |
| 量化层张量 | int8 + per-channel fp32 scale/offset，形状正确 |

### 4.2 行为级 A/B（53 条决策用例）

用例覆盖：工单路由、意图分类、工具选择（function calling）、是/否判断、风险分级、超范围拒答、结构化 JSON state、2~8 个选项。

| 指标 | 结果 |
|---|---|
| argmax 一致率 | **53/53 = 100%** |
| 概率平均漂移 mean\|Δp\| | **0.0062** |
| p95 / max \|Δp\| | 0.031 / 0.159（max 样本 argmax 未变） |

### 4.3 性能（Ascend 910B4，短 prompt ~100 token）

| 配置 | 单请求 p50 | 16 并发 | 64 并发 | 128 并发 |
|---|---|---|---|---|
| W8A8 TP1（1 卡） | 242 ms | 20.9 req/s | 27.8 req/s | — |
| W8A8 DP2（2 卡） | 239 ms | 29.0 req/s | 45~49 req/s | 55~61 req/s |
| bf16 TP2（2 卡，原版） | 301 ms | 21.3 req/s | — | — |

- 23k token 长 prompt：5.2 s（bf16 为 5.5 s；冷启动首请求约 13 s，之后稳定）
- 单卡 KV 容量 279k tokens（32768 上下文下充裕）
- 注意：decode 只有 1 个 token，**TP2 反而更慢**（292 ms，all-reduce 开销 > 收益）；扩展请用 DP

### 4.4 多模态（图像输入）验证

对量化版实机（DP2，`--limit-mm-per-prompt {"image":1}`）做的抽样测试，用例为「这张图是不是企业/品牌 logo」二选一：

| 用例 | 视觉 token | P(是 logo) | 结果 |
|---|---|---|---|
| RICOH 标志（1465×512） | 869 | 0.867 | ✓ 判为 logo |
| 某平台白色 logo（透明底，缩到 1400px + 深灰底） | 749 | 0.808 | ✓ 判为 logo |
| 某平台白色 logo（原图透明底未合成底色） | 10747 | 0.119 | ✗ 漏判（白底上看不见，见第 6 节第 5 条） |
| 人物证件照 | 2485 | 0.223 | ✓ 判为非 logo |
| 手机屏摄照片 | 12421 | 0.095 | ✓ 判为非 logo |

其他实测：

- **多图一次输入**：5 张图同请求可用（约 2.6 万 prompt tokens），5 选 1 单选能选出真 logo（p=0.680）
- **图文路由**：「用户上传 5 张图，帮我找出是 logo 的那张」→ 场景「识图内容」p=0.982
- **单图时延**（1400px，约 750～1600 视觉 token）：**0.45～0.67 s**；与原图尺寸强相关，1 万 token 以上的超大图会到 4.6～7.4 s
- **批量吞吐**：32 并发、1400px 预缩图，稳定 **12.8 张/秒**（实际跑过约 40 万张知识库图片）

---

## 5. 推理部署

### 5.1 启动

vLLM-Ascend 通过 `quant_model_description.json` 自动识别 W8A8 量化，无需 `--quantization` 参数：

```bash
vllm serve <model_dir> \
  --host 0.0.0.0 --port 50007 \
  --tensor-parallel-size 1 \
  --max-model-len 32768 --max-num-batched-tokens 16384 \
  --max-num-seqs 64 --gpu-memory-utilization 0.85 \
  --trust-remote-code --no-enable-prefix-caching \
  --limit-mm-per-prompt '{"image":1,"video":0}' \
  --logprobs-mode processed_logprobs --max-logprobs 255 \
  --generation-config vllm
```

> `--limit-mm-per-prompt` 决定每请求可带几张图：需要看图时至少设为 `{"image":1,"video":0}`；该参数缺省时 vLLM 默认为 1 张，**不要设为 0**，否则视觉输入会被丢弃（早期部署脚本曾漏配此项，导致误以为「不支持图像」）。
> 纯文本决策场景设为 `{"image":0}` 可省掉视觉预处理开销。

启动日志应出现 `Using the vLLM Ascend modelslim Quantization now!` 与 `quantization=ascend`。

高并发场景用 `--data-parallel-size 2`（两张卡各一个完整副本，零通信，吞吐 ~2×，延迟不变）。

### 5.2 文本决策调用协议（与基座一致）

```
POST /v1/completions          # 纯文本决策用这个；带图像的见 5.3 节
{
  "model": "<served-name>",
  "prompt": "<按固定模板拼好的完整字符串>",
  "max_tokens": 1,
  "temperature": 1.0,
  "logprobs": <选项数>,
  "allowed_token_ids": <vllm_readout.json 中前 n 个 readout_token_ids>,
  "return_tokens_as_token_ids": true,
  "ignore_eos": true
}
```

对返回的 `top_logprobs` 做 softmax 即得各选项概率。最小客户端（零第三方依赖）：

```python
import json, math, urllib.request

rd = json.load(open("vllm_readout.json"))
IDS, CODES = rd["readout_token_ids"], rd["codes"]

def decide(prompt, n, url="http://127.0.0.1:50007/v1", key="..."):
    body = {"model": "jev27", "prompt": prompt, "max_tokens": 1, "temperature": 1.0,
            "logprobs": n, "allowed_token_ids": IDS[:n],
            "return_tokens_as_token_ids": True, "ignore_eos": True}
    req = urllib.request.Request(url + "/completions", data=json.dumps(body).encode(),
                                 headers={"Content-Type": "application/json",
                                          "Authorization": "Bearer " + key})
    top = json.loads(urllib.request.urlopen(req, timeout=120).read())
    top = top["choices"][0]["logprobs"]["top_logprobs"][0]
    z = [top.get("token_id:%d" % t, -1e9) for t in IDS[:n]]
    m = max(z); e = [math.exp(x - m) for x in z]; s = sum(e)
    return [x / s for x in e]
```

Prompt 模板、选项渲染规则（`jev_format.py`）与基座一致，详见基座模型卡与 `jev_format.py` 源码。

### 5.3 图像输入（多模态调用）

**图像只能走 `/v1/chat/completions`**（`/v1/completions` 只接受纯字符串 prompt，无法携带图像）。输出仍受 255 路答案码约束，`max_tokens=1` 取一次分布。

```json
POST /v1/chat/completions
{
  "model": "jev27",
  "messages": [
    {"role": "system", "content": "You are a decision engine. ..."},
    {"role": "user", "content": [
      {"type": "text", "text": "Question:\n这张图是不是企业/brand logo？\n\nOptions:\nA: 不是 logo\nB: 是 logo\n\nReply with only the code of the best option."},
      {"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,<...>"}}
    ]}
  ],
  "max_tokens": 1,
  "temperature": 1.0,
  "logprobs": true,
  "top_logprobs": 255,
  "return_tokens_as_token_ids": true,
  "ignore_eos": true
}
```

**与文本接口的 3 个差异（实测 vLLM-Ascend 0.27.1）：**

| 项 | `/completions` | `/chat/completions` |
|---|---|---|
| `logprobs` | 整数（候选数） | **布尔**；候选数用 `top_logprobs` |
| `allowed_token_ids` | 生效 | **不生效**（返回全词表 top-N），需按 `readout_token_ids` 自行映射 |
| 返回位置 | `choices[0].logprobs.top_logprobs[0]` | `choices[0].logprobs.content[0].top_logprobs`（`token` 形如 `"token_id:33"`） |

因此图像路径取概率时要自己映射并归一化（未进入 top-N 的答案码按概率 0 处理）：

```python
lp = {}
for t in choice["logprobs"]["content"][0]["top_logprobs"]:
    if t["token"].startswith("token_id:"):
        lp[int(t["token"].split(":")[1])] = t["logprob"]

z = [lp.get(tid, -1e9) for tid in IDS[:n]]
m = max(z); e = [math.exp(x - m) for x in z]; s = sum(e)
probs = [x / s for x in e]
```

**建议的图像预处理**（直接影响准确率和时延）：

1. 长边缩到 **1400px**（约 750～1600 视觉 token，单图 0.45～0.7 s；不缩的话 1 万 token 以上要 5～10 s）
2. **带 alpha 通道的 PNG 先合成到深灰底**（`(35,37,40)`）——白 logo 叠在白底上模型看不见（实测同一张图：透明底 p=0.12 → 深灰底 p=0.81）
3. 高度/宽度 < 8px 的细条（PDF 切页残留）无判断价值，建议直接跳过；1～2px 的细条送模型会被服务端 400 拒收

---

## 6. 已知限制与注意事项

1. **概率平局**：W8A8 下可能出现两个选项 logit 完全相同（实测出现过一次，概率值逐位相等）。业务侧建议对 `top1 - top2 < 0.02` 的样本走人工兜底，不要硬取 argmax。
2. **无校准**：动态激活量化不依赖校准集，但也没有针对本模型做过 PTQ 精度调优；若下游任务对概率阈值敏感，建议在自己的验收集上复测（本文 53 条用例的 A/B 脚本可复用）。
3. **视觉塔未量化**：保持 bf16 原样，多模态读图可用；单请求最多几张图由 `--limit-mm-per-prompt` 决定（默认 1 张，多图需显式调大）。
4. **图像路径的概率不是校准分**：JEV 的训练/评测格式是 `/completions` 的固定 prompt 模板，图像只能走 chat 接口（模板由 vLLM 套用，格式与训练不完全一致）。因此图像判定的概率**只建议用于同一请求内的 argmax 比较**，跨请求的阈值需要按业务数据自行标定。
5. **透明底白色图形是盲区**：带 alpha 的 PNG 若主体是白色，叠白底后视觉上等于空白。送模型前请先合成深灰/黑色底，否则必然漏判（同一张 某平台 logo：透明底 p=0.12，深灰底 p=0.81）。
6. **超高/超宽细条**：1～2px 高度的切页碎片会被服务端 400 拒收，建议直接跳过；图像长边建议压到 1400px，过大（>1 万视觉 token）时延会涨到 5～10 s。
7. **扩展方式**：加卡请用 DP（`--data-parallel-size`），不要用 TP（decode 单 token，TP 通信开销为负收益）。
8. **硬件绑定**：W8A8 量化产物面向 Ascend NPU（vLLM-Ascend 加载），不能用于 CUDA 后端。
9. **冷启动**：长 prompt 首请求约 13 s（JIT/编译），之后稳定 5.2 s；压测前先 warmup。

## 7. 复现

```bash
# 环境
pip install msmodelslim==26.1.0        # 容器内 pip 源建议用清华镜像

# 量化（1 卡，约 8 分钟）
msmodelslim quant --model_type Qwen3.5-27B \
  --model_path <基座目录> --save_path <输出目录> \
  --config_path jev27_w8a8.yaml --device npu --trust_remote_code True

# 校验（必做）：lm_head 逐位一致 + 255 行非零
# A/B：53 条用例分别打 bf16 / w8a8 服务，比较 argmax 一致率与 |Δp|
```

完整配方、A/B 脚本与基准脚本随本仓库 `jev_format.py`、`jev_vllm_engine.py` 及基座模型卡提供。

## License

Apache-2.0（与基座一致）。本量化版由 msModelSlim 26.1.0 在 Ascend 910B4 上生成，推理框架为 vLLM-Ascend 0.27.1。
