I make a performance-critical WebGL library that loads and simulates some heavy 3D models. Detecting any compromise on performances on every code changes are crucial. So I made a benchmarking system and integrated it into CI/CD. It starts an EC2 instance, retrieves the latest version of our library and runs the benchmarking in the headless, gpu-accelerated chrome. Getting chrome the gpu-acceleration in EC2 environment was very tricky. I'm going to share how I did it in this article.
EC2 instance type
There were two requirement for the environment.
- To have a GPU
- To represent user environment well. Neither too good nor too bad.
G4 instances family seemed all good for me so I picked g4ad.xlarge (or g4dn.xlarge, if you prefer to use NVIDIA)because it was the cheapest one.
AMI
I had two options.
- Basic AMI(e.g. Amazon Linux 2) and install the driver manually
- Commercial AMI that is pre-shipped with the gpu driver.
I tried the former and even with a well-written instructions it was a hassle for several reasons.
- It took a long time to download and install the driver. (about 10m)
- Initializer shell script got very complicated
- Installing the dependencies
- Rebooting the system
So I chose the latter. I used Amazon Linux 2 AMI with AMD Radeon Pro Driver when I was using g4ad and Deep Learning AMI (Amazon Linux 2) - ami-08dbdbed58c271fec
when g4dn. I recommend you to do the same because it's cheap, ready to go, and saves you from all the mundane system configuration.
Chrome version
I installed Chrome using yum
# Enable EPEL repository so yum can find chromium
sudo amazon-linux-extras install epel -y
sudo yum install chromium -y
I tried some other options like using direct chrome installer and Puppeteer but for some reason they failed to recognize gpu driver. I didn't bother to inspect the reason since the first one worked well.
Headless Chrome and EGL
Here's little background knowledge about EGL. In order to use OpenGL you need to create an OpenGL Context. On Linux it's been usually done by GLX which requires windows system(e.g. X11), which requires display device (e.g. monitor, VNC). The problem was that this whole dependency chain kept people from using OpenGL on display-less devices like server or Arduino. So EGL emerged. EGL is a protocol that enables OpenGL Context creation without windows system. It made everything so easier and is now regarded as the future of OpenGL Context Interface. Now major graphics drivers are shipped with their own EGL implementation library.
Headless Chrome is one of the perfect example in which EGL is desired. Headless Chrome by definition lacks display therefore you need EGL to run OpenGL.
Run GPU-Accelerated Headless Chrome
All I had to do was to give the right arguments
sudo chromium-browser --no-sandbox --headless --use-gl=egl 'https://benchmarking.system'
- sudo - I don't exactly know why but unprivileged users didn't get gpu acceleration.
- chromium-browser - Default executable name of chromium installed by yum.
- --no-sandbox - Required for root user
- --headless - Required for EGL
- --use-gl=egl - Enables EGL
Debugging
Chrome has chrome://gpu
dashboard page that displays every gpu-related stuff. All I had to was to export it into pdf.
sudo chromium-browser --no-sandbox --headless --use-gl=egl --print-to-pdf=out.pdf 'chrome://gpu'
.. and bring it into my local computer using scp
like this
scp -i certificate.pem ec2-user@<ec2 ip address>:<path to out.pdf> ./
When everything is ok it should look like this.
and the correct driver information should be shown.
Top comments (10)
Hi Ingun, I am facing a major issue while following the steps provided by you after running sudo chromium-browser --no-sandbox --headless --use-gl=egl --print-to-pdf=out.pdf 'chrome://gpu' , I am getting the below error:
Could you please help me to rectify this issue asap.
any updates and suggestions .
Sorry i wasnt checking blog for a while ill look into it and get back!
I'm sorry but GPU drivers and Virtual Machines are updating so fast and I don't think I can easily give you an actual help on this. Good luck 😭
Do you have any idea on how to configure the same in **Docker **using a docker image with GPU accelerated browsers?
But I recently moved on to Azure in which I found much easier to set up GPU accelerated browsers. If it's an option for you I recommend trying Azure.
Could you please help me with the **Image **in azure which can help me quickly spin up Azure Virtual machine with that Image to test GPU drivers.
Just any image and you can add Nvidia GPU Extension learn.microsoft.com/en-us/azure/vi...
The cheapest Nvidia option I found was
This was a great help at the time, but things broke over time because of Chrome Updates, EGL, and loads of other factors.
I have recently worked with the Remotion.dev community to solve this issue, here is the link for that
dev.to/mirzabilal/how-to-enable-ha...