diff --git a/Dockerfile b/Dockerfile index 51a6c15..fbcf595 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,98 +1,74 @@ -# bring in the micromamba image so we can copy files from it -FROM mambaorg/micromamba:1.5.8 as micromamba - -# This is the image we are going add micromaba to: -FROM cp2k/cp2k:2023.2_openmpi_generic_psmp - -USER root - -# if your image defaults to a non-root user, then you may want to make the -# next 3 ARG commands match the values in your image. You can get the values -# by running: docker run --rm -it my/image id -a -ARG MAMBA_USER=mambauser -ARG MAMBA_USER_ID=57439 -ARG MAMBA_USER_GID=57439 -ENV MAMBA_USER=$MAMBA_USER -ENV MAMBA_ROOT_PREFIX="/opt/conda" -ENV MAMBA_EXE="/bin/micromamba" - -COPY --from=micromamba "$MAMBA_EXE" "$MAMBA_EXE" -COPY --from=micromamba /usr/local/bin/_activate_current_env.sh /usr/local/bin/_activate_current_env.sh -COPY --from=micromamba /usr/local/bin/_dockerfile_shell.sh /usr/local/bin/_dockerfile_shell.sh -COPY --from=micromamba /usr/local/bin/_entrypoint.sh /usr/local/bin/_entrypoint.sh -COPY --from=micromamba /usr/local/bin/_dockerfile_initialize_user_accounts.sh /usr/local/bin/_dockerfile_initialize_user_accounts.sh -COPY --from=micromamba /usr/local/bin/_dockerfile_setup_root_prefix.sh /usr/local/bin/_dockerfile_setup_root_prefix.sh - -RUN apt-get update -RUN apt-get install ca-certificates git -y -RUN update-ca-certificates - -RUN /usr/local/bin/_dockerfile_initialize_user_accounts.sh && \ - /usr/local/bin/_dockerfile_setup_root_prefix.sh - -# modify entrypoint to also activate cp2k, but do not set up the included (lib)torch -RUN head -n -1 /usr/local/bin/_entrypoint.sh > /usr/local/bin/entry.sh -RUN sed '/torch/Id' /opt/cp2k/tools/toolchain/install/setup > /opt/cp2k/tools/toolchain/install/setup_notorch -RUN echo "source /opt/cp2k/tools/toolchain/install/setup_notorch\n" >> /usr/local/bin/entry.sh -RUN echo "export PATH=\"/opt/cp2k/exe/local:\${PATH}\"\n" >> /usr/local/bin/entry.sh - -RUN echo "exec \"\$@\"" >> /usr/local/bin/entry.sh -RUN chmod +x /usr/local/bin/entry.sh - -USER $MAMBA_USER - -SHELL ["/usr/local/bin/_dockerfile_shell.sh"] - -ENTRYPOINT ["/usr/local/bin/entry.sh"] -# Optional: if you want to customize the ENTRYPOINT and have a conda -# environment activated, then do this: -# ENTRYPOINT ["/usr/local/bin/_entrypoint.sh", "my_entrypoint_program"] - -# You can modify the CMD statement as needed.... -CMD ["/bin/bash"] - -RUN micromamba install -n base --yes -c conda-forge \ - python=3.10 pip ndcctools py-plumed && \ - micromamba clean -af --yes -ARG MAMBA_DOCKERFILE_ACTIVATE=1 # (otherwise python will not be found) - -RUN pip install --no-cache-dir wandb plotly plumed -RUN pip install --no-cache-dir git+https://github.com/lab-cosmo/i-pi.git@feat/socket_prefix +FROM ubuntu:22.04 + +ENV DEBIAN_FRONTEND=noninteractive +ENV TZ=Etc/UTC + +RUN apt-get update && apt-get install -y \ + python3.10 \ + python3.10-venv \ + python3.10-dev \ + build-essential \ + cmake \ + wget \ + git \ + zlib1g-dev \ + libssl-dev \ + libcurl4-openssl-dev \ + libgsl-dev \ + perl \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +RUN python3.10 -m venv /opt/venv \ + && /opt/venv/bin/pip install --upgrade pip + +# Install PLUMED +ARG PLUMED_VERSION +RUN wget https://github.com/plumed/plumed2/archive/refs/tags/v${PLUMED_VERSION}.tar.gz \ + && tar -xzf v${PLUMED_VERSION}.tar.gz \ + && cd plumed2-${PLUMED_VERSION} \ + && ./configure --prefix=/usr/local/plumed \ + && make -j$(nproc) \ + && make install \ + && cd .. \ + && rm -rf plumed2-${PLUMED_VERSION} v${PLUMED_VERSION}.tar.gz + +# Ensure cctools can find the Python environment +ENV PYTHONPATH="/opt/venv/lib/python3.10/site-packages:$PYTHONPATH" +ENV PATH="/opt/venv/bin:$PATH" + +# Install cctools +ARG CCTOOLS_VERSION +RUN wget https://github.com/cooperative-computing-lab/cctools/archive/refs/tags/release/${CCTOOLS_VERSION}.tar.gz \ + && tar -xzf ${CCTOOLS_VERSION}.tar.gz \ + && cd cctools-release-${CCTOOLS_VERSION} \ + && ./configure --prefix=/usr/local/cctools \ + && make -j$(nproc) \ + && make install \ + && cd .. \ + && rm -rf cctools-release-${CCTOOLS_VERSION} ${CCTOOLS_VERSION}.tar.gz + +# Set environment variables for PLUMED and cctools +ENV PATH="/usr/local/plumed/bin:/usr/local/cctools/bin:$PATH" +ENV LD_LIBRARY_PATH="/usr/local/plumed/lib:/usr/local/cctools/lib:$LD_LIBRARY_PATH" + +# Create entrypoint script +RUN echo '#!/bin/bash\nsource /opt/venv/bin/activate\nexec "$@"' > /usr/local/bin/entrypoint.sh +RUN chmod +x /usr/local/bin/entrypoint.sh + +ARG PSIFLOW_VERSION +ARG PARSL_VERSION ARG GPU_LIBRARY -RUN pip install --no-cache-dir torch==2.1 --index-url https://download.pytorch.org/whl/${GPU_LIBRARY} -RUN pip install --no-cache-dir git+https://github.com/acesuit/mace.git@v0.3.3 -ARG GIT_COMMIT_SHA -RUN pip install --no-cache-dir git+https://github.com/molmod/psiflow.git@ipi - - -# install GPAW with MPI from cp2k -#USER root -#RUN git clone https://gitlab.com/libxc/libxc.git && \ -#cd libxc && \ -#apt install autogen autoconf libtool && \ -#autoreconf -i && \ -#./configure && \ -#make && \ -#make check && \ -#make install -USER root -RUN apt install libxc-dev -y -USER $MAMBA_USER -RUN source /opt/cp2k/tools/toolchain/install/setup && \ -export C_INCLUDE_PATH=$CPATH && \ -export LIBRARY_PATH=$LD_LIBRARY_PATH && \ -echo "C INCLUDE PATH" $C_INCLUDE_PATH && \ -pip install gpaw -USER root -RUN mkdir /opt/gpaw-data -RUN yes | gpaw install-data /opt/gpaw-data || true -ENV GPAW_SETUP_PATH=/opt/gpaw-data -USER $MAMBA_USER - -#RUN echo "export GPAW_SETUP_PATH=\"/opt/gpaw-data\n" >> /usr/local/bin/entry.sh - -#ENV C_INCLUDE_PATH=$CPATH -#RUN echo "export C_INCLUDE_PATH=\${CPATH}\"\n" >> /usr/local/bin/entry.sh -#RUN /usr/local/bin/entry.sh -#RUN echo "source /opt/cp2k/tools/toolchain/install/setup_notorch\n" >> /usr/local/bin/entry_gpaw.sh -#RUN echo "source /opt/cp2k/tools/toolchain/install/setup_notorch\n" >> /usr/local/bin/entry_gpaw.sh +RUN /bin/bash -c -o pipefail \ + "source /opt/venv/bin/activate && \ + pip install --no-cache-dir wandb plotly plumed && \ + pip install --no-cache-dir git+https://github.com/lab-cosmo/i-pi.git@feat/socket_prefix && \ + pip install --no-cache-dir git+https://github.com/molmod/psiflow.git@${PSIFLOW_VERSION} && \ + pip install --no-cache-dir torch==2.1 --index-url https://download.pytorch.org/whl/${GPU_LIBRARY} && \ + pip install --no-cache-dir git+https://github.com/acesuit/mace.git@v0.3.3" + +# Set entrypoint +ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] + +# Default command +CMD ["bash"] diff --git a/Dockerfile.cp2k b/Dockerfile.cp2k new file mode 100644 index 0000000..ad72746 --- /dev/null +++ b/Dockerfile.cp2k @@ -0,0 +1,110 @@ +# +# This file was created by generate_docker_files.py +# +# Usage: docker build -f ./2023.2_openmpi_generic_psmp.Dockerfile -t cp2k/cp2k:2023.2_openmpi_generic_psmp . + +# Stage 1: build step +FROM ubuntu:22.04 AS build + + +# Install packages required for the CP2K toolchain build +RUN apt-get update -qq && apt-get install -qq --no-install-recommends \ + g++ gcc gfortran openssh-client python3 \ + bzip2 ca-certificates git make patch pkg-config unzip wget zlib1g-dev + +# Download CP2K +RUN git clone --recursive -b support/v2023.2 https://github.com/cp2k/cp2k.git /opt/cp2k + +# Build CP2K toolchain for target CPU generic +WORKDIR /opt/cp2k/tools/toolchain +RUN /bin/bash -c -o pipefail \ + "./install_cp2k_toolchain.sh -j 8 \ + --install-all \ + --enable-cuda=no \ + --target-cpu=generic \ + --with-cusolvermp=no \ + --with-gcc=system \ + --with-openmpi=install \ + --with-libtorch=no" + +# Build CP2K for target CPU generic +WORKDIR /opt/cp2k +RUN /bin/bash -c -o pipefail \ + "cp ./tools/toolchain/install/arch/local.psmp ./arch/; \ + source ./tools/toolchain/install/setup; \ + make -j 8 ARCH=local VERSION=psmp" + +# Collect components for installation and remove symbolic links +RUN /bin/bash -c -o pipefail \ + "mkdir -p /toolchain/install /toolchain/scripts; \ + for libdir in \$(ldd ./exe/local/cp2k.psmp | \ + grep /opt/cp2k/tools/toolchain/install | \ + awk '{print \$3}' | cut -d/ -f7 | \ + sort | uniq) setup; do \ + cp -ar /opt/cp2k/tools/toolchain/install/\${libdir} /toolchain/install; \ + done; \ + cp /opt/cp2k/tools/toolchain/scripts/tool_kit.sh /toolchain/scripts; \ + unlink ./exe/local/cp2k.popt; \ + unlink ./exe/local/cp2k_shell.psmp" + +# Stage 2: install step +FROM ubuntu:22.04 AS install + +# Install required packages +RUN apt-get update -qq && apt-get install -qq --no-install-recommends \ + g++ gcc gfortran openssh-client python3 && rm -rf /var/lib/apt/lists/* + +# Install CP2K binaries +COPY --from=build /opt/cp2k/exe/local/ /opt/cp2k/exe/local/ + +# Install CP2K regression tests +COPY --from=build /opt/cp2k/tests/ /opt/cp2k/tests/ +COPY --from=build /opt/cp2k/tools/regtesting/ /opt/cp2k/tools/regtesting/ +COPY --from=build /opt/cp2k/src/grid/sample_tasks/ /opt/cp2k/src/grid/sample_tasks/ + +# Install CP2K database files +COPY --from=build /opt/cp2k/data/ /opt/cp2k/data/ + +# Install shared libraries required by the CP2K binaries +COPY --from=build /toolchain/ /opt/cp2k/tools/toolchain/ + +# Create links to CP2K binaries +RUN /bin/bash -c -o pipefail \ + "for binary in cp2k dumpdcd graph xyz2dcd; do \ + ln -sf /opt/cp2k/exe/local/\${binary}.psmp \ + /usr/local/bin/\${binary}; \ + done; \ + ln -sf /opt/cp2k/exe/local/cp2k.psmp \ + /usr/local/bin/cp2k_shell; \ + ln -sf /opt/cp2k/exe/local/cp2k.psmp \ + /usr/local/bin/cp2k.popt" + +# Create entrypoint script file +RUN printf "#!/bin/bash\n\ +ulimit -c 0 -s unlimited\n\ +\ +export OMPI_ALLOW_RUN_AS_ROOT=1\n\ +export OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1\n\ +export OMPI_MCA_btl_vader_single_copy_mechanism=none\n\ +export OMP_STACKSIZE=16M\n\ +export PATH=/opt/cp2k/exe/local:\${PATH}\n\ +source /opt/cp2k/tools/toolchain/install/setup\n\ +\"\$@\"" \ +>/usr/local/bin/entrypoint.sh && chmod 755 /usr/local/bin/entrypoint.sh + +# Create shortcut for regression test +RUN printf "/opt/cp2k/tools/regtesting/do_regtest.py --mpiexec \"mpiexec --bind-to none\" --maxtasks 8 --workbasedir /mnt \$* local psmp" \ +>/usr/local/bin/run_tests && chmod 755 /usr/local/bin/run_tests + +# Define entrypoint +WORKDIR /mnt +ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] +CMD ["cp2k", "--help"] + +# Label docker image +LABEL author="CP2K Developers" \ + cp2k_version="2023.2" \ + dockerfile_generator_version="0.2" + +# EOF + diff --git a/Dockerfile.gpaw b/Dockerfile.gpaw new file mode 100644 index 0000000..be1ecb0 --- /dev/null +++ b/Dockerfile.gpaw @@ -0,0 +1,80 @@ +FROM ubuntu:22.04 + +ENV DEBIAN_FRONTEND=noninteractive +ENV TZ=Etc/UTC + +RUN apt-get update && apt-get install -y \ + python3.10 \ + python3.10-venv \ + python3.10-dev \ + build-essential \ + autoconf \ + automake \ + libtool \ + make \ + cmake \ + wget \ + git \ + libopenblas-dev \ + libfftw3-dev \ + libopenmpi-dev \ + openmpi-bin \ + libscalapack-mpi-dev \ + libelpa-dev \ + libomp-dev \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +RUN python3.10 -m venv /opt/venv \ + && /opt/venv/bin/pip install --upgrade pip + +RUN /bin/bash -c -o pipefail \ + "source /opt/venv/bin/activate && \ + pip install --no-cache-dir numpy && \ + pip install --no-cache-dir git+https://gitlab.com/ase/ase" + +# install libxc +RUN cd /opt && \ + wget https://gitlab.com/libxc/libxc/-/archive/6.2.2/libxc-6.2.2.tar.bz2 -O libxc-6.2.2.tar.bz2 && \ + tar -xvf libxc-6.2.2.tar.bz2 && \ + cd libxc-6.2.2 && \ + autoreconf -i && \ + ./configure --prefix=/usr/local CFLAGS="-fPIC" && \ + make -j$(nproc) && \ + make install && \ + ldconfig + +# install GPAW +WORKDIR /opt/gpaw +ENV GPAW_CONFIG=/opt/gpaw/siteconfig.py +RUN echo "scalapack = True" >> siteconfig.py \ + && echo "fftw = True" >> siteconfig.py \ + && echo "elpa = True" >> siteconfig.py \ + && echo "libraries = ['openblas', 'fftw3', 'scalapack-openmpi', 'elpa', 'omp5']" >> siteconfig.py \ + && echo "library_dirs = ['/usr/lib', '/usr/local/lib']" >> siteconfig.py \ + && echo "extra_link_args = ['/usr/local/lib/libxc.a']" >> siteconfig.py \ + && echo "include_dirs = ['/usr/include', '/usr/local/include', '/usr/include/elpa']" >> siteconfig.py +RUN /bin/bash -c -o pipefail "source /opt/venv/bin/activate && pip install --no-cache-dir gpaw dftd3" +RUN mkdir /opt/gpaw-data +RUN /bin/bash -c -o pipefail "source /opt/venv/bin/activate && yes | gpaw install-data /opt/gpaw-data" || true + +ARG PSIFLOW_VERSION +RUN /bin/bash -c -o pipefail \ + "source /opt/venv/bin/activate && pip install --no-cache-dir git+https://github.com/molmod/psiflow.git@${PSIFLOW_VERSION}" +RUN ln -s /opt/venv/lib/python3.10/site-packages/psiflow/reference/gpaw_.py /opt/run_gpaw.py + +# Create entrypoint script +RUN echo '#!/bin/bash' >> /opt/entry.sh && \ + echo 'source /opt/venv/bin/activate' >> /opt/entry.sh && \ + echo 'export LD_LIBRARY_PATH="/usr/local/lib:${LD_LIBRARY_PATH}"' >> /opt/entry.sh && \ + echo 'export GPAW_SETUP_PATH="/opt/gpaw-data/gpaw-setups-24.1.0"' >> /opt/entry.sh && \ + echo '"$@"' >> /opt/entry.sh +RUN chmod +x /opt/entry.sh + +# libxc needed at runtime +ENV LD_LIBRARY_PATH="/usr/local/lib:${LD_LIBRARY_PATH}" +ENTRYPOINT ["/opt/entry.sh"] + + +# Default command +CMD ["bash"] diff --git a/build_containers.sh b/build_containers.sh new file mode 100644 index 0000000..d054402 --- /dev/null +++ b/build_containers.sh @@ -0,0 +1,102 @@ +#!/bin/bash + + +set -e # exit upon failure + + +if [ "$EUID" -ne 0 ]; then + echo "Please run this script as root or with sudo." + exit 1 +fi + +# Initialize flags +psiflow=false +gpaw=false +cp2k=false +build_sif=false + +# Parse command line options +while [[ $# -gt 0 ]]; do + case "$1" in + --gpaw) + gpaw=true + shift # Shift to next argument + ;; + --cp2k) + cp2k=true + shift + ;; + --psiflow) + psiflow=true + shift + ;; + --build_sif) + build_sif=true + shift + ;; + *) + echo "Unknown option: $1" + exit 1 + ;; + esac +done + + +PSIFLOW_VERSION="ipi" +PARSL_VERSION="benc-sander-wq-cpu-scaling" +CCTOOLS_VERSION=7.11.0 +PLUMED_VERSION=2.9.0 +GPU_LIBRARIES=("cu118" "rocm5.6") + + +# build model +if [ "$psiflow" = "true" ]; +then + for GPU_LIBRARY in "${GPU_LIBRARIES[@]}"; do + TAG="psiflow:${PSIFLOW_VERSION}_${GPU_LIBRARY}" + docker build \ + --build-arg GPU_LIBRARY=${GPU_LIBRARY} \ + --build-arg PARSL_VERSION=$PARSL_VERSION \ + --build-arg PSIFLOW_VERSION=$PSIFLOW_VERSION \ + --build-arg CCTOOLS_VERSION=$CCTOOLS_VERSION \ + --build-arg PLUMED_VERSION=$PLUMED_VERSION \ + -t ghcr.io/molmod/$TAG \ + -f Dockerfile . # test + if [ "$build_sif" = "true" ]; + then + apptainer build -F $TAG.sif docker-daemon:ghcr.io/molmod/$TAG + apptainer push $TAG.sif oras://ghcr.io/molmod/$TAG + rm $TAG.sif + fi + done +fi + +if [ "$cp2k" = "true" ]; +then + TAG="cp2k:2023.2" + docker build \ + -t ghcr.io/molmod/$TAG \ + -f Dockerfile.cp2k . + if [ "$build_sif" = "true" ]; + then + apptainer build -F $TAG.sif docker-daemon:ghcr.io/molmod/$TAG + apptainer push $TAG.sif oras://ghcr.io/molmod/$TAG + rm $TAG.sif + fi +fi + + +if [ "$gpaw" = "true" ]; +then + TAG="gpaw:24.1" + sudo docker build \ + --build-arg PSIFLOW_VERSION=$PSIFLOW_VERSION \ + -t ghcr.io/molmod/$TAG \ + -f Dockerfile.gpaw . + if [ "$build_sif" = "true" ]; + then + apptainer build -F $TAG.sif docker-daemon:ghcr.io/molmod/$TAG + apptainer push $TAG.sif oras://ghcr.io/molmod/$TAG + rm $TAG.sif + fi +fi diff --git a/tests/test_reference.py b/tests/test_reference.py index 745b795..e4d6ffa 100644 --- a/tests/test_reference.py +++ b/tests/test_reference.py @@ -230,7 +230,7 @@ def test_cp2k_success(context, simple_cp2k_input): # check number of mpi processes with open(geometry.stdout, "r") as f: content = f.read() - definition = psiflow.context().definitions["ReferenceEvaluation"] + definition = psiflow.context().definitions["CP2K"] ncores = definition.cores_per_worker lines = content.split("\n") for line in lines: