aptpod Advent Calendar 2023 12月18日 を担当する 組み込みエンジニアの久保田です。
みなさん、ROS(Robot Operating System)開発でGazeboシミュレータを動かす際、どのような環境を使っていますか? GPUを搭載した高性能なPCは社内に限られており、長時間の占有が難しいということも多いのではないでしょうか。以前紹介したOpen-RMFシミュレーションのように、試行錯誤しながら環境をフルに活用したいようなことがあるかと思います。
本記事では、そのような用途向けに、AWS EC2のGPUインスタンス上にx11vncを使用したリモートデスクトップ環境を構築する方法を紹介します。この環境は、ROS開発だけでなく、Unityや動画生成などのGPUを要求するアプリケーションを使用したい方々にとっても有益です。
はじめに
本記事ではGPUリソースをフルに活用できる、リモートデスクトップ環境の構築手順を紹介します。
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環境をインストールします
インスタンスタイプ
インスタンスタイプを選択します。ここではGPUインスタンスでも導入しやすい G4dn を指定します。
インスタンスサイズは xlarge (4 Core) としていますが、必要なCPUリソースによって変更してください
ストレージ
ストレージ容量を選択します。用途に合わせて調整してください。
デスクトップ利用のため、30GiB 以上を推奨します
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
コマンド 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を使ったその他のプロジェクトに役立つと嬉しいです。