跳到正文

02 / 05 · 2020.08 — 2022.08

人民中科智能技术有限公司

在内容安全中台负责算法调度与跨语言封装:用 Ray 编排 10+ 类算法能力,用 SWIG 把 C++ SDK 接入 Python,参与昇腾 Atlas 推理 SDK,并独立交付可离线部署的跨模态检索产品。

职位
算法应用工程师
行业
AI + 内容安全
地点
北京
团队
15 人
在职
2 年 1 个月

关键成果

  • 10+ 类

    统一编排的算法能力:成人内容、暴恐、OCR、台标、Logo、人脸检索、视频拷贝检测、跨模态检索等

  • 单卡 ×5

    以 num_gpus=0.2 小数资源声明,单卡并行承载 5 个模型实例(单机 4 卡 Tesla T4)

  • 3 个

    交付的客户定制离线版本(Docker 镜像)

在这里做的项目

PROJECTS · 3
印章检测效果:在示例公文上框出公章并给出置信度(0.95)

2020.08 – 2022.08(2 年) · 中台・算法后端(Python / C++11) · 团队 15人

AI 内容安全算法中台

对标大厂内容安全审核产品的 AI 系统,监控并解析公网媒体内容,为 G 端用户及友商提供审核能力。以订阅方式对外提供 10+ 类算法能力,覆盖图片、视频、音频、文本四种媒体类型。我负责其中的 Ray 调度中台与 SWIG 跨语言封装层,并参与昇腾 Atlas ACL 推理 SDK 与双平台模型工具链。

  • 基于 Ray 构建分布式算法调度中台(主线负责):以 Actor 模型统一编排 10+ 类算法能力(成人内容识别、暴恐识别、OCR、台标、Logo、人脸检索、视频拷贝检测、跨模态检索等)
  • 消息可靠性:关闭 Kafka 自动提交,一批处理完再 commit(至少一次语义);puller Actor 数量由客户端动态探测分区数决定,与分区 1:1 对等启动
  • GPU 资源分片:以 num_gpus=0.2 小数资源声明,单卡并行承载 5 个模型实例(集群为单机 4 卡 Tesla T4)
  • 设计“报文层 — 路由层 — 模型层”三级抽象:报文层用 ray.wait 流式重组推理 batch,路由层按订阅的 algo_id 与模型能力集求交集动态分发;新增一类模型只需新增一个 Actor,不改动既有代码
  • 用 SWIG 4.0 把 C++ 算法库封装为 Python 扩展模块(主线负责):图像以 numpy 内存指针传入并校验 C_CONTIGUOUS,消除跨语言数据拷贝
  • 参与华为昇腾 Atlas ACL 推理 SDK(C++11 / CMake):设备与 Stream 管理,FFmpeg 解封装配合 DVPP 硬件解码;将向量检索由 AscendFaiss 迁移至 Milvus;适配 3 个 CANN 驱动大版本,并定位修复多芯片并行检索时 OpenMP 线程数不匹配导致的索引删除失败
  • 模型双平台落地:PyTorch → ONNX(opset 11)→ TensorRT 7 INT8(面向 Tesla T4)与昇腾 ATC .om 离线模型,同一业务代码支持 NVIDIA 与昇腾两套算力,累计维护 17 个模型包
  • 自研 OCR 敏感内容识别链路:PSENet 文本检测 + CRNN(LSTM) 识别 + 角度分类,识别结果经 DFA 算法与约 2 万条词库高效匹配
  • Python
  • C++11
  • Ray
  • Kafka
  • Protobuf
  • gRPC
  • SWIG
  • CMake
  • PyTorch
  • ONNX
  • TensorRT
  • 昇腾 ACL
  • Milvus
  • Redis
  • MySQL
  • MongoDB
  • Docker
  • FFmpeg

系统架构

L5 交付层 产品交付 在线审核 SaaS · Kafka 回传 CDF 跨模态检索离线镜像 标准化开放 API · 签名/回调 L4 调度层 Ray 算法调度中台 Kafka 消费 Actor ×N MsgWorker 报文层 InferWorker 路由层 模型 Actor 池 ×8 L3 桥接层 SWIG 跨语言封装 .i 接口描述文件 _wrap.cxx → .so numpy 指针零拷贝 pyporn / pyivcpd … L2 推理层 C++ 推理 SDK acl_manager decoder · FFmpeg + DVPP inference / 前后处理 检索索引 L1 硬件层 异构算力 NVIDIA T4 · CUDA · TensorRT 7 INT8 华为昇腾 Atlas · ACL · DVPP 旁路 工具链 数据与模型工具链 爬虫采集 切帧 / 标注解析 pth → ONNX 鲁棒性评估
在线推理链路 Kafka 任务 topic Protobuf / JSON 报文 Puller Actor ×N 分区数 1:1 · 手动 commit num_cpus=0.2 MsgWorker ×3 报文层 · 解析与组包 ActorPool.map InferWorker 推理层 · 算法路由 algo_id ∩ 能力集 batch_imgfile_read 远程任务 分批下载解码 · ray.wait 流式重组 batch 模型层 · 每类一个 Actor / 单卡 num_gpus=0.2 分片 成人内容识别 porn_actor 暴恐识别 jzk_actor OCR 文字识别 ocr_actor 台标检测 taibiao_actor Logo 检测 logo_actor 文件类识别 file_actor 人脸检索 face_retrv_actor 视频拷贝检测 ivcpd_actor 结果聚合 按接口协议组装 tags Kafka 结果 topic 异步回传 底库管理链路 · task.py Kafka 底库 topic 增 / 删 / 改 人脸 / 视频底库 Actor 质量卡控 · 特征入库 Milvus 向量库 :19530 MySQL 元数据 :33060
视频 / 图片推理流水线 ① 视频 / 图片输入 URL · 文件 · 推流 ② FFmpeg 解封装 静态编译 -fPIC ③ DVPP 硬件解码 VDEC · 绕开 CPU 软解 ④ DVPP VPC 缩放 / 抠图 / 格式转换 ⑤ ACL 模型推理 离线 .om 引擎 ⑥ 后处理 检测框 / 分类分数 ⑦ 特征 / 标签输出 feature_index 模块 ⑧ Milvus 索引 替换原 AscendFaiss 自研支撑模块 · src/base acl_manager Device / Context / Stream 生命周期 多芯片资源分配 BlockingQueue 流水线 解码线程与推理线程解耦 多路并发吞吐 preprocessor / detector resizer · cropper · operator 统一前后处理基类 驱动适配:20.1.0 / 20.2.0 / 21.0.1 三个 CANN 大版本 · 60+ 个 perf 压测程序以 FPS / 吞吐为优化指标
构建流程 porn.h / porn.cpp C++ 算法实现与头文件 pyporn.i SWIG 接口描述 · 手写 swig -c++ -python 生成胶水代码 pyporn_wrap.cxx C++ 侧包装 pyporn.py Python 代理类 _pyporn.so setup.py build_ext Python 侧调用约定 内存指针零拷贝 img.ctypes.data + C_CONTIGUOUS 校验 STL 容器模板实例化 std::vector → ImageDescriptorVec 指针 / 数组 helper shared_ptr 取值 · 数组申请释放
数据与训练 爬虫采集 XPath + API 双路 数据处理脚本 切帧 · GIF 拆解 · VOC 解析 训练镜像 pytorch 1.8.1-cuda11.1 模型权重 .pth 训练产出 ONNX 中间格式 opset 11 · batch 32 · 常量折叠 NVIDIA 路线 TensorRT 7 序列化 · INT8 量化 file_int8_bs32_T4_TRT7.en 昇腾路线 ATC 转换 · 离线模型 .om 引擎文件 CUDA 推理 · T4 (cc 7.5) GPU 版 SDK ACL 推理 · Atlas 昇腾版 SDK 鲁棒性评估 albumentations 翻转 / 模糊 / 噪声 压缩 / 色彩扰动 增强前后 PR 指标对比 precision / recall 差异

2020.08 – 2022.08 · 独立开发

跨模态检索离线产品(客户定制)

面向客户定制化需求的离线交付物:把面向开发者的多参数模型接口封装成一个简易检索接口,以 Docker 镜像交付;对外只暴露一个检索接口,屏蔽模型路径、特征维度、索引分区等全部内部参数。

  • Tornado 服务支持文本 / 图片 / 视频三模态输入:视频抽帧(每 25 帧取 1 帧),经跨模态双塔模型统一编码为 512 维特征,视频特征取帧均值
  • 经 gRPC 检索 Milvus 取 TopK 候选,用多条件逻辑引擎(与 / 或 / 非 / 包含)做集合运算,RRF 倒数排名融合重排,批量打标签,Redis 做二级缓存
  • 四轮性能迭代:gRPC 单条查询 → 并发批量接口 → 逻辑前置筛选 → 多线程分片查询(100 条 / 批)+ np.dot 批量矩阵点积;底库查询由 N 次串行 gRPC 收敛为 ⌈N/100⌉ 次并发批量查询
  • 同类离线产品另有视频特定物体过滤:抽帧 → SDK 提取 512 维特征 → gRPC 检索 Milvus → 后处理 → Docker 交付
  • Python
  • Tornado
  • gRPC
  • Milvus
  • Redis
  • NumPy
  • OpenCV
  • Docker

系统架构

跨模态检索主流程与性能迭代
检索主流程 三模态输入 文本 / 图片 / 视频 base64 或明文 抽帧 / 解码 cv2 每 25 帧取一帧 仅视频分支 跨模态双塔模型 text.en / image.en 统一 512 维特征 视频特征合成 帧特征取均值 np.average Milvus gRPC 检索 TopK 候选 多条件逻辑引擎 与 / 或 / 非 / 包含 结果集合运算 RRF 重排序 倒数排名融合 1/(rank_l + rank_r) 批量打标签 QueryTags 批处理 TopK 标签词 Redis 缓存 → JSON 视频信息 / 标签二级缓存 Tornado 异步返回 性能优化四轮迭代 · 版本演进记录在 API/readme v1 · old gRPC 单条查询 基线实现 v2 gRPC 并发接口 批量请求合并 v3 · new 逻辑前置筛选 先筛选后打标签 v4 · thread 多线程分片查询 100 条/批 + np.dot 批量相似度

2020.08 – 2022.08 · 系统工程师 · 团队 1人

CV 数据处理系统

旨在将深度学习所需的数据处理工作可视化、简化,让部门成员通过 GUI 完成数据采集与加工。把分散的个人脚本系统化、集成化,提升复用性与效率。

  • 数据采集模块:以 RESTful API 接入爬虫服务,从界面下发采集任务,结果存入 MongoDB
  • 数据处理模块:将 OpenCV 图像处理、FFmpeg 视频处理封装为 Tornado 接口,通过 Vue 界面操作;设计分片断点续传上传
  • 模型缺陷分析模块:将初打标与人工确认界面化;输入多数据集/模型计算 PR 指标并自动生成 PDF 报告
  • 前后端均参与,包含页面代码修正与 UI 改善
  • Python
  • Tornado
  • Vue
  • Vue-Element-Admin
  • MongoDB
  • OpenCV
  • FFmpeg

系统架构

CV 数据处理系统的模块与数据流
L1 界面 Vue 管理界面 把每个人的零散脚本集成为统一界面 L2 接口 Tornado 接口层 RESTful 接口 · 任务下发 L3 三个模块 数据采集 RESTful 接入爬虫 API 服务 界面下达采集任务 数据处理 OpenCV 图像脚本 · FFmpeg 视频脚本 文件上传断点续传 模型缺陷分析 初打标签 + 人工确认(界面化) 导入数据集与模型路径 L4 产出 MongoDB 采集结果 处理后的图片 / 视频 裁剪 · 变换等 PR 指标 + PDF 报告 后端自动生成

系统数据流

抽象示意 · 不含内部细节
  1. Kafka 任务

    上层微服务投递 · Protobuf

  2. Ray 调度中台

    报文层 · 路由层 · 模型层

    ▲ 我负责的部分

  3. SWIG 封装层

    C++ SDK → Python 扩展

    ▲ 我负责的部分

  4. C++ 推理 SDK

    CUDA / TensorRT · 昇腾 ACL

  5. Milvus / MySQL

    特征 · 底库

  6. 结果 Kafka

    按协议回写

照片均已征得同事同意,或对他人面部做了模糊处理

在这里学到了什么

在 AI + 内容安全行业,了解了更多深度学习的应用。计算机视觉方向涉及 OCR、NLP;主线工作是算法程序,用 Kafka 融合多平台业务,并接触了 Docker 部署和云服务器运维。

更深入理解了如何高效利用算力:模型蒸馏与剪枝、通过 CUDA / TensorRT 在硬件层加速,以及昇腾上用 DVPP 硬件解码。也体会到几个工程上的取舍:三层抽象让协议变更、算法升级和新增模型互不牵连;Kafka 手动提交换来至少一次语义;优化要由实测指标驱动,而不是凭感觉。

TECH STACK

  • Python
  • C++11
  • Ray
  • Kafka
  • Protobuf
  • gRPC
  • SWIG
  • Milvus
  • PyTorch
  • ONNX
  • TensorRT
  • 昇腾 ACL
  • Tornado
  • Redis
  • MySQL
  • MongoDB
  • Docker