InsightFace Server 实战指南:单卡 GPU 承载 50M+ 人脸向量的自托管人脸识别服务
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 调用方式,以及底层原生精确检索的实现契约。
定位与数据流
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;单脸策略支持
largest和center_largest; - 数据模型:
Collection -> Person -> FaceSample三级结构;Collection 绑定模型,多图片注册支持部分成功、metadata 与明确的拒绝原因; - 审核模式:注册
review_mode支持off、standard、strict,也支持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,默认不保留原始上传图片。
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 |
滚动标签 cpu 和 cuda12 分别指向对应运行环境的最新稳定版本,不提供含义模糊的 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_m、buffalo_sc 和 antelopev2。安装会生成 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:8080 与 18098:8080)。创建 Collection、为 Person 上传一张或多张注册照,再用另一张照片搜索。停止时使用不带 -v 的 docker compose ... down,即可保留数据库卷。
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.yml 与 server/deploy/compose.cuda12.yml 结构一致,值得注意的工程细节:
- 安全加固:
read_only: true根文件系统、非特权用户10001:10001、cap_drop: [ALL]、no-new-privileges:true、pids_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=1、CUDA_MODULE_LOADING=LAZY 与 NVIDIA_* 容器环境变量,实现“严格 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 中还提供了 test、test-api、test-sdk、test-frontend、test-native-cpu(CMake + CTest 构建并测试原生检索库)、smoke-test、release-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.so(native_cuda);否则加载 libifs_search_cpu.so(native_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 内查看的文档始终与仓库内容一致。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0631
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown00
video-shotcraftAI宣传片skill,使用 Remotion 制作电影级产品视频:提供106 张镜头配方卡和可复用的视频魔板。适用于 Claude Code 与 Codex以及所有其他智能体Markdown00
HivisionIDPhotos⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。Python09
DragonOSDragonOS is an operating system developed from scratch using Rust, with Linux compatibility. It is designed for **Serverless** scenarios. 使用Rust从0自研内核,具有Linux兼容性的操作系统,面向云计算Serverless场景而设计。Rust00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00


