mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
fix: handle paddlepaddle-gpu CUDA import at build time gracefully
paddlepaddle-gpu requires libcuda.so.1 at import time, but no CUDA driver exists during Docker build. The download script now catches this ImportError and skips PaddleOCR model pre-download on amd64. Models will download on first use at runtime when the CUDA driver is available via nvidia-container-toolkit. On arm64 (CPU paddlepaddle), models are still pre-downloaded at build time as before. Also reverted CI to amd64-only Docker build test for speed. Multi-arch build is tested on release via the release workflow.
This commit is contained in:
@@ -87,14 +87,11 @@ jobs:
|
|||||||
|
|
||||||
- uses: docker/setup-buildx-action@v3
|
- uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
- uses: docker/setup-qemu-action@v3
|
|
||||||
|
|
||||||
- uses: docker/build-push-action@v6
|
- uses: docker/build-push-action@v6
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
file: docker/Dockerfile
|
file: docker/Dockerfile
|
||||||
push: false
|
push: false
|
||||||
platforms: linux/amd64,linux/arm64
|
|
||||||
tags: stirling-image:ci
|
tags: stirling-image:ci
|
||||||
cache-from: type=gha,scope=unified
|
cache-from: type=gha,scope=unified
|
||||||
cache-to: type=gha,mode=max,scope=unified
|
cache-to: type=gha,mode=max,scope=unified
|
||||||
|
|||||||
+3
-9
@@ -118,16 +118,10 @@ RUN if [ "$TARGETARCH" = "amd64" ]; then \
|
|||||||
|
|
||||||
RUN /opt/venv/bin/pip install seam-carving==1.1.0
|
RUN /opt/venv/bin/pip install seam-carving==1.1.0
|
||||||
|
|
||||||
# Install CUDA forward-compat stubs for build-time model downloads.
|
|
||||||
# paddlepaddle-gpu needs libcuda.so.1 to import, but the real driver is
|
|
||||||
# only injected at runtime by nvidia-container-toolkit. The compat package
|
|
||||||
# provides a stub that satisfies the dlopen without a real GPU.
|
|
||||||
RUN if [ "$TARGETARCH" = "amd64" ]; then \
|
|
||||||
apt-get update && apt-get install -y --no-install-recommends cuda-compat-12-6 && \
|
|
||||||
rm -rf /var/lib/apt/lists/* \
|
|
||||||
; fi
|
|
||||||
|
|
||||||
# Pre-download and verify all ML models
|
# Pre-download and verify all ML models
|
||||||
|
# Note: on amd64, paddlepaddle-gpu can't import without the CUDA driver (only
|
||||||
|
# available at runtime). The download script gracefully skips PaddleOCR model
|
||||||
|
# pre-download in this case; models download on first use at runtime instead.
|
||||||
COPY docker/download_models.py /tmp/download_models.py
|
COPY docker/download_models.py /tmp/download_models.py
|
||||||
RUN /opt/venv/bin/python3 /tmp/download_models.py && rm -f /tmp/download_models.py
|
RUN /opt/venv/bin/python3 /tmp/download_models.py && rm -f /tmp/download_models.py
|
||||||
|
|
||||||
|
|||||||
@@ -63,11 +63,16 @@ def download_realesrgan_model():
|
|||||||
def download_paddleocr_models():
|
def download_paddleocr_models():
|
||||||
"""Pre-download PaddleOCR models for all supported languages."""
|
"""Pre-download PaddleOCR models for all supported languages."""
|
||||||
print("=== Downloading PaddleOCR models ===")
|
print("=== Downloading PaddleOCR models ===")
|
||||||
os.environ["PADDLE_PDX_DISABLE_MODEL_SOURCE_CHECK"] = "True"
|
try:
|
||||||
# Force CPU mode during build - no GPU driver available at build time
|
|
||||||
os.environ["PADDLE_DEVICE"] = "cpu"
|
|
||||||
os.environ["FLAGS_use_cuda"] = "0"
|
|
||||||
from paddleocr import PaddleOCR
|
from paddleocr import PaddleOCR
|
||||||
|
except ImportError as e:
|
||||||
|
if "libcuda" in str(e):
|
||||||
|
# paddlepaddle-gpu can't import without CUDA driver at build time.
|
||||||
|
# Models will be downloaded on first use at runtime instead.
|
||||||
|
print(f" Skipping PaddleOCR model pre-download (no CUDA driver at build time)")
|
||||||
|
print(f" Models will download on first use at runtime.\n")
|
||||||
|
return
|
||||||
|
raise
|
||||||
|
|
||||||
for lang in PADDLEOCR_LANGUAGES:
|
for lang in PADDLEOCR_LANGUAGES:
|
||||||
print(f" Downloading models for lang={lang}...")
|
print(f" Downloading models for lang={lang}...")
|
||||||
@@ -100,13 +105,20 @@ def smoke_test():
|
|||||||
is_amd64 = platform.machine() in ("x86_64", "amd64")
|
is_amd64 = platform.machine() in ("x86_64", "amd64")
|
||||||
|
|
||||||
from rembg import new_session
|
from rembg import new_session
|
||||||
from paddleocr import PaddleOCR
|
|
||||||
import mediapipe as mp
|
import mediapipe as mp
|
||||||
import cv2
|
import cv2
|
||||||
import numpy
|
import numpy
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
import seam_carving
|
import seam_carving
|
||||||
print(" Core imports OK")
|
|
||||||
|
try:
|
||||||
|
from paddleocr import PaddleOCR
|
||||||
|
print(" Core imports OK (including PaddleOCR)")
|
||||||
|
except ImportError as e:
|
||||||
|
if "libcuda" in str(e):
|
||||||
|
print(" Core imports OK (PaddleOCR skipped - no CUDA driver at build time)")
|
||||||
|
else:
|
||||||
|
raise
|
||||||
|
|
||||||
# RealESRGAN/basicsr has a known torchvision compat issue on arm64.
|
# RealESRGAN/basicsr has a known torchvision compat issue on arm64.
|
||||||
# On amd64 we verify the full import chain; on arm64 we just check the model file.
|
# On amd64 we verify the full import chain; on arm64 we just check the model file.
|
||||||
|
|||||||
Reference in New Issue
Block a user