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