# Worker 套件依賴關係圖 > 最後更新:2026-04-02 ## 轉換流程總覽(含外部 Binary 標註) ``` 上傳模型 (.onnx / .tflite) │ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ Stage 1: ONNX 優化 (onnx-worker) │ │ │ │ 輸入: .onnx 或 .tflite │ │ 輸出: out.onnx │ │ │ │ ┌─ Python 套件 ───────────────────────────────────────────────┐ │ │ │ onnx — 模型載入/儲存 │ │ │ │ tensorflow — TFLite 解析(僅 .tflite 輸入時) │ │ │ │ tf2onnx — TFLite→ONNX 轉換(僅 .tflite 輸入時) │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ ┌─ [BINARY] 系統庫 ──────────────────────────────────────────┐ │ │ │ kneronnxopt — ONNX 圖形最佳化引擎 │ │ │ │ 位置: /workspace/libs/kneronnxopt/ │ │ │ │ 呼叫: ktc.onnx_optimizer → Python import │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ ┌─ [BINARY] 可選:IP 評估 ───────────────────────────────────┐ │ │ │ (使用 ktc.ModelConfig.evaluate(), │ │ │ │ 底層透過 sys_flow 呼叫量化分析庫) │ │ │ └─────────────────────────────────────────────────────────────┘ │ └──────────┬───────────────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ Stage 2: BIE 量化 (bie-worker) │ │ │ │ 輸入: out.onnx + 參考圖片 │ │ 輸出: out.bie │ │ │ │ ┌─ Python 套件 ───────────────────────────────────────────────┐ │ │ │ onnx — 載入 ONNX、讀取 input shape │ │ │ │ Pillow — 參考圖片讀取 │ │ │ │ numpy — 圖片數值運算 │ │ │ │ opencv-python — 圖片預處理(resize 等) │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ ┌─ [BINARY] 系統庫 ──────────────────────────────────────────┐ │ │ │ kneronnxopt — ONNX 再次最佳化 │ │ │ │ 位置: /workspace/libs/kneronnxopt/ │ │ │ │ 呼叫: ktc.onnx_optimizer → Python import │ │ │ │ │ │ │ │ sys_flow — 量化流程 V1(平台 520/720/530/630) │ │ │ │ 位置: /workspace/ (Python path) │ │ │ │ 呼叫: ktc/toolchain.py → gen_fx_model_v1()│ │ │ │ │ │ │ │ sys_flow_v2 — 量化流程 V2(平台 730) │ │ │ │ 位置: /workspace/ (Python path) │ │ │ │ 呼叫: ktc/toolchain.py → gen_fx_model_v2()│ │ │ │ + gen_opt_model_v2() │ │ │ └─────────────────────────────────────────────────────────────┘ │ └──────────┬───────────────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ Stage 3: NEF 編譯 (nef-worker) │ │ │ │ 輸入: out.bie │ │ 輸出: out.nef │ │ │ │ ┌─ [BINARY] ELF 執行檔(subprocess.run 呼叫)────────────────┐ │ │ │ │ │ │ │ gen_config.py — 產生編譯設定檔 │ │ │ │ 位置: libs/compiler/gen_config.py │ │ │ │ libs_V2/compiler/gen_config.py (730) │ │ │ │ 呼叫: subprocess.run(["python", gen_config.py, ...]) │ │ │ │ 時機: 編譯前的設定準備 │ │ │ │ │ │ │ │ batch_compile — 模型批次編譯器(主編譯器) │ │ │ │ 位置: libs/compiler/batch_compile │ │ │ │ libs_V2/compiler/batch_compile (730) │ │ │ │ 呼叫: subprocess.run([batch_compile, ...]) │ │ │ │ 時機: BIE → 中間編譯產物 │ │ │ │ 連結: libpiano.so, libmozart.so, libschubert.so, │ │ │ │ libbeethoven.so, libbach.so, libwagner.so │ │ │ │ │ │ │ │ kneron_nef_utils — NEF 封裝工具 │ │ │ │ 位置: libs/compiler/kneron_nef_utils │ │ │ │ libs_V2/compiler/kneron_nef_utils (730) │ │ │ │ 呼叫: subprocess.run([kneron_nef_utils, ...]) │ │ │ │ 時機: 中間產物 → 最終 NEF 封裝 │ │ │ │ 連結: libencoder.so, libkne.so │ │ │ │ │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ │ Binary 路徑選擇邏輯: │ │ if USE_PREBUILD 環境變數存在 → 使用預構建路徑 │ │ elif platform == "730" → libs_V2/compiler/ │ │ else → libs/compiler/ │ └──────────────────────────────────────────────────────────────────┘ ┌──────────────────────────────────────────────────────────────────┐ │ (未完成) E2E 模擬 │ │ │ │ ┌─ [BINARY] 動態庫(ctypes.CDLL 載入)────────────────────────┐ │ │ │ │ │ │ │ libdynasty.so — Dynasty 推理引擎 │ │ │ │ 位置: libs/dynasty/E2ESimulator/libdynasty.so │ │ │ │ 呼叫: ctypes.CDLL() → 浮點/定點推理 │ │ │ │ │ │ │ │ libload*.so — 各平台預處理庫 │ │ │ │ 位置: E2E_Simulator/c_interface/libs/ │ │ │ │ 呼叫: ctypes.CDLL() │ │ │ │ │ │ │ │ libprocessing*.so — 各平台後處理庫 │ │ │ │ 位置: E2E_Simulator/c_interface/libs/ │ │ │ │ 呼叫: ctypes.CDLL() │ │ │ │ │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ ┌─ [BINARY] CSIM 仿真器(subprocess.run 呼叫)───────────────┐ │ │ │ │ │ │ │ npu_csim_520 — KDP520 硬體仿真 │ │ │ │ npu_csim_730 — KDP730 硬體仿真 │ │ │ │ 位置: E2E_Simulator/bin/current/ │ │ │ │ 呼叫: subprocess.run([npu_csim_*, ...]) │ │ │ │ │ │ │ └─────────────────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────────────┘ ``` --- ## 依賴分層架構 ``` ┌─────────────────────────────────────────────────────────────────────┐ │ Worker 入口層 │ │ services/workers/{onnx,bie,nef}/worker.py │ │ 用途:啟動 consumer、選擇 stub/real 模式 │ │ 依賴:consumer.py, stubs.py 或 core.py │ ├─────────────────────────────────────────────────────────────────────┤ │ Worker 消費者層 │ │ services/workers/consumer.py │ │ 用途:Redis Stream 佇列消費、檔案上下載、流程控制 │ │ 依賴:redis, boto3 (MinIO), 標準庫 │ ├─────────────────────────────────────────────────────────────────────┤ │ Worker 核心處理層 │ │ services/workers/{onnx,bie,nef}/core.py │ │ 用途:呼叫 Backend Interface 執行模型轉換 │ │ 依賴:onnx, ktc, backends │ ├─────────────────────────────────────────────────────────────────────┤ │ Backend 介面層 (Protocol) │ │ services/backends/{compiler,quantization,evaluator,simulator}.py │ │ 用途:定義抽象介面,封裝 KTC 呼叫 │ │ 依賴:ktc (lazy import) │ ├─────────────────────────────────────────────────────────────────────┤ │ KTC 封裝層 │ │ ktc/toolchain.py, ktc/onnx_optimizer.py, ktc/inferencer.py │ │ 用途:封裝 Kneron Toolchain 的 Python API 和 binary 呼叫 │ │ 依賴:onnx, numpy, kneronnxopt, sys_flow, subprocess (binary) │ ├─────────────────────────────────────────────────────────────────────┤ │ 外部 Binary / 系統庫層 │ │ libs/, libs_V2/, E2E_Simulator/ │ │ 用途:Kneron 編譯器、模擬器、最佳化器的實際二進制執行檔 │ │ 呼叫方式:subprocess.run(), ctypes.CDLL() │ └─────────────────────────────────────────────────────────────────────┘ ``` --- ## 各 Stage 套件依賴明細 ### Stage 1: ONNX 優化(onnx-worker) | 套件 | 類型 | 用途 | 呼叫位置 | |------|------|------|---------| | `redis` | 第三方 (pip) | Redis Stream 佇列消費、訊息 ACK | `consumer.py` | | `boto3` | 第三方 (pip) | MinIO 檔案上傳/下載 | `consumer.py` → `s3_storage.py` | | `onnx` | 第三方 (pip) | 載入/儲存 ONNX 模型 | `onnx/core.py` — `onnx.load()`, `onnx.save()` | | `ktc.onnx_optimizer` | 本地模組 | TFLite→ONNX 轉換、ONNX 模型最佳化 | `onnx/core.py` — `tflite2onnx_flow()`, `onnx2onnx_flow()` | | `kneronnxopt` | 系統庫 | ONNX 圖形最佳化(被 ktc.onnx_optimizer 呼叫) | `ktc/onnx_optimizer_1_13.py` | | `ktc.ModelConfig` | 本地模組 | IP 評估(可選) | `backends/evaluator.py` → `km.evaluate()` | **ONNX 版本分歧:** ``` ktc/onnx_optimizer.py ├─ onnx 1.7.0 → onnx_optimizer_1_7.py (舊版相容) └─ onnx 1.13+ → onnx_optimizer_1_13.py (目前使用) └─ import kneronnxopt ``` ### Stage 2: BIE 量化(bie-worker) | 套件 | 類型 | 用途 | 呼叫位置 | |------|------|------|---------| | `redis` | 第三方 (pip) | Redis Stream 佇列消費 | `consumer.py` | | `boto3` | 第三方 (pip) | MinIO 檔案上傳/下載 | `consumer.py` → `s3_storage.py` | | `onnx` | 第三方 (pip) | 載入 ONNX 模型、讀取輸入節點資訊 | `bie/core.py` — `onnx.load()`, 讀取 graph input shape | | `ktc.onnx_optimizer` | 本地模組 | ONNX 模型再次最佳化 | `bie/core.py` — `onnx2onnx_flow()` | | `kneron_preprocess` | 本地模組 | 參考圖片預處理(resize, normalize) | `bie/core.py` — `preprocess_func()` | | `Pillow` | 第三方 (pip) | 圖片讀取(被 kneron_preprocess 呼叫) | `kneron_preprocess.py` | | `numpy` | 第三方 (pip) | 圖片數值運算 | `kneron_preprocess.py` | | `ktc.ModelConfig` | 本地模組 | 建立模型設定 | `backends/quantization.py` | | `km.analysis()` | 本地模組 | 執行量化分析,產出 BIE | `backends/quantization.py` | | `sys_flow` | 系統庫 | 量化流程 V1(平台 520/720/530/630) | `ktc/toolchain.py` — `gen_fx_model_v1()` | | `sys_flow_v2` | 系統庫 | 量化流程 V2(平台 730) | `ktc/toolchain.py` — `gen_fx_model_v2()`, `gen_opt_model_v2()` | ### Stage 3: NEF 編譯(nef-worker) | 套件 | 類型 | 用途 | 呼叫位置 | |------|------|------|---------| | `redis` | 第三方 (pip) | Redis Stream 佇列消費 | `consumer.py` | | `boto3` | 第三方 (pip) | MinIO 檔案上傳/下載 | `consumer.py` → `s3_storage.py` | | `ktc.ModelConfig` | 本地模組 | 建立模型設定 | `backends/compiler.py` | | `ktc.compile()` | 本地模組 | 執行 NEF 編譯 | `backends/compiler.py` | | `batch_compile` | 外部 Binary | 模型批次編譯(ELF 執行檔) | `ktc/toolchain.py` → `subprocess.run()` | | `kneron_nef_utils` | 外部 Binary | NEF 封裝工具(ELF 執行檔) | `ktc/toolchain.py` → `subprocess.run()` | | `gen_config.py` | 外部 Script | 編譯設定檔產生器 | `ktc/toolchain.py` → `subprocess.run(["python", ...])` | **Binary 路徑解析:** ``` _resolve_compiler_paths(platform) ├─ 若 USE_PREBUILD 環境變數存在 → 使用預構建路徑 ├─ 平台 730 → libs_V2/compiler/ └─ 其他平台 → libs/compiler/ ``` ### E2E 模擬(未完成,旗標已定義) | 套件 | 類型 | 用途 | 呼叫位置 | |------|------|------|---------| | `ktc.kneron_inference` | 本地模組 | E2E 推理入口 | `backends/simulator.py` | | `kneron_inference` (E2E_Simulator) | 系統庫 | 推理執行 | `ktc/inferencer.py` — 硬編碼 `/workspace/E2E_Simulator/python_flow` | | `numpy` | 第三方 (pip) | radix 計算 | `ktc/inferencer.py` | | `libdynasty.so` | 外部 Binary | Dynasty 推理引擎 | E2E_Simulator → `ctypes.CDLL()` | | `npu_csim_*` | 外部 Binary | 各平台 CSIM 仿真器 | E2E_Simulator → `subprocess.run()` | --- ## 完整套件依賴總表 ### 第三方套件(pip install) | 套件 | 版本 | 使用階段 | 用途 | |------|------|---------|------| | `redis` | >=5.0 | 全部 | Redis Stream 佇列通訊 | | `boto3` | >=1.28 | 全部 | MinIO 物件儲存(S3 相容 API) | | `onnx` | 1.14.1 | ONNX + BIE | 模型載入/儲存/圖形解析 | | `numpy` | - | BIE + E2E | 數值運算、圖片處理 | | `Pillow` | - | BIE | 參考圖片讀取 | | `onnxruntime` | - | ONNX (間接) | ONNX 推理(被 kneronnxopt 使用) | | `tensorflow` | 2.16.2 | ONNX (間接) | TFLite 轉換 | | `tf2onnx` | - | ONNX (間接) | TFLite→ONNX 轉換 | | `opencv-python` | - | BIE (間接) | 圖片預處理 | | `scipy` | - | BIE (間接) | 量化分析數學運算 | ### 系統庫(需部署在 /workspace) | 模組 | 位置 | 使用階段 | 用途 | |------|------|---------|------| | `kneronnxopt` | `/workspace/libs/kneronnxopt/` | ONNX | ONNX 圖形最佳化引擎 | | `sys_flow` | `/workspace/` (Python path) | BIE | 量化流程 V1(520/720/530/630) | | `sys_flow_v2` | `/workspace/` (Python path) | BIE | 量化流程 V2(730) | | `extract_bie_info` | `/workspace/` (Python path) | BIE (間接) | BIE 檔案 I/O 資訊提取 | | `kneron_inference` | `/workspace/E2E_Simulator/python_flow/` | E2E 模擬 | 推理模擬入口 | ### 外部 Binary(ELF 執行檔 / .so 動態庫) | Binary | 位置 | 使用階段 | 呼叫方式 | |--------|------|---------|---------| | `batch_compile` | `libs/compiler/` 或 `libs_V2/compiler/` | NEF | `subprocess.run()` | | `kneron_nef_utils` | `libs/compiler/` 或 `libs_V2/compiler/` | NEF | `subprocess.run()` | | `gen_config.py` | `libs/compiler/` 或 `libs_V2/compiler/` | NEF | `subprocess.run(["python", ...])` | | `libdynasty.so` | `libs/dynasty/E2ESimulator/` | E2E 模擬 | `ctypes.CDLL()` | | `npu_csim_520` | `E2E_Simulator/bin/current/` | E2E 模擬 | `subprocess.run()` | | `npu_csim_730` | `E2E_Simulator/bin/current/` | E2E 模擬 | `subprocess.run()` | | `libload*.so` | `E2E_Simulator/c_interface/libs/` | E2E 模擬 | `ctypes.CDLL()` | | `libprocessing*.so` | `E2E_Simulator/c_interface/libs/` | E2E 模擬 | `ctypes.CDLL()` | | `libpiano.so` | `libs/compiler/lib/` | NEF (間接) | batch_compile 動態連結 | | `libmozart.so` | `libs/compiler/lib/` | NEF (間接) | batch_compile 動態連結 | | `libencoder.so` | `libs/compiler/lib/` | NEF (間接) | kneron_nef_utils 動態連結 | | `libkne.so` | `libs/compiler/lib/` | NEF (間接) | kneron_nef_utils 動態連結 | --- ## 依賴關係圖(按呼叫鏈) ``` onnx-worker └─ consumer.py ─────────── redis, boto3 └─ onnx/core.py ├─ onnx ─────────────── onnx.load(), onnx.save() ├─ ktc.onnx_optimizer │ ├─ onnx │ ├─ kneronnxopt ──── [系統庫] ONNX 圖形最佳化 │ └─ (tflite 時) tf2onnx, tensorflow └─ (可選) backends/evaluator.py └─ ktc.ModelConfig → km.evaluate() bie-worker └─ consumer.py ─────────── redis, boto3 └─ bie/core.py ├─ onnx ─────────────── onnx.load(), 讀取 input shape ├─ ktc.onnx_optimizer ── (同上) ├─ kneron_preprocess ─── Pillow, numpy, opencv-python └─ backends/quantization.py └─ ktc.ModelConfig → km.analysis() ├─ sys_flow ──── [系統庫] 量化 V1 └─ sys_flow_v2 ── [系統庫] 量化 V2 nef-worker └─ consumer.py ─────────── redis, boto3 └─ nef/core.py └─ backends/compiler.py └─ ktc.compile() ├─ gen_config.py ──── [subprocess] 產生編譯設定 ├─ batch_compile ──── [subprocess] 執行編譯 │ └─ libpiano.so, libmozart.so... [動態連結] └─ kneron_nef_utils ── [subprocess] 封裝 NEF └─ libencoder.so, libkne.so [動態連結] (未完成) e2e-simulation └─ backends/simulator.py └─ ktc.kneron_inference └─ E2E_Simulator/kneron_inference ├─ libdynasty.so ──── [ctypes] Dynasty 推理 ├─ npu_csim_* ─────── [subprocess] CSIM 仿真 └─ libload*.so ─────── [ctypes] 預/後處理 ``` --- ## 環境變數一覽 | 變數 | 預設值 | 用途 | 影響範圍 | |------|--------|------|---------| | `REDIS_URL` | `redis://localhost:6379` | Redis 連線 | consumer.py | | `WORKER_MODE` | `real` | `stub` = 開發模式, `real` = 真實處理 | worker.py | | `STORAGE_BACKEND` | `local` | `local` = 共享卷, `minio` = MinIO | consumer.py | | `MINIO_ENDPOINT_URL` | `http://192.168.0.130:9000` | MinIO 端點 | s3_storage.py | | `MINIO_BUCKET` | `convertet-working-space` | MinIO Bucket | s3_storage.py | | `MINIO_ACCESS_KEY` | `convuser` | MinIO 帳號 | s3_storage.py | | `MINIO_SECRET_KEY` | - | MinIO 密碼 | s3_storage.py | | `MINIO_LIFECYCLE_DAYS` | `7` | 檔案自動清理天數 | s3_storage.py | | `JOB_DATA_DIR` | `/data/jobs` | 本地工作目錄 | consumer.py | | `KTC_OUTPUT_DIR` | `/data1/kneron_flow` | KTC 輸出目錄 | core.py → ktc | | `KTC_WORKDIR` | `/workspace/.tmp` | KTC 暫存目錄 | core.py → ktc | | `KTC_SCRIPT_RES` | - | KTC 資源目錄 | core.py → ktc | | `USE_PREBUILD` | - | 預構建 binary 路徑(優先於 libs/) | ktc/toolchain.py |