Amazon EC2 の AMI カタログで、「Deep Learning Base OSS Nvidia Driver GPU AMI (Ubuntu 22.04)」が公開されていたので、AWS CDK で起動して NICE DCV でリモートデスクトップ接続してみた

2024.05.01

こんにちは、CX 事業本部製造ビジネステクノロジー部の若槻です。

Amazon EC2の AMI カタログを眺めていたところ、Deep Learning Base OSS Nvidia Driver GPU AMI (Ubuntu 22.04) が 2024/04/29 付けで公開されていました。

リリースノートはこちらです。

Deep Learning Base OSS Nvidia Driver GPU AMI は、NVIDIA ドライバーや Python などディープラーニングなどの機械学習ワークロードを実行するためのソフトウェアが事前にインストールされた AMI です。今までは Ubuntu 20.04 までのディストリビューションでのみ提供されていましたが、このたび Ubuntu 22.04 が追加されました。

今回はこの「Deep Learning Base OSS Nvidia Driver GPU AMI (Ubuntu 22.04)」を AWS CDK で起動し、NICE DCV でのリモートデスクトップ接続を試してみました。

やってみた

NICE DCV サーバー構築用スクリプト

インスタンス上への NICE DCV サーバーの構築は、以下のスクリプトをユーザーデータで実行するようにします。

# Linux NICE DCV サーバーの前提条件
# @see: https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/setting-up-installing-linux-prereq.html
## デスクトップ環境とデスクトップマネージャーをインストールする

### デスクトップ環境とデスクトップマネージャーをインストールする
sudo apt update
sudo apt install ubuntu-desktop -y
sudo apt install gdm3

### GDM3 を起動する(GDM3 がアクティブでない場合があるため)
sudo systemctl start gdm3

### GDM3 をデフォルトのデスクトップマネージャーに設定する
sudo dpkg-reconfigure gdm3

### ソフトウェアパッケージをインストールする
sudo apt upgrade -y

## Wayland プロトコルを無効にする
### [daemon] セクションで WaylandEnable を false に設定する
sudo sed -i -e "s/^#WaylandEnable=false/WaylandEnable=false/g" /etc/gdm3/custom.conf

### GDM サービスを再起動する
sudo systemctl restart gdm3

## X サーバーを設定する
### 確認コマンド:'graphical.target'が返ること(Linux サーバーの起動時に X サーバーが自動起動すること)を確認する
sudo systemctl get-default

### X サーバーを再起動する
sudo systemctl isolate graphical.target

### 確認コマンド:出力があること(Xサーバーが実行中であること)を確認する
ps aux | grep X | grep -v grep

## glxinfo ユーティリティをインストールする
sudo apt install mesa-utils -y

## グラフィックスインスタンス用の GPU ドライバーをインストールする

### NVIDIA GPU ドライバーをインストールする
### インストール済みの AMI を使用しているため不要

### 確認コマンド:出力があること(NVIDIA GPU ドライバーがインストールされていること)を確認する
### @see: https://dev.classmethod.jp/articles/monitor-nvidia-gpu-usage-with-nvidia-smi-nvsmi/
nvidia-smi

### xorg.conf ファイルを生成する
sudo nvidia-xconfig --preserve-busid --enable-all-gpus

### X サーバーを再起動して、変更を有効にする
sudo systemctl isolate multi-user.target
sudo systemctl isolate graphical.target

### 確認コマンド:出力があること(OpenGL ハードウェアレンダリングが利用可能であること)を確認する
sudo DISPLAY=:0 XAUTHORITY=$(ps aux | grep "X.*\-auth" | grep -v grep | sed -n 's/.*-auth \([^ ]\+\).*/\1/p') glxinfo | grep -i "opengl.*version"

# Linux に NICE DCV サーバーをインストールする
# @see: https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/setting-up-installing-linux-server.html
## NICE DCV の作業ディレクトリを作成して移動する
mkdir -p /home/ubuntu/dcv && cd $_

## NICE GPG キーをインポートする
wget https://d1uj6qtbmh3dt5.cloudfront.net/NICE-GPG-KEY
gpg --import NICE-GPG-KEY

## NICE DCV パッケージをダウンロードする
wget https://d1uj6qtbmh3dt5.cloudfront.net/2023.1/Servers/nice-dcv-2023.1-16388-ubuntu2204-x86_64.tgz

## .tgz アーカイブのコンテンツを抽出し、抽出されたディレクトリに移動する
tar -xvzf nice-dcv-2023.1-16388-ubuntu2204-x86_64.tgz && cd nice-dcv-2023.1-16388-ubuntu2204-x86_64

## NICE DCV サーバーをインストールする
sudo apt install ./nice-dcv-server_2023.1.16388-1_amd64.ubuntu2204.deb -y

## dcv ユーザーを video グループに追加
sudo usermod -aG video dcv

## ホームディレクトリに戻り、ダウンロードした .tgz アーカイブを削除する
cd /home/ubuntu
sudo rm dcv/nice-dcv-2023.1-16388-ubuntu2204-x86_64.tgz

# インストール後のチェック
# @see: https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/setting-up-installing-linux-checks.html
## X サーバーがアクセス可能であることを確認する
### X サーバーを再起動する
sudo systemctl isolate multi-user.target
sudo systemctl isolate graphical.target

### 確認コマンド: "SI:localuser:dcv" が返ることを確認する
sudo DISPLAY=:0 XAUTHORITY=$(ps aux | grep "X.*\-auth" | grep -v grep | sed -n 's/.*-auth \([^ ]\+\).*/\1/p') xhost | grep "SI:localuser:dcv$"

# NICE DCV サーバー が Linux で自動的に起動するように設定する
# @see: https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/manage-start.html
sudo systemctl enable dcvserver

# 自動コンソールセッションの有効化
# @see: https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/managing-sessions-start.html#managing-sessions-start-auto
## Linux NICE DCV サーバー で自動コンソールセッションを有効にする
sudo sed -i -e "s/^#create-session/create-session/g" /etc/dcv/dcv.conf
sudo sed -i -e "s/^#owner = \"\"/owner = \"ubuntu\"/g" /etc/dcv/dcv.conf

## NICE DCV サービスを再起動する
sudo systemctl restart dcvserver

## 確認コマンド: 'console' セッションが作成されていることを確認する
dcv list-sessions

ちなみに上記スクリプトはこちらで作成したものを今回の GPU インスタンス向けに一部修正したものです。

CDK コード

Deep Learning Base OSS Nvidia Driver GPU AMI (Ubuntu 22.04) を使用して EC2 インスタンスを起動する CDK コードです。

lib/cdk-sample-stack.ts

import { aws_ec2, Stack } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as fs from 'fs';
import * as path from 'path';

export class CdkSampleStack extends Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    const vpcCidr = '10.100.0.0/16';
    const instanceAmiId = 'ami-0f956248ec264f3bc'; // Deep Learning Base OSS Nvidia Driver GPU AMI (Ubuntu 22.04) 20240429
    const region = 'ap-northeast-1';
    const ec2InstanceConnectSourceIpRange = '3.112.23.0/29';

    // VPC を作成
    const vpc = new aws_ec2.Vpc(this, 'Vpc', {
      ipAddresses: aws_ec2.IpAddresses.cidr(vpcCidr),
      subnetConfiguration: [
        {
          cidrMask: 24,
          name: 'public',
          subnetType: aws_ec2.SubnetType.PUBLIC,
        },
      ],
      maxAzs: 1,
    });

    // セキュリティグループを作成
    const securityGroup = new aws_ec2.SecurityGroup(this, 'SecurityGroup', {
      vpc,
    });

    // セキュリティグループに EC2 Instance Connect 用のインバウンドルールを追加
    securityGroup.addIngressRule(
      aws_ec2.Peer.ipv4(ec2InstanceConnectSourceIpRange),
      aws_ec2.Port.tcp(22),
      'SSH by EC2 Instance Connect in ap-northeast-1'
    );

    // EC2 インスタンスを作成
    const instance = new aws_ec2.Instance(this, 'Instance', {
      vpc,
      securityGroup,
      instanceType: aws_ec2.InstanceType.of(
        aws_ec2.InstanceClass.G4DN,
        aws_ec2.InstanceSize.XLARGE
      ),
      machineImage: aws_ec2.MachineImage.genericLinux({
        [region]: instanceAmiId,
      }),
      requireImdsv2: true,
    });

    // DCV サーバーのセットアップスクリプトを読み込み
    const setupDcvServerCommands = fs
      .readFileSync(
        path.resolve(__dirname, '../script/setupDcvServer.sh'),
        'utf-8'
      )
      .split('\n');

    // インスタンスのユーザデータにコマンドを追加
    instance.userData.addCommands(...setupDcvServerCommands);
  }
}

上記をデプロイして EC2 インスタンスを起動します。

NICE DCV サーバーの構築の完了確認

インスタンス起動後は NICE DCV サーバーが構築されるまで 15 分程掛かります。EC2 Instance Connect でインスタンスに接続し、以下のコマンドを実行して NICE DCV のセッションが作成されていることが確認できれば、構築は完了しています。

$ dcv list-sessions
Session: 'console' (owner:ubuntu type:console)

ubuntu ユーザーのパスワード設定

NICE DCV でリモートデスクトップ接続する際に使用する ubuntu ユーザーのパスワードを設定します。

sudo passwd ubuntu

NICE DCV クライアントで接続

M1 Mac にインストールした NICE DCV クライアントで、インスタンスに接続をします。

ネットワーク接続が確立されると、Ubuntu デスクトップのログイン画面が表示されるので、先ほど設定した ubuntu ユーザーのパスワードを入力してログインします。

ログインが成功し、Ubuntu デスクトップが表示されました。

YouTube で 4K 動画を再生してみましたが、カクついたりすることなく再生できました。

おわりに

Amazon EC2 の AMI カタログで、「Deep Learning Base OSS Nvidia Driver GPU AMI (Ubuntu 22.04)」が公開されていたので、AWS CDK で起動して NICE DCV でリモートデスクトップ接続してみました。

今までグラフィックスアプリケーションを実行するインスタンスを立てる場合には Ubuntu 20.04 で頑張っていたのですが、今後は 22.04 で使えるようになったのは嬉しいですね。

以上