Skip to content

Commit

Permalink
Added GitHub Actions workflow for building C Wrapper
Browse files Browse the repository at this point in the history
Re-factored scripts - for re-use in CI and dev. container.
  • Loading branch information
stemann committed Apr 29, 2024
1 parent c8f1e9c commit 254ff27
Show file tree
Hide file tree
Showing 8 changed files with 211 additions and 54 deletions.
16 changes: 16 additions & 0 deletions .dev/install_build_deps.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#!/usr/bin/env bash

set -e

GCC_VERSION=$1

apt-get update
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
build-essential \
ca-certificates \
cmake \
gcc-$GCC_VERSION \
g++-$GCC_VERSION \
jq \
unzip \
wget
27 changes: 27 additions & 0 deletions .dev/install_cuda_sdk.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#!/usr/bin/env bash

set -e

CUDA_VERSION=$1

CUDA_VERSION_MAJOR_MINOR=$(echo $CUDA_VERSION | cut -d . -f 1-2)
TMP_PROJECT=$(mktemp -d)
cd $TMP_PROJECT
touch Project.toml
cat <<EOT > LocalPreferences.toml
[CUDA_Runtime_jll]
version = "$CUDA_VERSION_MAJOR_MINOR"
EOT
CUDA_ROOT=$(julia --project --eval '
using Pkg
CUDA_VERSION = VersionNumber(ENV["CUDA_VERSION"])
CUDA_SDK_jll_pkg = :CUDA_SDK_jll
if CUDA_VERSION < v"11.4"
CUDA_SDK_jll_pkg = :CUDA_full_jll
end
Pkg.add(name=string(CUDA_SDK_jll_pkg), version=ENV["CUDA_VERSION"])
@eval using $CUDA_SDK_jll_pkg
println(@eval $CUDA_SDK_jll_pkg.artifact_dir)
')
ln -s $CUDA_ROOT/cuda /usr/local/cuda
export PATH=$PATH:/usr/local/cuda/bin
30 changes: 30 additions & 0 deletions .dev/install_cudnn.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#!/usr/bin/env bash

set -e

CUDA_VERSION=$1
CUDNN_VERSION=$2

CUDA_VERSION_MAJOR_MINOR=$(echo $CUDA_VERSION | cut -d . -f 1-2)
TMP_PROJECT=$(mktemp -d)
cd $TMP_PROJECT
touch Project.toml
cat <<EOT > LocalPreferences.toml
[CUDA_Runtime_jll]
version = "$CUDA_VERSION_MAJOR_MINOR"
EOT
CUDNN_ROOT=$(julia --project --eval '
using Pkg;
CUDA_VERSION = VersionNumber(ENV["CUDA_VERSION"])
if CUDA_VERSION < v"11"
Pkg.add(name="CUDA_Runtime_jll", version="0.2")
elseif CUDA_VERSION < v"11.4"
Pkg.add(name="CUDA_Runtime_jll", version="0.7")
else
Pkg.add(name="CUDA_Runtime_jll")
end
Pkg.add(name="CUDNN_jll", version=ENV["CUDNN_VERSION"]);
using CUDNN_jll;
println(CUDNN_jll.artifact_dir)')
for F in $CUDNN_ROOT/include/cudnn*.h; do ln -sf $F /usr/local/cuda/include/$(basename $F); done
for F in $CUDNN_ROOT/lib/libcudnn*; do ln -sf $F /usr/local/cuda/lib64/$(basename $F); done
11 changes: 11 additions & 0 deletions .dev/install_torch.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#!/usr/bin/env bash

set -e

TORCH_VARIANT=$1
TORCH_VERSION=$2

cd /usr/local
wget -q "https://download.pytorch.org/libtorch/$TORCH_VARIANT/libtorch-cxx11-abi-shared-with-deps-$TORCH_VERSION%2B$TORCH_VARIANT.zip"
unzip -q libtorch-*.zip
rm libtorch-*.zip
39 changes: 8 additions & 31 deletions .devcontainer/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,17 @@ FROM mcr.microsoft.com/devcontainers/cpp:$BASE_IMAGE_TAG
ARG CUDA_VERSION=11.8.0
ARG CUDNN_VERSION=8.9.4

ARG GCC_VERSION=10

ARG OCAML_VERSION=4
ARG OPAM_VERSION=2

ARG TORCH_VARIANT
ARG TORCH_VERSION=2.1.1

RUN apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
build-essential \
cmake \
COPY .dev /opt/container

RUN /opt/container/install_build_deps.sh $GCC_VERSION \
&& apt-get satisfy -y "ocaml (>= $OCAML_VERSION)" "opam (>= $OPAM_VERSION)" \
&& rm -rf /var/lib/apt/lists/*

Expand All @@ -29,36 +30,12 @@ ENV PATH=/opt/juliaup/bin:$PATH
ENV CUDA_VERSION=$CUDA_VERSION
ENV CUDNN_VERSION=$CUDNN_VERSION

RUN <<EOF
CUDA_VERSION_MAJOR_MINOR=$(echo $CUDA_VERSION | cut -d . -f 1-2)
TMP_PROJECT=$(mktemp -d)
cd $TMP_PROJECT
touch Project.toml
cat <<EOT > LocalPreferences.toml
[CUDA_Runtime_jll]
version = "$CUDA_VERSION_MAJOR_MINOR"
EOT
CUDA_ROOT=$(julia --project --eval '
using Pkg
CUDA_VERSION = VersionNumber(ENV["CUDA_VERSION"])
CUDA_SDK_jll_pkg = :CUDA_SDK_jll
if CUDA_VERSION < v"11.4"
CUDA_SDK_jll_pkg = :CUDA_full_jll
end
Pkg.add(name=string(CUDA_SDK_jll_pkg), version=ENV["CUDA_VERSION"])
@eval using $CUDA_SDK_jll_pkg
println(@eval $CUDA_SDK_jll_pkg.artifact_dir)
')
ln -s $CUDA_ROOT/cuda /usr/local/cuda
EOF
RUN /opt/container/install_cuda_sdk.sh $CUDA_VERSION
ENV PATH=$PATH:/usr/local/cuda/bin

SHELL ["/bin/bash", "-o", "pipefail", "-c"]

RUN if [ -z "$TORCH_VARIANT" ]; then export TORCH_VARIANT="cu$(echo $CUDA_VERSION | cut -d . -f 1-2 | tr -d '.')"; fi \
&& cd /usr/local \
&& wget -q "https://download.pytorch.org/libtorch/$TORCH_VARIANT/libtorch-cxx11-abi-shared-with-deps-$TORCH_VERSION%2B$TORCH_VARIANT.zip" \
&& unzip -q libtorch-*.zip \
&& rm libtorch-*.zip
RUN export TORCH_VARIANT="cu$(echo $CUDA_VERSION | cut -d . -f 1-2 | tr -d '.')" \
&& /opt/container/install_torch.sh $TORCH_VARIANT $TORCH_VERSION

ENV CMAKE_PREFIX_PATH=/usr/local/libtorch
2 changes: 2 additions & 0 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
{
"build": {
"context": "..",
"dockerfile": "Dockerfile",
"args": {
"BASE_IMAGE_VARIANT": "debian",
"BASE_IMAGE_VERSION": "11",
"CUDA_VERSION": "11.3.1",
"CUDNN_VERSION": "8.2.4",
"GCC_VERSION": "10",
"OCAML_VERSION": "4",
"OPAM_VERSION": "2",
"TORCH_VERSION": "1.10.2"
Expand Down
24 changes: 1 addition & 23 deletions .devcontainer/postCreate.sh
Original file line number Diff line number Diff line change
@@ -1,27 +1,5 @@
sudo chown -R vscode:vscode /opt/juliaup /opt/julia_depot

CUDA_VERSION_MAJOR_MINOR=$(echo $CUDA_VERSION | cut -d . -f 1-2)
TMP_PROJECT=$(mktemp -d)
cd $TMP_PROJECT
touch Project.toml
cat <<EOT > LocalPreferences.toml
[CUDA_Runtime_jll]
version = "$CUDA_VERSION_MAJOR_MINOR"
EOT
CUDNN_ROOT=$(julia --project --eval '
using Pkg;
CUDA_VERSION = VersionNumber(ENV["CUDA_VERSION"])
if CUDA_VERSION < v"11"
Pkg.add(name="CUDA_Runtime_jll", version="0.2")
elseif CUDA_VERSION < v"11.4"
Pkg.add(name="CUDA_Runtime_jll", version="0.7")
else
Pkg.add(name="CUDA_Runtime_jll")
end
Pkg.add(name="CUDNN_jll", version=ENV["CUDNN_VERSION"]);
using CUDNN_jll;
println(CUDNN_jll.artifact_dir)') \
&& for F in $CUDNN_ROOT/include/cudnn*.h; do ln -s $F /usr/local/cuda/include/$(basename $F); done \
&& for F in $CUDNN_ROOT/lib/libcudnn*; do ln -s $F /usr/local/cuda/lib64/$(basename $F); done
. /.dev/install_cudnn.sh

opam init --disable-sandboxing --auto-setup
116 changes: 116 additions & 0 deletions .github/workflows/BuildCWrapper.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
name: Build C Wrapper

on:
push:
branches:
- master
tags: ['*']
pull_request:
workflow_dispatch:

concurrency:
# Skip intermediate builds: always.
# Cancel intermediate builds: only if it is a pull request build.
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ startsWith(github.ref, 'refs/pull/') }}

jobs:
build_cpu:
name: Build (CPU, GCC ${{ matrix.gcc_version }}, Torch ${{ matrix.torch_version }})
runs-on: ubuntu-latest
timeout-minutes: 60
permissions: # needed to allow julia-actions/cache to proactively delete old caches that it has created
actions: write
contents: read
strategy:
fail-fast: false
matrix:
arch:
- x64
gcc_version:
- "8"
julia_version:
- "1.9"
os_version:
- "10"
torch_version:
- "1.10.2"
container:
image: debian:${{ matrix.os_version }}
env:
GCC_VERSION: ${{ matrix.gcc_version }}
TORCH_VARIANT: cpu
TORCH_VERSION: ${{ matrix.torch_version }}
USE_CUDA: "OFF"
steps:
- uses: actions/checkout@v4
- run: |
pwd
ls -la
- run: ./.dev/install_build_deps.sh $GCC_VERSION
- uses: julia-actions/setup-julia@v2
with:
version: ${{ matrix.julia_version }}
arch: ${{ matrix.arch }}
- uses: julia-actions/cache@v1
- run: ./.dev/install_torch.sh $TORCH_VARIANT $TORCH_VERSION
- name: build
run: |
export CMAKE_PREFIX_PATH=/usr/local/libtorch
cd deps/c_wrapper
cmake -S . -B build -DUSE_CUDA=$USE_CUDA
cmake --build build
build_cuda:
name: Build (CUDA ${{ matrix.cuda_version }}, CUDNN ${{ matrix.cudnn_version }}, GCC ${{ matrix.gcc_version }}, Torch ${{ matrix.torch_version }})
runs-on: ubuntu-latest
timeout-minutes: 60
permissions: # needed to allow julia-actions/cache to proactively delete old caches that it has created
actions: write
contents: read
strategy:
fail-fast: false
matrix:
arch:
- x64
cuda_version:
- "10.2.89"
- "11.3.1"
cudnn_version:
- "8.2.4"
gcc_version:
- "8"
julia_version:
- "1.9"
os_version:
- "10"
torch_version:
- "1.10.2"
container:
image: debian:${{ matrix.os_version }}
env:
CUDA_VERSION: ${{ matrix.cuda_version }}
CUDNN_VERSION: ${{ matrix.cudnn_version }}
GCC_VERSION: ${{ matrix.gcc_version }}
TORCH_VERSION: ${{ matrix.torch_version }}
USE_CUDA: "ON"
steps:
- uses: actions/checkout@v4
- run: ./.dev/install_build_deps.sh $GCC_VERSION
- uses: julia-actions/setup-julia@v2
with:
version: ${{ matrix.julia_version }}
arch: ${{ matrix.arch }}
- uses: julia-actions/cache@v1
- name: Install CUDA SDK ${{ matrix.cuda_version }} and CUDNN ${{ matrix.cudnn_version }}
run: |
./.dev/install_cuda_sdk.sh $CUDA_VERSION
./.dev/install_cudnn.sh $CUDA_VERSION $CUDNN_VERSION
- run: |
export TORCH_VARIANT="cu$(echo $CUDA_VERSION | cut -d . -f 1-2 | tr -d '.')"
./.dev/install_torch.sh $TORCH_VARIANT $TORCH_VERSION
- name: build
run: |
export CMAKE_PREFIX_PATH=/usr/local/libtorch
cd deps/c_wrapper
cmake -S . -B build -DUSE_CUDA=$USE_CUDA
cmake --build build

0 comments on commit 254ff27

Please sign in to comment.