次の方法で共有


HPC Pack の Docker タスク

HPC Pack Docker タスクは、Docker コンテナーで実行されているタスクです。

この機能を使用するには、タスク環境変数 CCP_DOCKER_IMAGE を設定して、Docker イメージを示します。これは、タスクを実行するために Docker コンテナーを開始するために使用されます。 形式は次のようになります: CCP_DOCKER_IMAGE=[Docker Registry]<Repository>[:Tag]

また、この機能を強化するために使用できる環境変数がいくつかあります。

  • CCP_DOCKER_NVIDIA (Linux のみ) を使用して、dockerを使用するのではなく、コマンド nvidia-dockerを使用して Docker コンテナーを起動するかどうかを示します。 たとえば、CCP_DOCKER_NVIDIA=1 のようにします。

  • ホストから Docker コンテナーにマウントするディレクトリをボリュームとして設定する CCP_DOCKER_VOLUMES。 たとえば、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 タスクを実行するには、前提条件として Docker アプリケーションを Windows/Linux コンピューティング ノードにインストールする必要があります。

MPI アプリケーションを実行するために複数の Linux ノードで割り当てられている Docker タスクでは、各 Linux ノード上のコンテナーがホストとネットワークを共有するため、他の MPI Docker タスクでこれらのノードを同時に使用する必要はありません。 Windows コンピューティング ノードでの Docker タスクでの MPI アプリケーションの実行はまだサポートされていません。

Docker イメージ内の Linux OS には /bin/bash必要があります。

Linux ノード上の Docker コンテナーで MPI アプリケーションを実行するには、docker イメージに sudoSSH serviceMPI がインストールされている必要があります。

Linux コンピューティング ノードで Docker タスクをステップ バイ ステップで実行する

ARM テンプレート を使用してクラスターをデプロイする

  • Linux ワークロード の単一ヘッド ノード クラスターを使用してクラスターをデプロイする

    armtemplate を する

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-getsudosshvimmpich をインストールします。

    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();
    }
    
  • mpicchelloMpi.c をコンパイルし、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 Hub アカウントが必要です。

  • これは Docker イメージを手動でビルドする方法です。代わりに Dockerfile を使用します。

MPI タスクの実行

  • 上記の手順でビルドした Docker イメージで MPI アプリケーションを実行する docker タスクを含むジョブを送信します。

    job submit /env:ccp_docker_image=<docker hub account>/mpich /numnodes:4 /workdir:/mpisample ./run.sh 16
    

    mpitask1

DOCKER イメージを SSH サーバーとして使用して MPI Docker タスクを実行する

SSH サーバーとして Docker イメージを作成する

  • ルート ユーザーの SSH キーを含む Ubuntu で Docker イメージをビルドするための Dockerfile を作成します。これは、ポート 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 イメージで MPI アプリケーションを実行するための docker タスクを含むジョブを送信します。コマンド 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 コンピューティング ノードをクラスターに追加する

  • Azure IaaS VM にバーストを して、コンテナーがインストールされたイメージを含む Windows コンピューティング ノードを追加する

    windowstask1 を する

Docker タスクとしてコンテナーでコマンドを実行する

  • Windows コンピューティング ノードに割り当てられた Docker タスクを含むジョブを送信する

    job submit /requestednodes:IaaSWinCN000 /env:CCP_DOCKER_IMAGE=mcr.microsoft.com/windows/servercore:ltsc2016 ping -t localhost
    
  • タスクの出力をピークする

    windowstask2 を する

  • ジョブを取り消す

    job cancel !!