Обучение модели классификации изображений в Azure без локального хранения данных с помощью Dagshub Direct Data Access и Azure ML SDK.

Введение

Машинное обучение и искусственный интеллект стали повсеместными, и одним из ключевых навыков Data Scientist является умение создавать масштабируемые модели, работать с конфиденциальными данными, а также создавать надежные конвейеры данных и моделей, которые воспроизводимы. В то время как облачные технологии позволяют нам создавать масштабируемые конвейеры, нам необходимо хранить все файлы в нашем облаке, прежде чем мы сможем использовать их для обучения моделей, требующих затрат ресурсов графического процессора и времени для извлечения данных.

В этой статье мы собираемся обучить модель в Azure с данными, хранящимися в репозитории Dagshub, с помощью функции Прямой доступ к данным (DDA) от Dagshub, которая позволяет нам извлекать данные партиями, когда это необходимо, — сокращая время, необходимое для извлечения. и хранить данные в Azure, тем самым снижая затраты на GPU.

Мы будем использовать Azure ML SDK, чтобы создать задание обучения прямо с нашего локального компьютера и отправить его в Azure. Мы также увидим, как мы можем контролировать работу прямо из нашего jupyter-ноутбука.

Мы будем использовать данные исследования Kaggle, Mayo Clinic — STRIP AI, где основное внимание уделяется дифференциации двух основных подтипов этиологии острого ишемического инсульта (ОИС): сердечный атеросклероз и атеросклероз крупных артерий. Выявление этиологии инсульта может помочь врачам смягчить последствия повторных инсультов.

Код и данные, использованные в этом анализе, можно найти здесь.



О данных

Данные, изначально представленные для задачи, представлены в формате tiff и имеют размер 356 ГБ. Для целей этого анализа мы уменьшаем изображения и сохраняем их в формате png. Код такого масштабирования данных можно найти здесь. Уменьшенные изображения можно найти здесь. Чтобы сопоставить изображения с классами, к которым они принадлежат, данные о соревнованиях предоставляют нам файл CSV, который содержит информацию о данных. Эти данные можно найти здесь.

Столбец «метка» в наборе обучающих данных состоит из принадлежащих изображений классов. Папка данных поезда состоит из 754 изображений, из которых 547 относятся к классу CE (сердечные) и 207 относятся к классу LAA (атеросклероз крупных артерий). Для нашего анализа мы создали столбец с именем «int_labels», которому присваивается значение 1, если изображение принадлежит классу «LAA», в противном случае ему присваивается значение 0.

Подход

Чтобы использовать Azure для обучения наших моделей, мы будем использовать Azure ML SDK и запускать наш код в Azure. Это потребует от нас создания рабочей области машинного обучения и вычислений на GPU в Azure. Как правило, мы также загружаем наши данные в хранилище Azure и создаем хранилища данных, чтобы рабочая область машинного обучения могла получить доступ к нашим данным. Мы не собираемся хранить данные в Azure, а вместо этого будем передавать данные из репозитория Dagshub.

Чтобы настроить Azure Workspace и создать вычисление с помощью Azure ML SDK, обратитесь здесь.

Dagshub называют «Github для машинного обучения», поскольку он позволяет нам не только поддерживать наш код, но и обеспечивает контроль версий наших данных.

Контроль версий данных (DVC) позволяет нам отслеживать изменения в больших файлах данных подобно тому, как Git помогает нам отслеживать изменения в нашем коде. Чтобы включить DVC, мы можем использовать любое облачное хранилище, такое как AWS, GCP и Azure, что может быть дорого. Подобно тому, как мы выполняем git pull для получения последней версии кода из Git, мы делаем dvc pull для получения данных, версии которых контролируются с помощью DVC. Подобно командам Git, у нас также есть команды dvc push, pull и commit.

Для этого проекта я создал репозиторий на Dagshub и загрузил все свои файлы данных и код. Все файлы и папки, использующие DVC, отмечены в репозитории как DVC.

Как только мы отправим данные в Dagshub, мы создадим сценарии, которые будут использовать функцию потоковой передачи из DDA для извлечения данных из репозитория без необходимости выполнять вытягивание dvc, что может занять больше времени.

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

Традиционно, если мы хотим построить модель или прочитать данные, которые присутствуют в любой системе управления версиями данных, мы берем на себя и извлекаем все имеющиеся файлы данных. Но во многих случаях нам не нужны все имеющиеся файлы, а извлечение больших файлов может занять много времени, а также затратить время процессора/графического процессора. Чтобы избежать этого, Dagshub представил Streaming API, который является частью функции прямого доступа к данным (DDA) Dagshub. Давайте посмотрим, как мы можем получить доступ к потоковому API в нашей локальной системе.

Установите потоковый API, используя:

pip install dagshub

Затем мы клонируем DagshubRepo с помощью библиотеки Gitpython.

После того, как вы клонируете репозиторий, вы можете увидеть репозиторий в своей локальной системе, но вы не найдете в репозитории папки с версиями, использующими DVC (папка данных и моделей).

Существует два способа использования потокового клиента.

Облегченные обработчики только для Python, которые могут автоматически обнаруживать вызовы встроенных файловых операций Python, таких как open(), listdir(), и совместимы с большинством библиотек Python ML. используя install_hooks(), можно просто получить доступ к файлу, как если бы он был сохранен на самом локальном компьютере.

Используя этот метод, когда мы используем os.listdir(), мы можем видеть данные и папку моделей, которые также имеют версию DVC.

Этот метод может не работать с Tensorflow и OpenCV, поскольку у них есть фреймворки ввода/вывода, написанные на низкоуровневом языке, таком как C/C++, которые должны обрабатываться по-другому по сравнению с библиотекой, такой как Pytorch. В таких случаях вы можете использовать потоковую передачу файлов, загрузив файловую систему Dagshub.

Для потоковой передачи файлов с помощью DDA достаточно просто загрузить файловую систему Dagshub.

Затем мы можем заменить любое использование open(), os.stat(), os.listdir() и os.scandir() на fs.open(), fs.stat(), fs.listdir() и fs. .scandir() соответственно. Используя fs.listdir(), теперь мы видим, что папки с данными и моделями присутствуют, даже если их нет на нашем компьютере.

Для проверки давайте воспользуемся как fs, так и os для вывода списка файлов в каталоге. Как мы видим ниже, мы не можем получить доступ к папкам данных при использовании os — это означает, что мы получаем доступ к файлам, которые находятся в Dagshub Repo, используя функцию потоковой передачи.

Чтобы прочитать, скажем, train.csv, который находится в папке data/raw/, мы можем использовать функцию открытия.

Когда вы открываете файл, он сохраняется в кеше на вашем локальном компьютере и, следовательно, будет виден при использовании функции os.listdir().

Открытый файл train.csv сохраняется в кеше и становится видимым в репозитории в локальной системе.

Основное преимущество использования функции потоковой передачи заключается в том, что вы не загружаете все файлы сразу, а получаете доступ только к тем файлам, которые вам нужны. Это означает, что нам не нужно ждать, пока загрузятся все файлы, прежде чем мы начнем тренировать наши модели, экономя время и затраты на GPU.

Визуализируйте изображения с помощью DDA

Мы создаем функцию show_image, которая принимает изображение и клиент потоковой передачи в качестве входных данных и считывает изображения — преобразует их в (512 512) изображений, а также переворачивает их по горизонтали. Здесь мы используем fs.open() для кэширования файла в нашей локальной системе, а затем используем функцию im.read() для чтения изображения.

Создание сценариев для обучения моделей классификации изображений в Azure

Первым шагом для обучения модели в Azure является создание собственной рабочей области и вычислений. Это можно сделать с помощью Azure ML SDK (см. здесь) или перейти на portal.azure.com и создать рабочую область. Чтобы обеспечить воспроизводимость, я создал свою рабочую область и вычислительные кластеры с помощью Azure ML SDK.

Следующим шагом будет создание скриптов на Python, которые будут использоваться для обучения. Все сценарии, которые будут использоваться, должны быть помещены в ту же папку, в которой эта папка будет загружена в Azure.

В папке скриптов — поскольку мне нужно иметь доступ к Dagshub Repo, я создаю dagshub_config.py, который содержит имя пользователя Dagshub, токен и имя репозитория. Токен должен храниться в секрете и не должен разглашаться.

Файл util.py, который содержит код для создания клиента потоковой передачи, клонирования репозитория git, перечисления изображений в папке обучения с использованием потоковой передачи данных, чтения фрейма данных train.csv и разделения данных на обучающие и тестовые наборы и функция для загрузки модели EfficientNet с использованием потоковой передачи данных.

Теперь последний и окончательный скрипт (train.py) — где и происходит вся магия. Для обучения модели классификации изображений мы используем класс ImageDataGenerator, но для этого необходимо, чтобы файлы присутствовали в системе. Поскольку мы собираемся использовать клиент потоковой передачи для чтения изображений, а также файл train.csv для получения имени файла изображения и класса, а также создадим Custom DataGenerator, который будет считывать изображения партиями. из Dagshub Repo, используя функцию потоковой передачи.

Мы будем использовать модель EfficientNet B5 для прогнозирования тромбов. EfficientNet позволяет систематически масштабировать модели CNN, уравновешивая глубину, ширину и разрешение сети. Мы сохранили эту модель в «data/raw/Pretrained_Efficient_Models» в репозитории, который содержит несколько моделей EfficientNet.

Но, поскольку нам нужна только модель B5, мы считываем веса только этой модели. Это возможно из-за потокового API — иначе нам придется загрузить всю папку, а затем прочитать этот конкретный файл.

Изменение размера изображения до (512 512) и создание генератора данных проверки и обучения с использованием нашего CustomDataGenerator также определены в нашем скрипте обучения. Мы отслеживаем показатели модели с помощью MLFlow в Azure, чтобы отслеживать показатели с помощью mlflow.autolog().

Создание среды и выполнение скрипта в Azure

Теперь, когда у нас есть готовые сценарии, нам нужна среда в Azure, где мы можем запустить наш сценарий — это означает установку наших библиотек и других зависимостей. Хотя мы можем создать собственную среду с пакетами conda и pip, мы также можем использовать кураторские среды.

В этом случае я создал свою собственную среду, используя существующий образ докера с установленной CUDA.

Следующим шагом является создание эксперимента. Думайте об эксперименте как о папке, в которой организованы ваши задания.

Затем мы создаем объект ScriptRunConfig. Вы можете рассматривать ScriptRunConfig как конфигурацию для сохранения всех сведений, необходимых для запуска задания в Azure.

Чтобы запустить задание в Azure, мы отправляем эксперимент с объектом ScriptRunConfig и отслеживаем ход выполнения прямо из нашей записной книжки с помощью виджета RunDetails.

Мы можем отслеживать метрики из нашего блокнота, используя run.get_metrics().

Мы видим, что модель достигла точности проверки 0,75 и точности обучения 0,76.

Мы также можем загрузить сохраненную модель с помощью run.download_files().

## Download the model folder saved after training into our local system in the current folder
run.download_files(output_directory="outputs/efficientNet_Model")

Ой!! Но что, если я хочу записать метрики в файл и отправить его в свое репозиторий Dagshub — нужно ли мне извлекать все данные, а затем отправлять их??

СЮРПРИЗ!!!

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

## Uploading files to Dagshub Repo using upload() functionality of DDA
from dagshub.upload import Repo

repo = Repo(DAGSHUB_USERNAME,DAGSHUB_REPO_NAME,branch="main",
             username=DAGSHUB_USERNAME,token=DAGSHUB_TOKEN)

repo.upload(file="../metrics.txt",path="efficientNet_Metrics.txt",
            commit_message="Updating Metrics File",versioning="dvc")

ВУАЛЯ!!! Файл загружается в Dagshub Repo с управлением версиями DVC.

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

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

Хотя я взял пример классификации изображений, чтобы показать, как мы можем объединить облачные технологии, такие как Azure, с функцией DDA Dagshub, это можно распространить и на другие типы данных, такие как типы данных аудио или видео. Как правило, видеофайлы имеют большой размер и часто занимают много места для хранения, а извлечение их каждый раз может занимать много времени.

Интересно, что использование функции потоковой передачи не ограничивается только моделями глубокого обучения, но также может использоваться, когда у вас есть данные из нескольких таблиц, хранящихся в виде файлов, которые часто обновляются, и для вашего анализа требуется всего несколько файлов — таким образом, используя потоковую передачу данных, один можно избежать загрузки всех файлов, а также просто повторно запустить скрипт, чтобы получить обновленные результаты.

Используя Azure, мы можем создать собственную среду со своими зависимостями, не имея большого опыта работы с контейнерами Docker. Кроме того, для тех, кто привык к python — Azure ML SDK дает нам возможность запускать наши модели в Azure, даже не выходя из знакомой среды jupyter-notebook.

Надеюсь, эта статья оказалась вам полезной. Как всегда, любой отзыв высоко ценится. Пожалуйста, поделитесь своими комментариями.

Эта статья изначально была опубликована в Hackernoon