-
Notifications
You must be signed in to change notification settings - Fork 474
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #486 from johnnynunez/master
Simplify Installation Cuda and latest Cuda
- Loading branch information
Showing
5 changed files
with
124 additions
and
156 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
244 changes: 96 additions & 148 deletions
244
dependencies/cuda-cmake-github-actions/scripts/actions/install_cuda_ubuntu.sh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,181 +1,129 @@ | ||
# @todo - better / more robust parsing of inputs from env vars. | ||
#!/bin/bash | ||
|
||
## ------------------- | ||
## Constants | ||
## Configuration | ||
## ------------------- | ||
|
||
# @todo - apt repos/known supported versions? | ||
|
||
# @todo - GCC support matrix? | ||
|
||
# List of sub-packages to install. | ||
# @todo - pass this in from outside the script? | ||
# @todo - check the specified subpackages exist via apt pre-install? apt-rdepends cuda-9-0 | grep "^cuda-"? | ||
|
||
# Ideally choose from the list of meta-packages to minimise variance between cuda versions (although it does change too) | ||
CUDA_PACKAGES_IN=( | ||
"command-line-tools" | ||
"libraries-dev" | ||
# CUDA sub-packages to install. | ||
declare -a CUDA_PACKAGES_IN=( | ||
"cuda-command-line-tools" | ||
"cuda-libraries-dev" | ||
"cuda-nvcc" | ||
) | ||
|
||
## ------------------- | ||
## Bash functions | ||
## Helper Functions | ||
## ------------------- | ||
# returns 0 (true) if a >= b | ||
function version_ge() { | ||
[ "$#" != "2" ] && echo "${FUNCNAME[0]} requires exactly 2 arguments." && exit 1 | ||
[ "$(printf '%s\n' "$@" | sort -V | head -n 1)" == "$2" ] | ||
} | ||
# returns 0 (true) if a > b | ||
function version_gt() { | ||
[ "$#" != "2" ] && echo "${FUNCNAME[0]} requires exactly 2 arguments." && exit 1 | ||
[ "$1" = "$2" ] && return 1 || version_ge $1 $2 | ||
} | ||
# returns 0 (true) if a <= b | ||
function version_le() { | ||
[ "$#" != "2" ] && echo "${FUNCNAME[0]} requires exactly 2 arguments." && exit 1 | ||
[ "$(printf '%s\n' "$@" | sort -V | head -n 1)" == "$1" ] | ||
} | ||
# returns 0 (true) if a < b | ||
function version_lt() { | ||
[ "$#" != "2" ] && echo "${FUNCNAME[0]} requires exactly 2 arguments." && exit 1 | ||
[ "$1" = "$2" ] && return 1 || version_le $1 $2 | ||
|
||
# Function to check if a command exists | ||
command_exists() { | ||
command -v "$1" >/dev/null 2>&1 | ||
} | ||
|
||
## ------------------- | ||
## Select CUDA version | ||
## Input Validation and Environment Setup | ||
## ------------------- | ||
|
||
# Get the cuda version from the environment as $cuda. | ||
CUDA_VERSION_MAJOR_MINOR=${cuda} | ||
# Get CUDA version from environment variable 'cuda' | ||
CUDA_VERSION_MAJOR_MINOR="${cuda}" | ||
|
||
# Split the version. | ||
# We (might/probably) don't know PATCH at this point - it depends which version gets installed. | ||
CUDA_MAJOR=$(echo "${CUDA_VERSION_MAJOR_MINOR}" | cut -d. -f1) | ||
CUDA_MINOR=$(echo "${CUDA_VERSION_MAJOR_MINOR}" | cut -d. -f2) | ||
CUDA_PATCH=$(echo "${CUDA_VERSION_MAJOR_MINOR}" | cut -d. -f3) | ||
# use lsb_release to find the OS. | ||
UBUNTU_VERSION=$(lsb_release -sr) | ||
UBUNTU_VERSION="${UBUNTU_VERSION//.}" | ||
|
||
echo "CUDA_MAJOR: ${CUDA_MAJOR}" | ||
echo "CUDA_MINOR: ${CUDA_MINOR}" | ||
echo "CUDA_PATCH: ${CUDA_PATCH}" | ||
# echo "UBUNTU_NAME: ${UBUNTU_NAME}" | ||
echo "UBUNTU_VERSION: ${UBUNTU_VERSION}" | ||
|
||
# If we don't know the CUDA_MAJOR or MINOR, error. | ||
if [ -z "${CUDA_MAJOR}" ] ; then | ||
echo "Error: Unknown CUDA Major version. Aborting." | ||
exit 1 | ||
# Validate CUDA version | ||
if [ -z "$CUDA_VERSION_MAJOR_MINOR" ]; then | ||
echo "Error: CUDA version not specified. Please set the 'cuda' environment variable (e.g., cuda=12.2)." | ||
exit 1 | ||
fi | ||
if [ -z "${CUDA_MINOR}" ] ; then | ||
echo "Error: Unknown CUDA Minor version. Aborting." | ||
exit 1 | ||
|
||
CUDA_MAJOR=$(echo "$CUDA_VERSION_MAJOR_MINOR" | cut -d. -f1) | ||
CUDA_MINOR=$(echo "$CUDA_VERSION_MAJOR_MINOR" | cut -d. -f2) | ||
|
||
# Check for root/sudo | ||
if ! command_exists sudo && [ "$EUID" -ne 0 ]; then | ||
echo "Error: This script requires root privileges. Please run with sudo." | ||
exit 1 | ||
fi | ||
# If we don't know the Ubuntu version, error. | ||
if [ -z ${UBUNTU_VERSION} ]; then | ||
echo "Error: Unknown Ubuntu version. Aborting." | ||
exit 1 | ||
|
||
SUDO_CMD="" | ||
if [ "$EUID" -ne 0 ]; then | ||
SUDO_CMD="sudo" | ||
fi | ||
|
||
# Get Ubuntu version | ||
UBUNTU_VERSION=$(lsb_release -sr) | ||
|
||
## --------------------------- | ||
## GCC studio support check? | ||
## --------------------------- | ||
# Validate Ubuntu version | ||
if [ -z "$UBUNTU_VERSION" ]; then | ||
echo "Error: Could not determine Ubuntu version." | ||
exit 1 | ||
fi | ||
|
||
# @todo | ||
# Format Ubuntu version for URLs (e.g., 20.04 -> 2004) | ||
UBUNTU_VERSION_FORMATTED=$(echo "$UBUNTU_VERSION" | tr -d '.') | ||
|
||
## ------------------------------- | ||
## Select CUDA packages to install | ||
## ------------------------------- | ||
CUDA_PACKAGES="" | ||
for package in "${CUDA_PACKAGES_IN[@]}" | ||
do : | ||
# @todo This is not perfect. Should probably provide a separate list for diff versions | ||
# cuda-compiler-X-Y if CUDA >= 9.1 else cuda-nvcc-X-Y | ||
if [[ "${package}" == "nvcc" ]] && version_ge "$CUDA_VERSION_MAJOR_MINOR" "9.1" ; then | ||
package="compiler" | ||
elif [[ "${package}" == "compiler" ]] && version_lt "$CUDA_VERSION_MAJOR_MINOR" "9.1" ; then | ||
package="nvcc" | ||
fi | ||
# Build the full package name and append to the string. | ||
CUDA_PACKAGES+=" cuda-${package}-${CUDA_MAJOR}-${CUDA_MINOR}" | ||
done | ||
echo "CUDA_PACKAGES ${CUDA_PACKAGES}" | ||
echo "CUDA Version: $CUDA_VERSION_MAJOR_MINOR" | ||
echo "Ubuntu Version: $UBUNTU_VERSION" | ||
echo "Ubuntu Version Formatted: $UBUNTU_VERSION_FORMATTED" | ||
|
||
## ----------------- | ||
## Prepare to install | ||
## ----------------- | ||
## ------------------- | ||
## Install CUDA | ||
## ------------------- | ||
|
||
PIN_FILENAME="cuda-ubuntu${UBUNTU_VERSION}.pin" | ||
PIN_URL="https://developer.download.nvidia.com/compute/cuda/repos/ubuntu${UBUNTU_VERSION}/x86_64/${PIN_FILENAME}" | ||
APT_KEY_URL="https://developer.download.nvidia.com/compute/cuda/repos/ubuntu${UBUNTU_VERSION}/x86_64/3bf863cc.pub" | ||
REPO_URL="https://developer.download.nvidia.com/compute/cuda/repos/ubuntu${UBUNTU_VERSION}/x86_64/" | ||
# Download and install the CUDA keyring | ||
KEYRING_URL="https://developer.download.nvidia.com/compute/cuda/repos/ubuntu${UBUNTU_VERSION_FORMATTED}/x86_64/cuda-keyring_1.1-1_all.deb" | ||
echo "Downloading CUDA keyring from: $KEYRING_URL" | ||
wget -nv "$KEYRING_URL" -O cuda-keyring.deb | ||
$SUDO_CMD dpkg -i cuda-keyring.deb | ||
rm cuda-keyring.deb | ||
|
||
echo "PIN_FILENAME ${PIN_FILENAME}" | ||
echo "PIN_URL ${PIN_URL}" | ||
echo "APT_KEY_URL ${APT_KEY_URL}" | ||
# Update package list | ||
echo "Updating package list..." | ||
$SUDO_CMD apt-get update | ||
|
||
## ----------------- | ||
## Check for root/sudo | ||
## ----------------- | ||
# Construct the list of CUDA packages to install | ||
CUDA_PACKAGES="" | ||
for package in "${CUDA_PACKAGES_IN[@]}"; do | ||
CUDA_PACKAGES+=" ${package}-${CUDA_MAJOR}-${CUDA_MINOR}" | ||
done | ||
|
||
# Detect if the script is being run as root, storing true/false in is_root. | ||
is_root=false | ||
if (( $EUID == 0)); then | ||
is_root=true | ||
fi | ||
# Find if sudo is available | ||
has_sudo=false | ||
if command -v sudo &> /dev/null ; then | ||
has_sudo=true | ||
fi | ||
# Decide if we can proceed or not (root or sudo is required) and if so store whether sudo should be used or not. | ||
if [ "$is_root" = false ] && [ "$has_sudo" = false ]; then | ||
echo "Root or sudo is required. Aborting." | ||
exit 1 | ||
elif [ "$is_root" = false ] ; then | ||
USE_SUDO=sudo | ||
else | ||
USE_SUDO= | ||
# Special handling for nvcc in older versions | ||
if (( $(echo "$CUDA_MAJOR < 9" | bc -l) )); then | ||
CUDA_PACKAGES+=" cuda-nvcc-${CUDA_MAJOR}-${CUDA_MINOR}" | ||
fi | ||
|
||
## ----------------- | ||
## Install | ||
## ----------------- | ||
echo "Adding CUDA Repository" | ||
wget ${PIN_URL} | ||
$USE_SUDO mv ${PIN_FILENAME} /etc/apt/preferences.d/cuda-repository-pin-600 | ||
$USE_SUDO apt-key adv --fetch-keys ${APT_KEY_URL} | ||
$USE_SUDO add-apt-repository "deb ${REPO_URL} /" | ||
$USE_SUDO apt-get update | ||
|
||
echo "Installing CUDA packages ${CUDA_PACKAGES}" | ||
$USE_SUDO apt-get -y install ${CUDA_PACKAGES} | ||
|
||
if [[ $? -ne 0 ]]; then | ||
echo "CUDA Installation Error." | ||
exit 1 | ||
# Install CUDA packages | ||
echo "Installing CUDA packages: $CUDA_PACKAGES" | ||
$SUDO_CMD apt-get install -y --no-install-recommends $CUDA_PACKAGES | ||
|
||
if [ $? -ne 0 ]; then | ||
echo "Error: Failed to install CUDA packages." | ||
exit 1 | ||
fi | ||
## ----------------- | ||
## Set environment vars / vars to be propagated | ||
## ----------------- | ||
|
||
CUDA_PATH=/usr/local/cuda-${CUDA_MAJOR}.${CUDA_MINOR} | ||
echo "CUDA_PATH=${CUDA_PATH}" | ||
export CUDA_PATH=${CUDA_PATH} | ||
## ------------------- | ||
## Environment Variables | ||
## ------------------- | ||
|
||
CUDA_PATH="/usr/local/cuda-${CUDA_MAJOR}.${CUDA_MINOR}" | ||
echo "CUDA_PATH=$CUDA_PATH" | ||
|
||
# Quick test. @temp | ||
# Update environment variables for the current shell | ||
export CUDA_PATH | ||
export PATH="$CUDA_PATH/bin:$PATH" | ||
export LD_LIBRARY_PATH="$CUDA_PATH/lib:$LD_LIBRARY_PATH" | ||
nvcc -V | ||
|
||
# If executed on github actions, make the appropriate echo statements to update the environment | ||
if [[ $GITHUB_ACTIONS ]]; then | ||
# Set paths for subsequent steps, using ${CUDA_PATH} | ||
echo "Adding CUDA to CUDA_PATH, PATH and LD_LIBRARY_PATH" | ||
echo "CUDA_PATH=${CUDA_PATH}" >> $GITHUB_ENV | ||
echo "${CUDA_PATH}/bin" >> $GITHUB_PATH | ||
echo "LD_LIBRARY_PATH=${CUDA_PATH}/lib:${LD_LIBRARY_PATH}" >> $GITHUB_ENV | ||
export LD_LIBRARY_PATH="$CUDA_PATH/lib64:$LD_LIBRARY_PATH" | ||
|
||
# Verify installation (optional) | ||
echo "Verifying installation..." | ||
if command_exists nvcc; then | ||
nvcc --version | ||
else | ||
echo "Warning: nvcc not found. Installation might be incomplete." | ||
fi | ||
|
||
# Update environment variables for GitHub Actions (if applicable) | ||
if [ -n "$GITHUB_ACTIONS" ]; then | ||
echo "Setting environment variables for GitHub Actions..." | ||
echo "CUDA_PATH=$CUDA_PATH" >> "$GITHUB_ENV" | ||
echo "$CUDA_PATH/bin" >> "$GITHUB_PATH" | ||
echo "LD_LIBRARY_PATH=$CUDA_PATH/lib64:$LD_LIBRARY_PATH" >> "$GITHUB_ENV" | ||
fi | ||
|
||
echo "CUDA installation complete." |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters