HPC Pack 中的 Docker 任务
HPC Pack docker 任务是在 docker 容器中运行的任务。
若要使用此功能,请设置任务环境变量 CCP_DOCKER_IMAGE
来指示 docker 映像,该映像将用于启动 docker 容器来运行任务。 格式如下所示:CCP_DOCKER_IMAGE=[Docker Registry]<Repository>[:Tag]
此外,还可以使用多个环境变量来增强此功能。
CCP_DOCKER_NVIDIA
(仅 Linux)来指示是否使用命令nvidia-docker
(而不是使用docker
)来启动 docker 容器。 例如CCP_DOCKER_NVIDIA=1
。CCP_DOCKER_VOLUMES
将要从主机装载到 docker 容器的目录设置为卷。 例如,CCP_DOCKER_VOLUMES=/host_path1:/container_path1,/common_path,/host_path2:/container_path2:z
或CCP_DOCKER_VOLUMES=c:\foo:c:\dest,c:\foo:d:
。CCP_DOCKER_DEBUG
指示容器在命令完成后是否保持活动状态进行调试,以后需要手动删除容器。 例如CCP_DOCKER_DEBUG=1
。CCP_DOCKER_START_OPTION
在启动 docker 容器时添加其他选项。 例如CCP_DOCKER_START_OPTION=--network=host --ulimit memlock=-1
。CCP_DOCKER_SKIP_SSH_SETUP
(仅 Linux)以指示是否跳过默认方式(使用容器中的 SSH 密钥和主机网络,停止主机上的 SSH 服务器,并在容器中启动 SSH 服务器)设置容器之间的 SSH 通信,如果 docker 映像处理此问题,则应设置该通信。 例如CCP_DOCKER_SKIP_SSH_SETUP=1
。
若要运行 docker 任务,应在 Windows/Linux 计算节点上安装 docker 应用程序作为先决条件。
当分配了多个 Linux 节点来运行 MPI 应用程序的 Docker 任务时,任何其他 MPI docker 任务都不应同时使用这些节点,因为每个 Linux 节点上的容器与其主机共享网络。 尚不支持在 Windows 计算节点上的 docker 任务中运行 MPI 应用程序。
docker 映像中的 Linux OS 应具有 /bin/bash
。
若要在 Linux 节点上的 docker 容器中运行 MPI 应用程序,docker 映像应已安装 sudo
、SSH service
和 MPI
。
逐步在 Linux 计算节点上运行 docker 任务
使用 ARM 模板 部署群集
为 Linux 工作负荷使用 单头节点群集 部署群集
在 Linux 计算节点上安装 docker
在 clusrun
docker 文档后安装 Docker CE clusrun /nodegroup:linuxnodes /interleaved yum -y update clusrun /nodegroup:linuxnodes /interleaved yum install -y yum-utils device-mapper-persistent-data lvm2 clusrun /nodegroup:linuxnodes /interleaved yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo clusrun /nodegroup:linuxnodes /interleaved yum install -y docker-ce docker-ce-cli containerd.io clusrun /nodegroup:linuxnodes systemctl start docker
在此文档中,Docker CE 的版本为 17.11.0-ce-rc3。
在容器中作为 docker 任务运行命令
提交包含 1 个 docker 任务的作业
job submit /env:ccp_docker_image=docker.io/library/ubuntu:16.04 hostname
在 HPC Pack 群集管理器中检查作业结果:
提交包含多个 docker 任务的作业
job new job add !! /env:ccp_docker_image=ubuntu cat /etc/*release ^| grep ^^NAME job add !! /env:ccp_docker_image=centos cat /etc/*release ^| grep ^^NAME job add !! /env:ccp_docker_image=debian cat /etc/*release ^| grep ^^NAME job add !! /env:ccp_docker_image=fedora cat /etc/*release ^| grep ^^NAME job submit /id:!!
在 HPC Pack 群集管理器中检查作业结果:
如果任务没有相同的环境变量,则任务将继承其作业的环境变量,因此也可以在作业环境变量中分配 docker 映像
job new /jobenv:ccp_docker_image=ubuntu job add !! hostname^; cat /etc/*release ^| grep ^^NAME job add !! hostname^; cat /etc/*release ^| grep ^^NAME job add !! hostname^; cat /etc/*release ^| grep ^^NAME job add !! /env:ccp_docker_image=centos hostname^; cat /etc/*release ^| grep ^^NAME job submit /id:!!
在 HPC Pack 群集管理器中检查作业结果:
运行 MPI docker 任务
生成已安装 MPICH 的自定义 Docker 映像
在安装了 docker 的任何 Linux 节点中执行此步骤。
使用 docker 映像启动容器
ubuntu
:docker run -it ubuntu
使用
apt-get
安装sudo
、ssh
、vim
和mpich
:apt update; apt -y install sudo ssh vim mpich
编写简单的 MPI 程序:
mkdir /mpisample chmod o+w /mpisample cd /mpisample vim helloMpi.c
使用以下内容编辑
helloMpi.c
:#include<mpi.h> #include<stdio.h> int main(int argc, char** argv) { int rank, size, processor_name_length; char processor_name[1000]; MPI_Init(NULL, NULL); MPI_Comm_rank (MPI_COMM_WORLD, &rank); MPI_Comm_size (MPI_COMM_WORLD, &size); MPI_Get_processor_name(processor_name, &processor_name_length); printf("Hello from %s, rank %d out of %d processors.\n", processor_name, rank, size); MPI_Finalize(); }
使用
mpicc
编译helloMpi.c
并创建 shell 脚本run.sh
:mpicc helloMpi.c -o helloMpi vim run.sh
使用以下内容编辑
run.sh
:#!/bin/bash echo $CCP_NODES | tr " " "\n" | sed "1d;n;d" | cat > host_file num=$1 [ -z "$num" ] && num=4 mpirun -n $num -f host_file ./helloMpi
设置
run.sh
的执行权限并退出 docker 容器:chmod +x run.sh exit
提交 docker 映像并将其推送到 docker 中心:
docker commit $(docker ps -qa -n 1) <docker hub account>/mpich docker login -u <docker hub account> -p <password> docker push <docker hub account>/mpich
执行此操作需要 Docker 中心帐户。
这是手动生成 docker 映像的方法,替代方法是使用 Dockerfile。
运行 MPI 任务
提交包含 docker 任务的作业,以在上述步骤中生成的 docker 映像中运行 MPI 应用程序:
job submit /env:ccp_docker_image=<docker hub account>/mpich /numnodes:4 /workdir:/mpisample ./run.sh 16
使用 docker 映像作为 SSH 服务器运行 MPI docker 任务
将 docker 映像创建为 SSH 服务器
创建
Dockerfile
,以便使用包含根用户的 SSH 密钥的 Ubuntu 生成 docker 映像,该映像将作为具有端口3022
的 SSH 服务器启动:FROM ubuntu RUN apt-get update RUN apt-get install -y sudo ssh mpich RUN ssh-keygen -t rsa -N "" -f /root/.ssh/id_rsa RUN cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys RUN echo "Port 3022" >> /root/.ssh/config RUN mkdir /run/sshd ENTRYPOINT ["/usr/sbin/sshd", "-D", "-p", "3022"]
生成 Docker 映像并将其推送到 docker 中心:
docker build -t <docker hub account>/ubuntu_mpich_as_ssh_server . docker login -u <docker hub account> -p <password> docker push <docker hub account>/ubuntu_mpich_as_ssh_server
运行 MPI 任务
提交包含 docker 任务的作业,以在上述步骤中生成的 docker 映像中运行 MPI 应用程序,命令
mpirun -machinefile $CCP_MPI_HOSTFILE hostname
和环境CCP_DOCKER_IMAGE=<docker hub account>/ubuntu_mpich_as_ssh_server,CCP_MPI_HOSTFILE_FORMAT=1,CCP_DOCKER_SKIP_SSH_SETUP=1,CCP_DOCKER_START_OPTION=--network=host
:检查任务输出
逐步在 Windows 计算节点上运行 docker 任务
将 Windows 计算节点添加到群集
突发到 Azure IaaS VM,添加装有容器的 Windows 计算节点
在容器中作为 docker 任务运行命令
提交包含分配给 Windows 计算节点的 docker 任务的作业
job submit /requestednodes:IaaSWinCN000 /env:CCP_DOCKER_IMAGE=mcr.microsoft.com/windows/servercore:ltsc2016 ping -t localhost
查看任务输出
取消作业
job cancel !!