# 1. 深度学习模型下载平台
# 1.1 HuggingFace简介
HuggingFace是机器学习界的一个重要社区,可以看作是机器学习领域的Github。它主要提供以下功能:
- 模型仓库(Model Repository):与Git仓库类似,用于管理模型版本和开源模型。
- 模型(Models):提供了许多预训练好的机器学习模型,适用于不同的任务,存储在模型仓库中。
- 数据集(Dataset):提供了许多公开数据集。
HuggingFace在NLP领域尤为出名,大部分提供的模型都是基于Transformer的。
# 1.2 下载HuggingFace模型
以 HuggingFace 上的 bert-base-chinese (opens new window) 为例,以多种方式,演示一下如何下载模型。推荐使用 HuggingFace Hub 下载的方案。
# 1.2.1 页面手动下载
页面上每个文件的后面都有下载按钮,可以一个个将其下载下来,但没有批量下载功能,文件多了就很不方便了。
# 1.2.2 使用Python脚本下载
分析页面元素,编写Python脚本进行下载。方案不够通用,下载不同的模型需要单独修改脚本。
# -*- coding: utf-8 -*-
import os
import json
import requests
from uuid import uuid4
from tqdm import tqdm
SESSIONID = uuid4().hex
VOCAB_FILE = "vocab.txt"
CONFIG_FILE = "config.json"
MODEL_FILE = "pytorch_model.bin"
BASE_URL = "https://huggingface.co/{}/resolve/main/{}"
headers = {'user-agent': 'transformers/4.8.2; python/3.8.5; \
session_id/{}; torch/1.9.0; tensorflow/2.5.0; \
file_type/model; framework/pytorch; from_auto_class/False'.format(SESSIONID)}
model_id = "bert-base-chinese"
# 创建模型对应的文件夹
model_dir = model_id.replace("/", "-")
if not os.path.exists(model_dir):
os.mkdir(model_dir)
# vocab 和 config 文件可以直接下载
r = requests.get(BASE_URL.format(model_id, VOCAB_FILE), headers=headers)
r.encoding = "utf-8"
with open(os.path.join(model_dir, VOCAB_FILE), "w", encoding="utf-8") as f:
f.write(r.text)
print("{}词典文件下载完毕!".format(model_id))
r = requests.get(BASE_URL.format(model_id, CONFIG_FILE), headers=headers)
r.encoding = "utf-8"
with open(os.path.join(model_dir, CONFIG_FILE), "w", encoding="utf-8") as f:
json.dump(r.json(), f, indent="\t")
print("{}配置文件下载完毕!".format(model_id))
# 模型文件需要分两步进行
# Step1 获取模型下载的真实地址
r = requests.head(BASE_URL.format(model_id, MODEL_FILE), headers=headers)
r.raise_for_status()
if 300 <= r.status_code <= 399:
url_to_download = r.headers["Location"]
# Step2 请求真实地址下载模型
r = requests.get(url_to_download, stream=True, proxies=None, headers=None)
r.raise_for_status()
# 这里的进度条是可选项,直接使用了transformers包中的代码
content_length = r.headers.get("Content-Length")
total = int(content_length) if content_length is not None else None
progress = tqdm(
unit="B",
unit_scale=True,
total=total,
initial=0,
desc="Downloading Model",
)
with open(os.path.join(model_dir, MODEL_FILE), "wb") as temp_file:
for chunk in r.iter_content(chunk_size=1024):
if chunk: # filter out keep-alive new chunks
progress.update(len(chunk))
temp_file.write(chunk)
progress.close()
print("{}模型文件下载完毕!".format(model_id))
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
# 1.2.3 使用 Git LFS 下载
首先需要在安装Git的基础上,再安装Git LFS,之后 git clone 即可。
$ curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
$ sudo apt-get install git-lfs
$ git lfs install
$ git clone https://huggingface.co/bert-base-chinese
2
3
4
但是,这种方案会下载仓库中的所有文件,无法下载指定的模型文件,不够灵活。有些模型文件我们可能用不到,会大大延长模型下载的时间。
# 1.2.4 使用 HuggingFace Hub 下载
首先,我们需要安装huggingface_hub依赖。
$ pip3 install huggingface_hub
这里只介绍部分常用情形,完整的详细使用说明见源码的snapshot_download方法或者官方文档 (opens new window)。
from huggingface_hub import snapshot_download
# 下载整个模型仓库
snapshot_download(repo_id="bert-base-chinese")
# 忽略指定类型的文件
snapshot_download(repo_id="bert-base-chinese", ignore_patterns=["*.h5", "*.msgpack"])
# 允许指定类型的文件
snapshot_download(repo_id="bert-base-chinese", allow_patterns=["*.bin"])
# 下载到本地指定目录
snapshot_download(repo_id="bert-base-chinese", local_dir="./models", local_dir_use_symlinks=False)
2
3
4
5
6
7
8
9
10
11
12
13
在MacOS默认会将模型文件下载到/Users/xxx/.cache/huggingface/hub
里的指定模型目录下,可以通过设置 local_dir 与 local_dir_use_symlinks 参数指定下载目录,参数说明摘自官方文档:
Parameters | File already cached | Returned path | Can read path? | Can save to path? | Optimized bandwidth | Optimized disk usage |
---|---|---|---|---|---|---|
local_dir=None | symlink in cache | ✅ | ❌ (save would corrupt the cache) | ✅ | ✅ | |
local_dir="path/to/folder" local_dir_use_symlinks="auto" | file or symlink in folder | ✅ | ✅ (for small files) ⚠️ (for big files do not resolve path before saving) | ✅ | ✅ | |
local_dir="path/to/folder" local_dir_use_symlinks=True | symlink in folder | ✅ | ⚠️ (do not resolve path before saving) | ✅ | ✅ | |
local_dir="path/to/folder" local_dir_use_symlinks=False | No | file in folder | ✅ | ✅ | ❌ (if re-run, file is re-downloaded) | ⚠️ (multiple copies if ran in multiple folders) |
local_dir="path/to/folder" local_dir_use_symlinks=False | Yes | file in folder | ✅ | ✅ | ⚠️ (file has to be cached first) | ❌ (file is duplicated) |
使用实例:下载 Baichuan2-13B-Chat (opens new window) 模型
# -*- coding: utf-8 -*-
import os
from huggingface_hub import snapshot_download
# 模型仓库的标识
repo_id = "baichuan-inc/Baichuan2-13B-Chat"
# 下载模型到当前目录下的 'models' 文件夹
local_dir = "./models"
# 检查目录是否存在,如果不存在则创建
if not os.path.exists(local_dir):
os.makedirs(local_dir)
snapshot_download(repo_id=repo_id, local_dir=local_dir)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
注:可通过 rm -rf ~/.cache/huggingface/
命令删除 HuggingFace 的缓存。
# 1.3 使用HuggingFace镜像站
# 1.3.1 设置HuggingFace镜像源
国内用户如果不设置代理的话,可以使用如下命令临时设置HuggingFace镜像源,之后就可以不修改代码直接拉取HuggingFace的模型文件了。
$ export HF_ENDPOINT=https://hf-mirror.com
注:如果存在个别文件下载失败,可以通过这种方式单独下载。
$ curl -L -o denoising_unet_acc.pth https://hf-mirror.com/BadToBest/EchoMimic/resolve/main/denoising_unet_acc.pth?download=true
# 1.3.2 ModelScope魔搭社区
ModelScope (opens new window) 是阿里达摩院于近一年刚上线的一款开源模型平台,里面提供了很多的热门模型供使用体验,而且与阿里云服务进行联动,不需要额外部署机器进行模型的运行调试,即可自动在阿里云进行实例创建。
它也支持类似于 HuggingFace Hub 的下载方式,首先需要安装 modelscope 依赖。
$ pip3 install modelscope
使用实例:下载 qwen/Qwen-VL-Chat (opens new window) 模型的v1.1.0版本
# -*- coding: utf-8 -*-
import os
from modelscope import snapshot_download
# 模型仓库的标识
model_id = "qwen/Qwen-VL-Chat"
revision = 'v1.1.0'
# 下载模型到指定目录
cache_dir = "/root/autodl-tmp/Qwen-VL"
# 检查目录是否存在,如果不存在则创建
if not os.path.exists(cache_dir):
os.makedirs(cache_dir)
# 下载模型
snapshot_download(model_id=model_id, revision=revision, cache_dir=cache_dir)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 1.3.3 AI快站第三方加速站
AI快站 (opens new window) 是一个专注于提供HuggingFace模型免费加速下载服务的平台,旨在为AI开发者解决大模型下载中的常见问题,无需梯子,但仅能支持单线程下载。
注:官方提供了所谓加速通道,速度可以达到 4MB/s,其实就是改一下域名 https://dl.aifasthub.com/
,如果有变更的话,就关注公众号获取。
使用提供的下载器下载模型:
Step1:下载器客户端,支持Linux、Windows、Mac系统,可批量下载模型目录里所有文件,目前仅支持单线程下载。
Step2:使用下载器下载所需模型文件,使用说明如下。
./aifasthubdl.linux -h
Usage: aifasthubdl.linux [OPTIONS] --m <M>
Options:
--m <M>
模型地址,例如: https://dl.aifasthub.com/models/baichuan-inc/Baichuan2-13B-Chat
--o <O>
保存目录,例如: ./ [default: ./]
--help
Print help
--version
Print version
2
3
4
5
6
7
8
9
10
11
12
# 2. GPU服务器租用
比较主流的GPU服务器租用厂商有 vast.ai (opens new window)、AutoDL (opens new window)、揽睿星舟 (opens new window)、矩池云 (opens new window) 等,其中 vast.ai 是国外厂商,不方便国内充值。在国内厂商中,从显卡价格、显卡种类、方便程度来衡量,个人感觉 AutoDL 最佳。
# 2.1 租用AutoDL的GPU服务器
# 2.1.1 GPU服务器定价
AutoDL GPU服务器租用:https://www.autodl.com/market/list (opens new window),部分GPU服务器的定价如下:
# 2.1.2 创建并连接实例
我这里是按照如下配置去购买实例的。
这家创建实例特别快,而且可以直接使用账号密码通过SSH连接服务器。
这里我使用了 FinalShell 工具进行连接,便于使用。
# 2.1.3 开启学术资源加速
以下为可以加速访问的学术资源地址:github.com、githubusercontent.com、githubassets.com、huggingface.co
如果在终端中使用:
$ source /etc/network_turbo
如果是在Notebook中使用:
import subprocess
import os
result = subprocess.run('bash -c "source /etc/network_turbo && env | grep proxy"', shell=True, capture_output=True, text=True)
output = result.stdout
for line in output.splitlines():
if '=' in line:
var, value = line.split('=', 1)
os.environ[var] = value
2
3
4
5
6
7
8
9
取消学术加速,如果不再需要建议关闭学术加速,因为该加速可能对正常网络造成一定影响
$ unset http_proxy && unset https_proxy
# 2.1.4 Conda环境安装
由于有些深度学习项目,需要用到较新版本的Python环境,而系统预装的与之不匹配,因此建议安装conda环境。
$ curl -O https://repo.anaconda.com/archive/Anaconda3-2019.03-Linux-x86_64.sh // 从官网下载安装脚本
$ bash Anaconda3-2019.03-Linux-x86_64.sh // 阅读协议确认安装,安装完成后再输入yes以便不需要手动将Anaconda添加到PATH
$ conda create -n conda_env python=3.10 // 安装虚拟环境,conda_env是给虚拟环境起的别名(任意即可)
$ source /root/miniconda3/etc/profile.d/conda.sh // conda初始化
$ conda activate conda_env // 激活虚拟环境
2
3
4
5
注:conda init
命令设置不成功,因此这里使用了source /root/miniconda3/etc/profile.d/conda.sh
命令。
# 2.1.5 安装其他版本的CUDA/cuDNN
由于有些深度学习项目,需要的CUDA环境版本与系统预装的不匹配,可以手动更改为其他版本。
$ conda search cudatoolkit
$ conda install cudatoolkit==11.8.0
$ conda list cudatoolkit
$ conda search cudnn --channel nvidia
$ conda install cudnn=8.9.2.26
$ conda list cudnn
2
3
4
5
6
注:默认镜像都内置了最原生的CUDA和cuDNN,如果您自己安装了cudatoolkits等,那么一般会默认优先使用conda中安装的cudatoolkits。
# 2.1.6 本地访问部署的服务
打开自定义服务,在本地终端输入上述命令(6006换成服务器实际部署服务的端口),之后就可以在本地通过127.0.0.1:6006去访问服务器部署的服务了。
注:现在这个“自定义服务”需要实名认证,6006端口只是个示例,可以换成任意端口,也可以开多个。
# 2.2 租用揽睿星舟的GPU服务器
# 2.2.1 GPU服务器定价
揽睿星舟GPU服务器租用:https://www.lanrui-ai.com/ (opens new window),部分GPU服务器的定价如下:
# 2.2.2 创建并连接实例
我这里是按照如下配置去购买实例的,购买后要等待几分钟让它创建实例。
- 注意:这里有个坑,资源数量那里选1就好了,账户上有钱就一直能用,不用了及时释放。千万千万不要把它当成购买时长,否则会按照n倍计费!!!
实例创建完成后,进入JupyterLab面板,打开Terminal,查看一些基础环境。
$ python3 --version // 查看python版本
$ nvidia-smi // 查看GPU资源
$ nvcc --version // 查看CUDA版本
2
3
自带的Python版本是3.10.6,可以直接用,懒的安装Conda了。由于这家的服务器是国内的,使用官方源安装依赖会很慢,所以要给pip3换个国内源。
$ pip3 config set global.index-url http://mirrors.aliyun.com/pypi/simple/
$ pip3 config set install.trusted-host mirrors.aliyun.com
2
注:如果想要SSH连接服务器,则需要在平台上配置RSA公钥,然后使用RSA私钥连接,该厂商不支持密码登录。
$ git config --global user.name “username”
$ git config --global user.email “email”
$ ssh-keygen -t rsa -C “email”
$ cat /Users/xxx/.ssh/id_rsa.pub // xxx处替换成用户名
2
3
4
设置SSH KEY:控制台——设置——SSH-Key——新增Key——填写pub_key(即id_rsa.pub文件的内容)和pub_key_name(随便填)
配置成功之后,即可使用控制台给出的命令进行连接。
$ ssh [email protected] -p 12345 -i ~/.ssh/id_rsa
# 3. Jupyter Notebook交互式记事本
# 3.1 Jupyter简介
Jupyter Notebook,是一个可以把代码、图像、注释、公式和做图于一体,实现可读性分析的灵活工具。它是用网页访问的,可以在浏览器中编写和执行程序,并且可以在其它机器上远程调用它,可以屏蔽不同系统的显示差异。在分享示例代码的时候,也非常方便,完全不用再去考虑格式的问题。
- 项目地址:https://github.com/jupyter/jupyter (opens new window)
- 官方文档:https://docs.jupyter.org/en/latest/ (opens new window)
# 3.2 搭建 Jupyter 交互式笔记本
# 3.2.1 使用 Docker 方式搭建 Jupyter 服务
Jupyter我这里采用Docker的方式进行搭建,Docker的基本使用这里就不再赘述了,如果不会的话见我的其他博客:Docker容器化及项目环境管理 (opens new window)。
$ docker pull jupyter/base-notebook
$ docker run -itd -p 8888:8888 --name jupyter -v "$PWD":/home/jovyan/work jupyter/base-notebook:latest
$ docker exec -it jupyter /bin/bash
$ jupyter server list // 查看Token信息
Currently running servers:
http://2204eb71a24f:8888/?token=cdc05dc84078f299fsb833639324d502cde60575dd2f4486 :: /home/jovyan
2
3
4
5
6
7
浏览器访问:http://IP:8888
地址即可,token就填写刚刚使用jupyter server list
命令查看到的那个。
# 3.2.2 使用汉化包将 Jupyter 设置成中文
Jupyter有现成的汉化包可以使用,进入容器内安装 jupyterlab-language-pack-zh-CN 汉化包即可。
$ docker exec -it jupyter /bin/bash
$ pip install jupyterlab-language-pack-zh-CN // 添加汉化包
2
汉化步骤:设置——语言——选择中文(简体,中国)
# 3.3 Google Colab基本介绍
Colaboratory 是一个 Google 研究项目,旨在帮助传播机器学习培训和研究成果。它是一个 Jupyter 笔记本环境,不需要进行任何设置就可以使用,并且完全在云端运行。
- Colaboratory 笔记本存储在 Google 云端硬盘中,并且可以共享,就如同您使用 Google 文档或表格一样,Colaboratory 可免费使用。
- 利用Colaboratory ,可以方便的使用Keras,TensorFlow,PyTorch,OpenCV等框架进行深度学习应用的开发。
- 与其它云服务相比,最重要的特点是Colab提供GPU并完全免费,详细介绍及使用方法见 faq page (opens new window)。
# 4. TensorBoard模型可视化
# 4.1 TensorBoard 简介
TensorBoard是Google开发的模型内部参数跟踪和可视化的调试工具。在Tensorflow中,用TensorBoard可以监控模型的各种指标的变化(如acc、loss的动态变化),可以将模型结构可视化,可以可视化词嵌入空间,可以分析模型性能,可以分析数据集的公平性等等,是一个非常强大且非常简单的工具。
- 项目地址:https://github.com/tensorflow/tensorboard (opens new window)
- 官方文档:https://www.tensorflow.org/tensorboard?hl=zh-cn (opens new window)
TensorBoard核心就是回调函数和可视化操作面板。通过编写回调函数获取模型信息,通过命令行启动TensorBoard图形化界面。TensorBoard的回调函数API为:
tf.keras.callbacks.TensorBoard(
log_dir='logs', histogram_freq=0, write_graph=True, write_images=False,
update_freq='epoch', profile_batch=2, embeddings_freq=0,
embeddings_metadata=None, **kwargs
)
2
3
4
5
参数 | 含义 |
---|---|
log_dir | 模型的信息保存目录 |
histogram_freq | 模型激活和参数信息记录的频率,每隔几个epochs记录一次 |
write_graph | 是否保存模型图文件 |
write_images | 是否保存模型参数可视化图 |
update_freq | 模型loss和其他metrics的记录频率,每隔几个batch更新一次 |
profile_batch | 指定性能分析时使用的批次 |
embeddings_freq | embedding 层更新的频率 |
# 4.2 搭建 TensorBoard 模型可视化
# 4.2.1 搭建 TensorBoard 服务
第一种方式:使用pip进行搭建
$ pip3 install tensorboard
$ pip3 install tensorboardX
2
第二种方式:使用源码进行搭建
由于 TensorBoard 使用 Bazel 进行构建,因此首先需要 安装Bazel (opens new window),它是谷歌推出的一套编译系统。
- 官方网站:https://bazel.build/ (opens new window)
- 项目地址:https://github.com/bazelbuild/bazel (opens new window)
安装 Bazel 的命令如下:
$ sudo apt install curl gnupg
$ curl -fsSL https://bazel.build/bazel-release.pub.gpg | gpg --dearmor > bazel.gpg
$ sudo mv bazel.gpg /etc/apt/trusted.gpg.d/
$ echo "deb [arch=amd64] https://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
$ sudo apt update
$ sudo apt install bazel
$ bazel --version
bazel 6.2.1
2
3
4
5
6
7
8
安装编译构建时需要的依赖:
$ pip3 install absl-py // 如未安装,编译时会报错 No module named 'absl'
$ pip3 install google_auth_oauthlib // 如未安装,启动时会报错 No module named 'google_auth_oauthlib'
2
使用 Bazel 编译构建 TensorBoard:
$ git clone https://github.com/tensorflow/tensorboard.git
$ cd tensorboard
$ bazel build tensorboard:tensorboard // 编译构建的过程比较慢,注意预留足够的内存(预留10GB以上的内存及交换空间)
2
3
测试一下启动 TensorBoard 服务:
$ sudo bazel-bin/tensorboard/tensorboard
这时会出现如下报错,这是因为我们还没有设置logdir。
TensorFlow installation not found - running with reduced feature set.
Error: A logdir or db must be specified. For example `tensorboard --logdir mylogdir` or `tensorboard --db sqlite:~/.tensorboard.db`. Run `tensorboard --helpfull` for details and examples.
2
# 4.2.2 TensorBoard 的基本使用
运行以下测试程序 test.py,会生成一个 ./logs/scalars
目录。
# -*- coding: utf-8 -*-
import tensorflow as tf
from tensorflow import keras
import datetime
import numpy as np
print("TensorFlow version: ", tf.__version__)
### set data to training regression
data_size = 1000
# 80% of the data is for training.
train_pct = 0.8
train_size = int(data_size * train_pct)
# Create some input data between -1 and 1 and randomize it.
x = np.linspace(-1, 1, data_size) # create 1000 number between (-1, 1) evenly
np.random.shuffle(x)
# Generate the output data.
# y = 0.5x + 2 + noise
# noise is created by a normal distribution with mean-value of 0 and standard deviation of 0.05
# shape of '(data_size, )' means one-dimensional array with 1000 elements
y = 0.5 * x + 2 + np.random.normal(0, 0.05, (data_size, ))
# Split into test and train pairs.
x_train, y_train = x[:train_size], y[:train_size] # the top 800 figures
x_test, y_test = x[train_size:], y[train_size:] # the last 200 figures
### Training the model and logging loss
# set the log directory and define a tensorboard callback
logdir = "logs/scalars/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = keras.callbacks.TensorBoard(log_dir=logdir)
# create a model with 2 dense layer
model = keras.models.Sequential([
keras.layers.Dense(16, input_dim=1),
keras.layers.Dense(1),
])
# compile the model
model.compile(
loss='mse', # keras.losses.mean_squared_error
optimizer=keras.optimizers.SGD(learning_rate=0.2),
)
print("Training ... With default parameters, this takes less than 10 seconds.")
# training
training_history = model.fit(
x_train, # input
y_train, # output
batch_size=train_size,
verbose=0, # Suppress chatty output; use Tensorboard instead
epochs=100,
validation_data=(x_test, y_test),
callbacks=[tensorboard_callback],
)
print("Average test loss: ", np.average(training_history.history['loss']))
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
启动 TensorBoard 时将 --logdir 参数设置为刚刚的 ./logs/scalars
目录
$ sudo bazel-bin/tensorboard/tensorboard --logdir /root/tensorboard_test/logs/scalars --host=0.0.0.0
另注:设置参数 --host=0.0.0.0
可以使其外网访问,否则只能 localhost 访问。
# 4.2.3 TensorBoard 的汉化二次开发
TensorBoard 界面的英文显示文本是写死在代码里的,我没找到有现成的汉化包,不行就手动逐个替换页面里的代码文本吧。
- 关于TensorBoard的二次开发:https://github.com/tensorflow/tensorboard/blob/master/DEVELOPMENT.md (opens new window)
- TensorBoard 的前端使用 Angular 框架开发的,用的 https://material.angular.cn/ (opens new window) 组件库,前端代码的路径:./tensorboard/webapp
举例:替换界面展示文本 Pin cards for a quick view and comparison
代码里的位置:./tensorboard/webapp/metrics/views/main_view/pinned_view_component.ts
将文本翻译成中文进行替换后,使用如下命令启动:
$ bazel run //tensorboard -- --logdir /root/tensorboard_test/logs/scalars --host=0.0.0.0
再次使用 Chrome 浏览器打开 http://ip:6006
访问 TensorBoard 面板,可以看到替换文本的地方已经翻译成中文了。
# 5. 深度学习基础环境
# 5.1 NVIDIA GPU常识
# 5.1.1 NVIDIA GPU 分类
目前,最主流的AI芯片无疑是NVIDIA的GPU,并且,英伟达针对不同的场景推出了不同的系列和型号。例如:L4用于AI视频,L40用于图像生成,H100系列则是大模型,GH200是图形推荐模型、矢量数据库和图神经网络。
目前NVIDIA的GPU产品主要有 GeForce、Data Center/Tesla 和 RTX/Quadro 三大系列。虽然从硬件角度来看,它们都采用同样的架构设计,也都支持用作通用计算,但因为它们分别面向的目标市场以及产品定位的不同,这三个系列的GPU在软硬件的设计和支持上都存在许多差异。其中,GeForce为消费级显卡,而Tesla和Quadro归类为专业级显卡。GeForce主要应用于游戏娱乐领域,而Quadro主要用于专业可视化设计和创作,Tesla更偏重于深度学习、人工智能和高性能计算。
- Tesla:A100(A800)、H100(H800)、A30、A40、V100、P100...
- GeForce:RTX 3090、RTX 4090 ...
- RTX/Quadro:RTX 6000、RTX 8000 ...
其中,A800/H800是针对中国特供版(低配版),相对于A100/H100,主要区别:
- A100的Nvlink最大总网络带宽为600GB/s,而A800的Nvlink最大总网络带宽为400GB/s。
- H100的Nvlink最大总网络带宽为900GB/s,而A800的Nvlink最大总网络带宽为400GB/s。
随着美国新一轮的芯片制裁,最新针对中国特供版H20、L20和L2芯片也将推出。
# 5.1.2 NVIDIA GPU 显存
NVIDIA GPU 显存有两种类型,GDDR 和 HBM,每种也有不同的型号。针对显存通常会关注两个指标:显存大小和显存带宽。HBM 显存通常可以提供更高的显存带宽,但是价格也更贵,通常在训练卡上会使用,比如:H100、A100 等,而 GDDR 显存通常性价比更高,在推理 GPU 或游戏 GPU 更常见,比如:T4、RTX 4090 等。
常见训练 GPU 的显存信息:
常见推理 GPU 的显存信息:
显存大小和带宽的影响:
- 传统的 CV、NLP 模型往往比较小,而且基本都是 Compute bound ,所以普遍对显存大小、带宽关注比较少;而现在 LLM 模型很大,推理除了是Compute bound,也是 IO bound;因此,越来越多人开始关注 GPU 显存大小和显存带宽。
- 最近 NVIDIA 正式推出 H200 GPU,相比 H100,其主要的变化就是 GPU 显存从 80GB 升级到 141GB,显存带宽从 3.5TB/s 增加到 4.8TB/s,也就是说算力和 NVLink 没有任何提升,这可能是为了进一步适配大模型推理的需求。
# 5.1.3 NVIDIA GPU之间的通信
NVIDA GPU-SXM主要是针对英伟达的高端GPU服务器,NVIDA GPU-SXM和NVIDA GPU-PCIe这两种卡都能实现服务器的通信,但是实现的方式是不一样的。SXM规格的一般用在英伟达的DGX服务器中,通过主板上集成的NVSwitch实现NVLink的连接,不需要通过主板上的PCIe进行通信,它能支持8块GPU卡的互联互通,实现了GPU之间的高带宽。
这里说的NVLink技术不仅能够实现CPU和GPU直连,能够提供高速带宽,还能够实现交互通信,大幅度提高交互效率,从而满足最大视觉计算工作负载的需求。
NVIDA GPU-PCIe就是把PCIe GPU卡插到PCIe插槽上,然后和CPU、同一个服务器上其他的GPU卡进行通信,也可以通过网卡与其他的服务器节点上的设备进行通信,这种就是PCIe的通信方式,但是这种传输速度不快。如果想要和SXM一样,有很快的传输速度,可以使用NVlink桥接器实现GPU和CPU之间的通信,但是和SXM不一样的地方就是它只能实现2块GPU卡之间的通信。也就是说,如果有 2 个 PCIe GPU,那么可以使用 NVLink 桥接器(Bridge)实现互联;如果超过 2 个 PCIe GPU,就无法实现 NVLink 的分组互联,此时只能考虑使用 SXM GPU。
一般来讲,单机内的多 GPU 之间通信分为:PCIe 桥接互联通信、NVLink 部分互联通信、NVSwitch 全互联通信三种。
// 检查NVLink状态
$ nvidia-smi nvlink -m
// 使用NVIDIA提供的测试工具来验证NVLink的性能
$ /usr/local/cuda/extras/demo_suite/bandwidthTest
2
3
4
5
# 5.2 CUDA环境及GPU资源
# 5.2.1 安装CUDA环境
CUDA下载地址:https://developer.nvidia.com/cuda-toolkit-archive (opens new window),根据你的服务器情况进行选择,安装类型选择runfile (local),之后会自动给出安装命令。
根据给出的命令进行下载安装,出来协议时直接输入accept
,之后在CUDA Installer里选择Install。
$ wget https://developer.download.nvidia.com/compute/cuda/12.1.0/local_installers/cuda_12.1.0_530.30.02_linux.run
$ sudo chmod u+x cuda_12.1.0_530.30.02_linux.run
$ sudo ./cuda_12.1.0_530.30.02_linux.run
2
3
第一次安装失败,先查看cat /var/log/cuda-installer.log,再查看 cat /var/log/nvidia-installer.log,报错信息如下:
解决办法是手动禁止Nouveau kernel driver的运行。
$ sudo vim /etc/modprobe.d/blacklist-nouveau.conf
在文件里写入:
blacklist nouveau
options nouveau modeset=0
$ sudo update-initramfs -u
$ sudo reboot
2
3
4
5
6
7
8
之后重新安装CUDA,这次就安装成功了。
$ sudo ./cuda_12.1.0_530.30.02_linux.run
# 5.2.2 NVIDIA GPU资源查看
安装 nvidia-smi 及 nvidia-cuda-toolkit 工具
$ sudo apt update
$ sudo apt install nvidia-utils-520
$ sudo apt install nvidia-cuda-toolkit
2
3
使用 nvidia-smi
命令可以显示出GPU的所有基础信息。
$ nvidia-smi // 查询GPU详情
$ nvidia-smi -q // 查询GPU型号
2
解释相关参数含义:
GPU:本机中的GPU编号
Name:GPU 类型
Fan:风扇转速
Temp:温度,单位摄氏度
Perf:表征性能状态,从P0到P12,P0表示最大性能,P12表示状态最小性能
Pwr:Usage/Cap:能耗表示
Bus-Id:涉及GPU总线的相关信息;
Disp.A:Display Active,表示GPU的显示是否初始化
Memory-Usage:显存使用率
Volatile GPU-Util:浮动的GPU利用率
Uncorr. ECC:关于ECC的东西
Compute M.:计算模式
Processes 显示每块GPU上每个进程所使用的显存情况。
2
3
4
5
6
7
8
9
10
11
12
13
查看CUDA驱动版本(安装PyTorch之类的深度学习库需要与CUDA驱动版本对应):
$ nvcc --version
另注:也可以使用 gpustat 工具查看GPU资源占用
$ pip3 install gpustat
$ gpustat
gpu11 Wed Jul 10 13:28:42 2024 535.54.03
[0] NVIDIA A800 80GB PCIe | 34°C, 0 % | 40489 / 81920 MB | xxx-slurm(40476M)
[1] NVIDIA A800 80GB PCIe | 34°C, 0 % | 55 / 81920 MB |
[2] NVIDIA A800 80GB PCIe | 32°C, 0 % | 7 / 81920 MB |
[3] NVIDIA A800 80GB PCIe | 33°C, 0 % | 7 / 81920 MB |
[4] NVIDIA A800 80GB PCIe | 33°C, 0 % | 12527 / 81920 MB | xxx-slurm(12258M)
[5] NVIDIA A800 80GB PCIe | 34°C, 0 % | 18137 / 81920 MB | xxx-slurm(17612M)
[6] NVIDIA A800 80GB PCIe | 34°C, 0 % | 7 / 81920 MB |
[7] NVIDIA A800 80GB PCIe | 34°C, 0 % | 7 / 81920 MB |
2
3
4
5
6
7
8
9
10
11
12
# 5.2.3 查看占用GPU的进程并清理
$ nvidia-smi // 查看显存占用
$ apt-get update && apt-get install psmisc // 安装分析工具
$ fuser -v /dev/nvidia* // 查看所有占用显存的进程
$ fuser -v /dev/nvidia0 // 查看指定显卡占用显存的进程
$ kill -9 [PID]
2
3
4
5
注:使用 fuser 命令的时候千万要注意参数,如果使用 -k 参数,将会直接把这些进程都 kill 掉,我就曾因为 fuser -k /dev/nvidia*
命令闯祸过。
# 5.2.4 列出后台任务并终止进程
需求情景:部署了大模型服务,使用 Ctrl+Z 组合键将进程放入后台并停止执行。为了彻底终止这个进程,并释放其占用的GPU资源。
Step1:列出后台任务
使用jobs
命令列出当前shell会话中所有的后台任务,这将会显示所有后台任务的列表,每个任务前都有一个编号。
$ jobs
Step2:终止后台进程
可以使用kill
命令加上%任务编号
来强制终止一个特定的后台任务。如果任务编号是3
,应该执行:
$ kill -9 %3
# 5.2.5 显卡状态显示ERR!问题
情景描述:服务器使用过程中遇到了显卡状态显示成ERR!
的问题,该显卡无法正常使用了。
nvidia-smi 官网显示了两个案例。
- 第一个案例 (opens new window),除了状态显示为
ERR!
,对应显存占用也很高。判断是显卡烧坏,需要更换显卡硬件。 - 第二个案例 (opens new window),与我们的情景类似。状态显示
ERR!
且显存占用低。判断是显卡相关驱动配置出现问题。
故障原因:可能是显卡过热原因导致掉卡了,显卡本身没有损坏。
解决方案:重启该服务器节点后恢复了正常使用(重启显卡驱动不好使,故障时候SRAM里面记录了错误,重启整个服务器才恢复正常)。
# 5.2.6 NVIDIA驱动失效问题
问题情景:之前已经安装过CUDA驱动,而且正常跑着大模型推理,后来爆显存了,重启后驱动就失效了。
报错信息:NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver.
修复过程:使用nvcc -V检查CUDA驱动发现是存在的,用dkms重装了一下指定版本的nvidia包即可恢复正常。
$ nvidia-smi
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver.
Make sure that the latest NVIDIA driver is installed and running.
$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2018 NVIDIA Corporation
Built on Sat_Aug_25_21:08:01_CDT_2018
Cuda compilation tools, release 10.0, V10.0.130
$ ls /usr/src | grep nvidia
nvidia-450.57
$ sudo apt-get install dkms
$ sudo dkms install -m nvidia -v 450.57
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 5.2.7 启用NVIDIA的持久化模式
问题情景:刚安装完了CUDA驱动,但使用 nvidia-smi 查询GPU信息非常慢,需要等待很久才能查询出来。
解决方案:开启NVIDIA的持久化模式即可。
$ nvidia-smi -pm 1
命令解释
-pm 1
:启用持久化模式。将其设置为1
表示开启持久化模式,而设置为0
则表示关闭持久化模式。
使用场景
- 持久化模式:通常用于 GPU 密集型计算环境,例如服务器集群和高性能计算场景,以减少 GPU 资源的初始化时间。
- 非持久化模式:通常在个人计算环境中使用,在这些场景下,减少资源占用和功耗比保持 GPU 驱动程序加载更重要。
# 5.3 基础深度学习框架
# 5.3.1 PyTorch框架
PyTorch是一个基于Torch的Python开源机器学习库,用于自然语言处理等应用程序。它主要由 Facebook的人工智能小组开发,不仅能够实现强大的GPU加速,同时还支持动态神经网络。PyTorch提供了两个高级功能:具有强大的 GPU加速的张量计算、包含自动求导系统的深度神经网络。
如果使用GPU(NVIDIA显卡)部署的话,需要先安装CUDA驱动,然后通过如下命令查看CUDA版本:
$ nvcc --version
去 PyTorch官网 (opens new window) 勾选上自己服务器的环境,下面会生成对应的安装命令。
CPU版
$ pip install torch==1.10.0+cpu torchvision==0.11.1+cpu torchaudio==0.10.0+cpu -f https://download.pytorch.org/whl/cpu/torch_stable.html
GPU版(CUDA 10.2)
$ pip install torch torchvision torchaudio
GPU版(CUDA 11.3)
$ pip install torch==1.10.2+cu113 torchvision==0.11.3+cu113 torchaudio==0.10.2+cu113 -f https://download.pytorch.org/whl/cu113/torch_stable.html
2
3
4
5
6
7
8
验证PyTorch是否连上GPU
# -*- coding: utf-8 -*-
import torch
import torch.nn as nn
print(torch.cuda.is_available())
model = nn.LSTM(input_size=10, hidden_size=4, num_layers=1, batch_first=True)
model = model.cuda()
print(next(model.parameters()).device)
data = torch.ones([2, 3])
data = data.cuda()
print(data.device)
2
3
4
5
6
7
8
9
10
11
12
13
14
加载在GPU环境训练好的算法模型
model = torch.load('model/pytorch_resnet50.pth') # GPU环境加载
# model = torch.load('model/pytorch_resnet50.pth', map_location ='cpu') # CPU环境加载
2
注意事项:在CPU环境下加载GPU环境训练的模型,需要加上 map_location ='cpu'
,否则会报如下错误
RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is False. If you are running on a CPU-only machine, please use torch.load with map_location=torch.device('cpu') to map your storages to the CPU.
# 5.3.2 Tensorflow框架
TensorFlow是一个深度学习框架,由Google团队设计。它结合了优化技术的计算代数,便于计算许多数学表达式。TensorFlow有以下重要功能:
- 它包含一个叫做张量概念,用来创建多维数组,优化和计算数学表达式。
- 它包括深度神经网络和机器学习技术的编程支持。
- 它包括具有各种数据集的高可扩展计算功能。
TensorFlow使用GPU计算,自动化管理,它还包括优化相同内存和使用数据的独特功能。
直接使用 pip 安装有时会出问题,可以去 tensorflow官网 (opens new window) 找对应版本的 whl 包进行安装。
$ pip install https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-2.6.0-cp37-cp37m-manylinux2010_x86_64.whl (支持GPU)
$ pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow_cpu-2.6.0-cp37-cp37m-manylinux2010_x86_64.whl (仅支持CPU)
2
验证 Tensorflow是否连上GPU
# -*- coding: utf-8 -*-
import tensorflow as tf
print(tf.test.is_gpu_available())
gpu_device_name = tf.test.gpu_device_name()
print(gpu_device_name)
2
3
4
5
6
7
8
# 5.4 常见依赖问题的解决
[1] pyhanlp:中文分词 词性标注 命名实体识别 依存句法分析 新词发现 关键词短语提取 自动摘要 文本分类聚类 拼音简繁 自然语言处理
pyhanlp依赖的运行需要Java环境,因此部署时应在 Dockerfile 里添加 jdk 并完成配置。安装包去官网下载Linux版的,放到项目里即可。
# 切换到工作目录
WORKDIR /usr
# 创建目录
RUN mkdir /usr/local/java
# 将jdk复制到内部目录并自动解压
ADD jdk-8u202-linux-x64.tar.gz /usr/local/java
# 设置软链接
RUN ln -s /usr/local/java/jdk1.8.0_202 /usr/local/java/jdk
# 设置环境变量
ENV JAVA_HOME /usr/local/java/jdk
ENV JRE_HOME ${JAVA_HOME}/jre
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib
ENV PATH ${JAVA_HOME}/bin:$PATH
2
3
4
5
6
7
8
9
10
11
12
13
附:jdk-8u202-linux-x64.tar.gz 的官网下载地址 (opens new window)
[2] ImportError: libGL.so.1: cannot open shared object file: No such file or directory
$ apt update
$ apt install libgl1-mesa-glx -y
2
[3] ImportError: numpy.core.multiarray failed to import
$ pip install --upgrade numpy
[4] setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (125,) + inhomogeneous part.
$ pip install numpy==1.23.3
[5] ImportError: cannot import name 'url_quote' from 'werkzeug.urls'
$ pip install Werkzeug==2.2.2
[6] bitsandbytes与CUDA版本不匹配的问题
bitsandbytes是用于大模型量化的库,项目地址:https://github.com/TimDettmers/bitsandbytes (opens new window)
使用pip安装bitsandbytes,出现该依赖与CUDA版本不匹配的问题
解决办法:拉取代码,指定CUDA版本,自己编译安装。
$ 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}
$ CUDA_VERSION=113 make cuda11x
$ python setup.py install
2
3
4
5
6
注意事项:编译安装的方式,如果是CUDA_VERSIONS之外的版本(比如12.1),会出现 Unsupported gpu architecture 'compute_89' 的问题。
使用 nvcc --list-gpu-arch 命令查询了一下,发现只支持到 compute_86。因此修改 Makefile,将compute_89和compute_90的都注释掉,然后重新进行编译即可。
# 6. 参考资料
[1] Google Colab免费GPU使用教程 from Rogn (opens new window)
[2] Colaboratory常见问题解答 from Google官方文档 (opens new window)
[3] docker jupyter配置 from 稀土掘金 (opens new window)
[4] jupyter 设置中文 from CSDN (opens new window)
[5] Jupyter Notebook介绍、安装及使用教程 from 知乎 (opens new window)
[6] 最详尽使用指南:超快上手Jupyter Notebook from 知乎 (opens new window)
[7] Jupyter notebook/Lab 简述 from 深入浅出PyTorch (opens new window)
[8] TensorBoard简介 from Superlova (opens new window)
[9] tensorboard使用界面介绍以及使用方法 from CSDN (opens new window)
[10] TensorBoard详解之安装使用和代码介绍 from CSDN (opens new window)
[11] Linux下Bazel的简单使用 from CSDN (opens new window)
[12] 如何优雅的下载huggingface-transformers模型 from 知乎 (opens new window)
[13] Download files from the Hub from HuggingFace官网 (opens new window)
[14] 目前哪里可以租用到GPU服务器?from 知乎 (opens new window)
[15] python3 | pip install dlib报错 from CSDN (opens new window)
[16] 解决:ImportError: numpy.core.multiarray failed to import from CSDN (opens new window)
[18] bitsandbytes 是 CUDA 自定义函数的轻量级包装器,特别是 8 位优化器、矩阵乘法 (LLM.int8()) 和量化函数 from CSDN (opens new window)
[19] 解决问题:How to disable Nouveau kernel driver from CSDN (opens new window)
[20] Ubuntu清除GPU显存 from CSDN (opens new window)
[21] 安装CUDA/cuDNN环境 from AutoDL帮助手册 (opens new window)
[22] 学术资源加速 from AutoDL帮助手册 (opens new window)
[23] 小白也能看懂的国内外 AI 芯片概述 from 吃果冻不吐果冻皮 (opens new window)
[24] 节省时间:AI 模型靠谱下载方案汇总 from 苏洋博客 (opens new window)
[25] nvidia-smi show ERR! 问题修复 from lif323 (opens new window)