最近,算法小组使用最新版本的tensorflow,需要用到cuda9,去年安装的是cuda8,已经不合适了,于是要在服务器上升级。由于是服务器,我不敢让其它人做,我就自己来升级。去年因为有同事安装cuda把python搞坏,我修复半天不行,ubunut一层一层的依赖关系太绕了,最后重新安装系统。
问题
cuda最新版本是9.1,但我们匹配的是9.0,9.0下载页面为:
https://developer.nvidia.com/cuda-90-download-archive?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1604&target_type=runfilelocal
然而,无论用下载工具,还是浏览器自带的,还是在linux物理机/虚拟机用wget、curl下载,得到的文件的md5值都不对。说明下载出错了——即使文件体积完全一样。
去年安装cuda,搞了一周多,一来是没接触过,二来经常有这或那的问题,最后发现这个问题的根本原因是下载的文件是错误的。也正因为这样,我在很多时候跟大家强调下载文件时确认md5很重要。
原理
原理见上一文章,此处不再赘述。
实现
首先,编写Dockerfile,内容如下:
FROM ubuntu:16.04
LABEL maintainer Late Lee([email protected])
RUN apt-get update || true && \
apt-get install -y \
wget && \
rm -rf /var/lib/dpkg/info/* /var/lib/apt/lists/*
RUN wget -c https://developer.nvidia.com/compute/cuda/9.0/Prod/local_installers/cuda_9.0.176_384.81_linux-run -O cuda_9.0.176_384.81_linux.run && \
echo "7a00187b2ce5c5e350e68882f42dd507 cuda_9.0.176_384.81_linux.run" | md5sum -c -
# patch 1
RUN wget -c https://developer.nvidia.com/compute/cuda/9.0/Prod/patches/1/cuda_9.0.176.1_linux-run -O cuda_9.0.176.1_linux.run && \
echo "8477e5733c8250dd3e110ee127002b9c cuda_9.0.176.1_linux.run" | md5sum -c -
# patch 2
RUN wget -c https://developer.nvidia.com/compute/cuda/9.0/Prod/patches/2/cuda_9.0.176.2_linux-run -O cuda_9.0.176.2_linux.run && \
echo "4d3113ffd68a4c67511ca66e497badba cuda_9.0.176.2_linux.run" | md5sum -c -
RUN wget -c https://developer.nvidia.com/compute/cuda/9.0/Prod/patches/3/cuda_9.0.176.3_linux-run -O cuda_9.0.176.3_linux.run && \
echo "0d7d07dc3084e0f0ce7d861b5a642f19 cuda_9.0.176.3_linux.run" | md5sum -c -
RUN wget -c https://developer.nvidia.com/compute/cuda/9.0/Prod/patches/4/cuda_9.0.176.4_linux-run -O cuda_9.0.176.4_linux.run && \
echo "a8dbbbde6e9d130e8deb7094795478b1 cuda_9.0.176.4_linux.run" | md5sum -c -
CMD ["/bin/bash"]
内容十分简单,安装wget,然后用wget下载,默认情况下,文件下载到根目录,即“/”目录。
将Dockerfile提交到github上,然后在hub.docker创建自动构建项目,关联Dockerfile后,手动构建,再次提交Dockefile进行自动构建,等待其完成。由于是免费使用,需要排队,构建时间无法确定,以笔者经验,晚上提交,第二天一般能构建完成(当然,可能成功,也可能失败)。
Dockerfile学习要点
上面的Dockerfile提到的命令,有2点值得记住的。
1、下载大的文件建议用wget命令,如果下载地址没有带正常的文件名,则可以使用-O(大写的字母O,不是数字0)来指定文件名,如果在放到目录,那么该目录必须存在。
2、校验md5可以使用如下命令:
$ echo "7a00187b2ce5c5e350e68882f42dd507 cuda_9.0.176_384.81_linux.run" | md5sum -c -
cuda_9.0.176_384.81_linux.run: OK
如果md5值不正确,会有错误提示:
$ echo "7a00187b2ce5c5e350e68882f42dd50 cuda_9.0.176_384.81_linux.run" | md5sum -c -
md5sum: 'standard input': no properly formatted MD5 checksum lines found
有兴趣可以用echo $?
查看2种场景的返回值。这里就不展开了。
验证
本文构建成功的镜像地址为https://hub.docker.com/r/latelee/cuda/。目前已经构建成功,拉取镜像命令如下:
$ docker pull latelee/cuda:tar-9.0
再运行这个镜像:
root@98dfc8d4f016:/# ls
bin cuda_9.0.176.2_linux.run cuda_9.0.176_384.81_linux.run home media proc sbin tmp
boot cuda_9.0.176.3_linux.run dev lib mnt root srv usr
cuda_9.0.176.1_linux.run cuda_9.0.176.4_linux.run etc lib64 opt run sys var
以.run结尾的,即是下载好的cuda文件。拷贝这些镜像到宿主机目录,然后退出。
root@98dfc8d4f016:/# cp *.run /home/latelee/tools/cuda
root@98dfc8d4f016:/# exit
exit
之后,就可以在ubuntu上安装使用了,笔者的习惯是,在个人HOME目录创建tools目录,所有开源项目、工具、命令,都放在这里。
下面验证md5值,命令如下:
$ md5sum cuda_9.0.176_384.81_linux.run
7a00187b2ce5c5e350e68882f42dd507 cuda_9.0.176_384.81_linux.run
nvidia官方的9.0版本校验地址为:https://developer.download.nvidia.com/compute/cuda/9.0/Prod/docs/sidebar/md5sum-4.txt。第一行如下:
7a00187b2ce5c5e350e68882f42dd507 cuda_9.0.176_384.81_linux.run
两者一致,说明下载成功。
小结
本文提出的方法,适用于无法下载cuda,或下载的cuda文件压缩包md5校验出错的情形。有一定实践指导意义。
李迟 2018.9.14 周五 夜