From 59b8b4c78d1b14b434aa2026631501929aa94ac3 Mon Sep 17 00:00:00 2001 From: Robert Sachunsky Date: Tue, 7 Jul 2026 22:59:36 +0200 Subject: [PATCH 1/5] try to improve tf_disable_interactive_logs() coverage --- src/ocrd_utils/logging.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/ocrd_utils/logging.py b/src/ocrd_utils/logging.py index f703f7f4c..7363cd745 100644 --- a/src/ocrd_utils/logging.py +++ b/src/ocrd_utils/logging.py @@ -83,10 +83,15 @@ def tf_disable_interactive_logs(): from os import environ # pylint: disable=import-outside-toplevel # This env variable must be set before importing from Keras environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + environ['GLOG_minloglevel'] = '3' + environ['GRPC_VERBOSITY'] = 'ERROR' + environ['KMP_AFFINITY'] = 'noverbose' from tensorflow.keras.utils import disable_interactive_logging # pylint: disable=import-outside-toplevel # Enabled interactive logging throws an exception # due to a call of sys.stdout.flush() disable_interactive_logging() + logging.getLogger('tensorflow').setLevel(LOGGING_DEFAULTS['tensorflow']) + logging.getLogger('absl').setLevel(LOGGING_DEFAULTS['tensorflow']) except ImportError: # Nothing should be handled here if TF is not available pass From 9a9f96281918ad558944aae866b4e6dee6ae37e3 Mon Sep 17 00:00:00 2001 From: Robert Sachunsky Date: Tue, 7 Jul 2026 23:02:28 +0200 Subject: [PATCH 2/5] add deps-onnx / docker-cuda-onnx variant --- .circleci/config.yml | 2 +- .github/workflows/docker-image.yml | 2 +- Dockerfile.cuda-onnx | 15 +++++++++++++++ Makefile | 16 ++++++++++++---- 4 files changed, 29 insertions(+), 6 deletions(-) create mode 100644 Dockerfile.cuda-onnx diff --git a/.circleci/config.yml b/.circleci/config.yml index 505c75e76..304f75d0f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -98,7 +98,7 @@ workflows: - deploy: matrix: parameters: - docker-variant: ['', '-cuda', '-cuda-tf2', '-cuda-torch'] + docker-variant: ['', '-cuda', '-cuda-tf2', '-cuda-torch', '-cuda-onnx'] filters: branches: only: master diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 01c635731..52ed3411a 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -54,4 +54,4 @@ jobs: username: ${{ secrets.DOCKERIO_USERNAME }} password: ${{ secrets.DOCKERIO_PASSWORD }} - name: Build the Docker images - run: make docker docker-cuda docker-cuda-tf2 docker-cuda-torch + run: make docker docker-cuda docker-cuda-tf2 docker-cuda-torch docker-cuda-onnx diff --git a/Dockerfile.cuda-onnx b/Dockerfile.cuda-onnx new file mode 100644 index 000000000..7c9a59020 --- /dev/null +++ b/Dockerfile.cuda-onnx @@ -0,0 +1,15 @@ +ARG BASE_IMAGE=docker.io/ocrd/core-cuda +FROM $BASE_IMAGE AS ocrd_core_base + +WORKDIR /build/core + +COPY Makefile . + +RUN make deps-onnx +# Smoke Test +RUN ocrd --version + +WORKDIR /data + +CMD ["/usr/local/bin/ocrd", "--help"] + diff --git a/Makefile b/Makefile index d6762f393..d10e60b35 100644 --- a/Makefile +++ b/Makefile @@ -87,8 +87,7 @@ endif deps-cuda: PYTHON_PREFIX != $(PYTHON) -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])' deps-cuda: get-conda # Get CUDA toolkit, including compiler and libraries with dev from NVIDIA channels -# Get CUDNN (needed for Torch, TF etc) from conda-forge. -# CUDA runtime libs will be pulled by `pip` for TF and Torch differently anyway, +# CUDA runtime libs will be pulled by `pip` for ONNX, TF and Torch differently anyway, # so do _not_ install them here to avoid wasting space. conda install -c nvidia/label/cuda-12.4.0 cuda-minimal-build \ && conda clean -a && ldconfig @@ -99,6 +98,9 @@ deps-tf2: deps-torch: $(PIP) install torch==2.5.1 torchvision==0.20.1 --extra-index-url https://download.pytorch.org/whl/cu124 -r requirements.txt +deps-onnx: + $(PIP) install "onnxruntime-gpu[cuda,cudnn]" "tensorrt_cu12<11" -r requirements.txt + # deps-*: always mix core's requirements.txt with additional deps, # so pip does not ignore the older version reqs, # but instead tries to find a mutually compatible set. @@ -343,9 +345,15 @@ docker-cuda-torch: DOCKER_FILE = Dockerfile.cuda-torch docker-cuda-torch: docker-cuda +docker-cuda-onnx: DOCKER_BASE_IMAGE = $(DOCKER_BASE_TAG)/core-cuda +docker-cuda-onnx: DOCKER_TAG = $(DOCKER_BASE_TAG:%=%/core-cuda-onnx) +docker-cuda-onnx: DOCKER_FILE = Dockerfile.cuda-onnx + +docker-cuda-onnx: docker-cuda + # if the current ref is a release, then use it as tag instead of :latest -docker docker-cuda docker-cuda-tf2 docker-cuda-torch: GIT_TAG := $(strip $(shell git describe --tags | grep -x "v[0-9]\.[0-9][[0-9]\.[0-9]")) -docker docker-cuda docker-cuda-tf2 docker-cuda-torch: +docker docker-cuda docker-cuda-tf2 docker-cuda-torch docker-cuda-onnx: GIT_TAG := $(strip $(shell git describe --tags | grep -x "v[0-9]\.[0-9][[0-9]\.[0-9]")) +docker docker-cuda docker-cuda-tf2 docker-cuda-torch docker-cuda-onnx: $(DOCKER_BUILD) -f $(DOCKER_FILE) $(DOCKER_TAG:%=-t %) \ $(if $(GIT_TAG),$(DOCKER_TAG:%=-t %:$(GIT_TAG))) \ --target ocrd_core_base \ From 890eea4eac51282aa8f23556c166a4f68cbcdef2 Mon Sep 17 00:00:00 2001 From: Robert Sachunsky Date: Wed, 8 Jul 2026 02:34:54 +0200 Subject: [PATCH 3/5] use patchelf to fix CUDA lib search paths --- Makefile | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index d10e60b35..0e58781d7 100644 --- a/Makefile +++ b/Makefile @@ -84,7 +84,6 @@ get-conda: ; endif # Dependencies for CUDA installation via Conda -deps-cuda: PYTHON_PREFIX != $(PYTHON) -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])' deps-cuda: get-conda # Get CUDA toolkit, including compiler and libraries with dev from NVIDIA channels # CUDA runtime libs will be pulled by `pip` for ONNX, TF and Torch differently anyway, @@ -92,14 +91,24 @@ deps-cuda: get-conda conda install -c nvidia/label/cuda-12.4.0 cuda-minimal-build \ && conda clean -a && ldconfig +deps-tf2: CUDA_RPATH := '$ORIGIN:$ORIGIN/../nvidia/cufft/lib:$ORIGIN/../nvidia/cudnn/lib:$ORIGIN/../nvidia/cusolver/lib:$ORIGIN/../nvidia/cublas/lib:$ORIGIN/../nvidia/cusparse/lib:$ORIGIN/../nvidia/cuda_cupti/lib:$ORIGIN/../nvidia/cuda_runtime/lib:$ORIGIN/../tensorrt_libs' deps-tf2: $(PIP) install "tensorflow[and-cuda]" -r requirements.txt + # fix missing search paths for CUDA runtime libs + cd $(dirname $($(PYTHON) -c 'print(__import__("tensorflow").__file__)')) && \ + patchelf --set-rpath $(CUDA_RPATH) libtensorflow_framework.so.2 && \ + patchelf --set-rpath $(CUDA_RPATH) libtensorflow_cc.so.2 deps-torch: $(PIP) install torch==2.5.1 torchvision==0.20.1 --extra-index-url https://download.pytorch.org/whl/cu124 -r requirements.txt +deps-onnx: CUDA_RPATH := '$ORIGIN/../../nvidia/cudnn/lib:$ORIGIN/../../nvidia/cusolver/lib:$ORIGIN/../../nvidia/cublas/lib:$ORIGIN/../../nvidia/cufft/lib:$ORIGIN/../../nvidia/curand/lib:$ORIGIN/../../nvidia/cusparse/lib:$ORIGIN/../../nvidia/cuda_cupti/lib:$ORIGIN/../../nvidia/cuda_runtime/lib:$ORIGIN/../../tensorrt_libs' deps-onnx: $(PIP) install "onnxruntime-gpu[cuda,cudnn]" "tensorrt_cu12<11" -r requirements.txt + # fix missing search paths for CUDA runtime libs + cd $(dirname $($(PYTHON) -c 'print(__import__("onnxruntime").__file__)'))/capi && \ + patchelf --set-rpath $(CUDA_RPATH) libonnxruntime_providers_cuda.so && \ + patchelf --set-rpath $(CUDA_RPATH) libonnxruntime_providers_tensorrt.so # deps-*: always mix core's requirements.txt with additional deps, # so pip does not ignore the older version reqs, @@ -108,7 +117,7 @@ deps-onnx: # Dependencies for deployment in an ubuntu/debian linux deps-ubuntu: apt-get update - apt-get install -y bzip2 python3 imagemagick libgeos-dev libxml2-dev libxslt-dev libssl-dev + apt-get install -y bzip2 python3 imagemagick libgeos-dev libxml2-dev libxslt-dev libssl-dev patchelf # Dependencies for deployment via Conda deps-conda: get-conda From 7a3c2b702dce4bba8bd0b2540a7c709f8a224c31 Mon Sep 17 00:00:00 2001 From: Robert Sachunsky Date: Wed, 8 Jul 2026 12:09:47 +0200 Subject: [PATCH 4/5] fix make syntax --- Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 0e58781d7..e35f7e020 100644 --- a/Makefile +++ b/Makefile @@ -91,22 +91,22 @@ deps-cuda: get-conda conda install -c nvidia/label/cuda-12.4.0 cuda-minimal-build \ && conda clean -a && ldconfig -deps-tf2: CUDA_RPATH := '$ORIGIN:$ORIGIN/../nvidia/cufft/lib:$ORIGIN/../nvidia/cudnn/lib:$ORIGIN/../nvidia/cusolver/lib:$ORIGIN/../nvidia/cublas/lib:$ORIGIN/../nvidia/cusparse/lib:$ORIGIN/../nvidia/cuda_cupti/lib:$ORIGIN/../nvidia/cuda_runtime/lib:$ORIGIN/../tensorrt_libs' +deps-tf2: CUDA_RPATH := '$$ORIGIN:$$ORIGIN/../nvidia/cufft/lib:$$ORIGIN/../nvidia/cudnn/lib:$$ORIGIN/../nvidia/cusolver/lib:$$ORIGIN/../nvidia/cublas/lib:$$ORIGIN/../nvidia/cusparse/lib:$$ORIGIN/../nvidia/cuda_cupti/lib:$$ORIGIN/../nvidia/cuda_runtime/lib:$$ORIGIN/../tensorrt_libs' deps-tf2: $(PIP) install "tensorflow[and-cuda]" -r requirements.txt # fix missing search paths for CUDA runtime libs - cd $(dirname $($(PYTHON) -c 'print(__import__("tensorflow").__file__)')) && \ + cd $$(dirname `$(PYTHON) -c 'print(__import__("tensorflow").__file__)'`) && \ patchelf --set-rpath $(CUDA_RPATH) libtensorflow_framework.so.2 && \ patchelf --set-rpath $(CUDA_RPATH) libtensorflow_cc.so.2 deps-torch: $(PIP) install torch==2.5.1 torchvision==0.20.1 --extra-index-url https://download.pytorch.org/whl/cu124 -r requirements.txt -deps-onnx: CUDA_RPATH := '$ORIGIN/../../nvidia/cudnn/lib:$ORIGIN/../../nvidia/cusolver/lib:$ORIGIN/../../nvidia/cublas/lib:$ORIGIN/../../nvidia/cufft/lib:$ORIGIN/../../nvidia/curand/lib:$ORIGIN/../../nvidia/cusparse/lib:$ORIGIN/../../nvidia/cuda_cupti/lib:$ORIGIN/../../nvidia/cuda_runtime/lib:$ORIGIN/../../tensorrt_libs' +deps-onnx: CUDA_RPATH := '$$ORIGIN/../../nvidia/cudnn/lib:$$ORIGIN/../../nvidia/cusolver/lib:$$ORIGIN/../../nvidia/cublas/lib:$$ORIGIN/../../nvidia/cufft/lib:$$ORIGIN/../../nvidia/curand/lib:$$ORIGIN/../../nvidia/cusparse/lib:$$ORIGIN/../../nvidia/cuda_cupti/lib:$$ORIGIN/../../nvidia/cuda_runtime/lib:$$ORIGIN/../../tensorrt_libs' deps-onnx: $(PIP) install "onnxruntime-gpu[cuda,cudnn]" "tensorrt_cu12<11" -r requirements.txt # fix missing search paths for CUDA runtime libs - cd $(dirname $($(PYTHON) -c 'print(__import__("onnxruntime").__file__)'))/capi && \ + cd $$(dirname `$(PYTHON) -c 'print(__import__("onnxruntime").__file__)'`)/capi && \ patchelf --set-rpath $(CUDA_RPATH) libonnxruntime_providers_cuda.so && \ patchelf --set-rpath $(CUDA_RPATH) libonnxruntime_providers_tensorrt.so From cdb08c302da9a9809eef67174b319c8eabc8299f Mon Sep 17 00:00:00 2001 From: Robert Sachunsky Date: Wed, 15 Jul 2026 04:24:21 +0200 Subject: [PATCH 5/5] os.is_git_url: silence stderr --- src/ocrd_utils/os.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ocrd_utils/os.py b/src/ocrd_utils/os.py index 58dadc22d..caaf9466c 100644 --- a/src/ocrd_utils/os.py +++ b/src/ocrd_utils/os.py @@ -83,7 +83,7 @@ def unzip_file_to_dir(path_to_zip : Union[str, PathLike], output_directory : str @lru_cache() def is_git_url(url: str) -> bool: try: - run(['git', 'ls-remote', '--exit-code', '-q', '-h', url], check=True) + run(['git', 'ls-remote', '--exit-code', '-q', '-h', url], check=True, capture_output=True) except CalledProcessError: return False return True