MIDI-GPT-inference-docker / create_python_library.sh
Paul Triana
initial commit
6229e10
raw
history blame
5.76 kB
#!/bin/bash
compute_canada=false
mac_os=false
cpu=false
no_torch=false
niagara=false
env_name="venv"
parent_dir="midigpt_workspace" # default parent directory name
cuda=false
trace=false
# Parse arguments
for ((i=1;i<=$#;i++)); do
case ${!i} in
--trace)
trace=true
;;
--compute_canada)
compute_canada=true
;;
--cpu)
cpu=true
;;
--mac_os)
mac_os=true
;;
--no_torch)
no_torch=true
;;
--niagara)
niagara=true
;;
--env_name)
i=$((i+1))
env_name=${!i}
;;
-n=*|--name=*) # new parent directory name option
parent_dir="${!i#*=}"
shift
;;
--cuda)
if $no_torch; then
echo "Cannot use --cuda and --no_torch at the same time."
exit 1
fi
cuda=true
;;
*)
echo "Unknown option ${!i}"
exit 1
;;
esac
done
# Get the current directory name
dir_name=$(basename `pwd`)
# Get the parent directory name
parent_dir_name=$(basename $(dirname `pwd`))
if [ "$parent_dir_name" != "$parent_dir" ]; then
# Go to the parent directory
cd ..
# Create the new parent directory
mkdir $parent_dir
# Move the old directory into the new parent directory
mv $dir_name $parent_dir/
# Change to the old directory, which is now inside the parent directory
cd $parent_dir/$dir_name
fi
# Load modules if we are in compute_canada and niagara
if $compute_canada; then
if $niagara; then
module load CCEnv arch/avx512
fi
module load StdEnv/2020
module load cmake/3.23.1
module load gcc/11.3.0
module load protobuf/3.12.3
module load python/3.8.2
mkdir ../CCLOG
fi
# Environment creation
if [[ -n ../$env_name ]]; then
if [[ -d ../$env_name ]]; then
echo "Environment $env_name already exists, activating it..."
else
echo "Environment $env_name does not exist, creating it..."
if $compute_canada; then
virtualenv ../$env_name
else
python3 -m venv ../$env_name
fi
fi
fi
source ../$env_name/bin/activate
# Install requirements
pip install -r pip_requirements/common_requirements.txt
if $compute_canada; then
pip install -r pip_requirements/create_dataset_requirements.txt
fi
if $mac_os; then
pip install -r pip_requirements/inference_requirements.txt
fi
if $compute_canada && ! $niagara; then # anf if no torch
pip install -r pip_requirements/train_requirements.txt
fi
#deactivate
# Set CMake flags based on command line arguments
cmake_flags=""
if $compute_canada; then
cmake_flags="$cmake_flags -Dcompute_canada=ON"
fi
if $no_torch; then
cmake_flags="$cmake_flags -Dno_torch=ON"
fi
if $trace; then
cmake_flags="$cmake_flags -Dtrace=ON"
fi
# Code to check if libtorch and pybind11 are already downloaded
if ! $no_torch; then
libtorch_path="libraries/libtorch"
libtorch_url="https://download.pytorch.org/libtorch/cpu/libtorch-cxx11-abi-shared-with-deps-2.0.0%2Bcpu.zip"
if $cuda; then
libtorch_url="https://download.pytorch.org/libtorch/cu118/libtorch-cxx11-abi-shared-with-deps-2.0.0%2Bcu118.zip"
fi
fi
pybind11_path="libraries/pybind11"
midifile_path="libraries/midifile"
pybind11_url="https://github.com/pybind/pybind11.git"
midifile_url="https://github.com/craigsapp/midifile"
if ! $no_torch; then
if $mac_os; then
libtorch_url="https://download.pytorch.org/libtorch/cpu/libtorch-macos-2.0.1.zip"
fi
if $cpu; then
libtorch_url="https://download.pytorch.org/libtorch/cpu/libtorch-cxx11-abi-shared-with-deps-2.0.0%2Bcpu.zip"
fi
# Check if libtorch folder exists and is not empty
if [ ! -d "$libtorch_path" ] || [ -z "$(ls -A "$libtorch_path")" ]; then
echo "libtorch folder does not exist or is empty. Downloading and extracting..."
mkdir -p "$libtorch_path"
curl -L "$libtorch_url" -o libtorch.zip
unzip -q libtorch.zip -d libraries/
rm libtorch.zip
echo "libtorch downloaded and extracted."
else
echo "libtorch folder exists and is not empty. No need to download."
fi
fi
# Check if pybind11 folder exists and is not empty
if [ ! -d "$pybind11_path" ] || [ -z "$(ls -A "$pybind11_path")" ]; then
echo "pybind11 folder does not exist or is empty. Cloning the repository..."
mkdir -p libraries
git clone "$pybind11_url" "$pybind11_path"
echo "pybind11 downloaded."
cd libraries/pybind11
git reset --hard 5ccb9e4
cd ../../
echo "pybind11 reset to working build"
else
echo "pybind11 folder exists and is not empty. No need to download."
fi
# Check if midifile folder exists and is not empty
if [ ! -d "$midifile_path" ] || [ -z "$(ls -A "$midifile_path")" ]; then
echo "midifile folder does not exist or is empty. Cloning the repository..."
mkdir -p libraries
git clone "$midifile_url" "$midifile_path"
echo "midifile downloaded."
cd libraries/midifile
git reset --hard 838c62c
cd ../../
echo "midifile reset to working build"
else
echo "midifile folder exists and is not empty. No need to download."
fi
# Middle section of the script to build the python library
rm -rf ./python_lib
mkdir ./python_lib
rm -rf ./libraries/protobuf/build
mkdir ./libraries/protobuf/build
cd ./libraries/protobuf/src
protoc --cpp_out ../build *.proto
cd ../../..
cd ./python_lib
if $mac_os; then
cmake $cmake_flags .. -Dmac_os=ON -DCMAKE_PREFIX_PATH=$(python3 -c 'import torch;print(torch.utils.cmake_prefix_path)')
else
cmake $cmake_flags ..
fi
make
python3 -c "import midigpt; print('midigpt python library built successfully')"
cd ..
if $compute_canada; then
dos2unix create_dataset_compute_canada.sh
dos2unix train_dataset.sh
fi
cd ./python_lib
cd ..