jim800121chen 0cae1b1130 feat(worker): 啟用 staging 真實轉檔(取代 stub)+ 修 ref_images S3 path
staging worker 原本跑 WORKER_MODE=stub(假轉檔、產佔位 NEF),visionA 因此反映拿到的是 stub。本次讓真實轉檔上線並打通 onnx→bie→nef 完整鏈路。

新增:
- services/workers/Dockerfile.real:真實版 worker image,COPY repo 自帶 ktc/ + toolchain/prebuild(2GB),設 USE_PREBUILD/LD_LIBRARY_PATH/PYTHONPATH/KTC_DISABLE_MP/WORKER_MODE=real;排除 libs/dynasty+libs/compiler 省 3.2G
- .dockerignore:控制 build context(排除被 USE_PREBUILD 取代的舊系統 binaries)
- docker-compose.real.yml:override 三 worker 改用 registry image,保留 base stub build 供一鍵 rollback

修正(e2e 抓到的兩個問題):
- jobService.js: ref_images S3 key 由 jobs/{id}/ref_images/ 改為 jobs/{id}/input/ref_images/,對齊系統主約定(local.js/legacy.js/bie worker consumer.py),修好 bie 量化抓不到 dataset 的 blocker。加 contract guard test 鎖死寫入 prefix == worker 讀取 prefix
- security.md: 同步 ref_images S3 key 路徑描述

驗證(staging e2e):
- platform 530(與模型相符)下 onnx→bie→nef 全綠,產真 NEF 636KB(合法 FlatBuffer、非 STUB),/result 可拉、結果上 MinIO
- 已知約定:呼叫端 platform 必須與模型量化 platform 一致(配錯會在 bie 量化階段失敗)

scheduler 全套件 667 tests pass。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 12:43:24 +08:00

113 lines
6.0 KiB
Docker
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Real Worker Dockerfile — 自帶 prebuild toolchain可實際把 BIE→NEF 真實轉檔
#
# 與 Dockerfile.stub 的差異:本 image 內含 ktc/ 真實轉檔素材 + toolchain/prebuild
# 的 x86-64 編譯 binariesbatch_compile / kneron_nef_utils / model_converter
# 並設好 USE_PREBUILD/LD_LIBRARY_PATH/PYTHONPATH讓 import ktc + ktc.compile 走
# repo 自帶 prebuild 路徑(不抓系統 libs/compiler、libs/dynasty
#
# Build從專案根目錄、本機 Docker daemon
# docker build -f services/workers/Dockerfile.real -t kneron-worker-real:verify .
#
# 注意build context 含 toolchain/prebuild (~2GB)。搭配「專案根 .dockerignore」
# docker build 以專案根為 context只讀 context 根目錄的 .dockerignore不存在
# services/workers/.dockerignore排除 libs/dynasty + libs/compiler被 USE_PREBUILD
# 取代,省 ~3.2GB)。
# python:3.9 對齊既有 workerbullseye(Debian 11, glibc 2.31) 對舊 toolchain
# prebuild ELF 最低需求 GNU/Linux 3.2.0)相容性最佳。
FROM python:3.9-slim-bullseye
WORKDIR /app
# --- System libraries ---------------------------------------------------------
# opencv-python runtime: libgl1 / libglib2.0-0
# OpenMP / OpenBLAScompiler binary 會用): libgomp1
# gfortran runtimeprebuild/lib 雖自帶 libgfortran.so.5,仍裝保險): libgfortran5
# 其餘缺的 .so 靠 image 內 `ldd toolchain/prebuild/batch_compile` 的 "not found" 補。
RUN apt-get update && apt-get install -y --no-install-recommends \
libgl1 \
libglib2.0-0 \
libgomp1 \
libgfortran5 \
ca-certificates \
procps \
file \
&& rm -rf /var/lib/apt/lists/*
# --- Python dependencies ------------------------------------------------------
# 1) queue / storageconsumer.py 需要)
# 2) worker 既有 requirementsfastapi/onnx/opencv…
# 3) ktc → sys_flow / sys_flow_v2 + extract_bie_info + kneronnxopt module-load 額外
# 需要(全部由本機實跑 `import ktc` 逐個盤出):
# pandas blinker docopt snoop pyzipper dict_recursive_update beautifulsoup4
# jinja2 matplotlib tabulate commentjson IPython adjustText onnx_tool onnxsim
#
# 特別注意的版本鎖:
# - onnx==1.14.1:與 root requirements 一致ktc/toolchain.py 對 onnx==1.7.0 會
# 關閉 730 支援,必須避開 1.7.0。
# - onnx_tool==0.7.0:未鎖時裝到的新版在 import 期會踩
# "unsupported operand type(s) for |: MessageMeta and type"protobuf 衝突);
# 0.7.0 import 乾淨。
# - onnxsim==0.4.36--only-binarypy3.9/bullseye 上新版 onnxsim 無 wheel、需
# cmake 從源碼編0.4.36 有 prebuilt wheel避免裝 build toolchain。
# 4) numpy<2 最後裝prebuild 鏈的 C-extension 以 numpy 1.x 編譯numpy 2.x 會出
# "numpy.core.multiarray failed to import"。最後安裝確保不被其他套件升級回 2.x。
COPY services/workers/nef/requirements.txt /tmp/worker-requirements.txt
RUN pip install --no-cache-dir \
redis>=5.0 boto3>=1.28 \
&& pip install --no-cache-dir -r /tmp/worker-requirements.txt \
&& pip install --no-cache-dir \
"onnx==1.14.1" \
scipy \
pandas blinker docopt snoop \
pyzipper dict_recursive_update beautifulsoup4 jinja2 matplotlib tabulate \
commentjson IPython adjustText "onnx_tool==0.7.0" \
&& pip install --no-cache-dir --only-binary :all: "onnxsim==0.4.36" \
&& pip install --no-cache-dir "numpy<2"
# --- Application + toolchain source ------------------------------------------
# 精準 COPY避免把 libs/dynasty(2.0G) + libs/compiler(1.2G) 帶進來。
COPY ktc/ /app/ktc/
COPY vendor/ /app/vendor/
COPY services/ /app/services/
COPY toolchain/prebuild/ /app/toolchain/prebuild/
COPY libs/kneronnxopt/ /app/libs/kneronnxopt/
COPY libs/ONNX_Convertor/ /app/libs/ONNX_Convertor/
COPY libs/fpAnalyser/ /app/libs/fpAnalyser/
COPY E2E_Simulator/python_flow/ /app/E2E_Simulator/python_flow/
# 驗證用 fixtures + conftestproduction 部署可拿掉,這裡為了在 image 內端到端跑)
COPY tests/ /app/tests/
RUN mkdir -p /data/jobs
# --- Toolchain / runtime environment即 tests/conftest.py 的 production 化版本)---
ENV USE_PREBUILD=/app/toolchain/prebuild
ENV LD_LIBRARY_PATH=/app/toolchain/prebuild/lib
ENV PYTHONPATH=/app:/app/vendor:/app/libs:/app/libs/kneronnxopt:/app/E2E_Simulator/python_flow
ENV KTC_DISABLE_MP=1
# --- Worker runtime config ----------------------------------------------------
ENV WORKER_MODE=real
ENV REDIS_URL=redis://redis:6379
ENV JOB_DATA_DIR=/data/jobs
# STORAGE_BACKEND 刻意「不」在此 image 設預設值。
#
# 為什麼consumer.py 第 52 行 `os.environ.get("STORAGE_BACKEND", "local")` 本身
# 已會 fall back 到 local。若這支真實版 image 又寫死 ENV STORAGE_BACKEND=local會給
# 部署者「image 預設就能上雲」的錯覺;一旦 staging compose 漏設 STORAGE_BACKEND=minio
# worker 會 *安靜* 走 local產出寫 container 本機磁碟、不上 MinIO→ 轉檔成功但
# visionA poll 拿不到結果(即 commit b8457dd / cbd1b9d 修過的同類隱患)。
#
# 處理姿態:
# - 本 image 不設預設 → 由 compose / 部署環境「顯式」提供。
# - staging用 MinIO必設 `STORAGE_BACKEND=minio`(見部署 checklist 硬性項)。
# - 本機 / dev 不設時consumer.py 仍 fall back localstub/local 開發流程不受影響。
# - 註:要根除 silent fallback 的最穩做法是在 consumer.py 對 WORKER_MODE=real 做
# fail-fast漏設 minio 即報錯),但那屬 application code、需 backend 處理,
# 不在本 Dockerfile 範圍。
# STAGE: onnx / bie / nef三個 worker 共用此 image差在 entrypoint
ENV STAGE=nef
# 用 shell form 以便 ${STAGE} 變數展開(三個 worker 共用 image、差在此變數
CMD ["sh", "-c", "python -m services.workers.${STAGE}.worker"]