Compute Engine の Slurm クラスタにアプリをインストールする

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

このチュートリアルでは、Google Cloud の Slurm クラスタにアプリをインストールする方法について説明します。これにより、クラスタが自動スケーリングされている場合でも、アプリをクラスタ全体で利用できるようになります。アプリは、tar ファイルまたは RPM としてパッケージ化されます。このチュートリアルでは、それぞれのファイル形式でアプリをインストールする方法について説明します。また、スクリプトを使用して複数のバージョンの Python をインストールする方法についても説明します。

このドキュメントは Slurm クラスタの管理者を対象としており、以下について基本的な知識があることを前提としています。

  • Linux システム管理
  • コマンドラインの使用
  • Slurm

このチュートリアルでは、同じアプリの複数のバージョンをインストールし、ジョブごとに異なるバージョンのアプリを使用するように modulefile を作成します。次のような場合に、複数のバージョンをインストールします。

  • 1 つのバージョンの結果を別のバージョンでテストする。
  • アプリの特定のバージョンを必要とするコードを使用する。

このドキュメントでは、Environment Modules を使用して、クラスタで実行されるジョブがアプリにアクセスできるようにする方法についても説明します。ここでは、Slurm クラスタを使用してバッチジョブまたは並列コンピューティング ジョブを実行します。

次の図に、Google Cloud にデプロイされた Slurm クラスタの構造を示します。

Compute Engine にインストールされた Slurm クラスタを示すアーキテクチャ図。

Compute Engine コンピューティング ノードでジョブをスケジュールするには、ログインノード(ヘッドノード)にログインします。スケジュールされたジョブは 1 つ以上のコンピューティング ノードで実行されます。コンピューティング ノードは、常にオンラインの静的ノードか、スケジュールされたジョブに応じて作成され、後で破棄されるエフェメラル ノードのいずれかです。

クラスタにアプリをインストールする場合は、次の要件を満たす必要があります。

  • どちらのノードにもソフトウェアをインストールできる。
  • 同じツールまたはライブラリの複数のバージョンを同時に使用できる。
  • クラスタで複数のバージョンのソフトウェアを使用できる。

これらの要件を満たすには、クラスタの NFS サーバーにソフトウェア パッケージをインストールします。

目標

  • Google Cloud の Slurm クラスタで、NFS にマウントされたアプリとホーム ディレクトリを確認する。
  • NFS にマウントされたアプリのディレクトリにソフトウェアをインストールする。
  • インストールしたソフトウェア パッケージの環境モジュール ファイルを設定する。
  • 複数のバージョンの Python をインストールする。

費用

このチュートリアルでは、課金対象である次の Google Cloud コンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

このチュートリアルを終了した後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

始める前に

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。

  4. Compute Engine API を有効にします。

    API を有効にする

  5. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  6. Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。

  7. Compute Engine API を有効にします。

    API を有効にする

  8. Google Cloud コンソールで、「Cloud Shell をアクティブにする」をクリックします。

    Cloud Shell をアクティブにする

    Google Cloud コンソールの下部で Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。Cloud Shell はシェル環境です。Google Cloud CLI がすでにインストールされており、現在のプロジェクトの値もすでに設定されています。セッションが初期化されるまで数秒かかることがあります。

  9. このチュートリアルでは、Google Cloud 上に Slurm クラスタを作成したか、このクラスタにアクセスできることを前提としています。Slurm クラスタを Google Cloud にデプロイする方法を確認してください。

アプリのインストール

Google Cloud 上の各 Slurm クラスタには、/apps ディレクトリと /home ディレクトリのマウントをエクスポートする NFS サーバーが存在します。環境に応じて、NFS サーバーは次の場所で実行できます。

NFS サーバーが実行されている場所に関係なく、/apps/home のマウントはクラスタ内のすべてのノードで使用できます。

クラスタをデプロイすると、Google Cloud 上の Slurm クラスタの /apps ディレクトリに次の 2 つのディレクトリが作成されます。

  • /apps/modulefiles: シェル環境変数を変更または設定するファイルが含まれます。
  • /apps/slurm: Slurm のワークロード管理アプリケーションに関連付けられているすべてのファイルとディレクトリが含まれます。

アプリのディレクトリに tar ファイルをインストールする

以下では、tar ファイルとしてパッケージ化されたアプリのインストール方法を説明します。この例では、Julia プログラミング言語のコンパイラとランタイムをインストールします。

  1. Cloud Shell で、SSH を使用してクラスタのログイン ノードにログインします。cluster-name はクラスタの名前で置き換えます。

    gcloud compute ssh cluster-name-login0
    sudo -i
    
  2. /apps ディレクトリに /julia ディレクトリを作成します。

    mkdir /apps/julia
    
  3. Julia の最新バージョンをインストールします。

    wget https://julialang-s3.julialang.org/bin/linux/x64/1.3/julia-1.3.1-linux-x86_64.tar.gz
    mv julia-1.3.1-linux-x86_64.tar.gz /apps/julia
    cd /apps/julia
    tar zxf julia-1.3.1-linux-x86_64.tar.gz
    rm julia-1.3.1-linux-x86_64.tar.gz
    mv julia-1.3.1 1.3.1
    
  4. /apps/julia ディレクトリに長期サポート(LTS)バージョンの Julia をインストールします。

    cd
    wget https://julialang-s3.julialang.org/bin/linux/x64/1.0/julia-1.0.5-linux-x86_64.tar.gz
    mv julia-1.0.5-linux-x86_64.tar.gz /apps/julia
    cd /apps/julia
    tar zxf julia-1.0.5-linux-x86_64.tar.gz
    rm julia-1.0.5-linux-x86_64.tar.gz
    mv julia-1.0.5 1.0.5
    

    これで、Julia の 2 つのバージョンがインストールされました。

アプリのディレクトリに RPM をインストールする

以下では、RPM としてパッケージ化されたアプリのインストール方法を説明します。この例では、Singularity コンテナ ランタイムをインストールします。

  1. Cloud Shell で、SSH を使用してクラスタのログインノードにログインします。

    gcloud compute ssh cluster-name-login0
    sudo -i
    
  2. /apps ディレクトリに /singularity ディレクトリを作成します。

    mkdir /apps/singularity
    
  3. Singularity バージョン 3.5.3-1.1 用のディレクトリを作成します。

    mkdir /apps/singularity/3.5.3-1.1
    
  4. Singularity 3.5.3-1.1 RPM を入手して展開します。

    wget http://rpmfind.net/linux/opensuse/tumbleweed/repo/oss/x86_64/singularity-3.5.3-1.1.x86_64.rpm
    rpm2cpio singularity-3.5.3-1.1.x86_64.rpm | cpio -idmv
    rm singularity-3.5.3-1.1.x86_64.rpm
    

Environment Modules の使用

Environment Modules パッケージを使用すると、Slurm ジョブを実行するときのシェル環境の初期化と管理を簡単に行うことができます。PATHMANPATH などのシェル環境変数を変更または設定する modulefile を作成します。よく使用されているすべてシェルと、Perl、Python、Ruby などの一部のスクリプト言語がサポートされています。

Environment Modules パッケージを操作するには、module コマンドを使用します。module コマンドは、MODULEPATH 環境変数を参照してシステムで modulefile を検索する場所を特定します。Google Cloud の Slurm クラスタでは、MODULEPATH 環境変数に次の 3 つのディレクトリを指定します。

  • /usr/share/Modules/modulefiles には、Environment Modules パッケージのディストリビューションの一部である modulefile が含まれます。
  • /etc/modulefiles には、openmpi-x86_64 という modulefile が含まれます。
  • /apps/modulefiles には、クラスタにインストールするアプリの modulefile が含まれます。

/apps/modulefiles ディレクトリにインストールするアプリの modulefile は任意の方法で整理できますが、/apps/modulefiles, にインストールするアプリごとにディレクトリを作成し、アプリ固有のディレクトリにアプリのすべてのバージョンの modulefile を作成することをおすすめします。

簡単な modulefile を作成する

modulefile は、Tool Command Language(Tcl) で作成します。このファイルは、モジュール ユーザー インターフェースを介して modulecmd.tcl Tcl プログラムによって解釈されます。Tcl を使用すると、modulefile で複雑な構成を処理できますが、大半の modulefile は比較的単純な構造になっています。

  1. Cloud Shell で、SSH を使用してクラスタのログインノードにログインします。

    gcloud compute ssh cluster-name-login0
    sudo -i
    
  2. /apps/modulefiles/julia/1.0.5 ファイルを作成します。

  3. テキスト エディタで 1.0.5 ファイルを開き、次の内容を貼り付けます。

    #%Module1.0#####################################################################
    ##
    ## modules julia/1.0.5.
    ##
    ## modulefiles/julia/1.0.5.
    ##
    proc ModulesHelp { } {
            global version modroot
            puts stderr "julia/1.0.5 - sets the environment for Julia 1.0.5"
    }
    module-whatis   "Sets the environment for using Julia 1.0.5"
    # for Tcl script use only
    set     topdir          /apps/julia/1.0.5
    set     version         1.0.5
    set     sys             linux86
    prepend-path    PATH            $topdir/bin
    prepend-path    MANPATH         $topdir/man
    

    次の点に注意してください。

    • 最初の行はマジック クッキーです。これは、modulefile の解釈に必要な modulecmd.tcl Tcl プログラムの最小バージョンを表します。
    • ModulesHelp プロシージャは module help コマンドによって呼び出され、modulefile に関する追加情報を提供します。
    • module-whatis コマンドは、module-whatis コマンドのレスポンスとして表示される文字列を定義します。
    • set コマンドは、最初の引数と 2 番目の引数の間に Tcl 変数バインディングを作成します。
    • prepend-path は、2 番目の引数に指定された値を先頭に追加し、最初の引数で指定された環境変数を変更します。

    詳細については、modulefile のドキュメントをご覧ください。

Python のバージョンのインストール

この手順は省略可能です。クラスタで実行されているアプリがカスタム Python バージョンまたは複雑なライブラリ ビルドを必要とする場合は、次の操作を行います。

次のスクリプトを実行し、virtualenv ツールを使用して Python バージョンをインストールします。このスクリプトにより、python2 というモジュール エントリが作成されます。このスクリプトは、構成の要件に合わせて変更できます。virtualenv を使用すると、Python の実行ファイルとすべてのライブラリが virtualenv ディレクトリにインストールされます。この構成により、固有のバイナリとライブラリのコレクションが特定のアプリに限定されます。

モジュールを直接編集せずに、次の bash スクリプトを作成します。

  1. Cloud Shell で、SSH を使用してクラスタのログインノードにログインします。

    gcloud compute ssh cluster-name-login0
    
  2. pip をインストールします。

    curl https://bootstrap.pypa.io/get-pip.py | python -
    
  3. virtualenvabsl-pygoogle-cloud-storage パッケージをインストールします。

    pip install virtualenv
    cd /apps
    virtualenv python2
    source ./python2/bin/activate
    pip install absl-py
    pip install google-cloud-storage
    
  4. /apps/modulefiles/python2 modulefile を作成します。

    cat > /apps/modulefiles/python2 << "PYTHONEND"
    #%Module1.0#####################################################################
    ##
    ## python2 for Google modulefile
    ##
    proc ModulesHelp { } {
           global version modroot
    
           puts stderr "\n\tThis adds $modroot/* to several of the"
           puts stderr "\tenvironment variables."
           puts stderr "\n\tVersion $version\n"
    }
    
    module-whatis    "Runs Virtualenv for python. Included Google Cloud Storage.";
    
    # for Tcl script use only
    set    version        000
    set    modroot        /apps/python2
    
    if {[module-info mode] == "load"} {
       puts stdout "source /apps/python2/bin/activate;"
    } elseif {[module-info mode] == "remove"} {
       puts stdout "deactivate;"
    }
    
    PYTHONEND
    
  5. python2 モジュールを環境に追加します。

    module load python2
    

    これで、Slurm ジョブで Python 2.x を使用できるようになりました。

クリーンアップ

課金を停止する最も簡単な方法は、チュートリアル用に作成した Cloud プロジェクトを削除することです。また、リソースを個別に削除することもできます。

プロジェクトの削除

  1. Google Cloud コンソールで、[リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

次のステップ

  • Google Cloud に関するリファレンス アーキテクチャ、図、チュートリアル、ベスト プラクティスを確認する。Cloud Architecture Center を確認します。