pkg_helpers.bash 9.55 KB
Newer Older
1
2
3
4
# A set of useful bash functions for common functionality we need to do in
# many build scripts


Edward Z. Yang's avatar
Edward Z. Yang committed
5
6
7
8
9
# Setup CUDA environment variables, based on CU_VERSION
#
# Inputs:
#   CU_VERSION (cpu, cu92, cu100)
#   NO_CUDA_PACKAGE (bool)
10
#   BUILD_TYPE (conda, wheel)
Edward Z. Yang's avatar
Edward Z. Yang committed
11
12
13
14
15
16
#
# Outputs:
#   VERSION_SUFFIX (e.g., "")
#   PYTORCH_VERSION_SUFFIX (e.g., +cpu)
#   WHEEL_DIR (e.g., cu100/)
#   CUDA_HOME (e.g., /usr/local/cuda-9.2, respected by torch.utils.cpp_extension)
17
18
#   USE_CUDA (respected by torchaudio setup.py)
#   NVCC_FLAGS (respected by torchaudio setup.py)
Edward Z. Yang's avatar
Edward Z. Yang committed
19
20
21
22
23
24
25
26
27
28
29
30
#
# Precondition: CUDA versions are installed in their conventional locations in
# /usr/local/cuda-*
#
# NOTE: Why VERSION_SUFFIX versus PYTORCH_VERSION_SUFFIX?  If you're building
# a package with CUDA on a platform we support CUDA on, VERSION_SUFFIX ==
# PYTORCH_VERSION_SUFFIX and everyone is happy.  However, if you are building a
# package with only CPU bits (e.g., torchaudio), then VERSION_SUFFIX is always
# empty, but PYTORCH_VERSION_SUFFIX is +cpu (because that's how you get a CPU
# version of a Python package.  But that doesn't apply if you're on OS X,
# since the default CU_VERSION on OS X is cpu.
setup_cuda() {
31
32
33
34

  # First, compute version suffixes.  By default, assume no version suffixes
  export VERSION_SUFFIX=""
  export PYTORCH_VERSION_SUFFIX=""
35
  export WHEEL_DIR="cpu/"
36
37
  # Wheel builds need suffixes (but not if they're on OS X, which never has suffix)
  if [[ "$BUILD_TYPE" == "wheel" ]] && [[ "$(uname)" != Darwin ]]; then
38
    export PYTORCH_VERSION_SUFFIX="+$CU_VERSION"
39
40
41
42
    # Match the suffix scheme of pytorch, unless this package does not have
    # CUDA builds (in which case, use default)
    if [[ -z "$NO_CUDA_PACKAGE" ]]; then
      export VERSION_SUFFIX="$PYTORCH_VERSION_SUFFIX"
43
      export WHEEL_DIR="$CU_VERSION/"
Edward Z. Yang's avatar
Edward Z. Yang committed
44
    fi
45
  fi
46
47
48

  # Now work out the CUDA settings
  case "$CU_VERSION" in
pbialecki's avatar
pbialecki committed
49
50
51
52
53
54
55
56
    cu118)
      if [[ "$OSTYPE" == "msys" ]]; then
        export CUDA_HOME="C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v11.8"
      else
        export CUDA_HOME=/usr/local/cuda-11.8/
      fi
      export TORCH_CUDA_ARCH_LIST="3.5;5.0+PTX;6.0;7.0;7.5;8.0;8.6"
      ;;
pbialecki's avatar
pbialecki committed
57
58
59
60
61
62
63
64
    cu117)
      if [[ "$OSTYPE" == "msys" ]]; then
        export CUDA_HOME="C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v11.7"
      else
        export CUDA_HOME=/usr/local/cuda-11.7/
      fi
      export TORCH_CUDA_ARCH_LIST="3.5;5.0+PTX;6.0;7.0;7.5;8.0;8.6"
      ;;
65
66
67
68
69
70
71
72
    cu116)
      if [[ "$OSTYPE" == "msys" ]]; then
        export CUDA_HOME="C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v11.6"
      else
        export CUDA_HOME=/usr/local/cuda-11.6/
      fi
      export TORCH_CUDA_ARCH_LIST="3.5;5.0+PTX;6.0;7.0;7.5;8.0;8.6"
      ;;
73
74
75
    rocm*)
      export USE_ROCM=1
      ;;
76
77
78
79
80
81
82
    cpu)
      ;;
    *)
      echo "Unrecognized CU_VERSION=$CU_VERSION"
      exit 1
      ;;
  esac
83
  if [[ -n "$CUDA_HOME" ]]; then
84
85
86
87
88
89
    if [[ "$OSTYPE" == "msys" ]]; then
      export PATH="$CUDA_HOME\\bin:$PATH"
    else
      # Adds nvcc binary to the search path so that CMake's `find_package(CUDA)` will pick the right one
      export PATH="$CUDA_HOME/bin:$PATH"
    fi
90
    export USE_CUDA=1
91
  fi
92
93
}

Edward Z. Yang's avatar
Edward Z. Yang committed
94
95
96
97
# Populate build version if necessary, and add version suffix
#
# Inputs:
#   BUILD_VERSION (e.g., 0.2.0 or empty)
98
#   VERSION_SUFFIX (e.g., +cpu)
Edward Z. Yang's avatar
Edward Z. Yang committed
99
100
101
102
103
#
# Outputs:
#   BUILD_VERSION (e.g., 0.2.0.dev20190807+cpu)
#
# Fill BUILD_VERSION if it doesn't exist already with a nightly string
104
105
# Or retrieve it from the version.txt
# Usage: setup_build_version
106
107
setup_build_version() {
  if [[ -z "$BUILD_VERSION" ]]; then
108
109
110
111
112
113
    if [[ -z "$1" ]]; then
      setup_base_build_version
    else
      BUILD_VERSION="$1"
    fi
    BUILD_VERSION="$BUILD_VERSION.dev$(date "+%Y%m%d")$VERSION_SUFFIX"
Edward Z. Yang's avatar
Edward Z. Yang committed
114
  else
115
    BUILD_VERSION="$BUILD_VERSION$VERSION_SUFFIX"
116
  fi
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131

  # Set build version based on tag if on tag
  if [[ -n "${CIRCLE_TAG}" ]]; then
    # Strip tag
    BUILD_VERSION="$(echo "${CIRCLE_TAG}" | sed -e 's/^v//' -e 's/-.*$//')${VERSION_SUFFIX}"
  fi

  export BUILD_VERSION
}

setup_base_build_version() {
  SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
  # version.txt for some reason has `a` character after major.minor.rev
  # command below yields 0.10.0 from version.txt containing 0.10.0a0
  BUILD_VERSION=$( cut -f 1 -d a "$SCRIPT_DIR/../version.txt" )
132
  export BUILD_VERSION
133
134
135
136
137
}

# Set some useful variables for OS X, if applicable
setup_macos() {
  if [[ "$(uname)" == Darwin ]]; then
moto's avatar
moto committed
138
    export CC=clang CXX=clang++
139
140
141
  fi
}

Edward Z. Yang's avatar
Edward Z. Yang committed
142
143
144
145
# Top-level entry point for things every package will need to do
#
# Usage: setup_env 0.2.0
setup_env() {
146
147
  # https://github.com/actions/checkout/issues/760#issuecomment-1097501613
  git config --global --add safe.directory /__w/audio/audio
148
  git submodule update --init --recursive
Edward Z. Yang's avatar
Edward Z. Yang committed
149
  setup_cuda
150
  setup_build_version
Edward Z. Yang's avatar
Edward Z. Yang committed
151
152
153
  setup_macos
}

154
155
156
157
158
# Function to retry functions that sometimes timeout or have flaky failures
retry () {
    $*  || (sleep 1 && $*) || (sleep 2 && $*) || (sleep 4 && $*) || (sleep 8 && $*)
}

Edward Z. Yang's avatar
Edward Z. Yang committed
159
160
161
162
163
164
165
166
167
# Inputs:
#   PYTHON_VERSION (2.7, 3.5, 3.6, 3.7)
#   UNICODE_ABI (bool)
#
# Outputs:
#   PATH modified to put correct Python version in PATH
#
# Precondition: If Linux, you are in a soumith/manylinux-cuda* Docker image
setup_wheel_python() {
peterjc123's avatar
peterjc123 committed
168
  if [[ "$(uname)" == Darwin || "$OSTYPE" == "msys" ]]; then
Edward Z. Yang's avatar
Edward Z. Yang committed
169
170
171
172
    eval "$(conda shell.bash hook)"
    conda env remove -n "env$PYTHON_VERSION" || true
    conda create -yn "env$PYTHON_VERSION" python="$PYTHON_VERSION"
    conda activate "env$PYTHON_VERSION"
173
    conda install --quiet -y pkg-config
Edward Z. Yang's avatar
Edward Z. Yang committed
174
175
176
  else
    case "$PYTHON_VERSION" in
      3.7) python_abi=cp37-cp37m ;;
177
      3.8) python_abi=cp38-cp38 ;;
Eli Uriegas's avatar
Eli Uriegas committed
178
      3.9) python_abi=cp39-cp39 ;;
179
      3.10) python_abi=cp310-cp310 ;;
Edward Z. Yang's avatar
Edward Z. Yang committed
180
181
182
183
184
185
186
187
188
      *)
        echo "Unrecognized PYTHON_VERSION=$PYTHON_VERSION"
        exit 1
        ;;
    esac
    export PATH="/opt/python/$python_abi/bin:$PATH"
  fi
}

189
190
191
192
193
194
195
196
197
# Install with pip a bit more robustly than the default
pip_install() {
  retry pip install --progress-bar off "$@"
}

# Install torch with pip, respecting PYTORCH_VERSION, and record the installed
# version into PYTORCH_VERSION, if applicable
setup_pip_pytorch_version() {
  if [[ -z "$PYTORCH_VERSION" ]]; then
Edward Z. Yang's avatar
Edward Z. Yang committed
198
199
200
    # Install latest prerelease version of torch, per our nightlies, consistent
    # with the requested cuda version
    pip_install --pre torch -f "https://download.pytorch.org/whl/nightly/${WHEEL_DIR}torch_nightly.html"
201
202
    # CUDA and CPU are ABI compatible on the CPU-only parts, so strip in this case
    export PYTORCH_VERSION="$(pip show torch | grep ^Version: | sed 's/Version:  *//' | sed 's/+.\+//')"
203
  else
204
    pip_install "torch==$PYTORCH_VERSION$PYTORCH_VERSION_SUFFIX" \
Edward Z. Yang's avatar
Edward Z. Yang committed
205
      -f https://download.pytorch.org/whl/torch_stable.html \
206
      -f "https://download.pytorch.org/whl/${UPLOAD_CHANNEL}/torch_${UPLOAD_CHANNEL}.html"
207
208
209
210
211
212
  fi
}

# Fill PYTORCH_VERSION with the latest conda nightly version, and
# CONDA_CHANNEL_FLAGS with appropriate flags to retrieve these versions
#
213
# You MUST have populated PYTORCH_VERSION_SUFFIX before hand.
214
setup_conda_pytorch_constraint() {
Eli Uriegas's avatar
Eli Uriegas committed
215
  CONDA_CHANNEL_FLAGS="${CONDA_CHANNEL_FLAGS}"
216
  if [[ -z "$PYTORCH_VERSION" ]]; then
Eli Uriegas's avatar
Eli Uriegas committed
217
    export CONDA_CHANNEL_FLAGS="${CONDA_CHANNEL_FLAGS} -c pytorch-nightly"
218
219
220
221
222
    if [[ "$OSTYPE" == "msys" ]]; then
      export PYTORCH_VERSION="$(conda search --json -c pytorch-nightly pytorch | python -c "import sys, json; data=json.load(sys.stdin); print(data['pytorch'][-1]['version'])")"
    else
      export PYTORCH_VERSION="$(conda search --json 'pytorch[channel=pytorch-nightly]' | python3 -c "import sys, json, re; print(re.sub(r'\\+.*$', '', json.load(sys.stdin)['pytorch'][-1]['version']))")"
    fi
223
  else
Eli Uriegas's avatar
Eli Uriegas committed
224
225
    export CONDA_CHANNEL_FLAGS="${CONDA_CHANNEL_FLAGS} -c pytorch -c pytorch-test -c pytorch-nightly"
  fi
Edward Z. Yang's avatar
Edward Z. Yang committed
226
  if [[ "$CU_VERSION" == cpu ]]; then
Edward Z. Yang's avatar
Edward Z. Yang committed
227
    export CONDA_PYTORCH_BUILD_CONSTRAINT="- pytorch==$PYTORCH_VERSION${PYTORCH_VERSION_SUFFIX}"
228
229
    export CONDA_PYTORCH_CONSTRAINT="- pytorch==$PYTORCH_VERSION"
  else
Edward Z. Yang's avatar
Edward Z. Yang committed
230
231
    export CONDA_PYTORCH_BUILD_CONSTRAINT="- pytorch==${PYTORCH_VERSION}${PYTORCH_VERSION_SUFFIX}"
    export CONDA_PYTORCH_CONSTRAINT="- pytorch==${PYTORCH_VERSION}${PYTORCH_VERSION_SUFFIX}"
232
  fi
Nikita Shulga's avatar
Nikita Shulga committed
233
234
  # TODO: Remove me later, see https://github.com/pytorch/pytorch/issues/62424 for more details
  if [[ "$(uname)" == Darwin ]]; then
235
236
237
238
239
    arch_name="$(uname -m)"
    if [ "${arch_name}" != "arm64" ]; then
      # Use less than equal to avoid version conflict in python=3.6 environment
      export CONDA_EXTRA_BUILD_CONSTRAINT="- mkl<=2021.2.0"
    fi
Nikita Shulga's avatar
Nikita Shulga committed
240
  fi
241
242
243
244
}

# Translate CUDA_VERSION into CUDA_CUDATOOLKIT_CONSTRAINT
setup_conda_cudatoolkit_constraint() {
245
  export CONDA_BUILD_VARIANT="cuda"
Edward Z. Yang's avatar
Edward Z. Yang committed
246
  if [[ "$(uname)" == Darwin ]]; then
247
    export CONDA_BUILD_VARIANT="cpu"
248
  else
Edward Z. Yang's avatar
Edward Z. Yang committed
249
    case "$CU_VERSION" in
pbialecki's avatar
pbialecki committed
250
251
252
      cu118)
        export CONDA_CUDATOOLKIT_CONSTRAINT="- pytorch-cuda=11.8 # [not osx]"
        ;;
253
254
255
      cu117)
        export CONDA_CUDATOOLKIT_CONSTRAINT="- pytorch-cuda=11.7 # [not osx]"
        ;;
256
      cu116)
257
        export CONDA_CUDATOOLKIT_CONSTRAINT="- pytorch-cuda=11.6 # [not osx]"
258
        ;;
Edward Z. Yang's avatar
Edward Z. Yang committed
259
260
      cpu)
        export CONDA_CUDATOOLKIT_CONSTRAINT=""
261
        export CONDA_BUILD_VARIANT="cpu"
Edward Z. Yang's avatar
Edward Z. Yang committed
262
        ;;
Edward Z. Yang's avatar
Edward Z. Yang committed
263
264
265
266
      *)
        echo "Unrecognized CU_VERSION=$CU_VERSION"
        exit 1
        ;;
Edward Z. Yang's avatar
Edward Z. Yang committed
267
    esac
268
269
  fi
}
270
271
272
273
274
275
276
277
278
279

# Build the proper compiler package before building the final package
setup_visual_studio_constraint() {
  if [[ "$OSTYPE" == "msys" ]]; then
      export VSTOOLCHAIN_PACKAGE=vs2019
      export VSDEVCMD_ARGS=''
      conda build $CONDA_CHANNEL_FLAGS --no-anaconda-upload packaging/$VSTOOLCHAIN_PACKAGE
      cp packaging/$VSTOOLCHAIN_PACKAGE/conda_build_config.yaml packaging/torchaudio/conda_build_config.yaml
  fi
}