Введение
В рамках нашего рабочего процесса разработки я хотел запустить тесты Playwright в режиме headless в среде Linux. Мне также нужно было запустить его внутри контейнера Docker. Еще одна вещь, которую я хотел, — чтобы экземпляр EC2 имел поддержку GPU, чтобы тесты могли запускаться с аппаратным ускорением.
Насколько я могу судить, разработчики Google Chrome выбрали способ поддержки аппаратного ускорения в Linux — это Vulkan (здесь и здесь).
Согласно Nvidia, официальной поддержки Vulkan в Docker нет. Хотя, похоже, что FAQ не обновлялся, потому что я смог найти контейнер Docker с поддержкой Vulkan здесь.
Ингредиенты нашего «рецепта» следующие:
- экземпляр EC2 с поддержкой GPU
- драйверы Nvidia
- Docker Engine
- Nvidia Container Toolkit
- Docker-контейнер с поддержкой Vulkan
Шаги
Начните с запуска экземпляра EC2 со следующими характеристиками:
- Тип экземпляра: g4dn.xlarge
- AMI: ami-058165de3b7202099 (Canonical, Ubuntu, 22.04 LTS, amd64 jammy image build on 2022-06-09)1
- Хранение: Не менее 20 Гб
Выполните SSH к экземпляру и обновите систему:
Не забудьте перезагрузиться после завершения обновления.
Установка драйверов Nvidia описана здесь. Я выбрал вариант установки 2 (публичные драйверы NVIDIA). Поскольку я использую экземпляр G4dn, я выполнил поиск, используя следующие параметры:
Как видно на изображении, последняя версия на момент написания этой статьи — 515.65.01. Теперь мы можем загрузить и установить эту версию:
sudo dpkg -i nvidia-driver-local-repo-ubuntu2204-515.65.01_1.0-1_amd64.deb
sudo apt-get update && sudo apt-get -y install cuda-drivers
Перезагрузите машину после установки драйверов. Чтобы убедиться, что драйверы работают так, как ожидалось, запустите nvidia-smi
. Вы должны получить результат, подобный этому:
Чтобы убедиться, что драйверы Vulkan доступны, нам нужно установить vulkan-tools: sudo apt-get -y install vulkan-tools
. После запуска vulkaninfo
вы должны получить что-то вроде этого:
Следующим шагом будет установка последней версии Docker Engine, следуя следующим шагам
sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt update && sudo apt-get install ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update && sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
- Проверьте, что docker успешно установлен:
sudo docker run hello-world
. - Добавьте пользователя в группу docker, чтобы мы не использовали sudo для выполнения команд Docker:
sudo usermod -aG docker $USER
. Выйдите из системы и снова войдите, чтобы изменения вступили в силу. - Убедитесь, что Docker включен после перезагрузки:
sudo systemctl enable docker.service && sudo systemctl enable containerd.service
.
Далее нам нужно установить Nvidia Container Toolkit (инструкции здесь).
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update && sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker
- Убедитесь, что Docker имеет доступ к GPU (обратите внимание на флаг
--gpus all
):docker run -it --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi
. Должен появиться текст, аналогичный командеnvidia-smi
, выполненной ранее. - Убедитесь, что Docker имеет доступ к драйверам Vulkan:
docker run --rm -it --gpus all nvidia/vulkan:1.2.133-450 vulkaninfo
. Должен появиться текст, аналогичный командеvulkaninfo
, выполненной ранее.
Теперь, чтобы запустить Playwright внутри контейнера, выполните следующие действия:
- Запустите контейнер с примонтированным томом к текущей папке, чтобы файлы были сохранены:
docker run -v $PWD:/tests -w /tests --rm -it --gpus all nvidia/vulkan:1.2.133-450 bash
.
Внутри контейнера выполните следующие команды для установки NodeJS:
wget https://deb.nodesource.com/setup_16.x -O nodesource_setup.sh
sh nodesource_setup.sh
apt install -y nodejs
Чтобы убедиться, что Playwright работает правильно, я использую следующие файлы:
package.json:
{
"devDependencies": {
"@playwright/test": "^1.24.2"
}
}
playwright.config.js:
const config = {
use: {
channel: "chromium",
launchOptions: {
args: [
'--enable-features=Vulkan,UseSkiaRenderer',
'--use-vulkan=swiftshader',
'--enable-unsafe-webgpu',
'--disable-vulkan-fallback-to-gl-for-testing',
'--dignore-gpu-blocklist',
'--use-angle=vulkan'
]
}
}
}
module.exports = config
gpu.spec.js:
import { test, expect } from '@playwright/test';
test('It should take a snapshot of the GPU Chrome page', async ({ page }) => {
await page.goto('chrome://gpu', { waitUntil: 'domcontentloaded' });
await page.screenshot({ path: 'gpu.png' });
await expect(page.locator('text=Graphics Feature Status').first()).toBeVisible();
});
Поместите эти 3 файла в папку /tests.
Чтобы установить Playwright, запустите npm install
.
Теперь нам нужно установить браузер Chromium, который мы будем использовать для наших тестов. Я добавляю в команду пользовательский путь для установки браузеров:
PLAYWRIGHT_BROWSERS_PATH=/tests/.cache/ms-playwright npx playwright install chromium
- Установите необходимые зависимости:
apt install -y libglib2.0-0 libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdbus-1-3 libxcomposite1 libxdamage1 libpango-1.0-0 libcairo2 libasound2 libatspi2.0-0
. - Запустите тест Playwright:
PLAYWRIGHT_BROWSERS_PATH=/tests/.cache/ms-playwright npx playwright test gpu.spec.js
В результате тест сохранит файл под названием gpu.png. Открытие этого файла должно показать что-то вроде этого
Если вместо этого вы видите «Software only, hardware acceleration unavailable», значит, что-то пошло не так и Playwright не использует аппаратное ускорение. Пройдите все шаги снова, убедившись, что ничего не упущено. Удачи!
-
Существуют AMI с уже установленными драйверами Nvidia. Например, вот этот. Но я не смог его использовать, потому что у меня не хватало прав в моей учетной записи AWS. Если вы воспользуетесь им, это может упростить ситуацию. Дайте мне знать в комментариях, если вы это сделаете.