qwen_7b_chinese_modern_poetry / script /install_bitsandbytes.sh
qgyd2021's picture
[update]add code
3177298
raw
history blame
No virus
7.68 kB
#!/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