装 R2018a,[4] 有下载链:https://pan.baidu.com/s/1W6jWkaXEMpMUEmIl8qmRwg#list/path=%2F,提取码:igx6
。
解压到 Linux-matlab2018a/:
MatConvNet 在 [5] 下载,本文用的是 1.0-beta25 版。解压到 matconvnet-1.0-beta25/。(为了在 commit 制成 docker 镜像时 matconvnet 能保存到容器内,后续需将此文件夹复制到容器内的 /usr/local/
下,见下文)
两个都下载到 /home/tom/downloads/。
由图可见,对应 cuda 版本是 9.0,用 pytorch/pytorch:0.4.1-cuda9-cudnn7-devel,可以白嫖里面的 cuda 9。
docker pull pytorch/pytorch:0.4.1-cuda9-cudnn7-devel
启动时加 --privileged=true
:
NAME="Matlab-R2018a"
docker run --gpus all --name=$NAME -dit --ipc=host --privileged=true \
-v /home/tom:/home/tom \
-v /home/tom/dataset:/home/dataset \
pytorch/pytorch:0.4.1-cuda9-cudnn7-devel /bin/bash \
> ~/log/docker/$NAME.$(date +%Y-%m-%d-%H-%M).log 2>&1
此处将 home 目录 /home/tom 映射去 docker 内同样位置,包含了前述下载路径(后面要在 docker 里用这些文件安装)。
主要参考 [6]。
在 Linux-matlab2018a/,分别解压两个 .iso 文件到 R2018a_glnxa64_dvd1/ 和 R2018a_glnxa64_dvd2/。好像其中有些操作需要权限。
/dev/loop0 is write-protected, mounting read-only
,而后面又要改里面两个文件,所以考虑解压 .iso 文件,而不是挂载。cd Linux-matlab2018a
# pwd # /home/tom/downloads/Linux-matlab2018a
mkdir R2018a_glnxa64_dvd1
mkdir R2018a_glnxa64_dvd2
mkdir /mnt/matlab
# 解压 dvd1
mount -t auto -o loop R2018a_glnxa64_dvd1.iso /mnt/matlab
cp -r /mnt/matlab/* R2018a_glnxa64_dvd1/
umount /mnt/matlab
# 解压 dvd2
mount -t auto -o loop R2018a_glnxa64_dvd2.iso /mnt/matlab
cp -r /mnt/matlab/* R2018a_glnxa64_dvd2/
umount /mnt/matlab
rmdir /mnt/matlab
将 dvd2 里的内容复制去 dvd1 里,这一步对应教程的「将 dvd1 切换为 dvd2」,但我装的时候这样会报找不到 xx 文件,所以提前复制。
cp -r R2018a_glnxa64_dvd2/* R2018a_glnxa64_dvd1/
改 R2018a_glnxa64_dvd1/ 下两个配置文件。找到对应行,照住改。(这一步,如果是用挂载而不是解压,发现 read-only 而没法改,就换成解压的方法)
destinationFolder=/usr/local/R2018a # 安装目录
fileInstallationKey=09806-07443-53955-64350-21751-41297 # crack/readme.txt 有写
agreeToLicense=yes
outputFile=/tmp/mathworks_install.log
mode=silent
isSilent=true
activateCommand=activateOffline
licenseFile=/home/tom/downloads/Linux-matlab2018a/crack/license_standalone.lic
其中 licenseFile
一项的路径按实际修改。
进入 docker,执行:
cd Linux-matlab2018a
./R2018a_glnxa64_dvd1/install -inputFile /home/tom/downloads/Linux-matlab2018a/R2018a_glnxa64_dvd1/installer_input.txt
其中 -inputFile
用绝对路径,我用相对路径报错了。
激活,docker 内:
cd /usr/local/R2018a/bin
./activate_matlab.sh -propertiesFile /home/tom/downloads/Linux-matlab2018a/R2018a_glnxa64_dvd1/activate.ini
# 将 crack/R2018a 的文件拷去安装目录 /usr/local/R2018a 里
cd /home/tom/downloads/Linux-matlab2018a/crack
cp -r R2018a /usr/local
添加环境变量,在 docker 内的 .bashrc 末尾追加:
export PATH=/usr/local/R2018a/bin:$PATH
alias mrun='matlab -nodesktop -nosplash -r' # 用 `mrun` 运行 .m 文件
不过这个 docker 镜像本身没装 vim,可以在外面改好再拷进去。然后:
source .bashrc
docker 内执行:matlab -nodisplay
。
libXt.so.6: cannot open shared object file: No such file or directory
,见 [7, 8],ubuntu 执行 apt install x11-xserver-utils
。要换 apt 源,见 [9]。装完就可以了,在 matlab 环境下执行 gpuDevice
测试 gpu,会打印 gpu 信息。
vl_compilenn
一行会报错:'/home/tom/Download/matconvnet-1.0-beta25/matlab/mex/vl_nnconv.mexa64' compiled with '-R2018a' and linked with '-R2017b'.
。参考 [12],将 matconvnet-1.0-beta25/matlab/ 下的 vl_compilenn.m 换成评论里的内容先。然后进入 docker,在 matlab 环境下执行:
% 进入 matconvnet 的 matlab 目录
% cd /home/tom/downloads/matconvnet-1.0-beta25/matlab
% 2021.4.21 更新:先将 `matconvnet-1.0-beta25` 复制去 `/usr/local/`,再:
cd /usr/local/matconvnet-1.0-beta25/matlab
mex -setup
mex -setup C++
vl_compilenn('enableGpu', true, 'cudaRoot', '/usr/local/cuda', 'cudaMethod', 'nvcc', 'enableCudnn', true, 'cudnnRoot', '/usr/local/cuda')
vl_setupnn
vl_testnn('gpu', true) % 测试 gpu 是否可用,可以中途 Ctrl-C 停止
/home/tom/
是挂载目录,在这里配置 matconvnet 的话,之后 commit 成镜像时 matconvmet 并不会保存到生成的镜像内(但上面的 matlab 会,因为是装在 /usr/local/R2018a/
,不是挂载路径,是容器内的路径)。为了保存 matconvnet,先将 matconvnet 复制(而不是软链接)去 /usr/local/matconvnet-1.0-beta25/
,再进行操作。vl_compilenn
一步会报没有 cublas_v2.h
和 cudnn.h
,而所缺文件在 pytorch/pytorch:0.4.1-cuda9-cudnn7-devel 的这个镜像里是有的,直接从后者把相应文件复制去前者的就可以了。可以用命令 find /usr -name cublas_v2.h
找位置。