Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
192 changes: 192 additions & 0 deletions .devcontainer/nvshmem.Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,192 @@
#Set Versions.
ARG OS_TYPE=x86_64
ARG PY_VER=3.10
ARG CONDA_VER=latest
ARG FEDORA_VERSION=41
ARG CUDA_VERSION=12.9
ARG CUDNN_VERSION=9.6.0.74
ARG CUDNN_CUDA_SUFFIX=cuda12
ARG NVSHMEM_VERSION=3.7.2
ARG GCC_SUFFIX=-13

#Base image
FROM quay.io/foundata/fedora${FEDORA_VERSION}-itt:latest

# Use the above args
ARG CONDA_VER
ARG OS_TYPE
ARG FEDORA_VERSION
ARG CUDA_VERSION
ARG CUDNN_VERSION
ARG CUDNN_CUDA_SUFFIX
ARG NVSHMEM_VERSION
ARG GCC_SUFFIX

# Run as root for system-level installs
USER root

# Layer 1: User creation, system packages, gh CLI, gcc, ssh, nix config
RUN useradd -u 1000 -g 0 -m -d /home/devuser -s /bin/bash devuser \
&& printf "[google-cloud-cli]\n\
name=Google Cloud CLI\n\
baseurl=https://packages.cloud.google.com/yum/repos/cloud-sdk-el9-x86_64\n\
enabled=1\n\
gpgcheck=1\n\
repo_gpgcheck=0\n\
gpgkey=https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg\n" > /etc/yum.repos.d/google-cloud-sdk.repo \
&& dnf upgrade --refresh -y \
&& dnf install -y \
python3 \
python3-devel \
python3-pip \
wget \
jq \
git \
make \
cmake \
ninja-build \
ccache \
gdb \
vim \
curl \
unzip \
which \
libffi-devel \
google-cloud-cli \
openssl-devel \
findutils \
libxcrypt-compat.x86_64 \
tmux \
tar \
htop \
rsync \
nix \
nodejs \
sudo \
&& dnf config-manager addrepo --from-repofile=https://cli.github.com/packages/rpm/gh-cli.repo \
&& dnf install gh --repo gh-cli -y \
&& if [ -n "${GCC_SUFFIX}" ]; then \
dnf install -y "gcc$(echo ${GCC_SUFFIX} | tr -d '-')-c++" \
&& alternatives --install /usr/bin/gcc gcc "/usr/bin/gcc${GCC_SUFFIX}" 100 \
&& alternatives --install /usr/bin/g++ g++ "/usr/bin/g++${GCC_SUFFIX}" 100; \
else \
dnf install -y gcc-c++; \
fi \
&& dnf clean all \
&& mkdir -p /home/devuser/.config/nix \
&& echo 'experimental-features = nix-command flakes' > /home/devuser/.config/nix/nix.conf \
&& mkdir -p -m 0700 /home/devuser/.ssh \
&& ssh-keyscan github.com >> /home/devuser/.ssh/known_hosts \
&& curl -fL https://github.com/llvm/llvm-project/releases/download/llvmorg-12.0.1/clang+llvm-12.0.1-x86_64-linux-gnu-ubuntu-16.04.tar.xz \
| tar xJ --strip-components=1 -C /usr/local \
--wildcards '*/bin/clang-12' '*/bin/clang' '*/bin/clang++' '*/bin/clang-tidy' \
'*/lib/clang/12*' '*/include/clang*' \
&& ln -sf /usr/local/bin/clang-12 /usr/local/bin/clang-12.0

# Layer 2: CUDA toolkit + cuDNN + NVSHMEM
RUN CUDA_PKG_VERSION=$(echo ${CUDA_VERSION} | tr '.' '-') \
&& dnf config-manager addrepo --from-repofile=https://developer.download.nvidia.com/compute/cuda/repos/fedora${FEDORA_VERSION}/x86_64/cuda-fedora${FEDORA_VERSION}.repo \
&& dnf -y install cuda-toolkit-${CUDA_PKG_VERSION} \
&& dnf clean all \
&& mkdir /tmp/cudnn \
&& cd /tmp/cudnn \
&& wget https://developer.download.nvidia.com/compute/cudnn/redist/cudnn/linux-x86_64/cudnn-linux-x86_64-${CUDNN_VERSION}_${CUDNN_CUDA_SUFFIX}-archive.tar.xz \
&& tar xvf cudnn-linux-x86_64-${CUDNN_VERSION}_${CUDNN_CUDA_SUFFIX}-archive.tar.xz \
&& mv ./cudnn-linux-x86_64-${CUDNN_VERSION}_${CUDNN_CUDA_SUFFIX}-archive/include/* /usr/local/cuda/include \
&& mv ./cudnn-linux-x86_64-${CUDNN_VERSION}_${CUDNN_CUDA_SUFFIX}-archive/lib/* /usr/local/cuda/lib64 \
&& cd / && rm -rf /tmp/cudnn \
&& chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn* \
&& mkdir /tmp/nvshmem \
&& cd /tmp/nvshmem \
&& wget https://developer.download.nvidia.com/compute/nvshmem/redist/libnvshmem/linux-x86_64/libnvshmem-linux-x86_64-${NVSHMEM_VERSION}_${CUDNN_CUDA_SUFFIX}-archive.tar.xz \
&& tar xvf libnvshmem-linux-x86_64-${NVSHMEM_VERSION}_${CUDNN_CUDA_SUFFIX}-archive.tar.xz \
&& mv ./libnvshmem-linux-x86_64-${NVSHMEM_VERSION}_${CUDNN_CUDA_SUFFIX}-archive /usr/local/nvshmem \
&& cd / && rm -rf /tmp/nvshmem

# Layer 3: Conda + Python
ARG PY_VER
ENV HOME=/home/devuser
RUN curl -fLO --retry 3 --retry-delay 5 "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-${OS_TYPE}.sh" \
&& bash Miniforge3-Linux-${OS_TYPE}.sh -p /home/devuser/miniconda -b \
&& rm Miniforge3-Linux-${OS_TYPE}.sh \
&& /home/devuser/miniconda/bin/conda init \
&& /home/devuser/miniconda/bin/conda install -c anaconda -y python=${PY_VER} gdb cuda-gdb \
&& /home/devuser/miniconda/bin/conda clean -afy
ENV PATH=/home/devuser/miniconda/bin:${PATH}

# Layer 4: PyTorch requirements + triton
ARG PYTORCH_RAW=https://raw.githubusercontent.com/pytorch/pytorch/refs/heads/main
RUN mkdir -p /build_pytorch/scripts /build_pytorch/.ci/docker/ci_commit_pins \
&& curl -fL -o /build_pytorch/requirements.txt ${PYTORCH_RAW}/requirements.txt \
&& curl -fL -o /build_pytorch/requirements-build.txt ${PYTORCH_RAW}/requirements-build.txt \
&& curl -fL -o /build_pytorch/Makefile ${PYTORCH_RAW}/Makefile \
&& curl -fL -o /build_pytorch/scripts/install_triton_wheel.sh ${PYTORCH_RAW}/scripts/install_triton_wheel.sh \
&& curl -fL -o /build_pytorch/.ci/docker/triton_version.txt ${PYTORCH_RAW}/.ci/docker/triton_version.txt \
&& curl -fL -o /build_pytorch/.ci/docker/triton_xpu_version.txt ${PYTORCH_RAW}/.ci/docker/triton_xpu_version.txt \
&& curl -fL -o /build_pytorch/.ci/docker/ci_commit_pins/triton.txt ${PYTORCH_RAW}/.ci/docker/ci_commit_pins/triton.txt \
&& curl -fL -o /build_pytorch/.ci/docker/ci_commit_pins/triton-xpu.txt ${PYTORCH_RAW}/.ci/docker/ci_commit_pins/triton-xpu.txt \
&& chmod +x /build_pytorch/scripts/install_triton_wheel.sh \
&& /home/devuser/miniconda/bin/pip install --no-cache-dir -r /build_pytorch/requirements.txt mkl-static mkl-include \
&& cd /build_pytorch && make triton \
&& (/home/devuser/miniconda/bin/pip uninstall torch -y 2>/dev/null || true) \
&& rm -rf /build_pytorch

# Layer 5: Ray requirements + bazel
ARG RAY_RAW=https://raw.githubusercontent.com/ray-project/ray/refs/heads/master
RUN mkdir -p /build_ray \
&& curl -fL -o /build_ray/requirements.txt ${RAY_RAW}/python/requirements.txt \
&& curl -fL -o /build_ray/test-requirements.txt ${RAY_RAW}/python/requirements/test-requirements.txt \
&& curl -fL -o /build_ray/requirements_compiled.txt ${RAY_RAW}/python/requirements_compiled.txt \
&& curl -fL -o /build_ray/.bazelversion ${RAY_RAW}/.bazelversion \
&& PY_MINOR=$(/home/devuser/miniconda/bin/python -c "import sys; print(sys.version_info.minor)") \
&& cd /build_ray \
&& if [ "$PY_MINOR" -lt 13 ]; then \
sed -i 's/importlib-metadata==6.11.0/importlib-metadata>=7.0.0/' test-requirements.txt \
&& sed -i '/tensordict/d' test-requirements.txt \
&& sed -i 's/opencv-python.*/opencv-python<4.10.0/' test-requirements.txt \
&& /home/devuser/miniconda/bin/pip install --no-cache-dir -r requirements.txt \
-r test-requirements.txt pre-commit; \
else \
/home/devuser/miniconda/bin/pip install --no-cache-dir -r requirements.txt pre-commit; \
fi \
&& (/home/devuser/miniconda/bin/pip uninstall torch -y 2>/dev/null || true) \
&& /home/devuser/miniconda/bin/pip install --no-cache-dir "numpy>=1.24,<1.27" \
&& BAZEL_VER=$(cat /build_ray/.bazelversion | tr -d '[:space:]') \
&& curl -fLO "https://github.com/bazelbuild/bazel/releases/download/${BAZEL_VER}/bazel-${BAZEL_VER}-installer-linux-x86_64.sh" \
&& chmod +x "bazel-${BAZEL_VER}-installer-linux-x86_64.sh" \
&& ./"bazel-${BAZEL_VER}-installer-linux-x86_64.sh" \
&& rm -f "bazel-${BAZEL_VER}-installer-linux-x86_64.sh" \
&& rm -rf /build_ray \
&& echo "build --local_ram_resources=HOST_RAM*.5 --local_cpu_resources=25 --disk_cache=/home/devuser/bazel-cache" >> /home/devuser/.bazelrc

# Layer 6: setuptools, uv, Claude, gcc symlinks, git config, sudoers, permissions
RUN /home/devuser/miniconda/bin/pip install --no-cache-dir setuptools uv scikit-build \
&& curl -fsSL https://claude.ai/install.sh | HOME=/home/devuser bash \
&& if [ -n "${GCC_SUFFIX}" ]; then \
rm -f /usr/bin/gcc /usr/bin/g++ \
&& ln -s "/usr/bin/gcc${GCC_SUFFIX}" /usr/bin/gcc \
&& ln -s "/usr/bin/g++${GCC_SUFFIX}" /usr/bin/g++; \
fi \
&& git config --system --add safe.directory '*' \
&& echo "devuser ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/devuser \
&& chmod 0440 /etc/sudoers.d/devuser \
&& date -u +%Y%m%d%H%M%S > /home/devuser/.image-build-id \
&& chown -R devuser:0 /home/devuser && chmod -R g=u /home/devuser

# set env variables
ENV CLAUDE_CODE_USE_VERTEX=1 \
CLOUD_ML_REGION=global \
ANTHROPIC_VERTEX_PROJECT_ID=itpc-gcp-ai-eng-claude \
USER=devuser \
NVCC_CCBIN=g++${GCC_SUFFIX} \
PATH="/home/devuser/.local/bin:/home/devuser/.claude/bin:/usr/local/cuda-${CUDA_VERSION}/bin:${PATH}" \
CUDA_HOME=/usr/local/cuda-${CUDA_VERSION} \
NVSHMEM_HOME=/usr/local/nvshmem \
CC=gcc${GCC_SUFFIX} \
CXX=g++${GCC_SUFFIX} \
MAX_JOBS=25 \
CMAKE_PREFIX_PATH=/home/devuser/miniconda \
RAY_INSTALL_CPP=0 \
RAY_DEBUG_BUILD=debug

USER 1000
1 change: 1 addition & 0 deletions .github/workflows/pr-build-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ on:
pull_request:
paths:
- '.devcontainer/Dockerfile'
- '.devcontainer/nvshmem.Dockerfile'

jobs:
build:
Expand Down
Loading