Tensorflow 2.x目前官方的版本暫時只支持到CUDA 10.1遣铝,但是RTX 3090顯卡只支持CUDA 11及以上的版本冻河,因此本次實驗采用了從源碼編譯的方法來構(gòu)建面向CUDA 11的tensorflow.
- 系統(tǒng):Ubuntu 20.10
- 硬件環(huán)境:Intel Core i9 10900X, 128GB內(nèi)存, 兩塊RTX 3090顯卡
- Python版本使用Anaconda來管理
(一) 準(zhǔn)備環(huán)境
基礎(chǔ)環(huán)境已安裝:
- Nvidia顯卡驅(qū)動 (455.38),使用Ubuntu自帶附加驅(qū)動安裝
- Anaconda3 (或Miniconda3)棒动,并配置了國內(nèi)源
- 系統(tǒng)自帶的gcc版本為10.2
- vim和vscode編輯器
(1) 安裝CUDA 11.1
首先打開下載地址:https://developer.nvidia.com/cuda-toolkit-archive
選擇最新版本11.1.1
然后選擇系統(tǒng)linux糙申,x86_64,Ubuntu船惨,20.04柜裸,安裝類型選runfile(local)
,下面會顯示安裝說明粱锐,如:
wget https://developer.download.nvidia.com/compute/cuda/11.1.0/local_installers/cuda_11.1.0_455.23.05_linux.run
sudo sh cuda_11.1.0_455.23.05_linux.run
這個安裝包會比較大(3.5GB)疙挺,建議執(zhí)行之前先cd
到下載文件的目錄。
注:如果想要更快的下載速度怜浅,可以使用mwget -n 32
來加速铐然,這里可以自己設(shè)置多線程下載的個數(shù)。
下載完執(zhí)行上面的第二句命令來安裝恶座,會提示已安裝驅(qū)動搀暑,選擇continue即可,然后accept跨琳。注意在安裝時自点,因為我們已經(jīng)有顯卡驅(qū)動,所以需要把Driver那個選項按空格鍵取消脉让,然后選Install安裝桂敛。
安裝完成后,需要配置環(huán)境變量溅潜,打開:
sudo vim ~/.bashrc
(如果沒有安裝vim术唬,首先需要安裝sudo apt install vim
)
在文件末尾添加:
export CUDA_HOME=/usr/local/cuda
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${CUDA_HOME}/lib64
export PATH=${CUDA_HOME}/bin:${PATH}
(括弧:這里的cuda路徑不加版本號伟恶,以便后續(xù)升級cuda版本的時候不需要重新配置)
保存之后碴开,更新環(huán)境變量:
source ~/.bashrc
最后輸入nvcc -V
驗證CUDA是否已安裝,并返回版本號等信息博秫。
(2) 配置Cudnn 8.0.5
首先打開下載地址:https://developer.nvidia.com/rdp/cudnn-download
這里需要登陸或注冊Nvidia賬號潦牛,如果是第一次下載,可能還要填一份調(diào)查問卷挡育,然后根據(jù)提示選擇版本巴碗,這里選的是cuDNN Library for Linux (x86_64)
如果使用瀏覽器下載太慢,建議開始下載之后右鍵復(fù)制鏈接即寒,然后取消下載橡淆,打開終端使用mwget
來下載召噩。
然后解壓:
tar -zxvf cudnn-11.1-linux-x64-v8.0.5.39.tgz
接下來把cudnn的文件復(fù)制到CUDA目錄:
sudo cp cuda/lib64/* /usr/local/cuda/lib64/
sudo cp cuda/include/* /usr/local/cuda/include/
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
最后驗證cudnn是否配置好并輸出版本號:
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
返回值為相關(guān)define的信息。
(3) 配置TensorRT
打開下載地址:https://developer.nvidia.com/tensorrt
登陸Nvidia賬號逸爵,同樣的可能會讓填一份問卷具滴,提交之后點擊立即下載。這里選擇版本為"TensorRT 7.2.1 for Ubuntu 18.04 and CUDA 11.1 TAR package"
同樣可以采用mwget
加速下載师倔,然后解壓并配置:
tar -zxvf TensorRT-7.2.1.6.Ubuntu-18.04.x86_64-gnu.cuda-11.1.cudnn8.0.tar.gz
sudo mv TensorRT-7.2.1.6 /usr/local/TensorRT-7.2.1.6
sudo ln -s /usr/local/TensorRT-7.2.1.6 /usr/local/tensorrt
然后配置環(huán)境變量构韵,打開:
sudo vim ~/.bashrc
在文件末尾添加:
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/tensorrt/lib
然后更新環(huán)境變量:
source ~/.bashrc
(4) 配置Python接口
因為Ubuntu 20.10自帶的python版本為3.8,而tensorrt只支持到3.7趋艘,因此需要建立一個新的Anaconda虛擬環(huán)境疲恢,設(shè)置python 3.7版本:
conda create -n tf2 python=3.7
conda activate tf2
然后在(tf2)下配置:
cd /usr/local/tensorrt/python
pip install tensorrt-7.2.1.6-cp37-none-linux_x86_64.whl
(5) 安裝UFF和graphsurgeon
cd /usr/local/tensorrt/uff
pip install uff-0.6.9-py2.py3-none-any.whl
cd /usr/local/tensorrt/graphsurgeon
pip install graphsurgeon-0.4.5-py2.py3-none-any.whl
(6) 驗證TensorRT安裝
運行mnist示例程序:
cd /usr/local/tensorrt/samples/sampleMNIST
make
/usr/local/tensorrt/bin/sample_mnist
(7) 安裝Bazel
首先打開下載地址:https://github.com/bazelbuild/bazel/releases
然后點擊Assets,選擇bazel-3.7.0-linux-x86_64瓷胧,版本號以最新版為準(zhǔn)显拳,然后下載,可使用mwget
加速搓萧。
這個下載的文件就是可執(zhí)行文件杂数,然后配置:
mkdir ~/bin
mv bazel-3.7.0-linux-x86_64 ~/bin/
cd ~/bin/
ln -s bazel-3.7.0-linux-x86_64 bazel
接下來配環(huán)境變量:
sudo vim ~/.bashrc
在文件末尾添加:
export BAZEL_HOME=/home/lab
export PATH=${PATH}:${BAZEL_HOME}/bin
(注意這里需要把lab改成自己的用戶名)
然后更新環(huán)境變量:
source ~/.bashrc
最后輸入bazel
驗證是否安裝成功。
(二) 編譯Tensorflow
(1) 獲取源碼
首先cd
到想要下載源碼的目錄:
# 官網(wǎng)
git clone https://github.com/tensorflow/tensorflow.git
# 可以使用國內(nèi)加速
git clone https://hub.fastgit.org/tensorflow/tensorflow.git
cd tesorflow
(2) 配置編譯選項
首先保證Anaconda已經(jīng)切換到剛剛建立的虛擬環(huán)境矛绘,然后:
./configure
選擇python版本時耍休,如果路徑正確,則直接敲回車货矮。
You have bazel 3.7.0 installed.
Please specify the location of python. [Default is /home/lab/miniconda3/envs/tf2/bin/python3]:Found possible Python library paths:
/home/lab/miniconda3/envs/tf2/lib/python3.7/site-packages
Please input the desired Python library path to use. Default is [/home/lab/miniconda3/envs/tf2/lib/python3.7/site-packages]Do you wish to build TensorFlow with ROCm support? [y/N]: N
No ROCm support will be enabled for TensorFlow.Do you wish to build TensorFlow with CUDA support? [y/N]: y
CUDA support will be enabled for TensorFlow.Do you wish to build TensorFlow with TensorRT support? [y/N]: y
TensorRT support will be enabled for TensorFlow.
后面的選項需要把CUDA和TensorRT設(shè)置成Y羊精,然后選擇CUDA版本,設(shè)置為11.1囚玫,CUDNN設(shè)置為8喧锦,TensorRT設(shè)置為7,因為NCCL沒有配置抓督,所以用默認(rèn):
Please specify the CUDA SDK version you want to use. [Leave empty to default to CUDA 10]: 11.1
Please specify the cuDNN version you want to use. [Leave empty to default to cuDNN 7]: 8
Please specify the TensorRT version you want to use. [Leave empty to default to TensorRT 6]: 7
Please specify the locally installed NCCL version you want to use. [Leave empty to use http://github.com/nvidia/nccl]:
然后配置CUDA路徑:
Please specify the comma-separated list of base paths to look for CUDA libraries and headers. [Leave empty to use the default]:
這里輸入:
/usr/local/tensorrt$ /lib,/lib/x86_64-linux-gnu,/usr,/usr/lib/x86_64-linux-gnu/libfakeroot,/usr/local/cuda,/usr/local/cuda/targets/x86_64-linux/lib,/usr/local/tensorrt
然后設(shè)置對GPU顯卡算力的支持:
Please note that each additional compute capability significantly increases your build time and binary size, and that TensorFlow only supports compute capabilities >= 3.5 [Default is: 8.6,8.6]:
對于RTX3090燃少,輸入8.6然后回車。(其他顯卡查詢:https://developer.nvidia.com/zh-cn/cuda-gpus#collapseOne)
是否使用clang選擇N铃在,gcc編譯器使用默認(rèn)阵具,編譯器優(yōu)化選項默認(rèn)回車,安卓選項設(shè)置為N:
Do you want to use clang as CUDA compiler? [y/N]: N
nvcc will be used as CUDA compiler.Please specify which gcc should be used by nvcc as the host compiler. [Default is /usr/bin/gcc]:
Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -march=native -Wno-sign-compare]:
Would you like to interactively configure ./WORKSPACE for Android builds? [y/N]: N
Not configuring the WORKSPACE for Android builds.
最后輸出以下信息定铜,配置完成阳液。
Preconfigured Bazel build configs. You can use any of the below by adding "--config=<>" to your build command. See .bazelrc for more details.
--config=mkl # Build with MKL support.
--config=mkl_aarch64 # Build with oneDNN support for Aarch64.
--config=monolithic # Config for mostly static monolithic build.
--config=numa # Build with NUMA support.
--config=dynamic_kernels # (Experimental) Build kernels into separate shared objects.
--config=v2 # Build TensorFlow 2.x instead of 1.x.
Preconfigured Bazel build configs to DISABLE default on features:
--config=noaws # Disable AWS S3 filesystem support.
--config=nogcp # Disable GCP support.
--config=nohdfs # Disable HDFS support.
--config=nonccl # Disable NVIDIA NCCL support.
Configuration finished
(3) 配置github加速
首先已cd到tensorflow源碼目錄,并且Anaconda已激活虛擬環(huán)境揣炕。使用vscode編輯源碼:
code WORKSPACE
按下Ctrl+H帘皿,把代碼中的那個"https://github.com"替換為"https://hub.fastgit.org",然后Ctrl+S保存畸陡,再編輯:
code tensorflow/workspace.bzl
code third_party/aws/workspace.bzl
按照同樣的方法替換鹰溜,大約分別有57處和4處虽填,全部替換,并保存曹动,關(guān)掉vscode斋日。
注:后續(xù)如果還出現(xiàn)下載github很慢的情況,可能是tensorflow版本更新的改動仁期,可以使用全文檢索的方法來查找文件路徑并替換網(wǎng)址(說明文檔以及注釋里的路徑不需要替換):
find .|xargs grep -ri "https://github.com/" -l
(4) 使用bazel進(jìn)行build
構(gòu)建帶有CUDA支持的tensorflow:
bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
根據(jù)網(wǎng)速的情況桑驱,下載過程大概需要20分鐘左右,編譯過程根據(jù)CPU配置可能需要1個多小時(酷睿i9 10900X)跛蛋,把機子開著去睡覺即可。
(5) 編譯報錯問題解決
報錯信息:
ModuleNotFoundError: No module named 'keras_preprocessing'
解決方法:
pip install keras_applications keras_preprocessing
成功安裝后會提示"INFO: Build completed successfully"痊硕。
(6) 從master分支構(gòu)建whl軟件包
./bazel-bin/tensorflow/tools/pip_package/build_pip_package --nightly_flag /tmp/tensorflow_pkg
注意這里的輸出路徑/tmp/tensorflow_pkg
建議不要修改赊级,否則容易出問題。
(7) 安裝生成的軟件包
首先查看生成的whl文件
cd /tmp/tensorflow_pkg/
ls
這里會顯示生成的文件名岔绸,然后安裝這個軟件包(以輸出的文件名為準(zhǔn))理逊。此時需要確認(rèn)已經(jīng)在正確的Anaconda虛擬環(huán)境下。
pip install tf_nightly-2.5.0-cp37-cp37m-linux_x86_64.whl
安裝過程會自動安裝相關(guān)依賴項盒揉。
(三) 測試編譯的Tensorflow是否可以訪問GPU
打開python晋被,運行以下代碼:
from tensorflow.python.client import device_lib
def get_available_gpus():
local_device_protos = device_lib.list_local_devices()
return [x.name for x in local_device_protos if x.device_type == 'GPU']
print(get_available_gpus())
這里會輸出一些和GPU相關(guān)的信息:
2020-11-19 12:16:47.387251: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcudart.so.11.0
2020-11-19 12:16:48.022598: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1267] Device interconnect StreamExecutor with strength 1 edge matrix:
2020-11-19 12:16:48.022639: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1273] 0 1
2020-11-19 12:16:48.022644: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1286] 0: N N
2020-11-19 12:16:48.022647: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1286] 1: N N
2020-11-19 12:16:48.026415: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1413] Created TensorFlow device (/device:GPU:0 with 22423 MB memory) -> physical GPU (device: 0, name: GeForce RTX 3090, pci bus id: 0000:17:00.0, compute capability: 8.6)
2020-11-19 12:16:48.028475: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1413] Created TensorFlow device (/device:GPU:1 with 21814 MB memory) -> physical GPU (device: 1, name: GeForce RTX 3090, pci bus id: 0000:65:00.0, compute capability: 8.6)
['/device:GPU:0', '/device:GPU:1']
如果輸出結(jié)果和你的實際GPU符合,則說明Tensorflow可以訪問GPU刚盈。
然后可以打開vscode羡洛,將Anaconda環(huán)境切換到本次配置的虛擬環(huán)境,然后測試自己的tensorflow程序藕漱。
運行時打開nvidia-smi
欲侮,觀察到GPU使用率提高,程序輸出結(jié)果正常肋联,說明配置成功威蕉。
實際測試3090顯卡比之前的Titan RTX訓(xùn)練網(wǎng)絡(luò)的速度明顯快一些,這里面可能也有一部分因為CUDA 11的加速作用橄仍。
參考文獻(xiàn)
Ubuntu18.04 LTS 使用CUDA11.1編譯TensoFlow-GPU版本
RTX3090 cuda,cudnn,tensorflow環(huán)境配置
RTX 3090的深度學(xué)習(xí)環(huán)境配置pytorch韧涨、tensorflow、keras - 知乎
如何提高國內(nèi)訪問Github的速度到2MB/s以上
求助侮繁!Tensorflow2.3 GPU報錯InternalError: CUDA runtime implicit initialization on GPU:0 failed.