Если вы являетесь пользователем ML.NET и хотите обучать свои модели на графических процессорах, вы можете обнаружить, что у вас есть ограниченные возможности, которые легко использовать. Если у вас есть настольный компьютер, поддерживающий видеокарты Nvidia GPU, вам повезло! Если вы окажетесь за «обычным» настольным компьютером или ноутбуком, вы застрянете на тренировке процессора, что не очень весело. Конечно, есть варианты, такие как запуск виртуальной машины в облаке или использование такой службы, как Azure Machine Learning Studio, но даже в этом случае есть препятствия, через которые нужно пройти. В этом посте мы рассмотрим, как вы можете использовать Google Colab, чтобы не только обучать свои модели ML.NET, но и быстро.

Этот пост посвящен непосредственно запуску ML.NET в Colab. Мы не будем беспокоиться о том, почему вы хотите это сделать, хотя есть много веских причин, по которым Colab имеет смысл для ваших рабочих нагрузок ML.NET.

Полное видеообзор этого поста можно найти на странице Практическая группа пользователей ML.NET на YouTube здесь. Пожалуйста, поставьте лайк и подпишитесь! Репозиторий GitHub можно найти здесь.

ML.NET в Google Colab Quickstart

Colab немного отличается от некоторых других более популярных бесплатных платформ машинного обучения, таких как Kaggle или Gradient Notebooks. Colab предлагает немного менее ограничительную среду, то есть мы можем установить .NET и ML.NET в сеанс Colab. Это просто невозможно, например, в Kaggle или Gradient. Однако не думайте, что вы можете установить что-либо там. Например, вы не можете установить Docker и запустить контейнеры, так что это не бесплатно для всех.

Если вы новичок в Colab, это очень просто и понятно. Все запускается с вашего Google Диска, поэтому просто откройте свой Диск и с помощью кнопки «НОВОЕ» выберите параметр «Дополнительно» в раскрывающемся списке, затем выберите «Google Colaboratory».

Это создаст новую записную книжку «.ipynb» на вашем Диске, а также откроет ее в Colab для вас. Для установки .NET и ML.NET достаточно создать новую записную книжку и выполнить следующие команды:

! wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb \
&& dpkg -i packages-microsoft-prod.deb \
&& add-apt-repository universe \
&& apt-get update \
&& apt-get install apt-transport-https \
&& apt-get update \
&& apt-get install dotnet-sdk-6.0 \
&& dotnet tool install -g mlnet

Эти команды установят .NET, в нашем случае .NET 6, а также последнюю версию ML.NET. Они должны работать успешно, после чего вы можете ввести команду dotnet --version, чтобы убедиться, что все работает правильно. Это очень просто, и на данный момент у вас есть среда Colab, в которой вы можете начать работать с .NET. Например, если вы просто хотите начать работу с Auto ML, все готово. Единственный недостаток… вы будете делать это только на процессорах. Мы хотим использовать всю мощь графического процессора, доступного нам в Colab. Итак, давайте разбираться, как это сделать.

Репозиторий и код GitHub

Репозиторий кода, который мы используем, представляет собой модифицированную версию примера Binary Deep Learning Image Classification из репозитория примеров машинного обучения .NET на GitHub. Код в основном классифицирует изображения бетонных поверхностей по одной из двух категорий: с трещинами и без трещин. Это простой пример бинарной классификации, и в их наборе данных около 400 изображений. Вы можете просмотреть код для этого поста здесь.

Мы не будем разбирать код, так как этот пост посвящен запуску этого кода на графических процессорах, а не тому, что потребовалось для его написания. Однако между моим репозиторием и примером Microsoft вы все готовы изучить более мелкие детали.

Необходимые условия для использования графических процессоров

Мы кратко рассмотрим каждый элемент в следующих разделах, и вы снова увидите их все, когда заглянете в нашу записную книжку Colab, в которой также есть подробные комментарии в каждом разделе.

Существует несколько требований для обучения на графических процессорах с использованием ML.NET. Как упоминалось выше, обучение работе с процессорами чрезвычайно просто: просто установите ML.NET и приступайте к работе. Есть несколько препятствий для графических процессоров, к счастью, они не слишком велики.

CUDA v10.1 и CUDNN v7.6.4

Первое требование, которое вы найдете в Документах по классификации изображений, — это CUDA и CUDNN. Вам необходимо убедиться, что в вашей среде установлены CUDA v10.1 и CUDNN v7.6.4 или выше. Важно отметить, что это минимальные требования, если у вас более высокая версия, это нормально. Например, на момент написания этой статьи в Google Colab была установлена ​​CUDA версии 11.2. Из Документации CUDA Драйверы всегда были обратно совместимы с CUDA. Также важно отметить, что это, скорее всего, только в случае использования ML.NET API, поскольку Auto ML, по-видимому, имеет требование на 10.1, скорее всего, из-за версииTensorflow это связано с.

SciSharp.TensorFlow.Redist-Linux-GPU

Google Colab работает в среде Ubuntu, поэтому нам нужно убедиться, что у нас установлен правильный пакет SciSharp.TensorFlow.Redist. Давайте посмотрим на файл .csproj для кода:

<ItemGroup>
    <!-- CPU version, use on MacOS or Windows without GPU card -->
    <!-- <PackageReference Include="SciSharp.TensorFlow.Redist" Version="2.3.1" /> -->
<!-- Windows GPU version, use on Windows with GPU card -->
    <!-- <PackageReference Include="SciSharp.TensorFlow.Redist-Windows-GPU" Version="2.6.0" /> -->
<!-- Linux GPU version, use on Linux with GPU card -->
    <PackageReference Include="SciSharp.TensorFlow.Redist-Linux-GPU" Version="2.5.0" ExcludeAssets="native" />
  </ItemGroup>

Как видите, мы ссылаемся на все версии SciSharp.TensorFlow.Redist, в основном для поддержки локальной разработки, а также для работы в Colab. Все остальные версии закомментированы, за исключением пакета Linux GPU, который нам нужно собрать для работы в Colab.

Обратите внимание на дополнение ExcludeAssets="native" к ссылке на пакет. Это указывает .NET не включать какую-либо версию Tensorflow в случае этого пакета. Причина этого в том, что при запуске нового сеанса Colab вы, скорее всего, получите последнюю версию Tensorflow в своей среде. На момент написания этого поста мы получали Tensorflow 2.7. Нам нужно контролировать установленную версию Tensorflow, чтобы она соответствовала ожиданиям пакета SciSharp. Это проще сделать, когда в игру не вступают лишние бинарники. Мы рассмотрим это более подробно позже в нашем блокноте Colab.

Библиотеки Libtensorflow C

Эти библиотеки необходимы для правильной работы SciSharp и не будут изначально присутствовать в вашей среде Colab. К счастью, их можно легко загрузить с сайта Tensorflow здесь. После того, как мы загрузили и установили библиотеки, нам нужно настроить компоновщик с помощью ldconfig, а также установить пару переменных среды.

libgdiplus и libc6-dev

Наконец, нам нужно убедиться, что установлены еще два пакета для поддержки классификации изображений. К счастью, один из них, libc6-dev, уже должен быть там, но если вы хотите снова установить оба, это ничего не повредит.

Постановка нашего кода

Прежде чем мы углубимся в блокнот Colab, давайте поговорим о том, как мы подготавливаем наш код для запуска в Colab.

Использование Google Диска

Поскольку мы будем использовать Google Colab, неудивительно, что мы размещаем наш код на Google Диске. Ноутбуки безумно легко запускать с Диска, как мы видели раньше, и также просто подключить наш Диск к сеансу Colab, как мы вскоре увидим. Вы захотите войти в Google и открыть свой Диск. Создайте новую папку для своего кода и загрузите Блокнот, расположенный здесь. Это учебная тетрадь, которую мы будем использовать для нашего кода.

Публикация для Linux

Нам нужно опубликовать наш обучающий код для нашей среды Linux. Поскольку мы будем перемещать код (загружать на Диск), я предпочитаю использовать публикацию одного файла. Следующая команда опубликует один файл в режиме выпуска без символов отладки:

dotnet publish -o ColabOutput -c Release -r linux-x64 --self-contained true -p:PublishSingleFile=true /p:DebugType=None /p:DebugSymbols=false

Эта команда также будет опубликована в папке «ColabOutput», что значительно упрощает загрузку. Просто зайдите в свою новую папку на Диске, щелкните правой кнопкой мыши в любом месте и выберите «Загрузить папку».

Набор данных изображений

Поскольку мы делаем тренировочное упражнение по классификации изображений, нам понадобятся изображения! Все изображения, необходимые для этого примера, находятся здесь. Они взяты непосредственно из примера глубокого обучения .NET без каких-либо изменений. Просто заархивируйте весь каталог Images, который включает в себя подкаталоги UD и CD. Загрузите этот zip-файл на свой диск, так как он понадобится нам позже в нашем блокноте Colab.

CSV-файл набора данных изображений

Вы можете найти блокнот Jupyter в репозитории, который использовался для создания CSV-файла нашего набора данных, или просто использовать готовый блокнот, расположенный здесь. Блокнот представляет собой очень простую (не оптимизированную) коллекцию всех изображений вместе с их метками. Полученный CSV-файл имеет два столбца: ImagePath и Label. Как вы можете видеть в столбце ImagePath ниже, все пути к изображениям имеют ../Images в начале, поэтому важно заархивировать весь каталог Images на этом уровне.

В данный момент нам не нужно загружать CSV на Диск. Причина этого в том, что любой файл CSV, загруженный на Диск через пользовательский интерфейс Google, будет автоматически преобразован в формат Google Sheets. Это не будет работать с нашим кодом. К счастью, Jupyter Notebooks предлагает способ загрузки файлов, поэтому мы можем легко обойти этот шаг и получить ошибку.

Блокнот Колаб

Теперь, когда наш код опубликован и все наши данные подготовлены, мы можем погрузиться в блокнот Colab, который находится здесь. Как только это будет загружено на ваш Диск, просто щелкните его правой кнопкой мыши и выберите Открыть с помощью => Google Colaboratory. Это запустит Блокнот в Colab, как показано ниже:

Настройка вашей среды

Прежде чем что-либо делать в этом ноутбуке, нам нужно убедиться, что мы настроены на использование графических процессоров. Вы можете сделать это из меню в верхней части страницы и выбрать «Время выполнения => Изменить тип времени выполнения». Это откроет модальное диалоговое окно, подобное приведенному ниже:

В разделе «Аппаратный ускоритель» убедитесь, что выбран графический процессор. У вас должны быть варианты None (CPU), GPU и TPU. Нам нужен GPU, поэтому выберите это. ПРИМЕЧАНИЕ. Я использую Colab Pro, который дает мне опцию «Форма времени выполнения». Вы можете не увидеть это, если вы используете бесплатную версию, однако, если у вас есть возможность выбрать «High-RAM», я имею в виду… почему бы и нет?

Проверьте настройки CUDA

Первое, что нам нужно сделать, это проверить наши настройки CUDA в нашем сеансе Colab, мы можем сделать это, выполнив следующие команды:

! uname -m
! lscpu
! cat /proc/meminfo
! nvcc --version
! nvidia-smi

Это покажет нам гораздо больше, чем просто версию CUDA, если это единственное, что вы хотите увидеть, то вы можете просто запустить ! nvidia-smi, чтобы проверить это, и вы должны увидеть следующее, если все установлено правильно:

+-----------------------------------------------------------------------------+ | NVIDIA-SMI 495.44       Driver Version: 460.32.03    CUDA Version: 11.2     | |-------------------------------+----------------------+----------------------+ | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC | | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. | |                               |                      |               MIG M. | |===============================+======================+======================| |   0  Tesla P100-PCIE...  Off  | 00000000:00:04.0 Off |                    0 | | N/A   37C    P0    28W / 250W |      0MiB / 16280MiB |      0%      Default | |                               |                      |                  N/A | +-------------------------------+----------------------+----------------------+                                                                                 +-----------------------------------------------------------------------------+ | Processes:                                                                  | |  GPU   GI   CI        PID   Type   Process name                  GPU Memory | |        ID   ID                                                   Usage      | |=============================================================================| |  No running processes found                                                 | +-----------------------------------------------------------------------------+

Из этой информации мы видим, что у нас CUDA версии 11.2, а также у нас есть доступ к графическому процессору Tesla P100. Если вы не получили такого вывода, просто зайдите в меню и выберите «Время выполнения => Сбросить время выполнения до заводских». Это удалит все, что вы сделали, и сбросит сеанс Colab. Очень важно сделать этот шаг, так как иногда среда будет запускаться, а CUDA будет вам недоступна. Это то, что вы хотите узнать и исправить немедленно, а не тогда, когда вы собираетесь запускать свой обучающий код!

Удалите Tensorflow 2.7 и установите Tensorflow 2.3.1

Как мы говорили ранее, нам нужно контролировать версию Tensorflow, установленную в нашей среде. На момент написания этой статьи SciSharp ожидает, что будет установлена ​​версия Tensorflow 2.3.1. Если у вас не установлен Tensorflow или неверная версия, то при обучении вы получите ошибку, что Tensorflow не может быть найден. Поэтому очень важно убедиться, что у вас установлены правильные версии. Мы можем сделать это с помощью следующих команд:

! pip uninstall --yes tensorflow
! pip install tensorflow==2.3.1
! pip install tensorflow-gpu==2.3.1

Сначала мы удаляем любую установленную версию Tensorflow, в нашем случае это была 2.7. После этого мы устанавливаем 2.3.1, а также версию 2.3.1 для графического процессора. После их запуска вы можете получить предупреждающее сообщение о том, что вам нужно перезапустить, чтобы использовать новую версию Tensorflow. Вы можете смело игнорировать это. Мы можем убедиться в этом, выполнив следующие команды:

! pip show tensorflow
import tensorflow as tf
print(tf.__version__)
print(tf.test.gpu_device_name())
print("Num GPUs Available: ", len(tf.config.experimental.list_physical_devices('GPU')))

Эти команды просто проверяют работоспособность, чтобы убедиться, что установлена ​​правильная версия Tensorflow. Выполнение этих команд должно привести к следующему результату:

Name: tensorflow
Version: 2.3.1
Summary: TensorFlow is an open source machine learning framework for everyone.
Home-page: https://www.tensorflow.org/
Author: Google Inc.
Author-email: [email protected]
License: Apache 2.0
Location: /usr/local/lib/python3.7/dist-packages
Requires: numpy, protobuf, keras-preprocessing, tensorflow-estimator, absl-py, astunparse, tensorboard, h5py, gast, grpcio, six, opt-einsum, wrapt, google-pasta, termcolor, wheel
Required-by: kapre
2.3.1
/device:GPU:0
Num GPUs Available:  1

Как видите, теперь у нас установлена ​​версия 2.3.1, и нам не нужно было перезапускать нашу сессию. Это также показывает нам, что у нас есть 1 GPU, доступный для использования. Теперь, когда установлена ​​правильная версия Tensorflow, мы можем двигаться дальше.

libgdiplus и libc6-dev

Как упоминалось выше, нам нужно установить libgdiplus и libc6-dev для классификации изображений, что можно сделать с помощью следующих команд:

! sudo apt install libc6-dev
! sudo apt install libgdiplus

Библиотеки Libtensorflow C

Затем мы устанавливаем библиотеки Libtensorflow C, как указано выше. Это можно сделать с помощью следующих команд:

! wget -q https://storage.googleapis.com/tensorflow/libtensorflow/libtensorflow-gpu-linux-x86_64-2.3.1.tar.gz
! sudo tar -C /usr/local -xzf libtensorflow-gpu-linux-x86_64-2.3.1.tar.gz
! sudo ldconfig
%env LIBRARY_PATH=$LIBRARY_PATH:/usr/local
%env LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local

Сначала мы просто загружаем заархивированные библиотеки в наш текущий каталог. Далее разархивируем их в каталог /usr/local. Вы должны иметь возможность разместить их где угодно, но это сработало для меня. Затем мы настраиваем компоновщик, запустив ldconfig, затем добавляем /user/local в переменную окружения LIBRARY_PATH, чтобы Tensorflow мог их найти. На этом вся наша настройка Tensorflow завершена, и мы можем перейти к установке .NET и ML.NET.

.NET и МЛ.NET

Мы уже видели эти команды, но обратимся к ним еще раз для непрерывности:

! wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb \
&& dpkg -i packages-microsoft-prod.deb \
&& add-apt-repository universe \
&& apt-get update \
&& apt-get install apt-transport-https \
&& apt-get update \
&& apt-get install dotnet-sdk-6.0 \
&& dotnet tool install -g mlnet

Подготовка данных

Далее нам нужно перенести наши тренировочные данные в наш сеанс Colab. Первое, что нам нужно сделать, это подключить наш диск к нашему сеансу, выполнив следующие команды:

from google.colab import drive
drive.mount('/content/drive')

Выполнение этой команды вызовет модальное диалоговое окно с вопросом, хотите ли вы разрешить доступ к своим файлам на Google Диске:

Нажмите «Подключиться к Google Диску», чтобы начать попытку OAuth, где вам нужно будет выбрать учетную запись Google, которую вы хотите подключить, а также согласиться с разрешениями, необходимыми Colab для подключения. Как только это будет сделано, теперь мы можем разархивировать наш набор данных изображений в нашу сессию:

! unzip -qq /content/drive/MyDrive/YOUR_FOLDER/Images.zip

Это простая команда unzip, передающая -qq, чтобы избежать любого вывода, поскольку в зависимости от количества изображений, которые у вас есть, это может быть довольно болтливым. Поскольку мы заархивировали каталог «Images», эта команда оставит нам идентичный каталог «Images» в нашем сеансе Colab со всеми нашими изображениями. Для проверки работоспособности мы можем подсчитать изображения, чтобы убедиться, что мы получили то, что ожидали:

! ls Images/CD/ | wc -l
! ls Images/UD/ | wc -l

В нашем случае это должно вывести 200 и 200, так как у нас всего 400 изображений, по 200 в каждой папке. Теперь, когда у нас есть изображения, давайте также загрузим наш CSV-файл в Colab. Мы можем сделать это с помощью следующих команд:

from google.colab import files
uploaded = files.upload()

Это удобный способ загрузить любые дополнительные файлы, которые могут вам понадобиться, и в нашем случае способ обойти преобразования Google Таблиц для .csv файлов. Выполнение этой команды откроет следующую опцию для загрузки файла:

Нажмите кнопку «Выбрать файлы» и выберите CSV, в котором есть данные нашего набора данных. После загрузки нам нужно переместить наш файл .csv в папку «Изображения»:

! mv training_data.csv Images/

Наш обучающий код предполагает, что CSV-файл будет находиться в корне папки «Изображения». Если вы не сможете его переместить, вы получите сообщение об ошибке «Файл не найден» после начала обучения. Теперь, когда наши изображения и CSV-файл подготовлены, мы можем подготовить наш код.

Подготовка кода

Постановка кода очень похожа на перемещение данных изображений. Поскольку наш Диск подключен к нашему сеансу Colab, мы можем выполнить следующие команды:

! rm -rf ColabOutput/
! cp -a /content/drive/MyDrive/YOUR_FOLDER/ColabOutput/ .
! chmod -R 777 ColabOutput/
! ls ColabOutput/

Давайте разберем их один за другим:

  • Во-первых, мы удаляем любой предыдущий промежуточный код. В нашем случае мы опубликовали наш код локально в выходной каталог под названием «ColabOutput», и это то, что мы скопируем в Colab. Просто чтобы быть чистым и безопасным, мы выдаем команду rm для удаления этого каталога, если он уже существует.
  • Затем мы копируем весь каталог «ColabOutput», чтобы упростить себе задачу.
  • Мы должны выполнить chmod, иначе мы получим ошибку «отказано в доступе», когда попытаемся запустить наш обучающий код.
  • Наконец, мы выполняем проверку работоспособности с помощью команды ls, чтобы визуально убедиться, что весь наш код прошел проверку.

Обучение модели

Теперь, когда наши данные и наш код подготовлены, мы можем начать обучение с помощью следующей команды:

! ./ColabOutput/App --train --folder="Images" --file="training_data.csv"

Наше приложение представляет собой простое консольное приложение, которое мы можем запускать по запросу для обучения. Мы используем NuGet-пакет CommandLineParser, чтобы упростить передачу аргументов. В этом случае у нас есть следующие аргументы:

  • train : это базовая команда, которая просто указывает коду выполнить обучение.
  • folder : указывает каталог, в котором находятся изображения и файл CSV.
  • file : Предоставляет имя CSV-файла на случай, если вы хотите предоставить несколько CSV-файлов с разными данными и т. д.

Ввод этой команды запустит обучение, и нам нужно найти несколько ключевых деталей, чтобы убедиться, что обучение графического процессора действительно происходит:

2021-12-15 17:36:47.138748: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcudart.so.10.1
2021-12-15 17:36:47.174564: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN)to use the following CPU instructions in performance-critical operations:  AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2021-12-15 17:36:47.188574: I tensorflow/core/platform/profile_utils/cpu_utils.cc:104] CPU Frequency: 2299995000 Hz
2021-12-15 17:36:47.188898: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x55c2b3c15d40 initialized for platform Host (this does not guarantee that XLA will be used). Devices:
2021-12-15 17:36:47.188924: I tensorflow/compiler/xla/service/service.cc:176]   StreamExecutor device (0): Host, Default Version
2021-12-15 17:36:47.190962: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcuda.so.1
2021-12-15 17:36:47.195377: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:982] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-12-15 17:36:47.195571: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1716] Found device 0 with properties: 
pciBusID: 0000:00:04.0 name: Tesla P100-PCIE-16GB computeCapability: 6.0
coreClock: 1.3285GHz coreCount: 56 deviceMemorySize: 15.90GiB deviceMemoryBandwidth: 681.88GiB/s

Вы должны увидеть множество журналов Tensorflow, а также строку об устройстве GPU, к которому подключен код. В этом случае:

Tesla P100-PCIE-16GB computeCapability: 6.0
coreClock: 1.3285GHz coreCount: 56 deviceMemorySize: 15.90GiB deviceMemoryBandwidth: 681.88GiB/s

Предполагая, что все было организовано правильно, вы должны начать видеть распечатку журнала обучения, и в конечном итоге, в зависимости от того, сколько у вас данных, будет построена модель.

Код поместит окончательную модель в каталог «ColabOutput» с именем ud-cd-classifier.mdl, и вы сможете скопировать ее обратно на свой диск с помощью следующей команды:

! cp -a ColabOutput/ud-cd-classifier.mdl /content/drive/MyDrive/YOUR_FOLDER/Models/ud-cd-classifier.mdl

Отсюда у вас будет модель классификации изображений ML.NET на вашем Google Диске, которую вы можете скачать и использовать где угодно!

Подведение итогов

В этом посте мы рассмотрели, как вы можете использовать Google Colab для обучения GPU с помощью ML.NET. Я могу честно сказать, что использую эту установку уже несколько недель и очень доволен ею. Определенно есть некоторые препятствия, через которые нужно перепрыгнуть, но они не являются серьезными, и то, что вы получаете, более чем стоит хлопот. В настоящее время я использую Colab Pro и плачу 10 долларов в месяц за эту услугу. Приятно знать, что это жесткое ограничение на расходы, и я могу в значительной степени попасть туда и использовать его в любое время.

Это может не подходить для всех, но для меня, который работает в основном на MacBook Pro (без доступа к графическим процессорам), это отличный вариант для обучения.

Рекомендации