Запуск тестов Playwright с аппаратным ускорением на экземпляре EC2 с поддержкой GPU и поддержкой Docker


Введение

В рамках нашего рабочего процесса разработки я хотел запустить тесты 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 не использует аппаратное ускорение. Пройдите все шаги снова, убедившись, что ничего не упущено. Удачи!


  1. Существуют AMI с уже установленными драйверами Nvidia. Например, вот этот. Но я не смог его использовать, потому что у меня не хватало прав в моей учетной записи AWS. Если вы воспользуетесь им, это может упростить ситуацию. Дайте мне знать в комментариях, если вы это сделаете. 

Оцените статью
devanswers.ru
Добавить комментарий