Jugando en la nube con AWS

Ahora que se acerca la fecha de lanzamiento de Microsoft Flight Simulator 2020 le he estado dando vueltas a la idea de armar una PC gamer. Me hubiera encantado la idea que hubieran lanzado el juego durante el distanciamiento social por COVID-19, así solamente me tendría que aislar una vez este año.

Antes de armar la nueva PC me gustaría poder evaluar los juegos que me interesan para ver si vale la pena la inversión y no hacer un gasto en algo que no voy a usar.

Tengo una Macbook Pro con características muy decentes pero la mayoría de los juegos que me interesan son para Windows (y no quiero tener dual boot) y me interesa tener un GPU NVIDIA para poder correr aplicaciones aceleradas por CUDA (actualmente uso máquinas virtuales en AWS para eso).

Aprovechando que tengo una conexión estable a internet y con buena velocidad (200 Mbps simétricos) quiero experimentar configurando una máquina virtual con GPU en AWS e intentar jugar desde ahí.

Voy a crear la máquina virtual en la región US-West-1 que se encuentra al norte de California porque es la que tengo más cerca físicamente (estoy viviendo en el área de la bahía de San Francisco) y la latencia de la conexión de mi departamento a esa región es bastante decente.

Captura tomada de https://www.cloudping.info/

Para esta prueba voy a crear una instancia con g4dn.2xlarge usando la imagen oficial de Windows Server 2019 Base. Esta configuración tiene un costo de $1.27 dólares por hora de uso con estas características:

  • 8 vCPUS de Intel Xeon P-8259L 2.5 GHz
  • 32 GB de RAM
  • 225 GB SSD NVME (efímero, cada vez que se detiene la máquina virtual se pierde)
  • Tarjeta de video NVIDIA T4 (2,560 cores y 16 GB DDR6 RAM)

Lo único que cambiaría de esa configuración sería la velocidad del procesador, si bien el que utiliza esta instancia tiene la capacidad de incrementar la velocidad del core hasta 3.9 GHz, Amazon lo tiene limitado a 2.5Ghz.

Una vez que está lista la máquina, me voy a conectar por RDP usando Microsoft Remote Desktop e instalar Google Chrome usando este snippet en PowerShell:

$Path = $env:TEMP; $Installer = "chrome_installer.exe"; Invoke-WebRequest "http://dl.google.com/chrome/install/latest/chrome_installer.exe" -OutFile $Path\$Installer; Start-Process -FilePath $Path\$Installer -Args "/silent /install" -Verb RunAs -Wait; Remove-Item $Path\$Installer

Después es necesario descargar los drivers de gaming de NVIDIA corriendo el siguiente comando en PowerShell:

$Bucket = "nvidia-gaming"
$KeyPrefix = "windows/latest"
$LocalPath = "$home\Desktop\NVIDIA"
$Objects = Get-S3Object -BucketName $Bucket -KeyPrefix $KeyPrefix -Region us-east-1
foreach ($Object in $Objects) {
    $LocalFileName = $Object.Key
    if ($LocalFileName -ne '' -and $Object.Size -ne 0) {
        $LocalFilePath = Join-Path $LocalPath $LocalFileName
        Copy-S3Object -BucketName $Bucket -Key $Object.Key -LocalFile $LocalFilePath -Region us-east-1
    }
}

Para que funcione correctamente es necesario tener configuradas las herramientas de AWS para PowerShell.

Una vez que se completa la ejecución del comando, estará una carpeta llamada NVIDIA en el escritorio y contiene los drivers a instalar. Hay que seleccionar la versión correcta de acuerdo a la versión de Windows que esté corriendo la máquina virtual e instalarlo.

Después hay que correr este comando en PowerShell para crear la configuración requerida:

New-ItemProperty -Path "HKLM:\SOFTWARE\NVIDIA Corporation\Global" -Name "vGamingMarketplace" -PropertyType "DWord" -Value "2"

Finalmente hay que descargar la licencia de NVIDIA y reiniciar para que los cambios tomen efecto.

Invoke-WebRequest -Uri "https://nvidia-gaming.s3.amazonaws.com/GridSwCert-Archive/GridSwCert-Windows_2020_04.cert" -OutFile "$Env:PUBLIC\Documents\GridSwCert.txt"

Para poder utilizar el disco efímero (si no te importa perder los datos que estén ahí cada vez que detengas la máquina virtual) es necesario formatearlo utilizando la herramienta Disk Management de Windows.

Ahora que está todo listo puedo instalar Steam y descargar algun juego para hacer pruebas.

Una de las ventajas de usar la infraestructura de Amazon es la velocidad de internet, esta instancia en particular tiene una conexión de hasta 25 Gbps.

Descargando a ~600 Mbps

Instalé Shadow of the Tomb Raider para tenerlo como punto de referencia y al correr el benchmark con gráficos en configuración alta da entre 70 y 90 fps a 2560×1440.

Noté en el uso de recursos que mientras se está jugando utiliza aproximadamente 30 Mbps de la conexión. El uso de GPU y procesadores (en general) es relativamente bajo pero se podría beneficiar de una velocidad más alta del procesador (uno de los núcleos se utiliza al 100%), mi próxima prueba será con la instancia g3.4xlarge que usa un procesador E5-2686 v4 a 2.7 GHz, si bien es una generación anterior es probable que la velocidad del reloj haga diferencia.

En cuanto a la experiencia de juego, no noté ningún retraso significativo (a pesar de estar conectado por un cliente RDP), después de jugar un rato hice una prueba para ver la latencia de la conexión entre mi equipo y el servidor virtual.

? ~ ping 18.144.55.16
PING 18.144.55.16 (18.144.55.16): 56 data bytes
64 bytes from 18.144.55.16: icmp_seq=0 ttl=114 time=4.311 ms
64 bytes from 18.144.55.16: icmp_seq=1 ttl=114 time=4.679 ms
64 bytes from 18.144.55.16: icmp_seq=2 ttl=114 time=4.307 ms
64 bytes from 18.144.55.16: icmp_seq=3 ttl=114 time=6.639 ms
^C
--- 18.144.55.16 ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 4.307/4.984/6.639/0.967 ms

El costo total por hora de juego llega a $2.485, de los cuales $1.215 es por la transferencia de datos (13.5 GB/hora) y $1.27 por la maquina virtual.

Por el costo por hora, experiencia de juego y facilidad de uso creo que es una solución bastante aceptable para probar un juego antes de hacer una inversión considerable en un PC gamer.

Definitivamente esta es la opción que voy a usar para probar Microsoft Flight Simulator 2020 una vez que esté disponible.