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:zCCP_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 映像应已安装 sudoSSH serviceMPI

逐步在 Linux 计算节点上运行 docker 任务

使用 ARM 模板 部署群集

在 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 群集管理器中检查作业结果:

    dockertask1

  • 提交包含多个 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 群集管理器中检查作业结果:

    dockertask2

  • 如果任务没有相同的环境变量,则任务将继承其作业的环境变量,因此也可以在作业环境变量中分配 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 群集管理器中检查作业结果:

    dockertask3

运行 MPI docker 任务

生成已安装 MPICH 的自定义 Docker 映像

在安装了 docker 的任何 Linux 节点中执行此步骤。

  • 使用 docker 映像启动容器 ubuntu

    docker run -it ubuntu
    
  • 使用 apt-get安装 sudosshvimmpich

    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
    

    mpitask1

使用 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

    mpitask2

  • 检查任务输出

    mpitask3

逐步在 Windows 计算节点上运行 docker 任务

将 Windows 计算节点添加到群集

在容器中作为 docker 任务运行命令

  • 提交包含分配给 Windows 计算节点的 docker 任务的作业

    job submit /requestednodes:IaaSWinCN000 /env:CCP_DOCKER_IMAGE=mcr.microsoft.com/windows/servercore:ltsc2016 ping -t localhost
    
  • 查看任务输出

    windowstask2

  • 取消作业

    job cancel !!