概要
本地运行环境:tensorflow-gpu1.2.0,Python3.6,cuda 8,cudnn 5.1
服务器环境: cuda 11.7
在本地跑代码会爆显存,所以想用组里的服务器来训练模型,由于使用的事tensorflow的gpu版本,所以需要对应的cuda和cudnn版本。使用的是Red hat的服务器,由于服务器的cuda版本较新,所以无法运行tensorflow-gpu1.2.0支持的代码,而且我没有root权限,所以也无法直接安装自己所需的cuda和cudnn版本。服务器已经安装podman-4.6.1
服务器安装podman容器,并借助Gpu进行深度强化学习训练。
- podman拉取镜像
podman pull nvcr.io/nvidia/cuda:8.0-cudnn5-devel-ubuntu16.04
报错:
rror: initializing source docker://nvcr.io/nvidia/cuda:8.0-cudnn5-devel-ubuntu16.04: Get "https://nvcr.io/proxy_auth?scope=repository%3Anvidia%2Fcuda%3Apull": tls: failed to verify certificate: x509: certificate is valid for *.cmtelematics.com, cmtelematics.com, not nvcr.io
这个错误表明,在使用Podman从nvcr.io拉取镜像时,TLS证书验证失败,导致无法建立安全的连接。这可能是由于你的网络环境或者镜像源配置的问题。
2. 禁用TLS验证(会降低连接的安全性,可能不适合生产环境)
podman pull --tls-verify=false nvcr.io/nvidia/cuda:8.0-cudnn5-devel-ubuntu16.04
Trying to pull nvcr.io/nvidia/cuda:8.0-cudnn5-devel-ubuntu16.04...
Getting image source signatures
Copying blob a6146334b4d9 done
Copying blob b51569e7c507 done
Copying blob 847af351305b done
Copying blob 58690f9b18fc done
Copying blob da8ef40b9eca done
Copying blob fb15d46c38dc done
Copying blob 454777287352 done
Copying blob 5a4223015407 done
Copying blob 061b84ac7eb5 done
Copying blob bfd547a64626 done
Copying blob 1cf331c5209a done
Copying blob b74095f662ae done
Copying config 9533c5da34 done
Writing manifest to image destination
9533c5da3485e93fddfc3f263be11256cc6d87997aa5f327eeb542d0d4958c99
(tf-1.2.0) (base) [02@gpu04 tensorflow_container]$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
nvcr.io/nvidia/cuda 8.0-cudnn5-devel-ubuntu16.04 9533c5da3485 2 years ago 1.87 GB
以上信息表示:nvcr.io/nvidia/cuda:8.0-cudnn5-devel-ubuntu16.04镜像拉取成功。
- 利用镜像创建容器
podman run --gpus all --name tf_gpu1.2.0_container -it nvcr.io/nvidia/cuda:8.0-cudnn5-devel-ubuntu16.04 /bin/bash
注意要加 –gpus all 参数,这是指示容器要使用 GPU 的一个步骤。
4. 启动并进入容器
podman start tf_gpu1.2.0_container
podman exec -it tf_gpu1.2.0_container /bin/bash
- 复制文件到容器:
podman exec -it tf_gpu_1.2.0_container mkdir -p /workspace
podman cp /home/02/dp/tensorflow_container/requirements.txt tf_gpu1.2.0_container:/workspace
podman cp /home/02/dp/tensorflow_container/code/ tf_gpu1.2.0_container:/workspace
- 基本命令
#########podman######################################
1. 查看 Podman 版本:podman --version
2. 拉取镜像:podman pull <镜像名称>
3. 列出本地镜像:podman images
4. 运行容器:podman run -it --name <容器名称> <镜像名称> /bin/sh
5. 列出运行中的容器:podman ps
6. 列出所有容器:podman ps -a
7. 停止容器:podman stop <容器ID或名称>
8. 启动容器:podman start <容器ID或名称>
9. 删除容器:podman rm <容器ID或名称>
10. 删除镜像:podman rmi <镜像ID或名称>
11. 查看容器日志:podman logs <容器ID或名称>
12. 进入正在运行的容器:podman exec -it <容器ID或名称> /bin/sh
13. 查看容器的详细信息:podman inspect <容器ID或名称>
14. 导出和导入容器:
podman export -o <文件名>.tar <容器ID或名称>
podman import <文件名>.tar
15.将文件从主机复制到 Podman 容器中:如果目标路径在容器内不存在,Podman 会自动创建它。
podman cp <主机路径> <容器ID或名称>:<容器路径>
复制文件夹:
podman cp /path/to/folder mycontainer:/root/folder
15. 退出容器:exit
16. 以root方式进入容器 podman exec -u 0 -it tf_g_1.2.0_container /bin/bash
###################linux操作#############################
17. 列出目录内容 : ls
18. 删除文件或文件夹:rm -rf 目录名字
19. 退出容器
#########其他#############
20. 查看 CUDA 版本: nvcc --version
21. 查看 cudnn版本: dpkg -l | grep cudnn
22. pip install tensorflow-gpu==1.2.0
- 从源码安装 Python 3.6(由于直接安装,安装不上)
① 安装必要的依赖项:
apt-get update
apt-get install -y build-essential libssl-dev zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev liblzma-dev libsqlite3-dev wget libreadline-dev libffi-dev
② 下载 Python 3.6 源码:
wget https://www.python.org/ftp/python/3.6.15/Python-3.6.15.tgz
tar -xf Python-3.6.15.tgz
cd Python-3.6.15
③ 编译和安装 Python 3.6:
./configure --enable-optimizations
make -j $(nproc)
make altinstall
④ 验证 Python 3.6 是否成功安装:
python3.6 --version
⑤ 使用专为 Python 3.6 设计的 get-pip.py 安装 pip:
使用 curl 命令下载 Python 3.6 兼容版本的 get-pip.py:
apt-get update
apt-get install -y curl
curl -O https://bootstrap.pypa.io/pip/3.6/get-pip.py
运行 get-pip.py 安装 pip:
python3.6 get-pip.py
验证 pip 安装:
pip3.6 --version
⑥ 安装依赖包:
pip3.6 install -r requirements.txt
- 执行main文件
python3.6 main.py
发生报错:
ImportError: libcuda.so.1: cannot open shared object file: No such file or directory
① 在容器内运行以下代码:
find /usr -name 'libcuda.so.1'
这样就找到了libcuda.so.1所在的位置(前提是确认安装好了cuda和cudnn)
root@eccc6ee33e2f:/workspace/PointerNetwork# find /usr -name 'libcuda.so.1'
/usr/local/cuda-8.0/targets/x86_64-linux/lib/libcuda.so.1
libcuda.so.1 文件存在于 /usr/local/cuda-8.0/targets/x86_64-linux/lib/ 路径下,但 TensorFlow 仍然无法找到它。这个问题通常是因为环境变量 LD_LIBRARY_PATH 没有正确设置。
设置 LD_LIBRARY_PATH 环境变量,让系统可以找到 CUDA 库。
② 如果①不行的话,就执行如下代码
find /usr/local/cuda-8.0/ -name 'libcuda.so*'
就找到了/usr/local/cuda-8.0/targets/x86_64-linux/lib/stubs/libcuda.so文件
由于已经找到实际的 libcuda.so 文件,但它位于 stubs 目录下,而不是运行时库目录中,所以需要将其移动或创建符号链接到正确的位置。
ln -s /usr/local/cuda-8.0/targets/x86_64-linux/lib/stubs/libcuda.so /usr/local/cuda-8.0/lib64/libcuda.so.1
验证libcuda.so.1文件是否存在
ls -l /usr/local/cuda-8.0/lib64/libcuda.so.1
存在的话就进行以下操作:确保 LD_LIBRARY_PATH 环境变量包括 /usr/local/cuda-8.0/lib64 目录:
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/targets/x86_64-linux/lib:$LD_LIBRARY_PATH
将这个命令添加到 .bashrc 或 .bash_profile 文件中,以便每次登录时自动设置:
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-8.0/targets/x86_64-linux/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
又遇到报错:
ImportError: libGL.so.1: cannot open shared object file: No such file or directory
和上个问题差不多,都是库文件没找到,按如下方式解决:
# 安装 libgl1-mesa-glx 包,它提供了 libGL.so.1
apt-get update
apt-get install -y libgl1-mesa-glx
#验证安装:
find / -name 'libGL.so.1'
==>/usr/lib/x86_64-linux-gnu/mesa/libGL.so.1
# 设置 LD_LIBRARY_PATH 环境变量,告诉系统在哪里查找共享库
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/mesa:$LD_LIBRARY_PATH
再次执行main.py文件,发现可以执行,所以tensorflow-gpu的环境算是搭建成功,但又遇到了一个编码错误,如下:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 10-13: ordinal not in range(128)
这个错误应该是因为我代码中的中文编码错误。解决方法之一就是在容器中设置 UTF-8 编码的环境变量,如下:
# 先进入容器的终端。
export LANG=C.UTF-8
export LC_ALL=C.UTF-8
又又遇到报错:
ImportError: libgthread-2.0.so.0: cannot open shared object file: No such file or directory
解决:
安装:
apt-get update
apt-get install libglib2.0-0
验证:
ls /usr/lib/x86_64-linux-gnu/libgthread-2.0.so.0
更新路径
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
然后重新启动容器,程序就可以正常执行了。
有服务器就是爽哈哈,本地得跑一天,不过为了用这个服务器真是杀死我一堆脑细胞,希望能帮助大家。