本文档说明 bce-embedding-base_v1 在 Ascend mis-tei 镜像中的服务化部署、OpenAI 兼容 Embedding API 调用、官方 Retrieval 精度复现,以及基于实测数据的接口性能和服务参数验证方法。
验证目标:
bce-embedding-base_v1 服务化部署后可以通过 /v1/embeddings HTTP API 调用。目标服务接口:
<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 | 用途 |
|---|---|---|---|
T2Retrieval | C-MTEB / MTEB | dev | 中文 Retrieval 精度复现 |
QuoraRetrieval | BEIR / MTEB | test | 英文 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 文件路径 |
镜像以 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将模型权重放置到容器可访问目录:
<MODEL_ROOT>/bce-embedding-base_v1容器启动命令如下。该镜像的入口会调用服务启动脚本,因此容器启动后服务会自动启动并监听 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 服务端口 |
服务启动后,通过 /v1/embeddings 接口发送待编码文本。请求示例:
curl <SERVICE_ENDPOINT>/v1/embeddings \
-X POST \
-H 'Content-Type: application/json' \
-d '{
"input": ["北京是中国的首都。"]
}'路由:
POST /v1/embeddings请求参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
input | string 或 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。
本章中的所有适配代码仅用于精度测试、性能测试和单元测试,不属于 mis-tei 模型服务本身的运行代码。模型服务仍由 mis-tei 镜像内的 start.sh 与 text-embeddings-router 启动。
代码基于 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.py | OpenAI 兼容 Embedding API 封装,负责 HTTP 请求、响应排序、payload 拆分和进度日志 |
BCEmbedding/tools/eval_mteb/eval_embedding_mteb.py | 官方 MTEB 评测入口,增加 API 模式、单任务选择和 batch 参数传递 |
tools/perf/tei_embedding_perf_probe.py | Embedding API 性能探测脚本,覆盖长度、batch、payload、并发测试 |
tools/perf/run_tei_cli_param_matrix.sh | 按 mis-tei CLI 参数矩阵启动服务并执行性能测试 |
tests/test_openai_embedding_model.py | API wrapper 行为单元测试 |
tests/test_eval_embedding_mteb_task_names.py | 单任务选择和 batch 参数传递测试 |
requirements-eval.txt | 评测依赖版本 |
OpenAIEmbeddingModel 提供 MTEB/BEIR 需要的接口:
encode()
encode_queries()
encode_corpus()eval_embedding_mteb.py 新增参数:
| 参数 | 说明 |
|---|---|
--task_names | 指定一个或多个 MTEB 任务名,只运行对应任务 |
--api_base | API base,例如 <SERVICE_ENDPOINT>/v1 |
--api_model | 请求体中的 model 字段 |
--api_timeout | API 请求超时时间,单位秒 |
--api_max_payload_bytes | 单次 HTTP 请求体最大字节数 |
行为说明:
--api_base 时,保持官方本地模型评测逻辑。--api_base 时,使用 API wrapper 远程获取 embedding。--task_names 用于单数据集评测,优先级高于 --task_type。batch_size 显式传递给 evaluation.run(),避免 BEIR 默认 batch 触发服务端 batch 限制。测试适配代码已整理为 Patch 文件,可以从当前代码仓中获取。
获取官方仓库后,在仓库根目录应用该 patch:
git clone https://github.com/netease-youdao/BCEmbedding.git
cd BCEmbedding
git apply <PATCH_FILE>| 项目 | 配置 |
|---|---|
| 评测框架 | MTEB / BEIR |
| MTEB 版本 | mteb==1.1.1 |
| 模型调用方式 | HTTP API |
| API base | <SERVICE_ENDPOINT>/v1 |
| API model | bce-embedding-base_v1 |
| client batch size | 32 |
| API timeout | 120s |
| 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单任务评测只会下载该任务所需数据。示例:
--task_names QuoraRetrieval会触发 BEIR quora.zip 下载并解压到数据缓存目录。
| 任务 | 数据文件 | 大小 | 说明 |
|---|---|---|---|
QuoraRetrieval | BeIR/quora.zip | 约 15.1MB | BEIR 官方 zip |
评测命令:
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@10 | 0.67952 |
| 百分制 | 67.952 |
| 评测耗时 | 519.28s |
官方对比:
| 数据集 | 官方 NDCG@10 | 当前实测 NDCG@10 | 差值 |
|---|---|---|---|
T2Retrieval | 67.94 | 67.952 | +0.012 |
因此当前 API 服务化结果与官方结果基本对齐。
评测命令:
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@1 | 0.78080 |
NDCG@10 | 0.85871 |
NDCG@100 | 0.87329 |
Recall@10 | 0.94102 |
MRR@10 | 0.85008 |
| 评测耗时 | 1172.71s |
官方对比:
| 数据集 | 官方 NDCG@10 | 当前实测 NDCG@10 | 差值 |
|---|---|---|---|
QuoraRetrieval | 85.87 | 85.871 | +0.001 |
因此当前 API 服务化结果与官方结果基本对齐。
性能测试采用 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_bytes | HTTP JSON 请求体大小 |
输入长度测试用于确认单条文本在服务端的有效 token 上限,以及超长文本在 HTTP 解析和 tokenizer 阶段带来的额外开销。这里的单条字符数是请求中一条 input 文本的字符规模,usage.prompt_tokens 是服务端返回的有效 token 数。
结果:
| 单条字符数 | 状态 | 延迟 | usage.prompt_tokens |
|---|---|---|---|
512 | 200 | 约 16ms | 275 |
1024 | 200 | 约 15ms | 512 |
32768 | 200 | 约 54ms | 512 |
结论:
512 tokens。client batch size 指单个 HTTP 请求中 input 数组包含的文本条数。该值受服务启动参数 --max-client-batch-size 限制,超过限制时请求会在校验阶段失败,不会进入模型推理。
默认配置下:
| batch | 状态 | 说明 |
|---|---|---|
32 | 200 | 成功,延迟约 64ms |
64 | 422 | 超过默认 --max-client-batch-size |
错误信息:
{"message":"batch size 64 > maximum allowed batch size 32","code":422,"type":"Validation"}batch=32 时继续放大单条输入长度可以验证 HTTP body 限制:
| 单条字符数 | payload bytes | 状态 | 说明 |
|---|---|---|---|
16384 | 1278125 | 200 | 成功 |
32768 | 2556077 | 413 | Failed to buffer the request body: length limit exceeded |
batch 表示单个 HTTP 请求中的文本条数,concurrency 表示同时发起的 HTTP 请求数。
默认配置下:
| 配置 | request QPS | embedding QPS | p95 |
|---|---|---|---|
batch=1, concurrency=128 | 461.80 | 461.80 | 251.89ms |
batch=1, concurrency=256 | 492.42 | 492.42 | 152.86ms |
batch=32, concurrency=1 | 11.33 | 362.43 | 96.14ms |
batch=32, concurrency=4 | 26.21 | 838.63 | 186.92ms |
batch=32, concurrency=8 | 30.28 | 968.86 | 301.38ms |
batch=32, concurrency=16 | 30.62 | 979.83 | 534.23ms |
结论:
batch=32 的 embedding 吞吐明显高于 batch=1。batch=32, concurrency=8 和 batch=32, concurrency=16 达到约 970-980 embeddings/s。concurrency=16 吞吐基本不再提升,但 p95 延迟明显上升。bce-embedding-base_v1 模型可通过 Ascend mis-tei 镜像稳定提供 /v1/embeddings 接口服务。
基于官方 BCEmbedding MTEB 评测代码,仅替换 embedding 调用方式即可复现 Retrieval 精度。
精度结果与官方基本对齐:
| 数据集 | 官方 NDCG@10 | 当前实测 NDCG@10 | 差值 |
|---|---|---|---|
T2Retrieval | 67.94 | 67.952 | +0.012 |
QuoraRetrieval | 85.87 | 85.871 | +0.001 |
batch=32, concurrency=8,继续提升到 concurrency=16 吞吐收益很小且 p95 延迟明显升高。