当前位置:   article > 正文

Ubuntu-Nvidia深度学习环境(CUDA,cuDNN,tensorRT,docker)配置_nvidia如何使用gds

nvidia如何使用gds

写在前面

  • TensorFlow 2.14/15广泛存在无法使用cudnn,cuFFT等问题(Github Issue#62075);2.16及以后将不提供 tf-estimator 包(Estimators | TensorFlow Core
  • (*可选):安装开源版本nvidia驱动,并启用NVIDIA GPUDirect Storage支持。对于个人小规模深度学习效率提升微弱,且问题较多,故不推荐使用。
  • (*替代):指同级目录下主要方法的替代方法,不可同时使用。

卸载以前的安装

  • To remove CUDA Toolkit ,cuDNN ,TensorRT ,nvidia-driver and extra components:
 # To remove CUDA Toolkit
sudo apt-get purge -y "*cuda*"
sudo apt-get purge -y "*cublas*"
sudo apt-get purge -y "*cufft*"
sudo apt-get purge -y "*cufile*"
sudo apt-get purge -y "*curand*"
sudo apt-get purge -y "*cusolver*"
sudo apt-get purge -y "*cusparse*"
sudo apt-get purge -y "*npp*"
sudo apt-get purge -y "*nvjpeg*"
sudo apt-get purge -y "*nvvm*"
sudo apt-get purge -y "nsight*"
 # To remove TensorRT and its attachments
sudo apt-get purge -y "libnvinfer*"
sudo apt-get purge -y "nv-tensorrt-local-repo*"
sudo apt-get purge -y "libnvonnxparsers*"
sudo apt-get purge -y "libnvparsers*"
sudo apt-get purge -y graphsurgeon-tf
sudo apt-get purge -y onnx-graphsurgeon
 # To remove cuDNN
sudo apt-get purge -y "libcudnn*"
sudo apt-get purge -y "cudnn-local-repo*"
 # To remove extra components
sudo apt-get purge -y "*libcufile*"
sudo apt-get purge -y "*gds-tools*"
sudo apt-get purge -y "*nvidia-fs*"
sudo apt-get purge -y "libnccl*"
 # To remove Nvidia driver and other components
sudo apt-get purge -y "*nvidia*"
sudo apt-get purge -y "libxnvctrl*"
  • 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
  • 删除添加的keys和pin:
sudo rm /usr/share/keyrings/cuda*.gpg
sudo rm /usr/share/keyrings/cudnn*.gpg
sudo rm /usr/share/keyrings/nv-tensorrt*.gpg
sudo rm /etc/apt/preferences.d/cuda-repository-pin-600
  • 1
  • 2
  • 3
  • 4
  • 自动删除剩下的未用包
sudo apt autoremove
  • 1

重启电脑

安装 CUDA 和 NVIDIA 驱动

* CUDA官方安装指南

安装 NVIDIA 官方 Apt 存储库

cd ~/Downloads/
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt-get update
  • 1
  • 2
  • 3
  • 4

安装 NVIDIA 驱动

安装 Server 版闭源驱动

最高兼容到 CUDA 12.4

sudo apt-get install -y nvidia-driver-550-server
  • 1

安装兼容 CUDA 12.5 的非 Server 最新版驱动:sudo apt install -y nvidia-driver-555

(*替代)安装开源驱动(*可选)

  • 1、通过以下方式启用对GeForce和Quadro SKU的实验性支持Nvidia driver 545.29.02之后不再需要设置
    echo "options nvidia NVreg_OpenRmEnableUnsupportedGpus=1" | sudo tee /etc/modprobe.d/nvidia-gsp.conf

  • 2、(替代) 安装open版驱动(CUDA12.2后必须open版驱动才能使用NVIDIA GPUDirect Storage)
    sudo apt-get install -y nvidia-driver-550-server-open

安装 CUDA

CUDA12.3 官方安装命令

sudo apt-get -y install cuda-toolkit-12-3
  • 1
  • 首次安装需要添加CUDA到用户环境变量
echo -e '\nexport LD_LIBRARY_PATH=/usr/local/cuda/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}\nexport PATH=/usr/local/cuda/bin${PATH:+:${PATH}}' |tee -a ~/.bashrc
source ~/.bashrc
  • 1
  • 2

安装 Docker 支持

1、(仅首次)添加 nvidia-container-toolkit 的 apt 源。若以前添加过源,则可以跳过这一步

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
  && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
  • 1
  • 2
  • 3
  • 4
  • 5

2、 安装 nvidia-container-toolkit

sudo apt-get install -y nvidia-container-toolkit
  • 1

3、运行

sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
  • 1
  • 2

提示:此操作可能对snap安装的docker无效,需卸载snap安装的docker sudo snap remove --purge docker后用apt安装docker解决。

安装 cuDNN

官网指南链接: docs.nvidia.com/deeplearning/cudnn/install-guide.
TensorFlow cuDNN CUDA版本对应表

  • 安装依赖包:
sudo apt-get install zlib1g
  • 1
  • 下载cudnn的deb包并安装 (仅其他方式安装CUDA时需要,网络deb安装CUDA应跳过该步骤)
    1、cuDNN官网下载地址
    2、启用本地存储库
    sudo dpkg -i cudnn-local-repo-$distro-8.x.x.x_1.0-1_amd64.deb
    sudo cp /var/cudnn-local-repo-*/cudnn-local-*-keyring.gpg /usr/share/keyrings/
    sudo apt-get update

  • 安装cuDNN v8

# 运行时(必选)
sudo apt-get install -y libcudnn8
# 开发环境(可选)
sudo apt-get install -y libcudnn8-dev
sudo apt-get install -y libcudnn8-samples
  • 1
  • 2
  • 3
  • 4
  • 5
  • 安装最新的cuDNN v9(*可选
    由于cuDNN v9可以与以前版本的cuDNN共存,但未被广泛支持(2024.4,详见cuDNN版本对应表), 所以若需要用到(如 jax 最新版),则可以同时安装:
sudo apt-get -y install cudnn9-cuda-12 # 运行时和开发环境
  • 1

sudo apt-get -y install libcudnn9-samples
一般而言,深度学习库会自动选择所需的cuDNN版本;如需要手动指定系统的默认cuDNN版本,则运行sudo update-alternatives --config libcudnn

验证 cuDNN v8 开发环境的安装(*可选)

cp -r /usr/src/cudnn_samples_v8/ /tmp
cd  /tmp/cudnn_samples_v8/mnistCUDNN
make clean && make
./mnistCUDNN
cd - >/dev/null
  • 1
  • 2
  • 3
  • 4
  • 5

若显示Test passed! ,则安装成功。

安装 TensorRT

tensorrt 官方安装指南

若CUDA安装是使用网络 deb(network)安装方式,则:

  • 安装tensorrt v8.6.1
    由于NVIDIA发布了tensorrt v10.0,但暂时不被TensorFlow等支持(2024.4),所以不能直接安装tensorrt等库,而要指定v8版本:
 # 必选项(安装这俩TensorFlow2.15/2.16至少能调用tensorrt了,注意调用cuda11.8的TensorFlow可能不能正常调用!)
sudo apt-get install -y libnvinfer8 libnvinfer-plugin8
 # 可选项
# sudo apt-get install -y libnvinfer-lean8 libnvinfer-vc-plugin8 libnvinfer-dispatch8
# sudo apt-get install -y libnvparsers8 libnvonnxparsers8
  • 1
  • 2
  • 3
  • 4
  • 5

【提示】 onnx-graphsurgeon 推荐pip安装,而不是apt包,python的 onnx-graphsurgeon 库安装详见 PyPi onnx-graphsurgeon
【提示】 由于 apt 安装的 tensorrt 不兼容多版本同时安装,tensorrt 的其它安装方式如pip安装等详见 tensorrt官方安装指南
sudo apt-get install tensorrt # 将安装最新的tensorrt v10.0
sudo apt-get install python3-libnvinfer-dev

若使用的其他CUDA安装方式,则需下载tensorRT 8.x (注意选择deb安装包与cuda大版本相对应,如for Ubuntu 22.04 and CUDA 12.0 and 12.1 DEB local repo Package),并参照指南3.2.1节进行安装

验证 TensorRT 功能(*可选)

在安装有 TensorFlow2.x 且支持tensorRT的Python下运行如下代码:
若输出正常则tensorRT功能正常;
若中途显示ERROR:tensorflow:Tensorflow needs to be built with TensorRT support enabled to allow TF-TRT to operate.,则tensorrt未正常安装。

import tensorflow as tf
from tensorflow.python.compiler.tensorrt import trt_convert as trt
import time
from tensorflow import keras
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.optimizers import RMSprop
import shutil

batch_size = 128
num_classes = 10
epochs = 5

(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')

# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(num_classes, activation='softmax'))

model.summary()

model.compile(loss='categorical_crossentropy',
              optimizer=RMSprop(),
              metrics=['accuracy'])

history = model.fit(x_train, y_train,
                    batch_size=batch_size,
                    epochs=epochs,
                    verbose=1,
                    validation_data=(x_test, y_test))
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
model.export('/tmp/tf_savedmodel')

params=trt.DEFAULT_TRT_CONVERSION_PARAMS
params._replace(precision_mode=trt.TrtPrecisionMode.FP32)
converter = trt.TrtGraphConverterV2(input_saved_model_dir='/tmp/tf_savedmodel',conversion_params=params)
converter.convert()#完成转换,但是此时没有进行优化,优化在执行推理时完成
converter.save('/tmp/trt_savedmodel')

(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_test = x_test.astype('float32')
x_test = x_test.reshape(10000, 784)
x_test /= 255

saved_model_loaded = tf.saved_model.load(
    "/tmp/trt_savedmodel", tags=[trt.tag_constants.SERVING])#读取模型
graph_func = saved_model_loaded.signatures[
    trt.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY]#获取推理函数,也可以使用saved_model_loaded.signatures['serving_default']
frozen_func = trt.convert_to_constants.convert_variables_to_constants_v2(
    graph_func)#将模型中的变量变成常量,这一步可以省略,直接调用graph_func也行

shutil.rmtree('/tmp/tf_savedmodel')
shutil.rmtree('/tmp/trt_savedmodel')

t=time.time()
output = frozen_func(tf.constant(x_test))[0].numpy()
print(time.time()-t)
print((output.argmax(-1)==y_test).mean())

  • 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

附录

编译 Tensorflow 的一些官方文档

Intel: Build TensorFlow from Source with Intel oneAPI oneDNN library
Tensorflow官方(要看英文版): Build from source

安装 NVIDIA GPUDirect Storage(GDS) 组件(*可选)

NVIDIA GPUDirect Storage 官方文档

(CUDA12.2后必须open版驱动才能使用NVIDIA GPUDirect Storage)

  • 【提示】GDS功能指直接将数据绕过CPU和内存,直接载入GPU显存中。对于深度学习,其一般用于数据预处理阶段,将大批量数据直接载入GPU,并由GPU直接进行预处理。这需要使用nvidia推出的DALI库(用pip安装),并使用特定的数据载入手段。

1、Github: NVIDIA/DALI/releases
2、DALI库数据载入说明: numpy_reader方法 --nvidia DALI官方文档

1、遵循指南2.1禁用iommu并且重启
2、对于nvme固态,运行

cat /sys/block/<nvme>/integrity/device_is_integrity_capable
  • 1

若输出为0,则支持gds,遵循指南14.1安装MLNX_OFED,在MLNX_OFED官网下载tgz文件并解压编译安装(安装脚本:mlnxofedinstall,卸载脚本:uninstall.sh)
3、运行如下命令

sudo apt-get install nvidia-gds
  • 1

重启电脑

3、测试gds功能是否正常安装
【方法一】

/usr/local/cuda/gds/tools/gdscheck.py -p
  • 1

若nvme为supported则可以了

【方法二】 用ipynb运行“DALI库数据载入说明: numpy_reader方法 --nvidia DALI官方文档”中的最后一段代码,若成功返回图片则成功。

参考文献

1、W1Fl.在tensorflow2.0上使用tensorrt6加速[EB/OL].csdn,2019-12-31. https://blog.csdn.net/weixin_43842032/article/details/103764010

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/985558
推荐阅读
相关标签
  

闽ICP备14008679号