首页
/ InsightFace Server 实战指南:单卡 GPU 承载 50M+ 人脸向量的自托管人脸识别服务

InsightFace Server 实战指南:单卡 GPU 承载 50M+ 人脸向量的自托管人脸识别服务

2026-09-09 17:53:59作者:董灵辛Dennis

InsightFace Server 是 InsightFace 仓库中面向生产环境的自托管人脸识别服务(当前版本 0.2.0,Linux x86_64):一个容器同时提供 Web UI、REST API、SQLite 持久化与本地 CPU 或 NVIDIA GPU 推理,核心能力是 SCRFD 检测 + ArcFace 特征 + 基于 INT8 特征量化的精确 1:N Person 搜索。读完本文,你将掌握它的部署方式(Compose 一键启动与源码构建)、关键配置参数(检测 Profile、检索 profile、容量与并发)、API/SDK 调用方式,以及底层原生精确检索的实现契约。

InsightFace Server 英文仪表盘

定位与数据流

Server 面向“上传图片 -> 检测、比对、注册或搜索”这一最常用的人脸识别闭环,是注重数据隐私的自托管方案:图片、特征、模型和索引都可以留在自己的网络内。需要明确它的边界——它不是 AWS Rekognition 兼容替代品,不实现 SigV4、IAM、Region 或 AWS 资源语义;也不内置 TLS、用户账户、RBAC、云 IAM 或法律合规层。

模型许可注意: InsightFace 公开预训练模型通常仅限非商业研究用途,商业使用需要前往 InsightFace 官网单独获取授权;该声明独立于 Server 源码的 MIT License(许可细节见 server/LICENSING.md)。

功能概览

  • 识别管线:SCRFD 人脸检测、五点关键点、对齐、ArcFace 512 维特征、L2 normalization、原始 cosine similarity、精确 1:N Person 搜索;
  • 多分辨率检测:动态 SCRFD 模型在每组配置的分辨率上分别推理,将所有候选映射回源图坐标后做一次全局 NMS;单脸策略支持 largestcenter_largest
  • 数据模型Collection -> Person -> FaceSample 三级结构;Collection 绑定模型,多图片注册支持部分成功、metadata 与明确的拒绝原因;
  • 审核模式:注册 review_mode 支持 offstandardstrict,也支持 external_trusted 外部可信特征;
  • 量化检索:GPU 精确检索支持 FP32、FP16、BF16 和 INT8 向量存储;
  • Web UI:多语言界面,覆盖仪表盘、人员库、人员、人脸检测、比对、搜索、RTSP 监控、系统诊断和帮助;
  • API 与 SDK/v1 下提供 29 个 snake_case REST 接口(包括受保护的 /v1/embeddings),附带轻量 Python SDK;
  • RTSP Monitor:服务端独立运行、保存有限的内存事件、支持多客户端,可选 preview.mjpeg;关闭浏览器不会停止监控;
  • 持久化与运维:SQLite 是持久化事实来源,内存精确索引可重建;/models 只读、/data 持久化,提供 migration、健康检查与禁止静默 CPU 回退的严格 CUDA 启动验证;
  • 图片格式:支持 JPEG、PNG、WebP,默认不保留原始上传图片。

英文 RTSP Monitor 页面,私有地址已遮挡

RTX 5090 上的 GPU 检索性能

在单张 NVIDIA GeForce RTX 5090(32,607 MiB)上,原生 CUDA 精确全量扫描索引使用 INT8 时,实测最多可保存 58.9M 个 512 维图片特征向量

GPU 数据类型 最大图片向量数 10M Top-5 p50 10M 串行 QPS
FP32 15.8M 12.84 ms 77.85
FP16 30.7M 6.83 ms 146.32
BF16 30.7M 6.83 ms 146.33
INT8 58.9M 3.84 ms 260.81

与 FP32 相比,INT8 的实测容量为 3.73 倍,10M Top-5 吞吐为 3.35 倍。以上仅为同一张 RTX 5090、Driver 580.105.08、CUDA 12.9 上的 GPU 实测。容量是未加载 ONNX 模型和 Server 工作负载时的独立原生索引极限;速度测试固定为 10M 个图片特征向量,执行 GPU 驻留的 Top-5 全量精确扫描,单请求串行,预热 10 次后测量 100 次。索引在各自存储表示内是精确搜索,但量化仍可能使分数相对 FP32 发生变化;生产部署还必须为模型、请求、并发、索引重建和显存分配器预留空间。

ICCV21-MFR 多人种 MR-ALL 精度:INT8 的精度代价

仓库在 challenges/iccv21-mfr/ 的多人种(MR)测试集上,按照 MR-ALL 全组队 1:1 协议、FAR 1e-6 测试了原生检索 profile。所有 profile 复用同一批由 Server API 一次性提取并完成 L2 normalization 的 512 维 buffalo_l 特征,仅改变向量存储和检索计算表示:

检索 profile FAR 1e-6 下的 MR-ALL Cosine 阈值 相对 FP32
FP32 91.249107% 0.407787
FP16 91.249197% 0.407787 +0.000090 个百分点
BF16 91.248502% 0.407787 -0.000605 个百分点
INT8 91.248005% 0.407739 -0.001102 个百分点

结论:INT8 在该测评中没有实质精度损失。 按挑战常用的两位小数展示,FP32 和 INT8 的 MR-ALL 均为 91.25%,未四舍五入的差异也只有 0.0011 个百分点,同时保留了上文 3.73 倍实测容量与 3.35 倍 10M Top-5 吞吐优势。这里对比的是向量存储与检索精度,并非 INT8 模型推理。

量化分数契约(源码级佐证)

上述“量化后仍精确”的承诺,来自原生检索库的显式分数契约。server/native/search/README.md 定义了 C ABI v2(固定 512 维,输入必须是有限、FP32 且 L2-normalized),所有返回分数使用原始 cosine 语义

q = clamp(round_half_away_from_zero(x * S), -128, 127)
score_internal = int32_dot(q_database, q_query) / (S * S)
similarity = clamp(score_internal, -1, 1)

INT8 支持两种比例系数 profile:INT8_X736_V1(推荐)与 INT8_X1000_V1(遗留兼容)。两者是相互独立的按索引契约,可在同一进程共存;已有的 x1000 Collection 永远不会被静默重解释为 x736。CPU、CUDA 与 NumPy 参考实现刻意采用相同的 FP32 语义做乘法与“远离零的一半”舍入,内部未缩放 INT32 累加器不对外暴露,保证排序精确、返回分数落在 [-1, 1]。

Profile 支持矩阵(同一文档确认):

Profile CPU CUDA
FP32_V1 支持 支持
FP16_V1 不支持(返回 IFS_SEARCH_UNSUPPORTED 支持
BF16_V1 支持 仅 Ampere/SM80 及以上;Turing 支持 FP32/FP16/INT8
INT8_X736_V1 支持 支持
INT8_X1000_V1 支持 支持

不支持的 profile 与 CUDA 失败一律 fail-closed,两个原生库内部没有任何 dtype 降级或 CPU 回退——这与 Server 层面“禁止静默 CPU 回退”的严格 CUDA 启动验证(Compose 中的 INSIGHTFACE_STRICT_CUDA=1)相互呼应。

快速开始

环境要求:安装 Docker Engine 和 Docker Compose 的 Linux x86_64;CUDA 版本还需要受支持的 NVIDIA GPU、NVIDIA Driver 和 NVIDIA Container Toolkit。宿主机不需要安装 Python、OpenCV、ONNX Runtime、CUDA Toolkit 或 cuDNN。公开镜像不包含模型、客户数据、API Key 或生产配置。

运行环境与镜像

运行环境 镜像
CPU ghcr.io/deepinsight/insightface-server:0.2.0-cpu
NVIDIA GPU ghcr.io/deepinsight/insightface-server:0.2.0-cuda12

滚动标签 cpucuda12 分别指向对应运行环境的最新稳定版本,不提供含义模糊的 latest。发布规则见维护者指南(仅英文)

1. 安装模型

在完整 InsightFace 仓库中,将模型安装到 server/.models(Compose 文件通过 YAML 锚点把该路径绑定为容器内只读的 /models):

mkdir -p server/.models
docker compose -f server/deploy/compose.cpu.yml pull
docker compose -f server/deploy/compose.cpu.yml \
  run --rm models install buffalo_l --accept-license

模型工具还支持 buffalo_mbuffalo_scantelopev2。安装会生成 manifest.json 和签名的 MODEL.LICENSE,可以用 models verify 核验。

2. 启动 CPU 服务

docker compose -f server/deploy/compose.cpu.yml up -d
curl -fsS http://127.0.0.1:18097/v1/health

3. 启动 CUDA 12 服务

docker compose -f server/deploy/compose.cuda12.yml pull
docker compose -f server/deploy/compose.cuda12.yml \
  run --rm models install buffalo_l --accept-license
docker compose -f server/deploy/compose.cuda12.yml up -d
curl -fsS http://127.0.0.1:18098/v1/health

CPU 打开 http://服务器地址:18097/,CUDA 打开 http://服务器地址:18098/(对应两个 Compose 文件中的端口映射 18097:808018098:8080)。创建 Collection、为 Person 上传一张或多张注册照,再用另一张照片搜索。停止时使用不带 -vdocker compose ... down,即可保留数据库卷。

英文 Collection 管理页面

4. 开放网络前必须开启认证

项目提供的 Compose 配置在隔离评估环境中默认关闭认证。对其他用户或网络开放前:

export INSIGHTFACE_AUTH_ENABLED=true
export INSIGHTFACE_API_KEY='请替换为足够长的随机密钥'
docker compose -f server/deploy/compose.cpu.yml up -d

完整的首次使用流程参见新手用户指南

Compose 配置要点(对照仓库文件)

server/deploy/compose.cpu.ymlserver/deploy/compose.cuda12.yml 结构一致,值得注意的工程细节:

  • 安全加固read_only: true 根文件系统、非特权用户 10001:10001cap_drop: [ALL]no-new-privileges:truepids_limit、受限 tmpfs;
  • 三卷分离/etc/insightface/server.toml(只读绑定 server/config/server.toml)、/data(命名卷,SQLite 与持久数据)、/models(只读绑定 server/.models);
  • 关键环境变量及默认值(两个文件相同):
环境变量 默认值 作用
INSIGHTFACE_DEFAULT_THRESHOLD 0.4 默认 cosine 阈值
INSIGHTFACE_COLLECTION_DEFAULT_SEARCH_PROFILE fp32_v1 新 Collection 默认检索 profile
INSIGHTFACE_COLLECTION_DEFAULT_CAPACITY_ROWS 100000 新 Collection 默认索引容量
INSIGHTFACE_COLLECTION_MAX_CAPACITY_ROWS 10000000 容量上限
INSIGHTFACE_COLLECTION_DEFAULT_MAX_FACES_PER_PERSON 20 每 Person 最大 FaceSample 数
INSIGHTFACE_COLLECTION_DEFAULT_LOAD_POLICY lazy 索引加载策略
INSIGHTFACE_SEARCH_DEVICE_ID 0 检索使用的 GPU 编号
INSIGHTFACE_SEARCH_TOPK_MODE auto Person Top-K 模式
INSIGHTFACE_SEARCH_BUILD_BATCH_ROWS 4096 索引重建批量
INSIGHTFACE_SAVE_FACE_CROPS false 是否保存人脸 crop

CUDA 文件额外设置 INSIGHTFACE_STRICT_CUDA=1CUDA_MODULE_LOADING=LAZYNVIDIA_* 容器环境变量,实现“严格 CUDA 启动验证”:启动时校验 GPU 可用,拒绝静默回退 CPU。

从源码构建

Dockerfile 会复制 server/python-package/insightface/ 中选定的推理模块,所以必须使用完整仓库作为构建上下文(Makefile 中的 docker build ... .. 即以仓库根目录为上下文)。

CPU:

make -C server build-cpu
docker compose -f server/deploy/compose.cpu.yml \
  run --rm --pull never models install buffalo_l --accept-license
docker compose -f server/deploy/compose.cpu.yml \
  up -d --no-build --pull never

CUDA 12:

make -C server build-cuda12
docker compose -f server/deploy/compose.cuda12.yml \
  run --rm --pull never models install buffalo_l --accept-license
docker compose -f server/deploy/compose.cuda12.yml \
  up -d --no-build --pull never

--pull never 确保 Compose 使用本地构建的镜像。构建过程仍会下载锁定的基础镜像和依赖;模型安装会单独下载已接受许可的模型包。server/Makefile 中还提供了 testtest-apitest-sdktest-frontendtest-native-cpu(CMake + CTest 构建并测试原生检索库)、smoke-testrelease-preflight 等目标,可用于本地验证。

核心行为(部署与调参必读)

  • Similarity 是原始 cosine 值,不是概率;阈值使用 0.0..1.0,默认 0.4
  • Collection 固定绑定模型和 embedding contract:模型不匹配时仍可查看,但注册和搜索返回 collection_model_mismatch
  • 检测 Profile 的继承与独立:启动时的检测 Profile 会复制给新 Collection,之后 Collection Profile 可以独立修改,并从下一次请求生效。
  • 可选人脸保存:保存内容是缩放为 112x112 的 bounding-box JPEG crop,不是原始上传图片,也不是识别模型使用的对齐输入;默认关闭(INSIGHTFACE_SAVE_FACE_CROPS=false)。
  • SQLite 提交是事实来源:注册或删除成功返回前会同步索引;重启后索引从 SQLite 重建。
  • 响应可追踪:响应包含 x-request-id,列表接口使用不透明的签名 cursor 分页。

这些行为的对应配置项集中在 server/config/server.toml

[inference]
# "auto" resolves to 4 concurrent model pipelines on CPU and 8 on CUDA.
# A positive integer overrides the provider-specific default.
max_concurrency = "auto"

[detection]
# 每个条目为 [width, height]:所有分辨率分别推理,
# 候选映射回源图坐标后做一次全局 NMS。
input_sizes = [[96, 96], [512, 512]]
threshold = 0.50        # SCRFD 候选生成阶段的最低置信度(在合并 NMS 之前生效)
nms_threshold = 0.40    # 全局 NMS 的 IoU 阈值
single_face_selection = "largest"   # 或 "center_largest"
max_detected_faces = 100           # 部署级安全上限,请求只能要求更少

[web]
disabled = false  # true 时进入 API-only 模式,仅保留 /v1 与 /openapi.json

其中 center_largest 策略最大化像素空间得分:area - 2.0 * squared_distance(face_box_center, image_center),适合“画面中心的那张脸”场景。

API 与 SDK

主要 API 分组(共 29 个接口,交互式 OpenAPI 保留在 /docs):

  • 系统/v1/health/v1/system/v1/models
  • 无状态人脸接口/v1/detect/v1/compare/v1/embeddings(受保护);
  • Collection / Person / FaceSample CRUD
  • Collection Person 搜索
  • RTSP Monitor 配置、状态、事件和预览。

所有参数、响应、错误和示例见完整 REST API 使用指南

配套 Python SDK 的最小用法:

from insightface_server import Client

with Client("http://localhost:18097", api_key=None) as client:
    faces = client.detect("photo.jpg")
    matches = client.search("employees", "unknown.jpg", limit=5)

SDK 源码位于 server/sdk/python/;SDK 安装、图片输入、方法和完整流程见用户指南

检索后端选择机制(源码级佐证)

Server 的内存精确索引由 server/backend/insightface_server/search/factory.py 中的 create_search_backend 选择后端。从源码结构看,search_backend=auto 时的决策链是:推理模式为 mock 时使用 NumPy 参考实现 ReferenceSearchBackend;执行提供方为 CUDAExecutionProvider 时加载 libifs_search_cuda.sonative_cuda);否则加载 libifs_search_cpu.sonative_cpu)。原生后端加载后还会执行一次分组 Top-K 自检(添加/搜索/删除各一条记录并校验分数),失败即启动失败——这是“fail-closed、无静默降级”设计在 Python 层的落点。库的默认路径为 /opt/insightface/server/native/lib,也可通过 search_library_path 覆盖;原生路径强制维度为 512,与 ABI v2 契约一致。

CUDA 端 Person Top-K 的实现细节(来自 server/native/search/README.md):行到组的元数据驻留设备端,两遍 GPU 归约先求每个 Person 的最高分再确定其确定性最优 FaceSample(同分时取最小 vector ID),最终只有前 K(至多 100)条 (group_id, vector_id, score) 记录跨 PCIe;CUDA 删除采用 tombstone,因此 physical_rows 在删除/重加循环中持续增长,Server 需要在 tombstone 耗尽容量前重建 Collection 代际——这也是“SQLite 为事实来源、索引可重建”设计的原因之一。

安全提示

人脸图片和 embedding 属于生物特征数据。网络部署时应:开启认证、通过可信反向代理终止 HTTPS、限制 Docker 和数据卷访问、保持宽泛 CORS 关闭、制定备份/留存/删除/同意和安全事件处理策略;日志中不得记录图片、embedding、RTSP 凭据或 API Key。部署和安全操作细节见用户指南

第一阶段范围(明确不做的事)

当前版本不实现:AWS/CompreFace 兼容、CUDA 11、Jetson、ARM64、Windows Container、TensorRT、Kubernetes、分布式 Worker、持久化 Monitor 事件或录像/NVR,也不实现活体检测、Deepfake Detection 和人口属性分析。

延伸阅读

  • 用户指南:完整覆盖安装、配置、模型、Web UI、SDK、GPU、安全、备份和故障定位;
  • REST API 使用指南:覆盖每个公开接口、字段、行为、结果、错误、分页规则和示例;
  • 维护者指南(仅英文):架构、检索内部实现、测试、贡献规则和容器发布;
  • server/LICENSING.md:许可入口——Server 源码与 Python SDK 采用 MIT License,该声明不覆盖模型文件、模型权重、数据集或第三方组件。

GitHub 文档与 Web UI 帮助页读取完全相同的本地化 User Guide 和 API Guide Markdown,区别只在渲染方式——这意味着 UI 内查看的文档始终与仓库内容一致。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
docsdocs
暂无描述
Markdown
899
5.83 K
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.14 K
2.76 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
860
1.35 K
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
925
1.85 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.84 K
1.02 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
533
601
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.37 K
1.46 K
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
548
395
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.04 K
525