From 25b3ef09512d0b5e83f85d4fc9320e91d17de05e Mon Sep 17 00:00:00 2001 From: Timur Rvachov Date: Sat, 28 Dec 2024 19:14:07 -0800 Subject: [PATCH] ARM build fixes --- Dockerfile.arm | 74 ++++++++++++++++++++---------- arm_build/decord_ffmpeg6_fix.patch | 73 +++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+), 25 deletions(-) create mode 100644 arm_build/decord_ffmpeg6_fix.patch diff --git a/Dockerfile.arm b/Dockerfile.arm index 89f452c96d..c65f05f715 100644 --- a/Dockerfile.arm +++ b/Dockerfile.arm @@ -93,17 +93,17 @@ RUN rm -rf /build # Addressing Security Scan Vulnerabilities RUN rm -rf /opt/pytorch/pytorch/third_party/onnx -RUN apt-get update && \ - apt-get install -y openssh-client=1:8.9p1-3ubuntu0.10 && \ - rm -rf /var/lib/apt/lists/* -RUN apt purge -y libslurm37 libpmi2-0 && \ +# RUN apt-get update && \ +# apt-get install -y openssh-client=1:8.9p1-3ubuntu0.10 && \ +# rm -rf /var/lib/apt/lists/* +RUN apt purge -y libpmi2-0 && \ apt autoremove -y -RUN source /usr/local/nvm/nvm.sh && \ - NODE_VER=$(nvm current) && \ - nvm deactivate && \ - nvm uninstall $NODE_VER && \ - sed -i "/NVM/d" /root/.bashrc && \ - sed -i "/nvm.sh/d" /etc/bash.bashrc +# RUN source /usr/local/nvm/nvm.sh && \ +# NODE_VER=$(nvm current) && \ +# nvm deactivate && \ +# nvm uninstall $NODE_VER && \ +# sed -i "/NVM/d" /root/.bashrc && \ +# sed -i "/nvm.sh/d" /etc/bash.bashrc # Use UV to install python packages from the workspace. This just installs packages into the system's python # environment, and does not use the current uv.lock file. @@ -133,19 +133,43 @@ COPY --from=rust-env /usr/local/rustup /usr/local/rustup ENV PATH="/usr/local/cargo/bin:/usr/local/rustup/bin:${PATH}" ENV RUSTUP_HOME="/usr/local/rustup" -# Build decord +# # Build decord +# This needs a specific version of ffmpeg: +# root@e1fc53d00844:/workspace/bionemo2# ffmpeg -version +# ffmpeg version 4.4.2-0ubuntu0.22.04.1 Copyright (c) 2000-2021 the FFmpeg developers +# built with gcc 11 (Ubuntu 11.2.0-19ubuntu1) +# configuration: --prefix=/usr --extra-version=0ubuntu0.22.04.1 --toolchain=hardened --libdir=/usr/lib/aarch64-linux-gnu --incdir=/usr/include/aarch64-linux-gnu --arch=arm64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-pocketsphinx --enable-librsvg --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared +# libavutil 56. 70.100 / 56. 70.100 +# libavcodec 58.134.100 / 58.134.100 +# libavformat 58. 76.100 / 58. 76.100 +# libavdevice 58. 13.100 / 58. 13.100 +# libavfilter 7.110.100 / 7.110.100 +# libswscale 5. 9.100 / 5. 9.100 +# libswresample 3. 9.100 / 3. 9.100 +# libpostproc 55. 9.100 / 55. 9.100 +# +# Issue link: https://github.com/dmlc/decord/issues/257 +# Diff to make it all work https://github.com/dmlc/decord/issues/186#issuecomment-1171882325 + +# Consider this: +# sudo apt install libnvidia-decode-550 +# cp /usr/lib/aarch64-linux-gnu/libnvcuvid* /usr/local/cuda/ +# cmake .. -DUSE_CUDA=ON -DCMAKE_BUILD_TYPE=Release + RUN apt-get update && \ apt-get install -y build-essential python3-dev python3-setuptools make cmake && \ - apt-get install -y ffmpeg libavcodec-dev libavfilter-dev libavformat-dev libavutil-dev && \ - git clone --recursive https://github.com/dmlc/decord && \ - cd decord && \ - mkdir build && cd build && \ - cmake .. -DUSE_CUDA=0 -DCMAKE_BUILD_TYPE=Release && \ - make && \ - cd ../python && \ - pip install . && \ - cd ${WORKDIR} && \ - rm -rf decord + apt-get install -y ffmpeg libavcodec-dev libavfilter-dev libavformat-dev libavutil-dev +# && cp /usr/lib/aarch64-linux-gnu/libnvcuvid* /usr/local/cuda/ +RUN --mount=type=bind,source=./arm_build/decord_ffmpeg6_fix.patch,target=/decord_ffmpeg6_fix.patch \ + git clone --recursive https://github.com/dmlc/decord && \ + cd decord && git apply /decord_ffmpeg6_fix.patch && \ + mkdir build && cd build && \ + cmake .. -DUSE_CUDA=0 -DCMAKE_BUILD_TYPE=Release && \ + make && \ + cd ../python && \ + pip install . && \ + cd ${WORKDIR} && \ + rm -rf decord RUN pip install --upgrade pip setuptools RUN pip install setuptools_scm py-cpuinfo @@ -183,14 +207,14 @@ RUN --mount=type=bind,source=./.git,target=./.git \ pip install --use-deprecated=legacy-resolver --no-build-isolation --break-system-packages \ tensorstore==0.1.45 -RUN sed -i 's/^Version: 0\.0\.0$/Version: 0.1.45/' /usr/local/lib/python3.12/dist-packages/tensorstore-0.0.0.dist-info/METADATA && mv /usr/local/lib/python3.12/dist-packages/tensorstore-0.0.0.dist-info /usr/local/lib/python3.12/dist-packages/tensorstore-0.1.45.dist-info - -RUN pip show tensorstore - +# For some reason, we do not need to do the tensorstore verson package hack on arm64 +# RUN sed -i 's/^Version: 0\.0\.0$/Version: 0.1.45/' /usr/local/lib/python3.12/dist-packages/tensorstore-0.0.0.dist-info/METADATA && mv /usr/local/lib/python3.12/dist-packages/tensorstore-0.0.0.dist-info /usr/local/lib/python3.12/dist-packages/tensorstore-0.1.45.dist-info RUN --mount=type=bind,source=./.git,target=./.git \ --mount=type=bind,source=./requirements-test.txt,target=/requirements-test.txt \ --mount=type=bind,source=./requirements-cve.txt,target=/requirements-cve.txt \ +# Comment out mamba install in NeMo as this causes issues. + sed -i "/mamba-ssm/d" ./3rdparty/NeMo/requirements/requirements_nlp.txt && \ uv pip install --no-build-isolation --break-system-packages \ ./3rdparty/* \ ./sub-packages/bionemo-* \ diff --git a/arm_build/decord_ffmpeg6_fix.patch b/arm_build/decord_ffmpeg6_fix.patch new file mode 100644 index 0000000000..cac6892280 --- /dev/null +++ b/arm_build/decord_ffmpeg6_fix.patch @@ -0,0 +1,73 @@ +# This is a patch file for decord https://github.com/dmlc/decord +# needed to build decord against ffmpeg6, taken from +# https://github.com/dmlc/decord/issues/186#issuecomment-1171882325 +# This needs to be removed once decord natively supports latest ffmpeg versions. +diff --git a/src/video/ffmpeg/ffmpeg_common.h b/src/video/ffmpeg/ffmpeg_common.h +index b0b973f..f0f7316 100644 +--- a/src/video/ffmpeg/ffmpeg_common.h ++++ b/src/video/ffmpeg/ffmpeg_common.h +@@ -21,6 +21,7 @@ + extern "C" { + #endif + #include ++#include + #include + #include + #include +diff --git a/src/video/nvcodec/cuda_threaded_decoder.cc b/src/video/nvcodec/cuda_threaded_decoder.cc +index 62bc7ee..957a90d 100644 +--- a/src/video/nvcodec/cuda_threaded_decoder.cc ++++ b/src/video/nvcodec/cuda_threaded_decoder.cc +@@ -17,7 +17,7 @@ namespace decord { + namespace cuda { + using namespace runtime; + +-CUThreadedDecoder::CUThreadedDecoder(int device_id, AVCodecParameters *codecpar, AVInputFormat *iformat) ++CUThreadedDecoder::CUThreadedDecoder(int device_id, AVCodecParameters *codecpar, const AVInputFormat *iformat) + : device_id_(device_id), stream_({device_id, false}), device_{}, ctx_{}, parser_{}, decoder_{}, + pkt_queue_{}, frame_queue_{}, + run_(false), frame_count_(0), draining_(false), +@@ -70,7 +70,7 @@ CUThreadedDecoder::CUThreadedDecoder(int device_id, AVCodecParameters *codecpar, + } + } + +-void CUThreadedDecoder::InitBitStreamFilter(AVCodecParameters *codecpar, AVInputFormat *iformat) { ++void CUThreadedDecoder::InitBitStreamFilter(AVCodecParameters *codecpar, const AVInputFormat *iformat) { + const char* bsf_name = nullptr; + if (AV_CODEC_ID_H264 == codecpar->codec_id) { + // H.264 +diff --git a/src/video/nvcodec/cuda_threaded_decoder.h b/src/video/nvcodec/cuda_threaded_decoder.h +index d7e6fcd..61958a1 100644 +--- a/src/video/nvcodec/cuda_threaded_decoder.h ++++ b/src/video/nvcodec/cuda_threaded_decoder.h +@@ -46,7 +46,7 @@ class CUThreadedDecoder final : public ThreadedDecoderInterface { + using FrameOrderQueuePtr = std::unique_ptr; + + public: +- CUThreadedDecoder(int device_id, AVCodecParameters *codecpar, AVInputFormat *iformat); ++ CUThreadedDecoder(int device_id, AVCodecParameters *codecpar, const AVInputFormat *iformat); + void SetCodecContext(AVCodecContext *dec_ctx, int width = -1, int height = -1, int rotation = 0); + bool Initialized() const; + void Start(); +@@ -70,7 +70,7 @@ class CUThreadedDecoder final : public ThreadedDecoderInterface { + void LaunchThreadImpl(); + void RecordInternalError(std::string message); + void CheckErrorStatus(); +- void InitBitStreamFilter(AVCodecParameters *codecpar, AVInputFormat *iformat); ++ void InitBitStreamFilter(AVCodecParameters *codecpar, const AVInputFormat *iformat); + + int device_id_; + CUStream stream_; +diff --git a/src/video/video_reader.cc b/src/video/video_reader.cc +index af4858d..99c9635 100644 +--- a/src/video/video_reader.cc ++++ b/src/video/video_reader.cc +@@ -145,7 +145,7 @@ VideoReader::~VideoReader(){ + + void VideoReader::SetVideoStream(int stream_nb) { + if (!fmt_ctx_) return; +- AVCodec *dec; ++ const AVCodec *dec; + int st_nb = av_find_best_stream(fmt_ctx_.get(), AVMEDIA_TYPE_VIDEO, stream_nb, -1, &dec, 0); + // LOG(INFO) << "find best stream: " << st_nb; + CHECK_GE(st_nb, 0) << "ERROR cannot find video stream with wanted index: " << stream_nb;