AWS Batch で CUDA コンテナの実行環境を作って Hello World を実行してみた

2023.06.10

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS ParallelCluster や、オンプレスパコンの非コンテナ環境で実行していたプログラムをコンテナ化、AWS Batch で PoC する環境を検討する機会がありました。最小構成で CUDA アプリをコンテナ化し、AWS Batch で検証する環境の一例を紹介します。

検証環境

オンプレスパコンまたは、ParallelCluster 実行していたアプリケーションをコンテナ化して AWS Batch で検証しやすい環境を想定しています。そのため Hello World 実行プログラム(バイナリファイル)はコンテナに同梱せずにあえて EFS へ外だししています。

Inventory icons created by Freepik - Flaticon

目的はコンテナに不慣れな HPC ユーザーでもソースコードの編集、コンパイルまで気軽に試せて、AWS Batch からの実行テストも容易に行えることを目指しています。コンテナからバイナリファイル外だしのアイデイアは以前 AWS Batch で OpenMPI を実行する Workshop に取り組んだ際に知り、良いアイデイアだったので取り入れました。

CUDA のコンパイルするコンテナ環境は事前に構築しバイナリファイルを生成済みです。詳細は以下の記事をご確認ください。

Name Version
Docker Image nvidia/cuda:10.2-runtime-centos7
CUDA 10.2.89

AWS Batch 実行環境の準備

AWS Batch 設定の要所をキャプチャを交えて紹介します。

コンピューティング

ecsInstanceRoleの IAM ポリシーは AWS 管理の AmazonEC2ContainerServiceforEC2Role ポリシーが付与されています。

ポリシー内容は折りたたみ

AmazonEC2ContainerServiceforEC2Role

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeTags",
                "ecs:CreateCluster",
                "ecs:DeregisterContainerInstance",
                "ecs:DiscoverPollEndpoint",
                "ecs:Poll",
                "ecs:RegisterContainerInstance",
                "ecs:StartTelemetrySession",
                "ecs:UpdateContainerInstancesState",
                "ecs:Submit*",
                "ecr:GetAuthorizationToken",
                "ecr:BatchCheckLayerAvailability",
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "ecs:TagResource",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "ecs:CreateAction": [
                        "CreateCluster",
                        "RegisterContainerInstance"
                    ]
                }
            }
        }
    ]
}

スポットインスタンスを使用するのでなにかしらの GPU インスタンスが起動してくるようにg4/g5 familyを選択しています。

検証環境につき既存 VPC の 1AZ のパブリックサブネットを指定しています。

ジョブキュー

今回作成したコンピューティング環境cuda-envのみ指定したキューを作成しました。

ジョブ定義

コンテナイメージは NVDIA 謹製 CUDA イメージのruntimeだけのイメージを使用します。コンパイル済みのバイナリファイルhelloは EFS へ保存済みです。EFS はコンテナ上では/appへマウントする設定はこの後に設定するのですが、/app配下にあるhelloファイルを実行するだけのコマンド登録しました。

ファイルシステム設定からその他の設定を展開し EFS をマウント設定を追加しました。

CUDA コンテナを実行してみる

作成したジョブ定義をもとにジョブを実行し、正常終了しました。

実行結果

GPU 上での実行結果のメッセージHello World From GPU!が出力できています。

---------------------------------------------------------------------------------------------------------------------------------
|   timestamp   |                                                    message                                                    |
|---------------|---------------------------------------------------------------------------------------------------------------|
| 1686381811070 | ==========                                                                                                    |
| 1686381811070 | == CUDA ==                                                                                                    |
| 1686381811070 | ==========                                                                                                    |
| 1686381811073 | CUDA Version 10.2                                                                                             |
| 1686381811074 | Container image Copyright (c) 2016-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved.                |
| 1686381811075 | This container image and its contents are governed by the NVIDIA Deep Learning Container License.             |
| 1686381811075 | By pulling and using the container, you accept the terms and conditions of this license:                      |
| 1686381811075 | https://developer.nvidia.com/ngc/nvidia-deep-learning-container-license                                       |
| 1686381811075 | A copy of this license is made available in this container at /NGC-DL-CONTAINER-LICENSE for your convenience. |
| 1686381811084 | *************************                                                                                     |
| 1686381811084 | ** DEPRECATION NOTICE! **                                                                                     |
| 1686381811084 | *************************                                                                                     |
| 1686381811084 | THIS IMAGE IS DEPRECATED and is scheduled for DELETION.                                                       |
| 1686381811084 |     https://gitlab.com/nvidia/container-images/cuda/blob/master/doc/support-policy.md                         |
| 1686381811901 | Hello World from CPU!                                                                                         |
| 1686381811901 | Hello World From GPU!                                                                                         |
| 1686381811901 | Hello World From GPU!                                                                                         |
| 1686381811901 | Hello World From GPU!                                                                                         |
| 1686381811901 | Hello World From GPU!                                                                                         |
| 1686381811901 | Hello World From GPU!                                                                                         |
| 1686381811901 | Hello World From GPU!                                                                                         |
| 1686381811901 | Hello World From GPU!                                                                                         |
| 1686381811901 | Hello World From GPU!                                                                                         |
| 1686381811901 | Hello World From GPU!                                                                                         |
| 1686381811901 | Hello World From GPU!                                                                                         |
---------------------------------------------------------------------------------------------------------------------------------

EFS 上に保存してある CUDA の実行ファイルをコンテナから実行ができてかつ、AWS Batch で起動したコンテナは GPU リソースへアクセスできているため、GPU 上での処理を行いHello World From GPU!メッセージが返せることを確認できました。

Inventory icons created by Freepik - Flaticon

おわりに

コンテナらしい使い方ではありませんが CUDA アプリを移植可能か?AWS Batch で動作可能か?を素早く確認するには良いのではないでしょうか。問題なければマルチステージビルドして、runtimeのイメージに CUDA アプリを同梱して ECR へプッシュまですれば一般的なコンテナらしい使い方になります。最終的に AWS Batch で動作確認とれれば脱 ParallelCluster、オンプレスパコンが一歩前進したと言えるでしょう。