创建基于华为基础镜像的自定义镜像(Tensorflow2-gpu&Ubuntu&Docker)

环境:Ubuntu 16.04,华为云ESC的GPU服务器(GPU: 1 NVIDIA T4 / 16G)
需要工具:Docker,nvidia-docker,tensorflow,python3.6

Docker相关安装

默认安装的Docker是不能使用Host的GPU设备的,Nvidia提供了一个plugin叫做nvidia-docker ,相当于在docker上面又封装了一层,可以在docker的容器内访问Host的GPU设备。

docker的安装参见:https://docs.docker.com/engine/install/ubuntu/
https://yeasy.gitbook.io/docker_practice/install/ubuntu

nvidia-docker的安装参见:https://blog.csdn.net/A632189007/article/details/78801166

这里只写一下我使用的nvidia-docker的安装命令:

sudo docker run --rm --gpus all nvidia/cuda:10.0-base nvidia-smi

本文中可能会用到的常用docker语句

docker ps -a # 查看当前所有容器
docker images # 查看当前所有镜像
docker rm 容器名 #删除容器
docker rmi 镜像名 #删除镜像
docker exec -ti 容器名 bash #进入容器

=====================================================================

安装华为云基础镜像(CUDA-10.0)

目前支持的基础镜像列表:https://support.huaweicloud.com/engineers-modelarts/modelarts_23_0217.html

1.下载基础镜像并创建容器:

sudo docker run -it -d -p 8888 --gpus all --name <容器名> swr.cn-north-4.myhuaweicloud.com/modelarts-job-dev-image/custom-gpu-cuda10-base:1.0

进入容器的命令:

docker exec -ti 容器名 bash

在容器内使用命令nvcc -V查看cuda版本号,可以看到以下提示:
在这里插入图片描述
2.由于华为预设的Host的CUDA是10.1版本,而docker要求Host和Container的CUDA版本一致,因此需要删除Host的旧版CUDA版本并安装10.0版本(强制使用10.0的CUDA版本原因见下方 安装Tensorflow2 的第二点):

sudo apt remove cuda
wget https://developer.nvidia.com/compute/cuda/10.0/Prod/local_installers/cuda_10.0.130_410.48_linux
sudo sh cuda_10.0.130_410.48_linux
export PATH=$PATH:/usr/local/cuda/bin
nvcc --version

注:不知道是不是我设置问题,云端下载cuda相关文件都很慢,所以我都是用迅雷下载到本地后上传到云端,再传到容器内,相关命令如下:

scp 本地路径名/文件名 root@公网IP:云端存储路径 #上传到云端
docker cp 云端路径名/文件名 容器名:存储路径名 #复制到容器

安装完成后在Host里使用nvcc -V可以看到版本号更换为10.0:
在这里插入图片描述
注意,如果使用命令nvidia-smi监控显卡状态,显示的版本和nvcc -V显示的版本可能不一致,但是只要nvidia-smi显示的版本等于或者高于nvcc -V的版本就不影响使用(参考:https://stackoverflow.com/questions/53422407/different-cuda-versions-shown-by-nvcc-and-nvidia-smi):
在这里插入图片描述
3.设置环境变量(以10.0为例,其他版本只要改一下数字就可以了)

export PATH=/usr/local/cuda-10.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64:${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
source ~/.bashrc

=====================================================================

安装cuDNN

参考链接:https://gist.github.com/matheustguimaraes/43e0b65aa534db4df2918f835b9b361d

官网下载地址:https://developer.nvidia.com/rdp/cudnn-archive

我选择的版本:
在这里插入图片描述

这三个文件都需要下载到容器中
在这里插入图片描述
运行代码:

sudo dpkg -i libcudnn7_7.4.2.24-1+cuda10.0_amd64.deb
sudo dpkg -i libcudnn7-dev_7.4.2.24-1+cuda10.0_amd64.deb 
sudo dpkg -i libcudnn7-doc_7.4.2.24-1+cuda10.0_amd64.deb
source ~/.bashrc

测试方法见参考链接,这里就不展开了。

=====================================================================

安装Tensorflow2

1.首先基础镜像的系统自带pip版本只有9.0,因此需要先升级pip以及其他组件再安装tensorflow:

python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade grpcio --user

注1:如果没有更新grpcio的话会报错:
ERROR: After October 2020 you may experience errors when installing or updating packages. This is because pip will change the way that it resolves dependency conflicts.
注2:我尝试安装过两次tensorflow2,缺少的组件名都不一样,总之在安装tensorflow过程中如果提示缺什么就安装什么,前面的步骤如果安装正确的话这一步问题不大。

2.找到想要安装的tensorflow GPU版本,我使用2.1版本时,在import tensorflow的时候会出现 Error: Could not load dynamic library ‘libnvinfer.so.6’,所以还是选择安装2.0.0版本的tensorflow-GPU,对应的CUDA版本为10.0,不要使用华为云的默认源,会报错,这里我使用了清华源。

安装命令:

pip3 install tensorflow-gpu==2.0.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

tensorflow对应的GPU版本
运行import tensorflow如果出现错误提示:
ImportError: libcublas.so.10.0: cannot open shared object file: No such file…
说明tensorflow和CUDA版本不匹配

3.最后安装完毕后,使用tf.test.is_gpu_available()查看可用的gpu设备以验证是否正确安装
在这里插入图片描述
至此,docker容器内安装tensorflow步骤完成。

安装其他package

我是使用pip安装的,Anaconda会报错bus error,搜了一下好像可以通过修改Anaconda版本解决,当时因为我不太希望在容器里安装太多东西所以就没再研究了

pip install scipy -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple --ignore-installed certifi
pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
#Update
#用于多线程,python自带的multiprocessing不能传递class object参数
pip install pathos -i https://pypi.tuna.tsinghua.edu.cn/simple 
#华为obs SDK,用于读取obs内的文件(moxing API不完善和tensorflow2.0冲突,最高只支持1.8)
#似乎华为基础镜像已经包含了obs的SDK,所以就不用装了,但是还是留着方便本地coding
pip install esdk-obs-python --trusted-host pypi.org -i https://pypi.tuna.tsinghua.edu.cn/simple

制作容器镜像并上传华为SWR

参考资料:https://support.huaweicloud.com/usermanual-swr/swr_01_0011.html
https://bbs.huaweicloud.com/blogs/186057

1.在华为云的SWR里建立一个组织。
2.在左边选择进入“我的镜像”后点击右上角的“客户端上传”。
3.在step2里点击“生成临时登录指令”,会生成一串指令码,将指令码复制到ECS服务器中就登录成功了。
在这里插入图片描述
4.根据上图的step3上传镜像(我是使用参考链接里的上传方式),组织名称就是之前创建的组织的id,swr.cn-east-3.myhuaweicloud.com这段根据你设置的区域进行修改,样例里的cn-east-3是指华东-上海一,华为地区和终端节点查询详见:https://developer.huaweicloud.com/endpoint

#创建容器镜像(容器id可以通过docker ps -a查看)
sudo docker commit 容器id swr.cn-east-3.myhuaweicloud.com/组织名称/镜像名称:版本名称
#上传容器镜像
sudo docker push swr.cn-east-3.myhuaweicloud.com/组织名称/镜像名称:版本名称

5.如果出现下面的界面,说明上传成功
在这里插入图片描述

对服务器进行备份

GPU服务器价格太高了,所以就查了一下怎么才能备份,总之就是增加一部分驱动删除一部分隐私资料。
华为云参考链接
参考链接:https://support.huaweicloud.com/usermanual-ims/zh-cn_topic_0047501133.html
通过云服务器创建Linux系统盘镜像:https://support.huaweicloud.com/usermanual-ims/ims_01_0202.html
准备镜像文件(Linux)(非云服务器):https://support.huaweicloud.com/usermanual-ims/ims_01_0209.html

在完成上述预设之后,在ESC服务器界面的右侧点击“更多->镜像/磁盘->创建镜像”,我是设置成了整机镜像,按照说明一步一步走就完成了。


列一下可能会出现的疑问:

  1. 使用cloud-init init --local会出现以下Warning,根据华为官方文档https://support.huaweicloud.com/ims_faq/index.html,CentOS 7/Fedora 28下似乎是因为gcc,但是我查了一下,似乎是可以忽略的https://cloudlib4zvm.readthedocs.io/en/latest/makeimage.html
UserWarning: You don’t have the C version of NameMapper installed! I’m disabling Cheetah’s 
useStackFrames option as it is painfully slow with the Python version of NameMapper. You 
should get a copy of Cheetah with the compiled C version of NameMapper. 
You don’t have the C version of NameMapper installed!

=====================================================================

其他可能出现的问题

  1. ERROR: tensorflow 1.9.0 has requirement setuptools<=39.1.0, but you’ll have setuptools 41.0.1
    参考:https://github.com/neuropoly/axondeepseg/issues/258 更新setuptools
pip install --upgrade setuptools -i https://pypi.tuna.tsinghua.edu.cn/simple

其他参考资料

Tensorflow和CUDA安装参考:https://zhuanlan.zhihu.com/p/86316522
华为云制作自定义镜像参考:https://bbs.huaweicloud.com/blogs/159744
Ubuntu16.04下.bashrc路径:https://blog.csdn.net/lzx_bupt/article/details/5642690
Nvidia-docker初步理解:https://blog.csdn.net/A632189007/article/details/78801166

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值