常用深度学习平台的使用指南

7/12/2022 HuggingFaceGPU服务器租用JupyterGoogle-ColabTensorBoardNVIDIA-GPU

# 1. 深度学习模型下载平台

# 1.1 HuggingFace简介

HuggingFace是机器学习界的一个重要社区,可以看作是机器学习领域的Github。它主要提供以下功能:

  • 模型仓库(Model Repository):与Git仓库类似,用于管理模型版本和开源模型。
  • 模型(Models):提供了许多预训练好的机器学习模型,适用于不同的任务,存储在模型仓库中。
  • 数据集(Dataset):提供了许多公开数据集。

HuggingFace在NLP领域尤为出名,大部分提供的模型都是基于Transformer的。

HuggingFace平台

# 1.2 下载HuggingFace模型

以 HuggingFace 上的 bert-base-chinese (opens new window) 为例,以多种方式,演示一下如何下载模型。推荐使用 HuggingFace Hub 下载的方案。

# 1.2.1 页面手动下载

页面上每个文件的后面都有下载按钮,可以一个个将其下载下来,但没有批量下载功能,文件多了就很不方便了。

bert-base-chinese模型

# 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))
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

# 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
1
2
3
4

但是,这种方案会下载仓库中的所有文件,无法下载指定的模型文件,不够灵活。有些模型文件我们可能用不到,会大大延长模型下载的时间。

使用Git-LFS下载模型文件

# 1.2.4 使用 HuggingFace Hub 下载

首先,我们需要安装huggingface_hub依赖。

$ pip3 install huggingface_hub
1

这里只介绍部分常用情形,完整的详细使用说明见源码的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)
1
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)
1
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
1

注:如果存在个别文件下载失败,可以通过这种方式单独下载。

$ curl -L -o denoising_unet_acc.pth https://hf-mirror.com/BadToBest/EchoMimic/resolve/main/denoising_unet_acc.pth?download=true
1

# 1.3.2 ModelScope魔搭社区

ModelScope (opens new window) 是阿里达摩院于近一年刚上线的一款开源模型平台,里面提供了很多的热门模型供使用体验,而且与阿里云服务进行联动,不需要额外部署机器进行模型的运行调试,即可自动在阿里云进行实例创建。

ModelScope社区

它也支持类似于 HuggingFace Hub 的下载方式,首先需要安装 modelscope 依赖。

$ pip3 install modelscope
1

使用实例:下载 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)
1
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开发者解决大模型下载中的常见问题,无需梯子,但仅能支持单线程下载。

HuggingFace镜像站

注:官方提供了所谓加速通道,速度可以达到 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
1
2
3
4
5
6
7
8
9
10
11
12

使用HuggingFace镜像站下载模型

# 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服务器的定价如下:

AutoDL的GPU服务器租用定价

# 2.1.2 创建并连接实例

我这里是按照如下配置去购买实例的。

AutoDL创建实例

这家创建实例特别快,而且可以直接使用账号密码通过SSH连接服务器。

AutoDL实例信息

这里我使用了 FinalShell 工具进行连接,便于使用。

FinalShell连接AutoDL实例

# 2.1.3 开启学术资源加速

以下为可以加速访问的学术资源地址:github.com、githubusercontent.com、githubassets.com、huggingface.co

如果在终端中使用:

$ source /etc/network_turbo
1

如果是在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
1
2
3
4
5
6
7
8
9

取消学术加速,如果不再需要建议关闭学术加速,因为该加速可能对正常网络造成一定影响

$ unset http_proxy && unset https_proxy
1

# 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                         // 激活虚拟环境
1
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
1
2
3
4
5
6

注:默认镜像都内置了最原生的CUDA和cuDNN,如果您自己安装了cudatoolkits等,那么一般会默认优先使用conda中安装的cudatoolkits。

# 2.1.6 本地访问部署的服务

打开自定义服务,在本地终端输入上述命令(6006换成服务器实际部署服务的端口),之后就可以在本地通过127.0.0.1:6006去访问服务器部署的服务了。

本地访问AutoDL部署的服务

注:现在这个“自定义服务”需要实名认证,6006端口只是个示例,可以换成任意端口,也可以开多个。

# 2.2 租用揽睿星舟的GPU服务器

# 2.2.1 GPU服务器定价

揽睿星舟GPU服务器租用:https://www.lanrui-ai.com/ (opens new window),部分GPU服务器的定价如下:

揽睿星舟GPU服务器租用定价

# 2.2.2 创建并连接实例

我这里是按照如下配置去购买实例的,购买后要等待几分钟让它创建实例。

  • 注意:这里有个坑,资源数量那里选1就好了,账户上有钱就一直能用,不用了及时释放。千万千万不要把它当成购买时长,否则会按照n倍计费!!!

GPU服务器购买实例

实例创建完成后,进入JupyterLab面板,打开Terminal,查看一些基础环境。

$ python3 --version       // 查看python版本
$ nvidia-smi              // 查看GPU资源
$ nvcc --version          // 查看CUDA版本
1
2
3

GPU服务器进入JupyterLab面板查看环境

自带的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
1
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处替换成用户名
1
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
1

# 3. Jupyter Notebook交互式记事本

# 3.1 Jupyter简介

Jupyter Notebook,是一个可以把代码、图像、注释、公式和做图于一体,实现可读性分析的灵活工具。它是用网页访问的,可以在浏览器中编写和执行程序,并且可以在其它机器上远程调用它,可以屏蔽不同系统的显示差异。在分享示例代码的时候,也非常方便,完全不用再去考虑格式的问题。

# 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
1
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    // 添加汉化包
1
2

汉化步骤:设置——语言——选择中文(简体,中国)

Jupyter交互式笔记本

# 3.3 Google Colab基本介绍

Colaboratory 是一个 Google 研究项目,旨在帮助传播机器学习培训和研究成果。它是一个 Jupyter 笔记本环境,不需要进行任何设置就可以使用,并且完全在云端运行。

  • Colaboratory 笔记本存储在 Google 云端硬盘中,并且可以共享,就如同您使用 Google 文档或表格一样,Colaboratory 可免费使用。
  • 利用Colaboratory ,可以方便的使用Keras,TensorFlow,PyTorch,OpenCV等框架进行深度学习应用的开发。
  • 与其它云服务相比,最重要的特点是Colab提供GPU并完全免费,详细介绍及使用方法见 faq page (opens new window)

Google-Colab简介

# 4. TensorBoard模型可视化

# 4.1 TensorBoard 简介

TensorBoard是Google开发的模型内部参数跟踪和可视化的调试工具。在Tensorflow中,用TensorBoard可以监控模型的各种指标的变化(如acc、loss的动态变化),可以将模型结构可视化,可以可视化词嵌入空间,可以分析模型性能,可以分析数据集的公平性等等,是一个非常强大且非常简单的工具。

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
)
1
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
1
2

第二种方式:使用源码进行搭建

由于 TensorBoard 使用 Bazel 进行构建,因此首先需要 安装Bazel (opens new window),它是谷歌推出的一套编译系统。

Bazel有何特别之处

安装 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
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'
1
2

使用 Bazel 编译构建 TensorBoard:

$ git clone https://github.com/tensorflow/tensorboard.git
$ cd tensorboard
$ bazel build tensorboard:tensorboard          // 编译构建的过程比较慢,注意预留足够的内存(预留10GB以上的内存及交换空间)   
1
2
3

测试一下启动 TensorBoard 服务:

$ sudo bazel-bin/tensorboard/tensorboard
1

这时会出现如下报错,这是因为我们还没有设置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.
1
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']))
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

启动 TensorBoard 时将 --logdir 参数设置为刚刚的 ./logs/scalars 目录

$ sudo bazel-bin/tensorboard/tensorboard --logdir /root/tensorboard_test/logs/scalars --host=0.0.0.0 
1

另注:设置参数 --host=0.0.0.0 可以使其外网访问,否则只能 localhost 访问。

TensorBoard

# 4.2.3 TensorBoard 的汉化二次开发

TensorBoard 界面的英文显示文本是写死在代码里的,我没找到有现成的汉化包,不行就手动逐个替换页面里的代码文本吧。

举例:替换界面展示文本 Pin cards for a quick view and comparison

TensorBoard汉化前示例

代码里的位置:./tensorboard/webapp/metrics/views/main_view/pinned_view_component.ts

TensorBoard汉化示例在代码中的位置

将文本翻译成中文进行替换后,使用如下命令启动:

$ bazel run //tensorboard -- --logdir /root/tensorboard_test/logs/scalars --host=0.0.0.0
1

再次使用 Chrome 浏览器打开 http://ip:6006 访问 TensorBoard 面板,可以看到替换文本的地方已经翻译成中文了。

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 ...
NVIDIA-GPU分类

其中,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的显存信息

常见推理 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。

NVIDIA-GPU之间的通信

一般来讲,单机内的多 GPU 之间通信分为:PCIe 桥接互联通信、NVLink 部分互联通信、NVSwitch 全互联通信三种。

// 检查NVLink状态
$ nvidia-smi nvlink -m

// 使用NVIDIA提供的测试工具来验证NVLink的性能
$ /usr/local/cuda/extras/demo_suite/bandwidthTest
1
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),之后会自动给出安装命令。

CUDA官网给出安装命令

根据给出的命令进行下载安装,出来协议时直接输入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
1
2
3

安装CUDA环境

第一次安装失败,先查看cat /var/log/cuda-installer.log,再查看 cat /var/log/nvidia-installer.log,报错信息如下:

CUDA安装失败问题

解决办法是手动禁止Nouveau kernel driver的运行。

$ sudo vim /etc/modprobe.d/blacklist-nouveau.conf

在文件里写入:
blacklist nouveau
options nouveau modeset=0

$ sudo update-initramfs -u
$ sudo reboot
1
2
3
4
5
6
7
8

之后重新安装CUDA,这次就安装成功了。

$ sudo ./cuda_12.1.0_530.30.02_linux.run
1

CUDA安装成功

# 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
1
2
3

使用 nvidia-smi 命令可以显示出GPU的所有基础信息。

$ nvidia-smi                 // 查询GPU详情
$ nvidia-smi -q              // 查询GPU型号
1
2
nvidia-smi详解

解释相关参数含义:

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上每个进程所使用的显存情况。
1
2
3
4
5
6
7
8
9
10
11
12
13

查看CUDA驱动版本(安装PyTorch之类的深度学习库需要与CUDA驱动版本对应):

$ nvcc --version
1

另注:也可以使用 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 |
1
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]
1
2
3
4
5

注:使用 fuser 命令的时候千万要注意参数,如果使用 -k 参数,将会直接把这些进程都 kill 掉,我就曾因为 fuser -k /dev/nvidia* 命令闯祸过。

# 5.2.4 列出后台任务并终止进程

需求情景:部署了大模型服务,使用 Ctrl+Z 组合键将进程放入后台并停止执行。为了彻底终止这个进程,并释放其占用的GPU资源。

Step1:列出后台任务

使用jobs命令列出当前shell会话中所有的后台任务,这将会显示所有后台任务的列表,每个任务前都有一个编号。

$ jobs
1

Step2:终止后台进程

可以使用kill命令加上%任务编号来强制终止一个特定的后台任务。如果任务编号是3,应该执行:

$ kill -9 %3
1

# 5.2.5 显卡状态显示ERR!问题

情景描述:服务器使用过程中遇到了显卡状态显示成ERR!的问题,该显卡无法正常使用了。

显卡状态显示ERR!问题

nvidia-smi 官网显示了两个案例。

故障原因:可能是显卡过热原因导致掉卡了,显卡本身没有损坏。

解决方案:重启该服务器节点后恢复了正常使用(重启显卡驱动不好使,故障时候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
1
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
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
1

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
1
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)  
1
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环境加载
1
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.
1

# 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)
1
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)
1
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
1
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
1
2

[3] ImportError: numpy.core.multiarray failed to import

$ pip install --upgrade numpy
1

[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
1

[5] ImportError: cannot import name 'url_quote' from 'werkzeug.urls'

$ pip install Werkzeug==2.2.2
1

[6] bitsandbytes与CUDA版本不匹配的问题

bitsandbytes是用于大模型量化的库,项目地址:https://github.com/TimDettmers/bitsandbytes (opens new window)

使用pip安装bitsandbytes,出现该依赖与CUDA版本不匹配的问题

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
1
2
3
4
5
6

注意事项:编译安装的方式,如果是CUDA_VERSIONS之外的版本(比如12.1),会出现 Unsupported gpu architecture 'compute_89' 的问题。

bitsandbytes编译安装的版本问题

使用 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)

[17] [Docker] 错误之ImportError: libGL.so.1: cannot open shared object file: No such file or directory 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)

[26] NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver from CSDN (opens new window)

Last Updated: 10/10/2024, 10:54:21 AM