docker制作Amber18镜像

扩展docker数据池

关闭docker并删除docker数据

systemctl stop docker
rm -rf /var/lib/docker

创建新的docker数据池

mkdir -p /var/lib/docker/devicemapper/devicemapper
dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1G count=0 seek=600

重新启动容器之后,再查看池大小

systemctl restart docker
dokcer info

拉取centos7作为基础镜像

docker pull centos:7

启动容器

这里将容器空间设置为20G,其实最后打包的镜像大小不到10G

docker run -it --storage-opt size=20G centos:7 /bin/bash

进入容器后,更换yum源并安装依赖

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

yum clean all
yum makecache

yum -y install gcc gcc-gfortran gcc-c++ flex tcsh zlib-devel \
     bzip2-devel libXt-devel libXext-devel libXdmcp-devel \
     tkinter openmpi openmpi-devel perl perl-ExtUtils-MakeMaker \
     patch bison boost-devel  libffi-devel

yum -y install which make

安装cuda

amber编译GPU版本需要使用cuda,这里采用rpm包安装cuda-9.2,需要到cuda官网下载rpm包,下载好后,使用docker cp [filename] [容器ID]:[容器目标目录] 命令将文件传输至容器内。

docker cp cuda-repo-rhel7-8-0-local-ga2-8.0.61-1.x86_64.rpm 7b99d8408200:/opt

安装cuda

rpm -i cuda-repo-rhel7-8-0-local-ga2-8.0.61-1.x86_64.rpm
yum clean all
yum install cuda

如果报如下错误:

Error: Package: 1:nvidia-kmod-375.26-2.el7.x86_64 (cuda-8-0-local-ga2)
Requires: dkms
You could try using --skip-broken to work around  the problem
You could try running: rpm -Va --nofiles --nodigest

解决办法:
缺少2个包,装第一个:

vi /etc/yum.repos.d/linuxtech.testing.repo

输入:
[linuxtech-testing]
name=LinuxTECH Testing
baseurl=http://pkgrepo.linuxtech.net/el6/testing/
enabled=0
gpgcheck=1
gpgkey=http://pkgrepo.linuxtech.net/el6/release/RPM-GPG-KEY-LinuxTECH.NET

yum --enablerepo=linuxtech-testing install libvdpau

装第二个:

yum -y install epel-release
yum -y install --enablerepo=epel dkms

再次执行install安装cuda

安装python3

使用yum安装python3(采用编译安装pthon3会报错,目前未解决)

yum -y install python3

现在容器外将Amber18的两个安装包解压缩后,将解压后的amber18目录传入容器中

# 需要 bzip2
tar jxvf AmberTools18.tar.bz2
tar jxvf Amber18.tar.bz2

docker cp amber18/ 7b99d8408200:/opt

然后在容器内使用pip3安装编译amber需要的依赖

pip3 install -r  /opt/amber18/AmberTools/src/python_requirement.txt

安装amber18

在~/.bashrc中添加环境变量

#AMBER
test -f /opt/amber18/amber.sh  && source /opt/amber18/amber.sh
export AMBERHOME=/opt/amber18

#CUDA
export CUDA_HOME=/usr/local/cuda-9.2
export PATH=$PATH:$CUDA_HOME/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CUDA_HOME/lib64

#OPENMPI
export PATH=$PATH:/usr/lib64/openmpi/bin/                                                           

编译顺序为:串行版本 -> 并行版本 -> GPU版本

串行版本:

cd $AMBERHOME                                                                  
./configure --with-python /usr/bin/python3 gnu
make install
make test

并行版本:

cd $AMBERHOME                                                                  
./configure --with-python /usr/bin/python3 -mpi gnu
make install

export DO_PARALLEL="mpirun --allow-run-as-root -np 4"
./configure --with-python /usr/bin/python3 -openmp gnu
make openmp

GPU版本:

cd $AMBERHOME                                                                  
./configure --with-python /usr/bin/python3 -cuda gnu
make install

./configure --with-python /usr/bin/python3 -cuda -mpi gnu
make install

# 此时test耗时很长,最终卡住无法进行,原因未知
make test.cuda
make test.cuda_parallel

打包镜像

退出容器后先将容器重启一下

docker restart 7b99d8408200

然后将容器打包成镜像,-a参数注明作者,-m参数注明提交时的说明文字

docker commit -a "mrwangwei" -m "amber18" 7b99d8408200 amber:18

将镜像打tag后上传至hub

docker login

docker tag amber:18 mrwangwei/amber:18

docker push mrwangwei/amber:18

dockerfile

# syntax=docker/dockerfile:experimental

###############################################################################
# CentOS 7, CUDA, INTEL MPI, and AMBER.
#
# Requirements:
# * amber18 directory in build directory with INTEL development kit.
#
# Build with:
# sudo docker build -t amber:18-cuda10.2 . \
#   --build-arg IMPI_VERSION=impi_version \
#   --build-arg INTEL_VERSION=intel_version
#
# Run with:
# export DOCKER_BUILDKIT=1
# sudo docker run -it \
#   --mount type=bind,source=/path/to/build-amber/intel/,target=/opt/intel/ \
#   amber:18-cuda10.2
#
# Before making the image you need two installation packages
# to get the amber18 installation directory. 
# Use tar jxf AmberTools18.tar.bz2, tar jxf Amber18.tar.bz2 
# two commands to decompress the two compressed files, 
# then you need to copy the amber18 installation directory 
# into the image file system in the dockerfile.
#
# To compile amber18 using the intel compiler, 
# you must use the intel compiler version 12-17, 
# and amber17 only supports the version before cuda-9.1, 
# so you need to update amber before compiling, 
# you cannot add the '--no-updates' parameter to the configure command
#
# Test with:
# sudo docker run -it \
#   --mount type=bind,source=/path/to/build-amber/intel/,target=/opt/intel/ \
#   amber:18-cuda10.2 
# cd $AMBERHOME/test
# ./test_amber_serial.sh
# export DO_PARALLEL="mpirun -np $(nproc)"
# ./test_amber_parallel.sh
# ./test_amber_cuda_serial.sh
# ./test_amber_cuda_parallel.sh
###############################################################################

###############################################################################
# Build stage
###############################################################################

FROM nvidia/cuda:10.2-cudnn7-devel-centos7

# sofrware version
ARG IMPI_VERSION=2017.4.256
ARG INTEL_VERSION=2017.6.256
ARG INTEL_VERSION=2017.6.256

# set environment variable
ENV AMBERHOME /opt/amber18
ENV INTELLIB_HOME /opt/intel/compilers_and_libraries_${INTEL_VERSION}/linux/
ENV PATH $PATH:$MPI_HOME/bin
ENV LD_LIBRARY_PATH $LD_LIBRARY_PATH:$MPI_HOME/lib
ENV LD_LIBRARY_PATH $LD_LIBRARY_PATH:$INTELLIB_HOME/mkl/lib/intel64
ENV LD_LIBRARY_PATH $LD_LIBRARY_PATH:$INTELLIB_HOME/compiler/lib/intel64
ENV CUDA_HOME /usr/local/cuda-10.2
ENV PATH $PATH:$CUDA_HOME/bin
ENV LD_LIBRARY_PATH $LD_LIBRARY_PATH:$CUDA_HOME/lib64

# inject nvidia-smi tool and init nvidia devices needed by cuda
COPY ./nvidia-smi /usr/bin/
COPY init-nvidia-dev.sh /usr/local/bin/
RUN chmod +x /usr/bin/nvidia-smi && chmod +x /usr/local/bin/init-nvidia-dev.sh

# prepare the installation directory and install required packages
WORKDIR /opt
COPY ./amber18 /opt/amber18
RUN yum install -y flex tcsh zlib-devel bzip2-devel \
     libXt-devel libXext-devel libXdmcp-devel perl patch \
     && yum install -y which make python3 \
     && pip3 install -r /opt/amber18/AmberTools/src/python_requirement.txt

# mount Intel compiler and build AMBER
RUN --mount=target=/opt/intel,type=bind,source=./intel \
  . /opt/intel/bin/compilervars.sh intel64 \
  && test -f /opt/amber18/amber.sh && source /opt/amber18/amber.sh \
  && cd $AMBERHOME \ 
  
# build serial
  && echo 'y' | ./configure --with-python /usr/bin/python3 intel \
  && make clean && make install -j $(nproc) \
  
# build parallel (mpi and openmp)
  && ./configure --with-python /usr/bin/python3 -intelmpi intel \
  && make clean && make install -j $(nproc) \
  
  && ./configure --with-python /usr/bin/python3 -openmp intel \
  && make clean && make openmp -j $(nproc) \
  
# build cuda_serial and cuda_parallel
  && ./configure --with-python /usr/bin/python3 -cuda intel \
  && make clean && make install -j $(nproc) \
  
  && ./configure --with-python /usr/bin/python3 -cuda -intelmpi intel \
  && make clean && make install -j $(nproc) \

# set environment variable
  && echo "# AMBER" >> /etc/profile \
  && echo "test -f /opt/amber18/amber.sh  && source /opt/amber18/amber.sh" >> /etc/profile \
  && echo "source /opt/intel/bin/compilervars.sh intel64" >> /etc/profile \
  && echo "source /etc/profile" >> /etc/bashrc

如果出现磁盘已满的情况,
vi /usr/lib/systemd/system/docker.service
在ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock后面添加如下参数: --graph /opt/docker/data
systemctl daemon-reload
systemctl restart docker

nvidia-smi tool

wget https://cn.download.nvidia.com/XFree86/Linux-x86_64/${VERSION_NAME}/NVIDIA-Linux-x86_64-${VERSION_NAME}.run
sh NVIDIA-Linux-x86_64-${VERSION_NAME}.run -x
cp nvidia-smi ../

init-nvidia-dev.sh

#!/bin/bash
touch init-nvidia-dev.log
ret=`nvidia-smi`
if [[ $ret -ne 0 ]]; then
    echo " [$(date) ] run nvidia-smi command error" >> init-nvidia-dev.log
else
    echo " [$(date) ] run nvidia-smi command success" >> init-nvidia-dev.log
fi

if [[ ! -c /dev/nvidia-uvm ]]; then
    ret=`mknod -m 666 /dev/nvidia-uvm c 245 0`
    if [[ $ret -ne 0 ]];then
        echo " [$(date) ] mknod error" >> init-nvidia-dev.log
    else
        echo " [$(date) ] mknod success" >> init-nvidia-dev.log
    fi
fi
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,744评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,505评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,105评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,242评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,269评论 6 389
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,215评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,096评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,939评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,354评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,573评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,745评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,448评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,048评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,683评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,838评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,776评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,652评论 2 354