Ascend-SACT/bce-embedding-base_v1
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

bce-embedding-base_v1 模型部署与测试总结

1. 背景

本文档说明 bce-embedding-base_v1 在 Ascend mis-tei 镜像中的服务化部署、OpenAI 兼容 Embedding API 调用、官方 Retrieval 精度复现,以及基于实测数据的接口性能和服务参数验证方法。

验证目标:

  • 验证 bce-embedding-base_v1 服务化部署后可以通过 /v1/embeddings HTTP API 调用。
  • 基于 BCEmbedding 官方 MTEB 评测代码复现 Retrieval 精度。
  • 基于实测结果确认 batch、并发和 mis-tei CLI 参数的合理配置。

目标服务接口:

<SERVICE_ENDPOINT>/v1/embeddings

模型信息:

项目说明
模型名称bce-embedding-base_v1
模型类型文本向量 Embedding 模型
服务框架Ascend mis-tei / text-embeddings-inference
API 格式OpenAI-compatible /v1/embeddings
输出维度768
单条有效输入长度512 tokens
官方仓库https://github.com/netease-youdao/BCEmbedding
官方评测结果https://github.com/netease-youdao/BCEmbedding/blob/master/Docs/EvaluationSummary/embedding_eval_summary.md
mis-tei 镜像https://www.hiascend.com/developer/ascendhub/detail/07a016975cc341f3a5ae131f2b52399d
CLI 参数文档https://gitcode.com/Ascend/text-embeddings-inference/blob/main/docs/source/en/cli_arguments.md

数据集与评测范围:

数据集来源split用途
T2RetrievalC-MTEB / MTEBdev中文 Retrieval 精度复现
QuoraRetrievalBEIR / MTEBtest英文 Retrieval 精度复现

路径占位符:

占位符含义
<PROJECT_ROOT>BCEmbedding 官方仓库根目录
<MODEL_ROOT>模型权重根目录
<DATASET_ROOT>MTEB/BEIR 数据缓存目录
<RUN_DIR>运行输出目录
<START_SCRIPT>mis-tei 镜像中的服务启动脚本
<SERVICE_ENDPOINT>服务地址,例如 http://127.0.0.1:8005
<BENCHMARK_REPORT>性能测试结果输出目录
<PATCH_FILE>测试代码适配 patch 文件路径

2. 服务化部署

2.1 镜像准备

镜像以 Ascend Hub 页面发布信息为准。本文档使用的镜像为:

swr.cn-south-1.myhuaweicloud.com/ascendhub/mis-tei:26.0.0-910b-ubuntu22.04-py3.11

拉取命令:

docker pull swr.cn-south-1.myhuaweicloud.com/ascendhub/mis-tei:26.0.0-910b-ubuntu22.04-py3.11

2.2 模型准备

将模型权重放置到容器可访问目录:

<MODEL_ROOT>/bce-embedding-base_v1

2.3 容器启动

容器启动命令如下。该镜像的入口会调用服务启动脚本,因此容器启动后服务会自动启动并监听 8005 端口。

export IMAGE=swr.cn-south-1.myhuaweicloud.com/ascendhub/mis-tei:26.0.0-910b-ubuntu22.04-py3.11
export NAME=bce-embedding-base_v1
export MODEL_DIR=/home/HwHiAiUser/model

docker run \
  -u root \
  --net host \
  --name $NAME \
  --device /dev/davinci0 \
  --device /dev/davinci_manager \
  --device /dev/devmm_svm \
  --device /dev/hisi_hdc \
  -v /usr/local/dcmi:/usr/local/dcmi \
  -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
  -v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \
  -v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \
  -v /etc/ascend_install.info:/etc/ascend_install.info \
  -w /workspace \
  -e MODEL_DIR=$MODEL_DIR \
  -v <MODEL_ROOT>:$MODEL_DIR \
  -itd $IMAGE --model-id $MODEL_DIR/bce-embedding-base_v1 --hostname 0.0.0.0 --port 8005

参数说明:

参数影响
--net host让容器服务端口直接暴露到宿主机网络
--device将 NPU 相关设备暴露给容器
-e MODEL_DIR=$MODEL_DIR指定容器内模型根目录
-v <MODEL_ROOT>:$MODEL_DIR将宿主机模型目录挂载到容器内
--model-id指定加载的模型路径
--hostname指定监听地址
--port指定 HTTP 服务端口

2.4 接口调用

服务启动后,通过 /v1/embeddings 接口发送待编码文本。请求示例:

curl <SERVICE_ENDPOINT>/v1/embeddings \
  -X POST \
  -H 'Content-Type: application/json' \
  -d '{
    "input": ["北京是中国的首都。"]
  }'

路由:

POST /v1/embeddings

请求参数:

参数类型必填说明
inputstring 或 string array是待编码文本;数组长度受 --max-client-batch-size 限制

响应结构:

{
  "object": "list",
  "data": [
    {
      "object": "embedding",
      "index": 0,
      "embedding": [0.01, 0.02]
    }
  ],
  "model": "bce-embedding-base_v1",
  "usage": {
    "prompt_tokens": 16,
    "total_tokens": 16
  }
}

usage.prompt_tokens 表示本次请求内所有 input 条目的有效 token 总数。单条文本超过模型有效长度时会被服务端截断。

成功响应中 data 数组包含每条输入对应的 embedding;本文模型单个 embedding 维度为 768。

3. 测试代码适配

本章中的所有适配代码仅用于精度测试、性能测试和单元测试,不属于 mis-tei 模型服务本身的运行代码。模型服务仍由 mis-tei 镜像内的 start.sh 与 text-embeddings-router 启动。

3.1 代码结构

代码基于 BCEmbedding 官方仓库 做最小适配。精简代码树如下:

<PROJECT_ROOT>/
├── BCEmbedding/
│   ├── evaluation/
│   │   └── c_mteb/
│   │       └── openai_embedding_model.py
│   └── tools/
│       └── eval_mteb/
│           └── eval_embedding_mteb.py
├── tools/
│   └── perf/
│       ├── tei_embedding_perf_probe.py
│       └── run_tei_cli_param_matrix.sh
├── tests/
│   ├── test_openai_embedding_model.py
│   └── test_eval_embedding_mteb_task_names.py
└── requirements-eval.txt

模块职责:

文件说明
BCEmbedding/evaluation/c_mteb/openai_embedding_model.pyOpenAI 兼容 Embedding API 封装,负责 HTTP 请求、响应排序、payload 拆分和进度日志
BCEmbedding/tools/eval_mteb/eval_embedding_mteb.py官方 MTEB 评测入口,增加 API 模式、单任务选择和 batch 参数传递
tools/perf/tei_embedding_perf_probe.pyEmbedding API 性能探测脚本,覆盖长度、batch、payload、并发测试
tools/perf/run_tei_cli_param_matrix.sh按 mis-tei CLI 参数矩阵启动服务并执行性能测试
tests/test_openai_embedding_model.pyAPI wrapper 行为单元测试
tests/test_eval_embedding_mteb_task_names.py单任务选择和 batch 参数传递测试
requirements-eval.txt评测依赖版本

3.2 API 模型封装

OpenAIEmbeddingModel 提供 MTEB/BEIR 需要的接口:

encode()
encode_queries()
encode_corpus()

3.3 评测入口改造

eval_embedding_mteb.py 新增参数:

参数说明
--task_names指定一个或多个 MTEB 任务名,只运行对应任务
--api_baseAPI base,例如 <SERVICE_ENDPOINT>/v1
--api_model请求体中的 model 字段
--api_timeoutAPI 请求超时时间,单位秒
--api_max_payload_bytes单次 HTTP 请求体最大字节数

行为说明:

  • 不传 --api_base 时,保持官方本地模型评测逻辑。
  • 传入 --api_base 时,使用 API wrapper 远程获取 embedding。
  • --task_names 用于单数据集评测,优先级高于 --task_type。
  • batch_size 显式传递给 evaluation.run(),避免 BEIR 默认 batch 触发服务端 batch 限制。

3.4 克隆官方仓库并应用 patch

测试适配代码已整理为 Patch 文件,可以从当前代码仓中获取。

获取官方仓库后,在仓库根目录应用该 patch:

git clone https://github.com/netease-youdao/BCEmbedding.git
cd BCEmbedding
git apply <PATCH_FILE>

4. 精度评测

4.1 评测配置

项目配置
评测框架MTEB / BEIR
MTEB 版本mteb==1.1.1
模型调用方式HTTP API
API base<SERVICE_ENDPOINT>/v1
API modelbce-embedding-base_v1
client batch size32
API timeout120s
payload 上限1800000 bytes
主要指标NDCG@10

依赖安装:

cd <PROJECT_ROOT>
pip install -r requirements-eval.txt
pip install -v -e .

缓存目录:

export HF_HOME=<DATASET_ROOT>/hf_home
export HF_DATASETS_CACHE=<DATASET_ROOT>/datasets
export TRANSFORMERS_CACHE=<DATASET_ROOT>/transformers

4.2 数据集下载说明

单任务评测只会下载该任务所需数据。示例:

--task_names QuoraRetrieval

会触发 BEIR quora.zip 下载并解压到数据缓存目录。

任务数据文件大小说明
QuoraRetrievalBeIR/quora.zip约 15.1MBBEIR 官方 zip

4.3 T2Retrieval

评测命令:

cd <PROJECT_ROOT>
python3 BCEmbedding/tools/eval_mteb/eval_embedding_mteb.py \
  --model_name_or_path maidalun1020/bce-embedding-base_v1 \
  --task_names T2Retrieval \
  --task_langs zh \
  --api_base <SERVICE_ENDPOINT>/v1 \
  --api_model bce-embedding-base_v1 \
  --batch_size 32 \
  --api_timeout 120 \
  --api_max_payload_bytes 1800000

结果:

指标当前实测
NDCG@100.67952
百分制67.952
评测耗时519.28s

官方对比:

数据集官方 NDCG@10当前实测 NDCG@10差值
T2Retrieval67.9467.952+0.012

因此当前 API 服务化结果与官方结果基本对齐。

4.4 QuoraRetrieval

评测命令:

cd <PROJECT_ROOT>
python3 BCEmbedding/tools/eval_mteb/eval_embedding_mteb.py \
  --model_name_or_path maidalun1020/bce-embedding-base_v1 \
  --task_names QuoraRetrieval \
  --task_langs en \
  --api_base <SERVICE_ENDPOINT>/v1 \
  --api_model bce-embedding-base_v1 \
  --batch_size 32 \
  --api_timeout 120 \
  --api_max_payload_bytes 1800000

结果:

指标当前实测
NDCG@10.78080
NDCG@100.85871
NDCG@1000.87329
Recall@100.94102
MRR@100.85008
评测耗时1172.71s

官方对比:

数据集官方 NDCG@10当前实测 NDCG@10差值
QuoraRetrieval85.8785.871+0.001

因此当前 API 服务化结果与官方结果基本对齐。

5. 性能评测

5.1 评测链路

性能测试采用 API 模式,测量 HTTP 端到端请求耗时:

client -> HTTP POST /v1/embeddings -> tokenizer/truncation -> model forward -> JSON response

该口径包含 HTTP 客户端耗时、服务端请求解析、tokenization、模型推理和响应序列化,不包含服务冷启动或模型加载时间。

评测负载:

评测负载目的
单条不同长度文本验证有效输入长度和长输入开销
不同 client batch size验证单请求 input 数量上限
batch=1 并发请求验证小请求高并发吞吐
batch=32 并发请求验证推荐 batch 下吞吐和延迟

指标说明:

指标含义
request_qps每秒完成的 HTTP 请求数
embedding_qps每秒完成的 embedding 条数
p50_ms请求延迟中位数
p95_ms请求延迟 95 分位
p99_ms请求延迟 99 分位
payload_bytesHTTP JSON 请求体大小

5.2 输入长度

输入长度测试用于确认单条文本在服务端的有效 token 上限,以及超长文本在 HTTP 解析和 tokenizer 阶段带来的额外开销。这里的单条字符数是请求中一条 input 文本的字符规模,usage.prompt_tokens 是服务端返回的有效 token 数。

结果:

单条字符数状态延迟usage.prompt_tokens
512200约 16ms275
1024200约 15ms512
32768200约 54ms512

结论:

  • 单条文本有效长度约为 512 tokens。
  • 超过有效长度后请求仍成功,但服务端会截断。
  • 长文本仍会增加 HTTP 请求体解析和 tokenization 成本。

5.3 client batch size

client batch size 指单个 HTTP 请求中 input 数组包含的文本条数。该值受服务启动参数 --max-client-batch-size 限制,超过限制时请求会在校验阶段失败,不会进入模型推理。

默认配置下:

batch状态说明
32200成功,延迟约 64ms
64422超过默认 --max-client-batch-size

错误信息:

{"message":"batch size 64 > maximum allowed batch size 32","code":422,"type":"Validation"}

batch=32 时继续放大单条输入长度可以验证 HTTP body 限制:

单条字符数payload bytes状态说明
163841278125200成功
327682556077413Failed to buffer the request body: length limit exceeded

5.4 并发验证

batch 表示单个 HTTP 请求中的文本条数,concurrency 表示同时发起的 HTTP 请求数。

默认配置下:

配置request QPSembedding QPSp95
batch=1, concurrency=128461.80461.80251.89ms
batch=1, concurrency=256492.42492.42152.86ms
batch=32, concurrency=111.33362.4396.14ms
batch=32, concurrency=426.21838.63186.92ms
batch=32, concurrency=830.28968.86301.38ms
batch=32, concurrency=1630.62979.83534.23ms

结论:

  • batch=32 的 embedding 吞吐明显高于 batch=1。
  • batch=32, concurrency=8 和 batch=32, concurrency=16 达到约 970-980 embeddings/s。
  • concurrency=16 吞吐基本不再提升,但 p95 延迟明显上升。

6. 结论与建议

  1. bce-embedding-base_v1 模型可通过 Ascend mis-tei 镜像稳定提供 /v1/embeddings 接口服务。

  2. 基于官方 BCEmbedding MTEB 评测代码,仅替换 embedding 调用方式即可复现 Retrieval 精度。

  3. 精度结果与官方基本对齐:

数据集官方 NDCG@10当前实测 NDCG@10差值
T2Retrieval67.9467.952+0.012
QuoraRetrieval85.8785.871+0.001
  1. 当前实测较合适的吞吐配置为 batch=32, concurrency=8,继续提升到 concurrency=16 吞吐收益很小且 p95 延迟明显升高。