是否可以在docker内加速ImageMagick -kmeans?

问题描述 投票:0回答:1

我正在使用 ImageMagick 版本 7 中的 kmeans 功能。

time convert in.png -kmeans 20 out.png

这个命令在我的机器上完成得相当快(

1.7s
)

但是,当在 docker 中运行时,速度要慢得多(

48.8s
)。

我在同一台机器上尝试过 docker,也在 AWS Lambda 中尝试过 docker。我使用什么类型的图像似乎也不重要。 docker 内到处都是同样慢的速度。

我正在使用这个 docker:

FROM amazon/aws-lambda-nodejs:20.2024.02.07.18 as build
并通过源代码编译 ImageMagic 7(因为只有 ImageMagick 版本
6
可以通过 AmazonLinux2023 上的
dnf
作为软件包使用)。

我编译 ImageMagick 时可能做错了什么吗?缺少库或某种优化?

这是在 docker 中运行的 ImageMagick 版本:

bash-5.2# convert -version
Version: ImageMagick 7.1.1-29 Q16-HDRI x86_64 cfc71f0aa:20240225 https://imagemagick.org
Copyright: (C) 1999 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI 
Delegates (built-in): bzlib fontconfig freetype jng jpeg lzma png xml zlib
Compiler: gcc (11.4)

这是直接在我的机器上运行的速度更快的 ImageMagick:

Version: ImageMagick 7.1.1-25 Q16-HDRI aarch64 21883 https://imagemagick.org
Copyright: (C) 1999 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI Modules OpenMP(5.0) 
Delegates (built-in): bzlib fontconfig freetype gslib heic jng jp2 jpeg jxl lcms lqr ltdl lzma openexr png ps raw tiff webp xml zlib zstd
Compiler: gcc (4.2)

为了在 Docker 中编译 ImageMagick,我使用了这种方法:

FROM amazon/aws-lambda-nodejs:20.2024.02.07.18 as build
RUN dnf -y update && dnf install -y g++ gdb ninja-build gcc cpp cmake make automake autoconf chkconfig pkgconfig clang clang-libs gcc-c++ dos2unix bzip2 bzip2-libs zlib-devel libpng libpng-tools libpng-devel openjpeg2 openjpeg2-tools openjpeg2-devel libwebp-devel giflib-devel fftw-libs fontconfig-devel libtool xz xz-libs tar bc && dnf clean all
ADD build /root/build
RUN /root/build/imagemagick.sh

使用此构建脚本:

#!/usr/bin/env bash
set -e

# libjpg

cd /root
curl https://github.com/winlibs/libjpeg/archive/refs/tags/libjpeg-9c.tar.gz -L -o tmp-libjpeg.tar.gz
tar xf tmp-libjpeg.tar.gz
cd libjpeg*

dos2unix *
dos2unix -f configure
chmod +x configure

PKG_CONFIG_PATH=/root/build/cache/lib/pkgconfig \
  ./configure \
    CPPFLAGS=-I/root/build/cache/include \
    LDFLAGS=-L/root/build/cache/lib \
    --disable-dependency-tracking \
    --disable-shared \
    --enable-static \
    --prefix=/root/build/cache

dos2unix -f libtool

make
make install

# libpng

cd /root
curl http://prdownloads.sourceforge.net/libpng/libpng-1.6.37.tar.xz -L -o tmp-libpng.tar.xz
tar xf tmp-libpng.tar.xz
cd libpng*

PKG_CONFIG_PATH=/root/build/cache/lib/pkgconfig \
  ./configure \
    CPPFLAGS=-I/root/build/cache/include \
    LDFLAGS=-L/root/build/cache/lib \
    --disable-dependency-tracking \
    --disable-shared \
    --enable-static \
    --prefix=/root/build/cache

make
make install

# imagemagick

cd /root
curl https://github.com/ImageMagick/ImageMagick/archive/refs/tags/7.1.1-29.tar.gz -L -o tmp-imagemagick.tar.gz
tar xf tmp-imagemagick.tar.gz
cd ImageMagick*

PKG_CONFIG_PATH=/root/build/cache/lib/pkgconfig \
  ./configure \
    CPPFLAGS=-I/root/build/cache/include \
    LDFLAGS="-L/root/build/cache/lib -lstdc++" \
    --disable-dependency-tracking \
    --disable-shared \
    --enable-static \
    --prefix=/root/result \
    --enable-delegate-build \
    --disable-installed \
    --without-modules \
    --disable-docs \
    --without-magick-plus-plus \
    --without-perl \
    --without-x \
    --disable-openmp \
    --with-openjp2=no \
    --with-webp=no \
    --with-tiff=no

make clean
make all
make install

*编辑:在读到它可以提高性能后,我也尝试在没有

disable-openmp
的情况下重新编译。使用和不使用该编译选项的时间相同。

docker compilation imagemagick
1个回答
0
投票

这里有一些你可以尝试的事情...


在两台机器上运行以下命令,查看每个版本构建时使用的确切选项并比较输出:

identify -list configure

尝试构建 Q8 版本,看看是否更快:

./configure --with-quantum-depth=8 ...

尝试使用编译器优化并针对您机器的确切架构,具体取决于您的编译器:

./configure CFLAGS="-O3 -march=native" CPPFLAGS="-O3 -march=native" ...

尝试禁用 OpenCL:

./conigure --disable-opencl ...

检查您的 docker 配置文件,了解它为您的容器提供了多少 RAM 和多少 CPU 核心。

© www.soinside.com 2019 - 2024. All rights reserved.