Skip to content

Commit 37d4656

Browse files
committed
Try to build GPU binary within old glibc docker for compatibility
1 parent 35537c4 commit 37d4656

File tree

2 files changed

+96
-36
lines changed

2 files changed

+96
-36
lines changed

Diff for: .github/workflows/Dockerfile.GPU-manylinux2014

+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
FROM quay.io/pypa/manylinux2014_x86_64
2+
ARG VER="12-6"
3+
ARG ARCH="x86_64"
4+
5+
# CUDA
6+
RUN yum install -y yum-utils
7+
RUN yum-config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel8/x86_64/cuda-rhel8.repo
8+
# libcublas-devel-${VER}.${ARCH}
9+
RUN yum -y install cuda-nvcc-${VER}.${ARCH} cuda-cudart-devel-${VER}.${ARCH}
10+
RUN echo "/usr/local/cuda/lib64" >> /etc/ld.so.conf.d/999_nvidia_cuda.conf
11+
ENV PATH="/usr/local/cuda/bin:${PATH}"
12+
ENV LD_LIBRARY_PATH="/usr/local/cuda/lib64:${LD_LIBRARY_PATH}"
13+
ENV CUDA_HOME=/usr/local/cuda
14+
ENV CUDA_ROOT=/usr/local/cuda
15+
ENV CUDA_PATH=/usr/local/cuda
16+
ENV CUDADIR=/usr/local/cuda
17+
18+
# Build system
19+
RUN yum install -y git wget vim zlib-devel bzip2-devel ninja-build centos-release-scl
20+
RUN mv /etc/yum.repos.d/CentOS-SCLo-scl.repo /etc/yum.repos.d/CentOS-SCLo-scl.repo.disabled
21+
RUN yum install -y devtoolset-11-gcc devtoolset-11-gcc-c++ devtoolset-11-libatomic-devel
22+
ENV CC=/opt/rh/devtoolset-11/root/bin/gcc
23+
ENV CXX=/opt/rh/devtoolset-11/root/bin/g++
24+
ENV CUDAHOSTCXX=/opt/rh/devtoolset-11/root/bin/g++
25+
ENV CUDACXX=/usr/local/cuda/bin/nvcc
26+
ENV LIBGCC=/opt/rh/devtoolset-11/root/usr/lib/gcc/x86_64-redhat-linux/11
27+
28+
# cmake
29+
RUN wget https://github.com/Kitware/CMake/releases/download/v3.31.0/cmake-3.31.0-linux-x86_64.sh; \
30+
chmod +x cmake-3.31.0-linux-x86_64.sh; \
31+
./cmake-3.31.0-linux-x86_64.sh --skip-license --prefix=/usr/local;
32+
33+
RUN mkdir /deps; \
34+
cd /deps; \
35+
wget https://sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz; \
36+
tar xzvf bzip2-1.0.8.tar.gz; \
37+
cd bzip2-1.0.8; \
38+
make install PREFIX=/deps;
39+
40+
RUN cd /deps; \
41+
wget https://www.zlib.net/zlib-1.3.1.tar.gz; \
42+
tar xzvf zlib-1.3.1.tar.gz; \
43+
cd zlib-1.3.1; \
44+
./configure --prefix=/deps --static; \
45+
make install;
46+
47+
# compile
48+
WORKDIR /work
49+
ADD . .
50+
RUN mkdir -p /work/build && cd /work/build; \
51+
if [ -e "${LIBGCC}/libgomp.so" ]; then \
52+
mv -f -- "${LIBGCC}/libgomp.so" "${LIBGCC}/libgomp.so.disabled"; \
53+
fi; \
54+
/usr/local/bin/cmake -GNinja -DCMAKE_BUILD_TYPE=Release -DHAVE_TESTS=1 -DENABLE_WERROR=1 -DHAVE_AVX2=1 \
55+
-DOpenMP_C_FLAGS="-fopenmp -I${LIBGCC} -L${LIBGCC}" -DOpenMP_C_LIB_NAMES=gomp -DOpenMP_CXX_FLAGS="-fopenmp -I${LIBGCC} -L${LIBGCC}" -DOpenMP_CXX_LIB_NAMES=gomp -DOpenMP_gomp_LIBRARY="${LIBGCC}/libgomp.a" \
56+
-DATOMIC_LIB_OVERRIDE="${LIBGCC}/libatomic.a" \
57+
-DCMAKE_POLICY_DEFAULT_CMP0074=NEW -DCMAKE_POLICY_DEFAULT_CMP0144=NEW \
58+
-DZLIB_ROOT=/deps -DBZIP2_ROOT=/deps \
59+
-DFORCE_STATIC_DEPS=1 -DENABLE_CUDA=1 -DCMAKE_CUDA_ARCHITECTURES="75-real;80-real;86-real;89-real;90" ..; \
60+
cmake --build . -j$(nproc --all) -v;
61+
62+
RUN if ldd /work/build/src/mmseqs | grep -P -v "linux-vdso.so|/lib64/(ld-linux-x86-64|libc|libm|libdl|librt|libpthread).so" | grep -q .; then \
63+
echo "Error: unwanted libraries found"; \
64+
ldd /work/build/src/mmseqs; \
65+
exit 1; \
66+
fi; \
67+
if readelf -Ws /work/build/src/mmseqs | grep -q GLIBC_PRIVATE; then \
68+
echo "Error: binary contains private glibc symbols"; \
69+
readelf -Ws /work/build/src/mmseqs; \
70+
exit 1; \
71+
fi; \
72+
LIBC_V=$(readelf -V /work/build/src/mmseqs | awk '$3 ~ /^GLIBC_/ { print $3 }' | sort -V | tail -n1); \
73+
if [[ "$LIBC_V" > "GLIBC_2.17" ]]; then \
74+
echo "Error: glibc too new"; \
75+
readelf -V /work/build/src/mmseqs; \
76+
exit 1; \
77+
fi;

Diff for: azure-pipelines.yml

+19-36
Original file line numberDiff line numberDiff line change
@@ -137,43 +137,26 @@ jobs:
137137
steps:
138138
- checkout: self
139139
submodules: false
140-
- script: |
141-
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-keyring_1.1-1_all.deb
142-
sudo dpkg -i cuda-keyring_1.1-1_all.deb
143-
sudo apt-get update
144-
sudo apt-get install -y gcc-10 g++-10 cuda-nvcc-12-6 cuda-cudart-dev-12-6 build-essential libgcc-10-dev ninja-build
145-
sudo apt-get purge -y cmake
146-
wget https://github.com/Kitware/CMake/releases/download/v3.31.0/cmake-3.31.0-linux-x86_64.sh
147-
chmod +x cmake-3.31.0-linux-x86_64.sh
148-
sudo ./cmake-3.31.0-linux-x86_64.sh --skip-license --prefix=/usr/local
149-
displayName: Install newer G++
150-
- script: |
151-
mkdir build && cd build
152-
export CC=gcc-10 ; export CXX=g++-10; export CUDAHOSTCXX=$CXX; export CUDACXX=/usr/local/cuda/bin/nvcc;
153-
LIBGCC=/usr/lib/gcc/x86_64-linux-gnu/10;
154-
/usr/local/bin/cmake -GNinja -DCMAKE_BUILD_TYPE=Release -DHAVE_TESTS=1 -DENABLE_WERROR=1 -DHAVE_AVX2=1 \
155-
-DOpenMP_C_FLAGS="-fopenmp -I${LIBGCC}" -DOpenMP_C_LIB_NAMES=gomp -DOpenMP_CXX_FLAGS="-fopenmp -I${LIBGCC}" -DOpenMP_CXX_LIB_NAMES=gomp -DOpenMP_gomp_LIBRARY=${LIBGCC}/libgomp.a \
156-
-DATOMIC_LIB_OVERRIDE=${LIBGCC}/libatomic.a \
157-
-DFORCE_STATIC_DEPS=1 -DENABLE_CUDA=1 -DCMAKE_CUDA_ARCHITECTURES="75-real;80-real;86-real;89-real;90" ..
158-
cmake --build . -j$(nproc --all) -v
159-
# fail if GLIBC_PRIVATE or too new GLIBC is present
160-
if readelf -Ws src/mmseqs | grep -q GLIBC_PRIVATE; then
161-
echo "Error: binary contains private glibc symbols"
162-
exit 1
163-
fi
164-
LIBC_V=$(readelf -V src/mmseqs | awk '$3 ~ /^GLIBC_/ { print $3 }' | sort -V | tail -n1)
165-
if [[ "$LIBC_V" > "GLIBC_2.29" ]]; then
166-
echo "Error: glibc too new"
167-
exit 1
168-
fi
169-
if readelf -d src/mmseqs | grep -q "libatomic.so"; then
170-
echo "Error: libatomic.so is present as a dependency"
171-
exit 1
172-
fi
173-
displayName: Build MMseqs2
174-
- task: PublishPipelineArtifact@0
140+
- task: Docker@2
141+
displayName: Build Docker Image
175142
inputs:
176-
targetPath: $(Build.SourcesDirectory)/build/src/mmseqs
143+
command: build
144+
dockerfile: '.github/workflows/Dockerfile.GPU-manylinux2014'
145+
tags: |
146+
manylinux-latest:latest
147+
buildContext: '$(Build.SourcesDirectory)'
148+
- script: mkdir -p ${BUILD_SOURCESDIRECTORY}/output
149+
- task: Docker@2
150+
displayName: Run Build in Docker
151+
inputs:
152+
command: run
153+
imageName: 'manylinux-latest:latest'
154+
options: >
155+
-v $(Build.SourcesDirectory)/output:/output
156+
arguments: /bin/bash -c "cp /work/build/src/mmseqs /output/"
157+
- task: PublishPipelineArtifact@1
158+
inputs:
159+
targetPath: $(Build.SourcesDirectory)/output/mmseqs
177160
artifactName: mmseqs-linux-gpu
178161

179162
- job: build_ubuntu_cross

0 commit comments

Comments
 (0)