Spaces:
Runtime error
Runtime error
File size: 7,679 Bytes
3177298 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 |
#!/usr/bin/env bash
#bitsandbytes
#https://github.com/TimDettmers/bitsandbytes
#
### 安装bitsandbytes
#
#bitsandbytes 是 CUDA 自定义函数的轻量级包装器, 特别是 8 位优化器, 矩阵乘法 (LLM.int8()) 和量化函数.
#
#### 安装
#
#通过 `pip3 install bitsandbytes` 来安装.
#
#安装之后通过 `python -m bitsandbytes` 来验证安装是否成功.
#
#在某些情况下可能需要从源代码进行编译.
#
#```text
#git clone https://github.com/timdettmers/bitsandbytes.git
#cd bitsandbytes
#
## CUDA_VERSIONS in {110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 120}
## make argument in {cuda110, cuda11x, cuda12x}
## if you do not know what CUDA you have, try looking at the output of: python -m bitsandbytes
#CUDA_VERSION=117 make cuda11x
#python setup.py install
#```
#
#### 备注
#
##### 必须安装与 GPU 版本相匹配的 CUDA
#
#我的情况如下:
#
#**GPU 和 CUDA 版本. **
#
#```text
## nvidia-smi
#Mon Aug 28 14:38:32 2023
#+-----------------------------------------------------------------------------+
#| NVIDIA-SMI 515.105.01 Driver Version: 515.105.01 CUDA Version: 11.7 |
#|-------------------------------+----------------------+----------------------+
#| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
#| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
#| | | MIG M. |
#|===============================+======================+======================|
#| 0 Tesla V100S-PCI... Off | 00000000:0B:00.0 Off | 0 |
#| N/A 48C P0 40W / 250W | 14154MiB / 32768MiB | 0% Default |
#| | | N/A |
#+-------------------------------+----------------------+----------------------+
#
#+-----------------------------------------------------------------------------+
#| Processes: |
#| GPU GI CI PID Type Process name GPU Memory |
#| ID ID Usage |
#|=============================================================================|
#| 0 N/A N/A 11127 C python3 12973MiB |
#| 0 N/A N/A 25921 C python3 1177MiB |
#+-----------------------------------------------------------------------------+
#```
#
#**CUDA 版本. **
#
#我的经历, 安装 nvidia driver 驱动后 PyTorch 就可以使用 GPU 了, 同时 `nvidia-smi` 命令中也会显示 `CUDA Version: 11.7`.
#
#但是 `/usr/local/cuda:/usr/local/cuda-11.7` 是不存在的. 这个需要单独安装 (即: 安装 CUDA).
#
#```text
## ll /usr/local/ | grep cuda
#lrwxrwxrwx 1 root root 20 Aug 15 19:12 cuda -> /usr/local/cuda-11.7
#drwxr-xr-x 14 root root 268 Aug 15 18:31 cuda-11.7
#```
#
##### 从编译安装
#
#从编译安装使用的命令如下:
#
#```
#CUDA SETUP: Something unexpected happened. Please compile from source:
#git clone git@github.com:TimDettmers/bitsandbytes.git
#cd bitsandbytes
#CUDA_VERSION=117 make cuda11x_nomatmul
#python setup.py install
#```
#
#我的情况是没有使用容器, 在宿主机上安装的.
#
#1. 之前机器上安装的是 `/usr/local/cuda-10.4` 编译不通过. 因为 `/usr/local/cuda-10.4/bin` 下的 `nvcc` 编译器与 GPU 所需的 `CUDA Version: 11.7` 是不匹配的.
#2. 后来安装了 `/usr/local/cuda-11.7` 并删除 `/usr/local/cuda-10.4`, 但还是安装不成功.
#
#偶然的一次尝试:
#
#**需要使用conda虚拟环境**, 在 python 的 virtualenv 中安装失败了.
#
#**执行 `CUDA_VERSION=117 make cuda11x_nomatmul` 命令时, 确保以下几项正确**. 即:
#
#* `NVCC path`: 指向了 cuda 中的 nvcc 编译器. (`nvcc` 是 cuda 提供的一款编译器).
#
#* `CUDA_HOME`: cuda 安装的目录, 一般安装时会自动确定在 `/usr/local/cuda`,
#
#* `CONDA_PREFIX`: 是 `conda` 下创建的虚拟环境.
#
#* `PATH`: 应包含 cuda 的 bin 目录.
#
#* `LD_LIBARY_PATH`: 应包含 cuda 的 lib 目录.
#
#```
#(Transformers) [root@nlp bitsandbytes-0.39.1]# CUDA_VERSION=117 make cuda11x_nomatmul
#ENVIRONMENT
#============================
#CUDA_VERSION: 117
#============================
#NVCC path: /usr/local/cuda/bin/nvcc
#GPP path: /usr/bin/g++ VERSION: g++ (GCC) 11.1.0
#CUDA_HOME: /usr/local/cuda
#CONDA_PREFIX: /usr/local/miniconda3/envs/Transformers
#PATH: /usr/local/miniconda3/envs/Transformers/bin:/usr/local/miniconda3/condabin:/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/cuda/bin:/root/bin
#LD_LIBRARY_PATH: /usr/local/cuda/lib64
#============================
#```
#
#我的情况是, 本应该是 `LD_LIBRARY_PATH: /usr/local/cuda/lib64` 的项变成了 `LD_LIBRARY_PATH:`.
#
#检查 `cat ~/.bashrc` 中包含:
#
#```text
#CUDA_HOME="/usr/local/cuda"
#PATH=/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/miniconda3/bin:/usr/local/cuda/bin
#LD_LIBRARY_PATH=/usr/local/cuda/lib64
#```
#
#同时再执行
#
#```text
#export LD_LIBRARY_PATH="/usr/local/cuda/lib64${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
#```
#
#之后就编译成功了.
#
#**检查是否安装成功**
#
#重新连接 Terminal 之后, 在执行 `python -m bitsandbytes` 之前先执行以下命令.
#
#```text
#export LD_LIBRARY_PATH="/usr/local/cuda/lib64${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
#```
#
#这一步非常奇怪, 因为 `echo $LD_LIBRARY_PATH`, 可以看到 `/usr/local/cuda/lib64` 路径在其中. `echo $PATH` 都可以看到 `/usr/local/cuda` 在其中.
#
#但是执行 `CUDA_VERSION=117 make cuda11x_nomatmul` 时会发现原本应该是 `LD_LIBRARY_PATH: /usr/local/cuda/lib64` 的项变成了 `LD_LIBRARY_PATH:`.
#
#只要再执行一次以上命名, 再执行以下命令, 就可以成功.
#
#安装后执行以下命令, 检查是否安装成功.
#
#```
#python -m bitsandbytes
#```
#
#如过出现以下内容, 说明安装成功了.
#
#```text
#...
#...
#...
#Running a quick check that:
# + library is importable
# + CUDA function is callable
#
#
#WARNING: Please be sure to sanitize sensible info from any such env vars!
#
#SUCCESS!
#Installation was successful!
#```
# sh install_bitsandbytes.sh --stage 0 --stop_stage 0
verbose=true;
stage=0 # start from 0 if you need to start from data preparation
stop_stage=5
# parse options
while true; do
[ -z "${1:-}" ] && break; # break if there are no arguments
case "$1" in
--*) name=$(echo "$1" | sed s/^--// | sed s/-/_/g);
eval '[ -z "${'"$name"'+xxx}" ]' && echo "$0: invalid option $1" 1>&2 && exit 1;
old_value="(eval echo \\$$name)";
if [ "${old_value}" == "true" ] || [ "${old_value}" == "false" ]; then
was_bool=true;
else
was_bool=false;
fi
# Set the variable to the right value-- the escaped quotes make it work if
# the option had spaces, like --cmd "queue.pl -sync y"
eval "${name}=\"$2\"";
# Check that Boolean-valued arguments are really Boolean.
if $was_bool && [[ "$2" != "true" && "$2" != "false" ]]; then
echo "$0: expected \"true\" or \"false\": $1 $2" 1>&2
exit 1;
fi
shift 2;
;;
*) break;
esac
done
work_dir="$(pwd)"
thirdparty_dir="${work_dir}/thirdparty"
mkdir -p "${thirdparty_dir}"
if [ ${stage} -le 0 ] && [ ${stop_stage} -ge 0 ]; then
$verbose && echo "stage 0: download bitsandbytes"
cd "${thirdparty_dir}" || exit 1;
wget https://github.com/TimDettmers/bitsandbytes/archive/refs/tags/0.39.1.zip
unzip 0.39.1.zip
rm -rf 0.39.1.zip
fi
|