aptpod Tech Blog

株式会社アプトポッドのテクノロジーブログです

リモートROS開発におすすめ!AWS EC2 GPUインスタンスにVNC接続

aptpod Advent Calendar 2023 12月18日 を担当する 組み込みエンジニアの久保田です。

みなさん、ROS(Robot Operating System)開発でGazeboシミュレータを動かす際、どのような環境を使っていますか? GPUを搭載した高性能なPCは社内に限られており、長時間の占有が難しいということも多いのではないでしょうか。以前紹介したOpen-RMFシミュレーションのように、試行錯誤しながら環境をフルに活用したいようなことがあるかと思います。

AWS EC2にVNC Clientで接続してOpen-RMFのデモを動かしている様子

本記事では、そのような用途向けに、AWS EC2のGPUインスタンス上にx11vncを使用したリモートデスクトップ環境を構築する方法を紹介します。この環境は、ROS開発だけでなく、Unityや動画生成などのGPUを要求するアプリケーションを使用したい方々にとっても有益です。

はじめに

本記事ではGPUリソースをフルに活用できる、リモートデスクトップ環境の構築手順を紹介します。

Remote Desktop

AWS EC2インスタンスのデスクトップ環境にリモートアクセスする方法がいくつかありますが本記事ではVNCを使用します。 VNC(Virtual Network Computing)はリモートデスクトップアクセスソフトウェアの一つで、インターネットやネットワーク経由で別のコンピュータのデスクトップにアクセスし、操作することができます。この技術は、デスクトップ画面の画像をリモートコンピュータに転送し、リモートコンピュータからの入力(キーボードやマウス操作)をローカルコンピュータに送り返すことで機能します。

このVNCの機能でリモートデスクトップ環境は構築できますが、セキュアな通信とするため、SSH Port Forwardingを使用します。 SSH Port Forwardingは、安全なSSH(Secure Shell)接続を通じてネットワークポートの転送を行う技術です。この方法は、SSHトンネルを使用して、ローカルマシンとリモートマシン間でデータを安全に転送するために使用します。

VNCとSSH Port Forwardingの設定手順をVNCサーバ側、VNCクライアント側それぞれ説明していきます。

VNCサーバ側

AWS EC2インスタンス構築

AWS EC2のGPUインスタンスを構築していきます。このインスタンスにはssh接続できるように設定します。

OSイメージ

インスタンスのOSイメージを選択します。ここでは、Ubuntu Server 22.04 LTS (x86) を指定します。

  ここではUbuntu Server Editionですが、後述する手順でDesktop環境をインストールします

AWS EC2 OSイメージ選択

インスタンスタイプ

インスタンスタイプを選択します。ここではGPUインスタンスでも導入しやすい G4dn を指定します。

  インスタンスサイズは xlarge (4 Core) としていますが、必要なCPUリソースによって変更してください

AWS EC2 GPUインスタンス選択

ストレージ

ストレージ容量を選択します。用途に合わせて調整してください。

  デスクトップ利用のため、30GiB 以上を推奨します

AWS EC2 ストレージ設定

Ubuntuパッケージ更新

EC2インスタンス起動後、Ubuntuを最新の状態に更新します。

sudo apt update
sudo apt upgrade

NVIDIAドライバインストール

構築したAWS EC2のGPUインスタンスにNVIDIAドライバをインストールしていきます。

ubuntu-driversコマンド

NVIDIAドライバインストールに必要なコマンド ubuntu-drivers をインストールします。

sudo apt install ubuntu-drivers-common

NVIDIA推奨ドライバー確認

コマンドubuntu-driversを実行して、インスタンスに最適なドライバを確認します。

  最適なドライバは recommended と表示されます

ubuntu@ip-203-0-113-129:~$ sudo ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:1e.0 ==
modalias : pci:v000010DEd00001EB8sv000010DEsd000012A2bc03sc02i00
vendor   : NVIDIA Corporation
model    : TU104GL [Tesla T4]
driver   : nvidia-driver-510 - distro non-free
driver   : nvidia-driver-470 - distro non-free
driver   : nvidia-driver-470-server - distro non-free
driver   : nvidia-driver-450-server - distro non-free
driver   : nvidia-driver-418-server - distro non-free
driver   : nvidia-driver-515 - distro non-free
driver   : nvidia-driver-525 - distro non-free recommended
driver   : nvidia-driver-525-server - distro non-free
driver   : nvidia-driver-515-server - distro non-free
driver   : xserver-xorg-video-nouveau - distro free builtin

NVIDIAドライバーをインストール

確認した最適なドライバをインストールします。ここではnvidia-driver-525とします。

sudo apt install nvidia-driver-525

インスタンスを再起動後、NVIDIAドライバーを動作確認

コマンド nvidia-smi はNVIDIAのGPU使用状況を確認することができるコマンドです。GPU名 (GPU Name)や温度 (Temp), 消費電力 (Pwr:Usage/Cap)などが表示できている場合、インストールしたドライバが動作していることを確認できます。

ubuntu@ip-203-0-113-129:~$ nvidia-smi
Tue Jan 31 04:45:26 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.78.01    Driver Version: 525.78.01    CUDA Version: 12.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla T4            Off  | 00000000:00:1E.0 Off |                    0 |
| N/A   50C    P8    15W /  70W |      2MiB / 15360MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

Ubuntu Desktopインストール

Ubuntu Server Edition上にDesktop環境を構築していきます。

Xorg サーバ設定ファイル作成

Desktop環境に必要なXorgサーバ設定ファイル (/etc/X11/xorg.conf) をコマンド nvidia-xconfig にて作成します。

sudo nvidia-xconfig

Ubuntu Desktop

インスタンスのOSイメージがServer Editionのため、Ubuntu Desktopをインストールします。

sudo apt update
sudo apt install ubuntu-desktop

Wayland無効化

X11を使用するため、Waylandを無効にします。

/etc/gdm3/custom.conf

WaylandEnable=false

LightDMをインストール

x11vncに対応したデスクトップマネージャであるLightDMに切り替えます。

sudo apt install lightdm

  インストールの途中で、デフォルトのディスプレイマネージャを選択する画面が表示されるので、LightDMを選択します

x11vncインストール

リモートからDesktop環境を利用するためにx11vncをインストールします。

x11vncは、X Window SystemのデスクトップをリモートアクセスするためのVNCサーバーソフトウェアです。このソフトウェアは、既存のXセッションをリアルタイムでキャプチャし、それをVNCプロトコルを通じて別のコンピューターに転送します。これにより、ユーザーは遠隔地から現在動作しているデスクトップ環境にアクセスし、操作することができます。

x11vncの主な特徴は以下の通りです:

  • 既存のXセッション共有:現在アクティブなXセッションに接続し、その内容をリモートユーザーと共有します。
  • クロスプラットフォーム対応:Linux、Windows、Macなど、多様なオペレーティングシステムでVNCビューア(クライアント)を使用してアクセスできます。
  • セキュリティ機能:パスワード保護やSSHトンネリングを使用して、接続を安全に保ちます。
  • GPUアクセラレーション:描画性能の向上のために、GPUアクセラレーションを利用することが可能です。これにより、グラフィックス処理が高速化され、特にグラフィック集約型のアプリケーションやデスクトップ環境でのパフォーマンスが向上します。

x11vnc

x11vncをインストールします。

sudo apt install x11vnc

x11vncパスワードファイル

パスワードファイルを作成します。

$ sudo x11vnc -storepasswd /etc/vncpasswd
Enter VNC password:  ← パスワード入力
Verify password:     ← パスワード確認入力
Write password to /etc/vncpasswd?  [y]/n 
Password written to: /etc/vncpasswd

Xauthorityファイル

X11アクセス制御情報を格納するファイル .Xauthority を作成します。

/home/ubuntu/.Xauthority

$ touch ~/.Xauthority
$ xauth add :0 MIT-MAGIC-COOKIE-1 $(openssl rand -hex 16)

SSHパスワードログイン

SSHパスワードログインを有効にします。

/etc/ssh/sshd_config

PasswordAuthentication yes

ログインパスワードを設定します。

sudo passwd ubuntu

x11vnc自動起動設定

インスタンス起動時にx11vncが自動起動するようにsystemdへ設定ファイルを登録します。設定ファイル (x11vnc.service)を作成し、systemd設定ディレクトリ(/etc/systemd/system)に格納してください。

$ sudo systemctl daemon-reload
$ sudo systemctl enable x11vnc

/etc/systemd/system/x11vnc.service

[Unit]
Description=x11vnc (Remote access)
After=network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -auth guess -display :0 -rfbauth /etc/vncpasswd -rfbport 5900 -forever -loop -noxdamage -repeat -shared
ExecStop=/bin/kill -TERM $MAINPID
ExecReload=/bin/kill -HUP $MAINPID
KillMode=control-group
Restart=on-failure

[Install]
WantedBy=graphical.target

  VNCの使用ポート番号を 5900 とします

VNCクライアント側

VNCサーバ側の準備ができたところで、VNCサーバへVNCクライアントを接続していきます。 本記事では、VNCクライアントとしてRealVNCのVNC Viewerを使用します。

SSH Port Forwarding接続

SSH Port Forwarding

別ターミナルで、AWS EC2インスタンスのVNCサーバの通信をSSH port forwardingするためにssh接続します。

ssh -L 5900:ec2-203-0-113-129.ap-northeast-1.compute.amazonaws.com:5900 ubuntu@ec2-203-0-113-129.ap-northeast-1.compute.amazonaws.com

VNCクライアント接続

VNCクライアント

SSH Port Forwardingのためのssh接続後、VNCクライアントを実行してリモートデスクトップ画面を表示します。

vncviewer 127.0.0.1::5900

vncviewer

コマンド nvidia-smi はNVIDIAのGPU使用状況を確認することができるコマンドです。プロセス情報 (Processes) に デスクトップ表示プロセス (Xorg) が表示されている場合、デスクトップ表示にGPUを使用していることが確認できます。

ubuntu@ip-203-0-113-129:~$ nvidia-smi
Tue Jan 31 08:34:40 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.78.01    Driver Version: 525.78.01    CUDA Version: 12.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla T4            Off  | 00000000:00:1E.0 Off |                    0 |
| N/A   33C    P8    14W /  70W |    245MiB / 15360MiB |      1%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      2409      G   /usr/lib/xorg/Xorg                136MiB |
|    0   N/A  N/A      2911      G   /usr/bin/gnome-shell              105MiB |
+-----------------------------------------------------------------------------+

まとめ

本記事では、AWS EC2 GPUインスタンスへのリモートデスクトップ環境の構築手順を紹介しました。設定項目は多いですが構築できれば快適な環境を手にいれることができます。本記事の内容がROS開発やGPUを使ったその他のプロジェクトに役立つと嬉しいです。