本帖最后由 T.JOHN 于 2023-1-20 17:48 编辑
排版不完全正常,不过PC浏览器基本可读,觉得乱或者手机阅读的可以移步此处为可以正确渲染markdown的页面
此文为debian11环境下部署CUDA套件并且进行AI性能测试的指南,deep learning毕竟用于生产,使用自然有一些门槛。另windows下也一样能够部署,请自行搜索玩耍,使用linux一方面我对windows生产环境不熟,另一方面可获取更高性能。 由于linux在安装/部署软件过程中不可避免会报很多错误,因此即便按照本文step by step操作也不可避免,因为时间久远我已经忘了我部署过程中出现过哪些错误。不过每个错误你把关键字段放google上搜索下都能找到答案,只是时间问题。一般是缺乏依赖,无非就是apt install xxx或者pip install xxx即可解决。如果找不到答案,也可以在回帖中问。 - 更新系统内核
由于intel 12代及其以后cpu有大小核心,调度需要优化。同时AMD/Intel两家集显和以及网卡驱动也集成在内核linux内核中,更新到6.0+内核还是必要的。另外NV独显也依赖headers,这个是内核相关的必安装项。
- 添加backports至source清单
printf "deb http://deb.debian.org/debian bullseye-backports main non-free\ndeb-src http://deb.debian.org/debian bullseye-backports main non-free" > /etc/apt/sources.list.d/backports.list - 更新内核后重启
apt update && apt install -t bullseye-backports linux-image-amd64 linux-headers-amd64 - 安装C/C++编译器,减少后面报错次数(如果这里预安装了所有依赖就可以一次性无错通过,但很多依赖我已经不记得了)
apt install build-essential
- 部署CUDA环境
NV的AI护城河强的主要原因在其CUDA套件为业界广泛应用,在此领域先到先得,开发人员底层离不开它。相当于微软的DX之于游戏界,区别只是巨硬不做硬件。
- 安装CUDA套件
由于CUDA需要配合驱动使用,安装CUDA会强制更新GPU驱动为NV自己的闭源驱动,linux上的开源驱动会同时被卸载。参考NV官网手册的安装命令如下wget https://developer.download.nvidi ... .13-1_amd64.debsudo dpkg -i cuda-repo-debian11-12-0-local_12.0.0-525.60.13-1_amd64.debsudo cp /var/cuda-repo-debian11-12-0-local/cuda-*-keyring.gpg /usr/share/keyrings/sudo add-apt-repository contribsudo apt-get updatesudo apt-get -y install cuda-11-8上述命令我修改最后一行为cuda-11-8,如果不修改会默认安装cuda12.0。截至2023年1月,NV还没有更新cuDNN去支持12.0
使用以下命令可查看已经安装的CUDA套件版本
cat /usr/local/cuda/version.txt - 安装cuDNN
cuDNN时GPU加速库,安装时需要指定自己的版本号和CUDA的版本号,否则可能不兼容。依旧参考NV官网手册的流程。在NV开发者页面注册成为NV开发者,再转到cuDNN页面点击下载,选择CUDA对应的cuDNN版本就行下载,debian11是一个deb文件。
注:如果你是ubuntu用户理论可以跳过这个注册步骤,使用在线包管理安装
- 转到下载目录
cd /你的下载目录 - 启用本地仓库
sudo dpkg -i cudnn-local-repo-${OS}-8.x.x.x_1.0-1_amd64.deb - 导入CUDA GPG密钥
- sudo cp /var/cudnn-local-repo-*/cudnn-local-*-keyring.gpg /usr/share/keyrings/
- 更新仓库元数据
sudo apt-get update - 安装Runtime库
sudo apt-get install libcudnn8=8.x.x.x-1+cudaX.Y - 安装开发者库
sudo apt-get install libcudnn8-dev=8.x.x.x-1+cudaX.Y - 安装测试样例代码和cuDNN文档
sudo apt-get install libcudnn8-samples=8.x.x.x-1+cudaX.Y
注:X.Y和8.x.x.x分别是你的CUDA和cuDNN版本号。如果不知道版本号,可以用apt search libcudnn8和apt info libcudnn8去查看NV官方源现在可用版本 - 验证是否安装成功
- 假设前面下载的样品代码在
/usr/src/cudnn_samples_v8 - 拷贝cuDNN样例代码至可写目录
cp -r /usr/src/cudnn_samples_v8/ $HOME - 进入目录
cd $HOME/cudnn_samples_v8/mnistCUDNN - 编译mnistCUDNN样例
make clean && make - 运行mnistCUDNN
./mnistCUDNN - 如果结果显示如下,则说明安装正确
Test passed!
- 安装TensorRT
TensorRT属于NV开发的SDK,依赖cuDNN。根据NV的介绍 “更大限度减少显存占用,并高效地为张量重复利用内存”,因此用来优化性能的,包括延时,显存等等。安装参考NV官网手册,debian11可以使用ubuntu 22.04的安装包
- 转到下载目录
cd /你的下载目录 - 启用本地仓库
sudo dpkg -i nv-tensorrt-local-repo-${os}-${tag}_1.0-1_amd64.deb - 导入cuDNN GPG密钥
- cp /var/nv-tensorrt-local-repo-${os}-${tag}/*-keyring.gpg /usr/share/keyrings/
- 更新仓库元数据
sudo apt-get update - 安装TensorRT
sudo apt-get install tensorrt - 若使用tensorflow
python3 -m pip install protobuf
sudo apt-get install uff-converter-tf - 验证是否安装成功
dpkg -l | grep TensorRT
会有类似如下显示
ii graphsurgeon-tf 8.5.2-1+cuda11.8 amd64 GraphSurgeon for TensorRT package
ii libnvinfer-bin 8.5.2-1+cuda11.8 amd64 TensorRT binaries
ii libnvinfer-dev 8.5.2-1+cuda11.8 amd64 TensorRT development libraries and headers
ii libnvinfer-plugin-dev 8.5.2-1+cuda11.8 amd64 TensorRT plugin libraries
ii libnvinfer-plugin8 8.5.2-1+cuda11.8 amd64 TensorRT plugin libraries
ii libnvinfer-samples 8.5.2-1+cuda11.8 all TensorRT samples
ii libnvinfer8 8.5.2-1+cuda11.8 amd64 TensorRT runtime libraries
ii libnvonnxparsers-dev 8.5.2-1+cuda11.8 amd64 TensorRT ONNX libraries
ii libnvonnxparsers8 8.5.2-1+cuda11.8 amd64 TensorRT ONNX libraries
ii libnvparsers-dev 8.5.2-1+cuda11.8 amd64 TensorRT parsers libraries
ii libnvparsers8 8.5.2-1+cuda11.8 amd64 TensorRT parsers libraries
ii python3-libnvinfer 8.5.2-1+cuda11.8 amd64 Python 3 bindings for TensorRT
ii python3-libnvinfer-dev 8.5.2-1+cuda11.8 amd64 Python 3 development package for TensorRT
ii tensorrt 8.5.2.x-1+cuda11.8 amd64 Meta package of TensorRT
ii uff-converter-tf 8.5.2-1+cuda11.8 amd64 UFF converter for TensorRT package
ii onnx-graphsurgeon 8.5.2-1+cuda11.8 amd64 ONNX GraphSurgeon for TensorRT package
- 创建python虚拟环境进行测试
debian11默认自带python3.9,这里只需要创建虚拟环境后直接使用。由于linux的包管理即操作系统安装软件的管理程序依赖python,你把python折腾坏了,系统就容易被你搞挂。因此创建虚拟环境的原因是避免为了污染系统环境,类似于docker,一个简单的半隔离虚拟机,你怎么折腾都在你的一亩三分地中
- 创建虚拟环境
- 安装python venv依赖
apt install python3-venv - 在当前文件下创建py的虚拟环境
python3 -m venv py - 进入py文件夹并且启用虚拟环境,可以看到terminal用户名之前多了(py),以下所有操作都在虚拟环境中完成
cd py && source bin/activate #需要退出请输入deactivate
- 安装tensorflow-gpu(测试版)
pip install tf-nightly-gpu
注:测试版本支持TensorRT 8.x,稳定版只支持7.x,会报错,因此安装测试版
- 安装benchmark进行测试
- 安装ai-benchmark脚本
pip install ai-benchmark - 进行测试
ai-benchmark
- 问题修复
- 已知问题1 在ai-benchmark运行时报错 Cannot register 2 metrics with the same name: /tensorflow/core/bfc_allocator_delay
应该是tensorflow版本问题,我之前老版本TF跑没这个错误,今天更新到最新版就出错了,但不影响使用 - 已知问题2 在ai-benchmark运行时报错 successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero.
numa_node报错,并不影响测试,只是会多出一堆字符。参考github和stackflow。输入以下命令解决
for a in /sys/bus/pci/devices/*; do echo 0 | sudo tee -a $a/numa_node; done - 已知问题3 TensorRT组件中的python3-libnvinfer无法安装
由于源借用的ubuntu 22.04,debian11系统自带的python是3.9版本,需要3.10。可以通过单独下载tensorrt.whl文件安装,无伤大雅
- 安装结束,即一旦生产环境部署完毕后,别瞎JB升级软件。比如CUDA,不是越新越好,而是越稳越好,一旦改变坏境中的一个软件,很有可能导致其他组件无法运行。2023年1月的最新环境为CUDA 11.8cuDNN 8.7.0.84 for CUDA 11.8TensorRT 8.5.2 for CUDA 11.8Tensorflow-gpu 2.12 nightly
- 测试项目包括16个,图像识别,物体区分,分辨率超采样等等,具体参考ai-benchmark官网。跑分参考官网GPU排名,除了总分每个项目都有小分。我用240w的3070跑了下,得分如下
Device Inference Score: 16181
Device Training Score: 18804
Device AI Score: 34985
比2080ti略好,和v100差不多。测试过程中8G显存吃满,核心占用1x%~7x%波动。功耗几十瓦至两百瓦波动。几个子项会报显存不足,提示“不是不能跑,而是更多显存能提升性能”。因此深度学习显存自然是越大越好,而CUDA占用率是跑不到100%的。另外我试了TensorRT安装和未安装的情况,分数基本一样,可能多模型,多任务,多显卡的时候作用更加明显。
最后,4090的deep learning 理论性能测试首发时就有了,比3090没强多少,也就1.4x的样子,和它3倍于3090的FP32算力不成正比,能耗比也就略微好些,两者显存大小也一样,如果有项目需求建议显然便宜带nvlink的3090更合适,毕竟价格便宜,显存更大。 下一篇介绍如何基于CUDA套件畅玩具备数千年历史的3A大作GO,实现单机部署Katago 1.12.x超越alpha go
|