Don’t let AI Agents fail in production
Restack backend framework provides long-running workflows and infrastructure for reliable & accurate AI agents.
Get started with example agents
Research Paper
Agent accuracy benchmark
Many enterprises are exploring AI agents, but one issue blocks their adoption: keeping them accurate and on brand. General-purpose LLMs hit only 51% accuracy, while fine-tuned small agents reach 99.7%.
The trust in AI is eroding due to unreliable, poorly designed agents. For AI to reach its full potential, we need better ones. Restack helps you build agents that are reliable, scalable, and ready for real-world use.
Features
The Restack framework
Build reliable and accurate AI agents with Restack.
Developer UI
Simulate, time travel and replay AI agents
The Restack developer toolkit provides a UI to visualize and replay workflows or individual steps. Open a favourite IDE like VS Code or Cursor on one side and view workflows on the other to improve debugging and local development.
Get started in seconds
Start building with Restack AI framework and deploy with Restack Cloud.
-
Star
(4)
You must be signed in to star a gist -
Fork
(3)
You must be signed in to fork a gist
-
Clone this repository at <script src="https://gist.github.com/atinfinity/f9568aa9564371f573138712070f5bad.js"></script>
- Save atinfinity/f9568aa9564371f573138712070f5bad to your computer and use it in GitHub Desktop.
Clone this repository at <script src="https://gist.github.com/atinfinity/f9568aa9564371f573138712070f5bad.js"></script>
Install NVIDIA Container Toolkit on WSL2
Key points:
- The NVIDIA Container Toolkit (formerly known as NVIDIA Docker) allows Linux containers to access full GPU acceleration.
- All graphics APIs are supported, including OpenGL, Vulkan, OpenCL, CUDA and NVENC/NVDEC.
- This only works with NVIDIA GPUs for Linux containers running on Linux host systems or inside WSL2.
Contents
- Overview
- Installation under Linux
- Installation under Windows with WSL2
- Container image compatibility
Overview
The NVIDIA Container Toolkit (formerly known as NVIDIA Docker) is a library and accompanying set of tools for exposing NVIDIA graphics devices to Linux containers. It provides full GPU acceleration for containers running under Docker, containerd, LXC, Podman and Kubernetes. If you are interested in learning about the underlying architecture of the NVIDIA Container Toolkit then be sure to check out the Architecture Overview page of the official documentation.
Containers running with GPU acceleration have access to all supported graphics APIs on NVIDIA GPUs, including OpenGL, Vulkan, OpenCL, CUDA and NVENC/NVDEC. For details of what these APIs are used for, see the GPU acceleration in containers overview page.
The NVIDIA Container Toolkit is designed specifically for Linux containers running directly on Linux host systems or within Linux distributions under version 2 of the Windows Subsystem for Linux (WSL2). The underlying code does not support Windows containers, nor can it be used when running Linux containers on macOS or Windows without WSL2 due to the fact that containers are run inside a Linux VM that does not have GPU access. However, Docker clients running under Windows and macOS can still be used to connect to a Docker daemon running under Linux with the NVIDIA Container Toolkit.
For details of alternative options for other GPU vendors and operating systems, see the GPU acceleration in containers overview page.
Installation under Linux
-
As per the supported platforms list and prerequisites list from the NVIDIA Container Toolkit Installation Guide, you will need to ensure you have a supported Linux distribution and a supported NVIDIA GPU.
-
Install a supported version of Docker Community Edition (CE) 18.09 or newer.
-
Install the NVIDIA binary GPU driver, ensuring you use a version that meets the minimum requirements for the CUDA version you intend to use or at least version 418.81.07 if you don’t intend to use CUDA.
-
Install the NVIDIA Container Toolkit by following the instructions for your specific Linux distribution.
-
If you would like to test out a specific graphics API, pull the relevant NVIDIA base container images from Docker Hub:
- nvidia/opengl for OpenGL support
- nvidia/cuda for CUDA support
- nvidia/cudagl for OpenGL + CUDA support
- nvidia/vulkan for OpenGL + Vulkan + CUDA support
- nvidia/opencl for OpenCL support
-
If you intend to use the Unreal Engine with a runtime container image then be sure to choose a base image that is pre-configured to support the NVIDIA Container Toolkit.
-
If you intend to use the Unreal Engine with a development container image then you will need to choose an image source that supports the NVIDIA Container Toolkit. Depending on the graphics APIs that you are interested in using, it may be necessary to build a development image from source that extends the relevant NVIDIA base image.
Installation under Windows with WSL2
The authors of this documentation are still in the process of familiarising themselves with the use of the NVIDIA Container Toolkit under WSL2. This section will be updated when the relevant information has been gathered.
Container image compatibility
Container images built on a system that has the NVIDIA Container Toolkit installed will be identical to container images built on a system without the NVIDIA Container Toolkit. This is because GPU acceleration is not enabled during the build process. The resulting container images can be run with GPU acceleration using the NVIDIA Container Toolkit or without GPU acceleration using any OCI-compatible container runtime.
Older versions of NVIDIA Docker allowed the Docker daemon to use NVIDIA Docker as the default container runtime, which enabled GPU acceleration during image builds and meant that any container images built by that Docker daemon could be rendered non-portable. For this reason, it was strongly recommended that you did not reconfigure the default container runtime on hosts that were used to build containers. This option is not present in newer versions of the NVIDIA Container Toolkit.
- Background
- 1. Windows Insider Preview Build 20150
- 2. Install WSL
- 3. Linux Kernel
- 4. Install Ubuntu 18.04
- 5. Install CUDA drivers on Win 10 (host)
- 6. Install Docker
- Docker Desktop for Windows confusion
- 7. Install NVIDIA Container Toolkit
- 8. Use VS Code for development
- Issues faced
- References
- Summary
Background
This is a followup to my earlier post in which I wrote how to setup Docker and Python. I had recently installed a NVIDIA GPU (RTX 2060 Super) in my machine and I wanted to use it to develop deep learning models in Tensorflow. I have been extensively using Docker and VS Code, so I was looking for a setup that would fit in my existing workflow.
There were few options :
- Install Python and tensorflow directly on Windows [The setup seems quite complicated and I prefer the containerised approach for development]
- Dual boot into Ubuntu and setup tensorflow [Best and recommended. But this would mean I would be switching back forth between Ubuntu and Windows]
- Use the Docker Desktop for Windows and create tensorflow containers [Currently GPU is not supported, hence the next option]
- Use Windows Subsystem for Linux (WSL)
I decided to go with the last option. And it was a good timing as Microsoft and NVIDIA had recently announced the support for GPU acceleration in WSL 2. So, the plan is as follows :
- Enable WSL on Windows
- Install Ubuntu inside WSL
- Install Docker and NVIDIA toolkit in Ubuntu and create tensorflow containers (with GPU support)
- Use the VS Code IDE for development
Please note that as of 26th Jun 20, most of these features are still in development. They worked for me and you may try them at your own risk, as they did end up messing some parts of my system. You will need to sign up for :
- Windows Insider Program
- NVIDIA Developer Program
Also, under each step I have mentioned some CHECKS
. Hope they help in making sure you are on the right track.
1. Windows Insider Preview Build 20150
First and foremost, the GPU support on WSL is not available in the Retail Build of Windows 10. I had to get the latest Windows 10 Insider Preview Build 20150. The details of all the builds are available in the Flight Hub. The installation process took an hour.
CHECK : Windows Version. In Power Shell (PS) or CMD, type winver
2. Install WSL
Steps to be done in PS/CMD:
- Enable WSL1 :
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
- Enable WSL2 :
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
- Restart Computer
- Default to version 2 :
wsl.exe --set-default-version 2
3. Linux Kernel
After running the above command, I got this message : WSL 2 requires an update to its kernel component. For information please visit https://aka.ms/wsl2kernel.
The page has instructions for installing the WSL2 Linux Kernel MSI. After installing it in Win10, this command worked : wsl.exe --set-default-version 2
CHECK : Linux Kernel version should be 4.19.121 or higher. On PS/CMD type wsl cat /proc/version
Output : Linux version 4.19.121-microsoft-standard (oe-user@oe-host) (gcc version 8.2.0 (GCC)) #1 SMP Fri Jun 19 21:06:10 UTC 2020
If you dont have latest kernel, then go to Windows Settings \ Update & Security \ Windows Update \ Check for updates
. Ensure that “Receive Updates” is turned on.
As per my understanding, in the future releases both the installation/update of WSL Linux Kernel will be handled by these two commands : wsl --install
and wsl --update
As per Microsoft :
We’ve removed the Linux kernel from the Windows OS image and instead will be delivering it to your machine via Windows Update, the same way that 3rd party drivers (like graphics, or touchpad drivers) are installed and updated on your machine today. When automatic install and update of the Linux kernel is added you’ll start getting automatic updates to your kernel right away.
4. Install Ubuntu 18.04
- You can get the distro from the Microsoft store, to be installed on WSL
- I prefer the Debian distribution as it is lighter than Ubuntu, so I spent quite some time in setting it up. But it did not work.
- In the end, I went ahead with Ubuntu 18.04 (I didn’t choose 20.04 as I have read somewhere that tensorflow has issues with that version. I might be wrong)
CHECK : Version of Ubuntu. On PS/CMD type wsl -l -v
Output :
NAME STATE VERSION
* Ubuntu-18.04 Stopped 2
5. Install CUDA drivers on Win 10 (host)
The CUDA drivers for WSL — Public Preview can be installed from here
CHECK : The CUDA driver version should be 455.41 or higher. On PS/CMD type nvidia-smi
6. Install Docker
- Enter the WSL by typing
wsl
on PS/CMD. This will activate Ubuntu. - Install docker using
curl https://get.docker.com | sh
- As far as I understand, the NVIDIA container toolkit does not work with Docker Desktop for Windows so I ignored this
WSL DETECTED: We recommend using Docker Desktop for Windows. You may press Ctrl+C now to abort this script.
- As far as I understand, the NVIDIA container toolkit does not work with Docker Desktop for Windows so I ignored this
CHECK : Docker version. At the Ubuntu prompt, type docker -v
Docker Desktop for Windows confusion
- The Docker Desktop for Windows is different from the docker that I installed in Step 6
- Prior to the release of WSL2, it would use Hyper-V virtualisation for creating the Linux VMs in Windows
- After I installed WSL2, I enabled the WSL2 integration in Docker Desktop and let it use the WSL backend
- But this started interfering with the docker that I had installed in WSL/Ubuntu
- In particular, it would create its own Linux distros :
docker-desktop
anddocker-desktop-data
- And the images/containers that I created using the WSL/Ubuntu dockerd went missing
- In particular, it would create its own Linux distros :
- I found these solutions to work:
- Disable the Docker Desktop integration with WSL2 (so that it continues to use Hyper-V backend). And then restart computer
- Quit Docker Desktop and degister
docker-desktop
anddocker-desktop-data
usingwslconfig /u docker-desktop
andwslconfig /u docker-desktop-data
- Check
wsl -l -v
- Setting default distro to Ubuntu
wsl --set-default Ubuntu 18.04
did not help
8. Use VS Code for development
One of the challenges I faced was to connect VS Code to the container that was running on Ubuntu which was inturn running inside WSL. The Remote-Containers
extension was unable to reach the container. And Remote-WSL
extension only reached the Ubuntu.
With some help from the VS Code community and the docker documentation here and here, I managed to get it working in below 2 steps :
- In WSL/Ubuntu, I started the docker daemon using the -H flag
sudo dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
- This opens the 2375 port for the docker to listen (this is a non-secured way)
- And in VS Code settings.json, I added this line :
"docker.host":"tcp://localhost:2375"
And then in VS Code, I could use the Remote Containers:Attach to running containers
to connect to the container running in WSL/Ubuntu
Issues faced
- The boot loader menu for my Ubuntu — Windows 10 dual boot disappeared (Most likely after the installation of the Insider Build 20150)
- The CUDA toolkit doesn’t seem to work on Debian distro (I might have to give it another try )
- The Docker Desktop for Windows (with WSL2 backend) should not be running as it interferes with the docker daemon in Ubuntu
- Some useful
wsl
optionswsl --set-default Ubuntu 18.04
to change default distrowsl --shutdown
to shutdown the Linux Kernel
- I also had another non-CUDA display adapter on my machine GeForce GT710. And I realised tensorflow was crashing at this command
tf.test.gpu_device_name()
, so I disabled it and it seemed to work well.
References
- GPU Compute, WSL Install and WSL Update arrive in the latest Insider build for the Windows Subsystem for Linux | Microsoft
- Enable NVIDIA CUDA in WSL 2 | Microsoft
- Windows Subsystem for Linux Installation Guide for Windows 10 | Microsoft
- Announcing CUDA on Windows Subsystem for Linux 2 | NVIDIA
- CUDA on WSL User Guide | NVIDIA
- NVIDIA Forum 1
- NVIDIA Forum 2
- VS Code configuration
- Tensorflow
- Getting started with CUDA on Ubuntu on WSL 2 | Ubuntu
Summary
This was just a start and I could run into issues as I continue using tensorflow. But in summary, it was a good learning experience even though I ended up spending couple of days in setting it up. I am not an expert in Docker neither in CUDA, so if you see any issues with the blog please leave a comment and I will rectify. You can also reach out to the NVIDIA team, they are highly engaged and promptly reply to queries on their forums. Cheers !
Компания Microsoft, откликаясь на многочисленные просьбы пользователей, представила в мае 2020 года на конференции Build новую возможность подсистемы Windows для Linux 2 (Windows Subsystem for Linux 2, WSL 2) — поддержку видеоускорителей. Это позволит запускать в WSL 2 приложения, занимающиеся специализированными вычислениями. Поддержка GPU откроет дорогу профессиональным инструментам, поможет решать в WSL 2 задачи, которые в настоящее время можно решать только в Linux. Теперь подобные задачи можно будет решать и в Windows, пользуясь возможностями GPU.
Крайне важно тут и то, что в WSL приходит поддержка программно-аппаратной архитектуры параллельных вычислений NVIDIA CUDA.
Материал, перевод которого мы публикуем, подготовлен специалистами NVIDIA. Здесь речь пойдёт о том, чего можно ожидать от CUDA в Public Preview-версии WSL 2.
Запуск AI-фреймворков, используемых в Linux, в WSL 2-контейнерах
Что такое WSL?
WSL — это возможность Windows 10, которая позволяет использовать инструменты командной строки Linux непосредственно в Windows без необходимости сталкиваться со сложностями применения конфигурации двойной загрузки. WSL представляет собой контейнеризованное окружение, которое тесно интегрировано с ОС Microsoft Windows. Это позволяет запускать Linux-приложения вместе с традиционными Windows-приложения и с современными приложениями, распространяемыми через Microsoft Store.
WSL — это, преимущественно, инструмент для разработчиков. Если вы работаете над некими проектами в контейнерах Linux, это значит, что вы можете заниматься теми же делами локально, на Windows-компьютере, используя привычные инструменты Linux. Обычно, чтобы запустить подобные приложения на Windows, нужно потратить много времени на настройку системы, нужны какие-то сторонние фреймворки, библиотеки. Теперь, с выходом WSL 2, всё изменилось. Благодаря WSL 2 в мир Windows пришла полная поддержка ядра Linux.
WSL 2 и технология паравиртуализации GPU (GPU Paravirtualization, GPU-PV) позволили Microsoft вывести поддержку Linux в Windows на новый уровень, сделав возможным запуск вычислительных нагрузок, рассчитанных на GPU. Ниже мы подробнее поговорим о том, как выглядит использование GPU в WSL 2.
Если вас интересует тема поддержки видеоускорителей в WSL 2 — взгляните на этот материал и на этот репозиторий.
CUDA в WSL
Для того чтобы воспользоваться возможностями GPU в WSL 2, необходимо, чтобы на компьютере был бы установлен видеодрайвер, поддерживающий Microsoft WDDM. Подобные драйверы создают производители видеокарт — такие, как NVIDIA.
Технология CUDA позволяет заниматься разработкой программ для видеоускорителей NVIDIA. Эта технология поддерживается в WDDM, в Windows, уже многие годы. Новый контейнер WSL 2 от Microsoft даёт возможности по GPU-ускорению вычислений, которыми может воспользоваться технология CUDA, что позволяет выполнять в среде WSL программы, рассчитанные на CUDA. Подробности об этом можно узнать в руководстве пользователя по работе с CUDA в WSL.
Поддержка CUDA в WSL включена в драйверы NVIDIA, рассчитанные на WDDM 2.9. Эти драйверы достаточно просто установить в Windows. Драйверы пользовательского режима CUDA в WSL (libcuda.so) автоматически становятся доступными внутри контейнера, их может обнаружить загрузчик.
Команда NVIDIA, занимающаяся разработкой драйверов, добавила в драйвер CUDA поддержку WDDM и GPU-PV. Сделано это для того чтобы эти драйверы могли бы работать в среде Linux, запущенной на Windows. Эти драйверы всё ещё находятся в статусе Preview, их релиз состоится только тогда, кода состоится официальный релиз WSL с поддержкой GPU. Подробности о выпуске драйверов можно найти здесь.
На следующем рисунке показана схема подключения драйвера CUDA к WDDM внутри гостевой системы Linux.
WDDM-драйвер пользовательского режима с поддержкой CUDA, выполняющийся в гостевой системе Linux
Предположим, вы — разработчик, который установил дистрибутив WSL на последнюю сборку Windows из Fast Ring (сборка 20149 или старше) Microsoft Windows Insider Program (WIP). Если вы переключились на WSL 2 и у вас есть GPU NVIDIA, вы можете испытать драйвер и запустить свой код, выполняющий GPU-вычисления, в WSL 2. Для этого достаточно установить драйвер в хост-системе Windows и открыть WSL-контейнер. Здесь вам, без дополнительных усилий, будет доступна возможность работы с приложениями, использующими CUDA. На следующем рисунке показано, как в WSL 2-контейнере выполняется TensorFlow-приложение, использующее возможности CUDA.
TensorFlow-контейнер, выполняющийся в WSL 2
То, что в WSL теперь доступна технология CUDA, позволяет выполнять в WSL приложения, которые раньше можно было выполнять только в обычном Linux-окружении.
NVIDIA всё ещё активно работает над этим проектом и вносит в него улучшения. Мы, кроме прочего, работаем над добавлением в WDDM API, которые раньше были рассчитаны исключительно на Linux. Это приведёт к тому, что в WSL, без дополнительных усилий со стороны пользователя, сможет работать всё больше и больше приложений.
Ещё один интересующий нас вопрос — это производительность. Как уже было сказано, поддержка GPU в WSL 2 серьёзно использует технологию GPU-PV. Это может плохо повлиять на скорость выполнения небольших задач на GPU, в ситуациях, когда не будет использоваться конвейеризация. Прямо сейчас мы работаем в направлении как можно более сильного сокращения подобных эффектов.
NVML
В исходный пакет драйвера не включена технология NVML, мы стремимся это исправить, планируя добавить в WSL поддержку NVML и поддержку других библиотек.
Мы начали работу с основного драйвера CUDA, что позволит пользователям запускать большую часть существующих CUDA-приложений даже на ранней стадии появления поддержки CUDA в WSL. Но, как оказалось, некоторые контейнеры и приложения используют NVML для получения информации о GPU даже до загрузки CUDA. Именно поэтому добавление поддержки NVML в WSL — это одна из наших первоочередных задач. Вполне возможно то, что скоро мы сможем поделиться хорошими новостями по поводу решения этой задачи.
GPU-контейнеры в WSL
В дополнение к поддержке в WSL 2 DirectX и CUDA, NVIDIA работает над добавлением в WSL 2 поддержки NVIDIA Container Toolkit (раньше эта технология называлась nvidia-docker2). Контейнеризованные GPU-приложения, которые дата-сайентисты создают в расчёте на запуск в локальной или облачной среде Linux, теперь могут, без внесения в них каких-либо изменений, запускаться в WSL 2, на компьютерах, работающих под управлением Windows.
Каких-то особых пакетов WSL для этого не требуется. Библиотека времени выполнения NVIDIA (libnvidia-container) может динамически обнаруживать библиотеку libdxcore и пользоваться ей в ситуации, когда код выполняется в WSL 2-среде с поддержкой GPU-ускорения. Это происходит автоматически, после установки пакетов Docker и NVIDIA Container Toolkit, так же, как и на Linux. Это позволяет, без дополнительных усилий, запускать в WSL 2 контейнеры, в которых используются возможности GPU.
Мы настоятельно рекомендуем тем, кто хочет пользоваться опцией --gpus
, установить последнюю версию инструментов Docker (19.03 или свежее). Для того чтобы включить поддержку WSL 2, следуйте инструкциям для вашего дистрибутива Linux и установите самую свежую из доступных версий nvidia-container-toolkit
.
Как это работает? Все задачи, характерные для WSL 2, решаются средствами библиотеки libnvidia-container. Теперь эта библиотека может, во время выполнения, обнаруживать присутствие libdxcore.so и использовать эту библиотеку для обнаружения всех GPU, видимых этому интерфейсу.
Если эти GPU нужно использовать в контейнере, то, с помощью libdxcore.so, выполняется обращение к месту хранения драйверов, к папке, которая содержит все библиотеки драйверов для хост-системы Windows и WSL 2. Библиотека libnvidia-container.so отвечает за настройку контейнера таким образом, чтобы можно было бы корректно обратиться к хранилищу драйверов. Эта же библиотека отвечает за настройку базовых библиотек, поддерживаемых WSL 2. Схема этого показана на следующем рисунке.
Схема обнаружения и отображения в контейнер хранилища драйверов, используемая libnvidia-container.so в WSL 2
Кроме того, это отличается от логики, используемой за пределами WSL. Этот процесс полностью абстрагирован с помощью libnvidia-container.so и он, для конечного пользователя, должен быть как можно прозрачнее. Одно из ограничений этой ранней версии заключается в невозможности выбора GPU в окружениях, в которых имеется несколько GPU. В контейнере всегда видны все GPU.
В WSL-контейнере можно запустить любые Linux-контейнеры NVIDIA, с которыми вы уже знакомы. NVIDIA поддерживает самые интересные инструменты и рабочие процессы, характерные для Linux и используемые профессионалами. Загрузите интересующий вас контейнер из NVIDIA NGC и испытайте его.
Сейчас мы расскажем о том, как запускать в WSL 2 контейнеры TensorFlow и N-body, рассчитанные на использование GPU NVIDIA для ускорения вычислений.
Запуск контейнера N-body
Установим Docker, воспользовавшись скриптом установки:
user@PCName:/mnt/c$ curl https://get.docker.com | sh
Установим NVIDIA Container Toolkit. Поддержка WSL 2 доступна, начиная с nvidia-docker2 v2.3 и с библиотеки времени выполнения libnvidia-container 1.2.0-rc.1.
Настроим репозитории stable
и experimental
и GPG-ключ. Изменения в коде времени выполнения, рассчитанные на поддержку WSL 2, доступны в экспериментальном репозитории.
user@PCName:/mnt/c$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
user@PCName:/mnt/c$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
user@PCName:/mnt/c$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
user@PCName:/mnt/c$ curl -s -L https://nvidia.github.io/libnvidia-container/experimental/$distribution/libnvidia-container-experimental.list | sudo tee /etc/apt/sources.list.d/libnvidia-container-experimental.list
Установим пакеты времени выполнения NVIDIA и их зависимости:
user@PCName:/mnt/c$ sudo apt-get update
user@PCName:/mnt/c$ sudo apt-get install -y nvidia-docker2
Откроем WSL-контейнер и запустим в нём демон Docker. Если всё сделано правильно — после этого можно будет увидеть служебные сообщения dockerd
.
user@PCName:/mnt/c$ sudo dockerd
Запуск демона Docker
В другом окне WSL загрузим и запустим контейнер симуляции N-body. Нужно, чтобы у пользователя, выполняющего эту задачу, было бы достаточно полномочий для загрузки контейнера. Следующие команды может потребоваться запустить с использованием sudo. В выводимых данных можно увидеть сведения о GPU.
user@PCName:/mnt/c$ docker run --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark
Запуск контейнера N-body
Запуск контейнера TensorFlow
Испытаем в Docker, в среде WSL 2, ещё один популярный контейнер — TensorFlow.
Загрузим Docker-образ TensorFlow. Для того чтобы избежать проблем с подключением к Docker, выполним следующую команду в режиме sudo:
user@PCName:/mnt/c$ docker pull tensorflow/tensorflow:latest-gpu-py3
Сохраним немного изменённую версию кода из 15 урока руководства по TensorFlow, посвящённого использованию GPU, на диск C
хост-системы. Этот диск, по умолчанию, монтируется в контейнере WSL 2 как /mnt/c
.
user@PCName:/mnt/c$ vi ./matmul.py
import sys
import numpy as np
import tensorflow as tf
from datetime import datetime
device_name = sys.argv[1] # Choose device from cmd line. Options: gpu or cpu
shape = (int(sys.argv[2]), int(sys.argv[2]))
if device_name == "gpu":
device_name = "/gpu:0"
else:
device_name = "/cpu:0"
tf.compat.v1.disable_eager_execution()
with tf.device(device_name):
random_matrix = tf.random.uniform(shape=shape, minval=0, maxval=1)
dot_operation = tf.matmul(random_matrix, tf.transpose(random_matrix))
sum_operation = tf.reduce_sum(dot_operation)
startTime = datetime.now()
with tf.compat.v1.Session(config=tf.compat.v1.ConfigProto(log_device_placement=True)) as session:
result = session.run(sum_operation)
print(result)
# Вывод результатов
print("Shape:", shape, "Device:", device_name)
print("Time taken:", datetime.now() - startTime)
Ниже показаны результаты выполнения этого скрипта, запущенного со смонтированного в контейнере диска C
. Скрипт выполнялся, сначала, с использованием GPU, а потом — с использованием CPU. Для удобства объём представленных здесь выходных данных сокращён.
user@PCName:/mnt/c$ docker run --runtime=nvidia --rm -ti -v "${PWD}:/mnt/c" tensorflow/tensorflow:latest-gpu-jupyter python /mnt/c/matmul.py gpu 20000
Результаты выполнения скрипта matmul.py
При использовании GPU в WSL 2-контейнере наблюдается значительное ускорение выполнения кода в сравнении с его выполнением на CPU.
Проведём ещё один эксперимент, рассчитанный на исследование производительности GPU-вычислений. Речь идёт о коде из руководства по Jupyter Notebook. После запуска контейнера вы должны увидеть ссылку на сервер Jupyter Notebook.
user@PCName:/mnt/c$ docker run -it --gpus all -p 8888:8888 tensorflow/tensorflow:latest-gpu-py3-jupyter
Запуск Jupyter Notebook
Теперь у вас должна появиться возможность запускать демонстрационные примеры в среде Jupyter Notebook. Обратите внимание на то, то, что для подключения к Jupyter Notebook с использованием браузера Microsoft Edge, нужно, вместо 127.0.0.1, использовать localhost
.
Перейдите в tensorflow-tutorials
и запустите блокнот classification.ipynb
.
Для того чтобы увидеть результаты ускорения вычислений с помощью GPU, перейдите в меню Cell
, выберите Run All
и посмотрите журнал в WSL 2-контейнере Jupyter Notebook.
Журнал Jupyter Notebook
Этот демонстрационный пример, да и некоторые другие в данном контейнере, позволяют увидеть проблемы со слоем виртуализации, относящиеся к неоправданно высокой дополнительной нагрузке на систему при решении небольших задач. Выше мы уже говорили об этом. Так как мы запускаем тут очень маленькие учебные модели, время их выполнения на GPU меньше времени, необходимого на решение задач синхронизации. При решении таких вот «игрушечных» задач в WSL 2, CPU может оказаться эффективнее GPU. Мы занимаемся решением этой проблемы, стремясь ограничить её проявления лишь совсем небольшими рабочими нагрузками, к которым не применяется конвейеризация.
Обзор WSL
Для того чтобы понять то, как поддержка GPU была добавлена в WSL 2, сейчас мы поговорим о том, что собой представляет запуск Linux на Windows, и о том, как контейнеры видят аппаратное обеспечение.
Компания Microsoft представила технологию WSL на конференции Build в 2016 году. Эта технология быстро нашла широкое применение и стала популярной в среде Linux-разработчиков, которым нужно было запускать Windows-приложения, вроде Office, вместе с инструментами разработки для Linux и соответствующими программами.
Система WSL 1 позволяла запускать немодифицированные исполняемые файлы Linux. Однако здесь использовался слой эмуляции ядра Linux, который был реализован в виде подсистемы ядра NT. Эта подсистема обрабатывала вызовы, поступающие от Linux-приложений, перенаправляя их соответствующим механизмам Windows 10.
Система WSL 1 была полезным инструментом, но она не была совместима со всеми Linux-приложениям, так как ей требовалось эмулировать абсолютно все системные вызовы Linux. Кроме того, медленными были операции по работе с файловой системой, что приводило к недопустимо низкой производительности некоторых приложений.
Учитывая это, Microsoft решила пойти другим путём и выпустила WSL 2 — новую версию WSL. Контейнеры WSL 2 выполняют полные Linux-дистрибутивы в виртуализованном окружении, но при этом используют все полезные возможности новой системы контейнеризации Windows 10.
В то время как WSL 2 использует Hyper-V-сервисы Windows 10, это — не традиционная виртуальная машина, а, скорее, легковесный вспомогательный механизм виртуализации. Этот механизм отвечает за управление виртуальной памятью, связанной с физической памятью, позволяя WSL 2-контейнерам динамически выделять память, обращаясь к хост-системе Windows.
Среди основных целей создания WSL 2 можно отметить увеличение производительности работы с файловой системой и обеспечение совместимости со всеми системными вызовами. Кроме того, WSL 2 создавали, стремясь улучшить уровень интеграции WSL и Windows. Это позволяет удобно работать с Linux-системой, выполняемой в контейнере, пользуясь средствами командной строки Windows. Это, кроме того, повышает удобство работы с файловой системой хоста, автоматически монтируемой в выбранные директории файловой системы контейнера.
WSL 2 была представлена в Windows Insider Program в виде Preview-возможности и была выпущена в самом свежем обновлении Windows 10, в версии 2004.
В WSL 2 из самой свежей версии Windows внесено ещё больше улучшений, которые затрагивают много всего — от сетевых стеков, до базовых VHD-механизмов системы хранения данных. Описание всех новых возможностей WSL 2 выходит за рамки этого материала. Подробнее о них можно узнать на этой странице, где приводится сравнение WSL 2 и WSL 1.
Linux-ядро WSL 2
Ядро Linux, применяемое в WSL 2, собрано Microsoft на основе самой свежей стабильной ветки, с использованием исходного кода, доступного на kernel.org. Это ядро было специально настроено для WSL 2, оптимизировано с точки зрения размеров и производительности с целью обеспечения работы Linux в среде Windows. Ядро поддерживается через механизм Windows Update. Это значит, что пользователю не нужно заботиться о том, чтобы загружать последние обновления безопасности и улучшения ядра. Всё это делается автоматически.
Microsoft поддерживает в WSL несколько дистрибутивов Linux. Компания, следуя правилам опенсорс-сообщества, опубликовала в GitHub-репозитории WSL2-Linux-Kernel исходный код ядра WSL 2 с модификациями, необходимыми для интеграции с Windows 10.
Поддержка GPU в WSL
Разработчики Microsoft добавили в WSL 2-контейнеры поддержку реальных GPU с использованием технологии GPU-PV. Здесь графическое ядро операционной системы (dxgkrnl) маршалирует драйверу режима ядра, который находится на хосте, вызовы от компонентов пользовательского режима, выполняемых в гостевой виртуальной машине.
Компания Microsoft разработала эту технологию в виде возможности WDDM, с момента её появления вышло уже несколько релизов Windows. Эта работа была проведена с привлечением независимых производителей аппаратного обеспечения (Independent Hardware Vendor, IHV). Графические драйверы NVIDIA поддерживали GPU-PV начиная с ранних дней появления этой технологии в Preview-версиях продуктов, доступных в Windows Insider Program. Все GPU NVIDIA, поддерживаемые в настоящий момент, могут быть доступны ОС Windows, выполняемой в гостевом режиме, в виртуальной машине, использующей Hyper-V.
Для того чтобы в WSL 2 можно было бы пользоваться возможностями GPU-PV, Microsoft пришлось создать базу своего графического фреймворка для гостевой системы Linux: WDDM с поддержкой протокола GPU-PV. Новый драйвер Microsoft находится за dxgkrnl, за системой, отвечающей за поддержку WDDM в Linux. Код драйвера можно найти в репозитории WSL2-Linux-Kernel.
Ожидается, что dxgkrnl обеспечит поддержку GPU-ускорения в контейнерах WSL 2 в WDDM 2.9. Microsoft говорит о том, что dxgkrnl — это GPU-драйвер Linux, основанный на протоколе GPU-PV, и о том, что у него нет ничего общего с Windows-драйвером, имеющим похожее имя.
В настоящее время вы можете загрузить Preview-версию драйвера NVIDIA WDDM 2.9. В ближайшие несколько месяцев этот драйвер будет распространяться через Windows Update в WIP-версии Windows, что делает ненужными ручную загрузку и установку драйвера.
Основные сведения о GPU-PV
Драйвер dxgkrnl делает доступным, в пользовательском режиме гостевой системы Linux, новое устройство /dev/dxg. Сервисный слой ядра D3DKMT, который был доступен в Windows, тоже был портирован, как часть библиотеки dxcore, на Linux. Он взаимодействует с dxgkrnl, используя набор частных IOCTL-вызовов.
Гостевая Linux-версия dxgkrnl подключаются к ядру dxg на Windows-хосте, используя несколько каналов шины VM. Ядро dxg на хосте обрабатывает то, что ему приходит от Linux-процесса, так же, как то, что приходит от обычных Windows-приложений, использующих WDDM. А именно, ядро dxg отправляет то, что получило, KMD (Kernel Mode Driver, драйверу режима ядра, уникальному для каждого HIV). Драйвер режима ядра подготавливает то, что получил, для отправки аппаратному графическому ускорителю. На следующем рисунке показана упрощённая схема взаимодействия Linux-устройства /dev/dxg и KMD.
Упрощённая схема, иллюстрирующая то, как компоненты Windows-хоста обеспечивают работу устройства dxg в гостевой системе Linux
Если говорить об обеспечении подобной схемы работы в гостевых системах Windows, то можно сказать, что драйверы NVIDIA поддерживают GPU-PV в Windows 10 уже довольно давно. GPU NVIDIA могут быть использованы для ускорения вычислений и вывода графики во всех Windows 10-приложениях, использующих слой виртуализации Microsoft. Использование GPU-PV позволяет и работать с vGPU. Вот несколько примеров подобных приложений:
- Windows Sandbox
- Microsoft Defender Application Guard
- Эмулятор Microsoft HoloLens 2
Вот как выглядит запуск DirectX-приложения в контейнере Windows Sandbox с применением видеоускорителя NVIDIA GeForce GTX 1070.
В контейнере Windows Sandbox ускорение графики выполняется средствами NVIDIA GeForce GTX 1070
Поддержка пользовательского режима
Для того чтобы добавить в WSL поддержку вывода графики, соответствующая команда разработчиков из Microsoft, кроме того, портировала на Linux компонент пользовательского режима dxcore.
Библиотека dxcore предоставляет API, который позволяет получать сведения об имеющихся в системе графических адаптерах, совместимых с WDDM. Эту библиотеку задумывали как кросс-платформенную низкоуровневую замену для средства работы с DXGI-адаптерами в Windows и Linux. Библиотека, кроме того, абстрагирует доступ к сервисам dxgkrnl (IOCTL-вызовы в Linux и GDI-вызовы в Windows), используя слой API D3DKMT, который используется CUDA и другими компонентами пользовательского режима, полагающимися на поддержку WDDM в WSL.
По сведениям Microsoft, библиотека dxcore (libdxcore.so) будет доступна и в Windows, и в Linux. NVIDIA планирует добавить в драйвер поддержку DirectX 12 и API CUDA. Эти дополнения нацелены на новые возможности WSL, доступные благодаря WDDM 2.9. Обе библиотеки, представляющие API, будут подключены к dxcore для того чтобы они могли бы давать dxg указания по поводу маршалирования их запросов к KMD на хост-системе.
Попробуйте новые возможности WSL 2
Хотите использовать свой Windows-компьютер для решения настоящих задач из сфер машинного обучения и искусственного интеллекта, и при этом пользоваться всеми удобствами Linux-окружения? Если так, то поддержка CUDA в WSL даёт вам отличную возможность это сделать. Среда WSL — это то место, где Docker-контейнеры CUDA показали себя как самое популярное среди дата-сайентистов вычислительное окружение.
- Для того чтобы получить доступ к Preview-версии WSL 2 с поддержкой GPU-ускорения, вы можете присоединиться к Windows Insider Program.
- Загрузите свежие драйверы NVIDIA, установите их и попробуйте запустить в WSL 2 какой-нибудь CUDA-контейнер.
Здесь можно узнать подробности о применении технологии CUDA в WSL. Здесь, на форуме, посвящённом CUDA и WSL, вы можете поделиться с нами вашими впечатлениями, наблюдениями и идеями об этих технологиях.
А вы уже пробовали CUDA в WSL 2?