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
124 changes: 91 additions & 33 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ on:
push:
# branches: [main]
tags:
- '*' # Run also when a tag is pushed
- '*' # Run only when a new tag is pushed
pull_request:

jobs:
Expand All @@ -21,81 +21,139 @@ jobs:
run: |
apt-get update && apt-get install -y patchelf curl unzip zip gcc

- name: Set up python virtual environment with NVIDIA dependencies
# Get CUDA runtimes via pip
- name: Set up python virtual environments with NVIDIA dependencies for CUDA 12 and CUDA 13 (respectively)
run: |
mkdir -p venvs
python -m venv venvs/cu12
bash -c "source venvs/cu12/bin/activate && \
pip install --upgrade pip -qq && \
pip install --extra-index-url=https://pypi.anaconda.org/rapidsai-wheels-nightly/simple/ cuopt-cu12==25.10.0 nvidia-cuda-runtime-cu12==12.8.* nvidia-nvjitlink-cu12 -qq"
pip install --extra-index-url=https://pypi.nvidia.com cuopt-cu12==25.10.* cuda-toolkit[cudart,nvjitlink]==12.9.* -qq &&
deactivate"
python -m venv venvs/cu13
bash -c "source venvs/cu13/bin/activate && \
pip install --upgrade pip -qq && \
pip install --extra-index-url=https://pypi.nvidia.com cuopt-cu13==25.10.* cuda-toolkit[cudart,nvjitlink]==13.0.* -qq &&
deactivate"

# Get GAMS
- name: Download and extract latest GAMS distribution
run: |
curl https://d37drm4t2jghv5.cloudfront.net/distributions/latest/linux/linux_x64_64_sfx.exe --output linux_x64_64_sfx.exe
unzip -q linux_x64_64_sfx.exe
mv gams*_linux_x64_64_sfx gamsdist
rm linux_x64_64_sfx.exe

- name: Compile gmscuopt
# Build link
- name: Compile GAMS/cuOpt-link binary "gmscuopt.out" for CUDA 12 and then for CUDA 13
run: |
export GAMSCAPI="gamsdist/apifiles/C/api"
export CUOPT="venvs/cu12/lib/python3.12/site-packages/libcuopt"
export JITLINK="venvs/cu12/lib/python3.12/site-packages/nvidia/nvjitlink/lib"
export CUOPT_VERSION="`cat "$CUOPT/VERSION"`"
export CUOPT_HASH="`cat "$CUOPT/GIT_COMMIT"`"
gcc -Wall gmscuopt.c -o gmscuopt.out \
gcc -Wall gmscuopt.c -o gmscuopt-cu12.out \
-DCUOPT_VERSION=\"$CUOPT_VERSION\" -DCUOPT_HASH=\"$CUOPT_HASH\" \
-I $GAMSCAPI $GAMSCAPI/gmomcc.c $GAMSCAPI/optcc.c $GAMSCAPI/gevmcc.c \
-I $CUOPT/include $JITLINK/libnvJitLink.so.12 -L $CUOPT/lib64 -lcuopt
patchelf --set-rpath \$ORIGIN gmscuopt.out
patchelf --set-rpath \$ORIGIN gmscuopt-cu12.out
export CUOPT="venvs/cu13/lib/python3.12/site-packages/libcuopt"
export JITLINK="venvs/cu13/lib/python3.12/site-packages/nvidia/cu13/lib"
export CUOPT_VERSION="`cat "$CUOPT/VERSION"`"
export CUOPT_HASH="`cat "$CUOPT/GIT_COMMIT"`"
gcc -Wall gmscuopt.c -o gmscuopt-cu13.out \
-DCUOPT_VERSION=\"$CUOPT_VERSION\" -DCUOPT_HASH=\"$CUOPT_HASH\" \
-I $GAMSCAPI $GAMSCAPI/gmomcc.c $GAMSCAPI/optcc.c $GAMSCAPI/gevmcc.c \
-I $CUOPT/include $JITLINK/libnvJitLink.so.13 -L $CUOPT/lib64 -lcuopt
patchelf --set-rpath \$ORIGIN gmscuopt-cu13.out

# Collect dependencies for link and runtime convenience archive
- name: Prepare release artifact and runtime bundle
run: |
mkdir release
cp gmscuopt.out release/
cp assets/* release/
cp venvs/cu12/lib/python3.12/site-packages/libcuopt/lib64/libcuopt.so release/
cp venvs/cu12/lib/python3.12/site-packages/libcuopt/lib64/libmps_parser.so release/
cp venvs/cu12/lib/python3.12/site-packages/libcuopt_cu12.libs/libgomp-*.so.1.0.0 release/
cp venvs/cu12/lib/python3.12/site-packages/libcuopt_cu12.libs/libtbb-*.so.2 release/
cp venvs/cu12/lib/python3.12/site-packages/libcuopt_cu12.libs/libtbbmalloc-*.so.2 release/
cp venvs/cu12/lib/python3.12/site-packages/rapids_logger/lib64/librapids_logger.so release/
cp venvs/cu12/lib/python3.12/site-packages/librmm/lib64/librmm.so release/
mkdir runtime
cp venvs/cu12/lib/python3.12/site-packages/nvidia/cu12/lib/libcudss.so.0 runtime/
cp venvs/cu12/lib/python3.12/site-packages/nvidia/cusolver/lib/libcusolver.so.11 runtime/
cp venvs/cu12/lib/python3.12/site-packages/nvidia/cublas/lib/libcublas.so.12 runtime/
cp venvs/cu12/lib/python3.12/site-packages/nvidia/cublas/lib/libcublasLt.so.12 runtime/
cp venvs/cu12/lib/python3.12/site-packages/nvidia/nvjitlink/lib/libnvJitLink.so.12 runtime/
cp venvs/cu12/lib/python3.12/site-packages/nvidia/curand/lib/libcurand.so.10 runtime/
cp venvs/cu12/lib/python3.12/site-packages/nvidia/cusparse/lib/libcusparse.so.12 runtime/
mkdir release-cu12
cp gmscuopt-cu12.out release-cu12/gmscuopt.out
cp assets/* release-cu12/
cp venvs/cu12/lib/python3.12/site-packages/libcuopt/lib64/libcuopt.so release-cu12/
cp venvs/cu12/lib/python3.12/site-packages/libcuopt/lib64/libmps_parser.so release-cu12/
cp venvs/cu12/lib/python3.12/site-packages/libcuopt_cu12.libs/libgomp-*.so.1.0.0 release-cu12/
cp venvs/cu12/lib/python3.12/site-packages/libcuopt_cu12.libs/libtbb-*.so.2 release-cu12/
cp venvs/cu12/lib/python3.12/site-packages/libcuopt_cu12.libs/libtbbmalloc-*.so.2 release-cu12/
cp venvs/cu12/lib/python3.12/site-packages/rapids_logger/lib64/librapids_logger.so release-cu12/
cp venvs/cu12/lib/python3.12/site-packages/librmm/lib64/librmm.so release-cu12/
mkdir runtime-cu12
cp venvs/cu12/lib/python3.12/site-packages/nvidia/cu12/lib/libcudss.so.0 runtime-cu12/
cp venvs/cu12/lib/python3.12/site-packages/nvidia/cusolver/lib/libcusolver.so.11 runtime-cu12/
cp venvs/cu12/lib/python3.12/site-packages/nvidia/cublas/lib/libcublas.so.12 runtime-cu12/
cp venvs/cu12/lib/python3.12/site-packages/nvidia/cublas/lib/libcublasLt.so.12 runtime-cu12/
cp venvs/cu12/lib/python3.12/site-packages/nvidia/nvjitlink/lib/libnvJitLink.so.12 runtime-cu12/
cp venvs/cu12/lib/python3.12/site-packages/nvidia/curand/lib/libcurand.so.10 runtime-cu12/
cp venvs/cu12/lib/python3.12/site-packages/nvidia/cusparse/lib/libcusparse.so.12 runtime-cu12/
mkdir release-cu13
cp gmscuopt-cu13.out release-cu13/gmscuopt.out
cp assets/* release-cu13/
cp venvs/cu13/lib/python3.12/site-packages/libcuopt/lib64/libcuopt.so release-cu13/
cp venvs/cu13/lib/python3.12/site-packages/libcuopt/lib64/libmps_parser.so release-cu13/
cp venvs/cu13/lib/python3.12/site-packages/libcuopt_cu13.libs/libgomp-*.so.1.0.0 release-cu13/
cp venvs/cu13/lib/python3.12/site-packages/libcuopt_cu13.libs/libtbb-*.so.2 release-cu13/
cp venvs/cu13/lib/python3.12/site-packages/libcuopt_cu13.libs/libtbbmalloc-*.so.2 release-cu13/
cp venvs/cu13/lib/python3.12/site-packages/rapids_logger/lib64/librapids_logger.so release-cu13/
cp venvs/cu13/lib/python3.12/site-packages/librmm/lib64/librmm.so release-cu13/
mkdir runtime-cu13
cp venvs/cu13/lib/python3.12/site-packages/nvidia/cu13/lib/libcudss.so.0 runtime-cu13/
cp venvs/cu13/lib/python3.12/site-packages/nvidia/cu13/lib/libnvJitLink.so.13 runtime-cu13/
cp venvs/cu13/lib/python3.12/site-packages/nvidia/cu13/lib/libcublas.so.13 runtime-cu13/
cp venvs/cu13/lib/python3.12/site-packages/nvidia/cu13/lib/libcublasLt.so.13 runtime-cu13/
cp venvs/cu13/lib/python3.12/site-packages/nvidia/cu13/lib/libcurand.so.10 runtime-cu13/
cp venvs/cu13/lib/python3.12/site-packages/nvidia/cu13/lib/libcusolver.so.12 runtime-cu13/
cp venvs/cu13/lib/python3.12/site-packages/nvidia/cu13/lib/libcusparse.so.12 runtime-cu13/

- name: Upload link artifact to GitHub Actions (always)
# Upload artifacts
- name: Upload CUDA 12 link artifact to GitHub Actions (always)
uses: actions/upload-artifact@v4
with:
name: cuopt-link
path: release/
name: cuopt-link-cu12
path: release-cu12/

- name: Upload runtime artifact to GitHub Actions (always)
- name: Upload CUDA 12 runtime artifact to GitHub Actions (always)
uses: actions/upload-artifact@v4
with:
name: cu12-runtime
path: runtime/
path: runtime-cu12/

- name: Upload CUDA 13 link artifact to GitHub Actions (always)
uses: actions/upload-artifact@v4
with:
name: cuopt-link-cu13
path: release-cu13/

- name: Upload CUDA 13 runtime artifact to GitHub Actions (always)
uses: actions/upload-artifact@v4
with:
name: cu13-runtime
path: runtime-cu13/

# Bundle into archives
- name: Create zip archive (only on tag push)
if: startsWith(github.ref, 'refs/tags/')
run: |
cd release
zip -r ../cuopt-link-release.zip .
cd ../runtime
cd release-cu12
zip -r ../cuopt-link-release-cu12.zip .
cd ../runtime-cu12
zip -r ../cu12-runtime.zip .
cd ../release-cu13
zip -r ../cuopt-link-release-cu13.zip .
cd ../runtime-cu13
zip -r ../cu13-runtime.zip .

# Create new release with archives
- name: Create GitHub Release (only on tag push)
if: startsWith(github.ref, 'refs/tags/')
uses: softprops/action-gh-release@v2
with:
files: |
cuopt-link-release.zip
cuopt-link-release-cu12.zip
cu12-runtime.zip
cuopt-link-release-cu13.zip
cu13-runtime.zip
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
22 changes: 7 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,29 +8,20 @@ You can get more details and tips by reading the blog post ["GPU-Accelerated Opt

## Requirements

- **Operating System:** Linux, Windows through WSL2
- **Operating System:** Linux, Windows 11 through WSL2
- **GAMS:** Version 49 or newer.
- **GAMSPy:** Version 1.12.1 or newer
- **NVIDIA GPU:** Volta architecture or better
- **CUDA Runtime Libraries:** 12.0+
- **CUDA Runtime Libraries:** 12 and 13

## Getting started / installation

- Make sure [CUDA runtime](https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64) is installed
- Download and unpack `cuopt-link-release.zip` from the [releases page](https://github.com/GAMS-dev/cuoptlink-builder/releases):
- Unpack the contents of `cuopt-link-release.zip` into your GAMS system directory. For GAMSPy, you can find out your system directory by running `gamspy show base`. So for example you can run `unzip -o cuopt-link-release.zip -d $(gamspy show base)`.
- Download and unpack `cuopt-link-release-cu12.zip` or `cuopt-link-release-cu13.zip` (for CUDA 12 and 13 respectively) from the [releases page](https://github.com/GAMS-dev/cuoptlink-builder/releases):
- Unpack the contents of `cuopt-link-release-cu*.zip` into your GAMS system directory. For GAMSPy, you can find out your system directory by running `gamspy show base`. So for example you can run `unzip -o cuopt-link-release-cu*.zip -d $(gamspy show base)`.
- **Caution:** This will overwrite any existing `gamsconfig.yaml` file in that directory. The contained `gamsconfig.yaml` contains a `solverConfig` section to make cuOpt available to GAMS.

More specifically, the files from the CUDA runtime needed are
```
libcublas.so.12
libcublasLt.so.12
libcudss.so.0
libcurand.so.10
libcusolver.so.11
libnvJitLink.so.12
```
and can be installed e.g. via `pip install --extra-index-url=https://pypi.nvidia.com cuopt-cu12==25.5.* nvidia-cuda-runtime-cu12==12.8.* nvidia-nvjitlink-cu12` into a Python environment or downloaded as archive `cu12-runtime.zip` from the [releases page](https://github.com/GAMS-dev/cuoptlink-builder/releases).
The neccessary files from the CUDA 12 or 13 runtime can also be downloaded as convenient archive `cu12-runtime.zip` or `cu13-runtime.zip` from the [releases page](https://github.com/GAMS-dev/cuoptlink-builder/releases).

## Test the setup

Expand All @@ -42,4 +33,5 @@ gams trnsport lp cuopt

## Examples

- [examples/trnsport_cuopt.ipynb](examples/trnsport_cuopt.ipynb)
- [examples/trnsport_cuopt.ipynb](examples/trnsport_cuopt.ipynb) for CUDA 12
- [examples/trnsport_cuopt.ipynb](examples/trnsport_cuopt_cu13.ipynb) for CUDA 13
Loading