本文へスキップ

02 / 05 · 2020.08 — 2022.08

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

コンテンツ安全の中台でアルゴリズム調整とクロス言語ラッパーを担当。Ray で 10 種類以上のアルゴリズム機能を編成し、SWIG で C++ SDK を Python に接続。昇腾 Atlas 推論 SDK にも参画し、オフライン配備可能なクロスモーダル検索製品を単独で納品した。

職種
アルゴリズム応用エンジニア
業種
AI × コンテンツ安全
所在地
北京
チーム
15名
在籍
2年1ヶ月

主な成果

  • 10 種類以上

    統合して編成したアルゴリズム機能:アダルト、暴力テロ、OCR、局ロゴ、ロゴ、顔検索、動画コピー検出、クロスモーダル検索 など

  • 1 枚で ×5

    num_gpus=0.2 の小数指定で、1 枚の GPU が 5 つのモデルインスタンスを並行処理(1 台・Tesla T4 × 4)

  • 3 件

    納品した顧客向けカスタマイズのオフライン版(Docker イメージ)

この会社での案件

PROJECTS · 3
公印検出の結果例:サンプル文書上の印影を枠で囲み、信頼度(0.95)を表示

2020.08 – 2022.08(2年) · 中台・アルゴリズムバックエンド(Python / C++11) · 体制 15名

AI コンテンツ安全アルゴリズム中台

大手のコンテンツ安全審査製品を目標とした AI システムで、公開ネット上のメディアを監視・解析し、政府系ユーザーや協業各社に審査機能を提供する。サブスクリプション方式で 10 種類以上のアルゴリズム機能(画像・動画・音声・テキスト)を提供。自分は Ray ベースの調整中台と SWIG による言語間ラッパーを担当し、昇腾 Atlas ACL 推論 SDK とデュアルプラットフォームのモデルツールチェーンにも参画した。

  • Ray ベースの分散アルゴリズム調整中台を構築(主担当):Actor モデルで 10 種類以上のアルゴリズム機能(アダルト・暴力テロ識別、OCR、局ロゴ、ロゴ、顔検索、動画コピー検出、クロスモーダル検索など)を統合的に編成
  • メッセージ信頼性:Kafka の自動コミットを無効化し、1 バッチ処理後に commit(at-least-once)。puller Actor の数はクライアントが検出したパーティション数に合わせ、1:1 で起動
  • GPU リソースの分割:num_gpus=0.2 の小数指定により、1 枚の GPU で 5 つのモデルインスタンスを並行稼働(クラスタは 1 台・Tesla T4 × 4)
  • 「電文層 — ルーティング層 — モデル層」の 3 層抽象を設計:電文層は ray.wait で推論バッチを流れるように再構成し、ルーティング層は購読 algo_id とモデル能力の積集合で動的に振り分け。新しいモデルは Actor を 1 つ足すだけで既存コードに触れない
  • SWIG 4.0 で C++ アルゴリズムライブラリを Python 拡張モジュール化(主担当):画像は numpy のメモリポインタで渡し C_CONTIGUOUS を検証して、言語間のデータコピーを排除
  • 華為 Ascend Atlas ACL 推論 SDK(C++11 / CMake)の開発に参画:デバイス/Stream 管理、FFmpeg のデマルチプレクスと DVPP ハードウェアデコード。ベクトル検索を AscendFaiss から Milvus へ移行し、CANN ドライバ 3 バージョンに対応。複数チップ並列検索時の OpenMP スレッド数不一致によるインデックス削除失敗を特定・修正
  • モデルのデュアルプラットフォーム展開:PyTorch → ONNX(opset 11)→ TensorRT 7 INT8(Tesla T4 向け)/Ascend ATC の .om オフラインモデル。同一の業務コードで NVIDIA と Ascend の両方を支え、累計 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 華為 Ascend 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 で再バッチ化 モデル層 · 種別ごとに 1 Actor / 1 枚あたり num_gpus=0.2 で分割 アダルト識別 porn_actor 暴力・テロ識別 jzk_actor OCR 文字認識 ocr_actor 局ロゴ検出 taibiao_actor ロゴ検出 logo_actor ファイル種別識別 file_actor 顔検索 face_retrv_actor 動画コピー検出 ivcpd_actor 結果集約 API 仕様で tags を組立 Kafka 結果 topic 非同期で返却 ベースデータ管理の経路 · task.py Kafka ベースデータ topic 追加/削除/更新 顔/動画ベース Actor 品質ゲート · 特徴の登録 Milvus ベクトル DB :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 3 バージョン · 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 ポインタ/配列ヘルパー shared_ptr の値取得 · 配列の確保と解放
データと学習 クローラ収集 XPath + API の 2 経路 データ処理スクリプト フレーム切出 · GIF 分解 · VOC 解析 学習イメージ pytorch 1.8.1-cuda11.1 モデル重み .pth 学習の成果物 ONNX 中間形式 opset 11 · batch 32 · 定数畳み込み NVIDIA ルート TensorRT 7 シリアライズ · INT8 量子化 file_int8_bs32_T4_TRT7.en Ascend ルート ATC 変換 · オフラインモデル .om エンジンファイル CUDA 推論 · T4 (cc 7.5) GPU 版 SDK ACL 推論 · Atlas Ascend 版 SDK ロバスト性評価 albumentations 反転/ぼかし/ノイズ 圧縮/色の摂動 拡張前後の PR 指標比較 precision / recall の差

2020.08 – 2022.08 · 単独開発

クロスモーダル検索オフライン製品(顧客向けカスタマイズ)

顧客のカスタマイズ要件に応えるオフライン納品物。開発者向けの多パラメータなモデル API を単純な検索 API にラップし、Docker イメージで納品。モデルパス・特徴次元・インデックス分割などの内部パラメータはすべて隠し、検索 API を 1 つだけ公開する。

  • Tornado サービスがテキスト/画像/動画の 3 モダリティ入力に対応:動画は 25 フレームごとに 1 枚抽出し、クロスモーダルのデュアルタワーモデルで 512 次元の特徴に統一、動画特徴はフレーム平均
  • gRPC で Milvus を検索して TopK 候補を取得し、複数条件ロジックエンジン(AND/OR/NOT/包含)で集合演算、RRF(逆順位融合)で再ランク、ラベル一括付与、Redis で 2 次キャッシュ
  • 性能改善 4 段階:gRPC 単発照会 → 並行バッチ API → 論理条件の前置絞り込み → マルチスレッド分割照会(100 件/バッチ)+ np.dot によるバッチ行列内積。ベース照会を N 回の逐次 gRPC から ⌈N/100⌉ 回の並行バッチへ集約
  • 同種のオフライン製品として、動画の特定物体フィルタも担当:フレーム抽出 → SDK で 512 次元特徴 → gRPC で Milvus 検索 → 後処理 → Docker 納品
  • Python
  • Tornado
  • gRPC
  • Milvus
  • Redis
  • NumPy
  • OpenCV
  • Docker

システム構成

クロスモーダル検索のフローと性能改善
検索のメインフロー 3 モダリティ入力 テキスト/画像/動画 base64 または平文 フレーム抽出/デコード cv2 で 25 フレームごとに 1 枚 動画のみ クロスモーダル・デュアルタワー text.en / image.en 512 次元に統一した特徴 動画特徴の合成 フレーム特徴の平均 np.average Milvus gRPC 検索 TopK 候補 複数条件ロジックエンジン AND/OR/NOT/包含 結果の集合演算 RRF 再ランク 逆順位融合 1/(rank_l + rank_r) ラベル一括付与 QueryTags バッチ処理 TopK ラベル語 Redis キャッシュ → JSON 動画情報/ラベルの 2 次キャッシュ Tornado 非同期レスポンス 性能改善 4 段階 · 版の変遷は API/readme に記録 v1 · old gRPC 単発照会 ベースライン実装 v2 gRPC 並行 API バッチリクエストの統合 v3 · new 論理条件の前置絞り込み 絞り込み後にラベル付与 v4 · thread マルチスレッド分割照会 100 件/バッチ + np.dot 類似度

2020.08 – 2022.08 · SE · 体制 1名

CV データ処理システム

ディープラーニングに必要なデータ処理業務を可視化・効率化することを目的とし、部門メンバーが GUI 操作でデータ収集・加工を行えるように開発。バラバラに存在していた個人スクリプトをシステム化・統合し、再利用性と作業効率を向上させた。

  • データ収集モジュール:RESTful API でクローラサービスを連携し、画面から収集タスクを実行、結果を MongoDB に保存
  • データ処理モジュール:OpenCV の画像処理・FFmpeg の動画処理を Tornado で API 化し、Vue 画面から操作可能に。ファイルの分割アップロード(レジューム対応)を設計
  • モデル欠陥分析モジュール:初期ラベリングと人手確認を GUI 化。複数データセット・モデルを入力して PR 指標を算出し、PDF レポートを自動生成
  • フロント・バック両方を担当し、ページコード修正や UI 改善も実施
  • Python
  • Tornado
  • Vue
  • Vue-Element-Admin
  • MongoDB
  • OpenCV
  • FFmpeg

システム構成

CV データ処理システムのモジュールとデータフロー
L1 画面 Vue 管理画面 個人スクリプトを 1 つの画面に集約 L2 API Tornado API 層 RESTful API · タスク指示 L3 3 つのモジュール データ収集 RESTful でクローラ API と連携 画面から収集タスクを指示 データ処理 OpenCV 画像 · FFmpeg 動画スクリプト ファイルアップロードの再開対応 モデル欠陥分析 初期ラベル + 人手確認(GUI) データセットとモデルパスを指定 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 ハードウェアデコード。工学的なトレードオフも学びました。3 層の抽象により、プロトコル変更・アルゴリズム更新・モデル追加が互いに影響しないこと。Kafka の手動コミットで at-least-once を得ること。最適化は勘ではなく実測指標で進めること。

TECH STACK

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