服务器上通过podman容器运行需要较低版本cuda的代码

概要

本地运行环境: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进行深度强化学习训练。

  1. 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镜像拉取成功。

  1. 利用镜像创建容器
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
  1. 复制文件到容器:
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
  1. 基本命令
#########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


  1. 从源码安装 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
  1. 执行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


然后重新启动容器,程序就可以正常执行了。

在这里插入图片描述
有服务器就是爽哈哈,本地得跑一天,不过为了用这个服务器真是杀死我一堆脑细胞,希望能帮助大家。

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ppdd·~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值