Эта статья является кратким изложением моего опыта создания простого приложения для классификации изображений, основанного на выводах из первых 1 и ½ уроков курса FastAI Практическое глубокое обучение для программистов. Этот класс абсолютно бесплатный и предоставляет отличные ресурсы для проекта, поэтому я не буду здесь повторять все детали. Скорее, я хочу выделить камни преткновения, с которыми я столкнулся, и, надеюсь, сделать процесс более быстрым для других. Проблемы были почти полностью связаны с настройкой среды, а не с программированием глубокого обучения/МО.

Что я построил

Поскольку в Новой Англии приближается зима, я думал о горячем супе. В частности, корейский и вьетнамский суп. Это заставило меня задуматься: может ли ИИ различать эти два типа супа, просто глядя на фотографии? Ниже представлен финальный UX моего эксперимента. Вы можете поиграть с ним здесь:

https://huggingface.co/spaces/TrentL/KoreanVietnameseSoup

Конвейер разработки

Инструменты, которые я использовал для этого проекта:

  • Kaggle. Создайте записную книжку Python для создания, обучения и экспорта модели классификатора изображений в виде файла .pkl.
  • HuggingFace Spaces и Gradio. На этом популярном сайте моделей машинного обучения также можно размещать простые веб-приложения, полезные для демонстрации моделей. Поскольку я хотел сначала разрабатывать локально, я также использовал…
  • Visual Studio Code/Python/Windows. Моей локальной средой разработки была Visual Studio Code для Windows, а программирование выполнялось на Python. Как вы увидите, это оказалось самым большим камнем преткновения, но я думаю, что устранил большинство деталей.

Каггл

Использование Kaggle было очень простым, и у меня не было никаких проблем. У меня есть базовый опыт работы с блокнотами Python, поэтому создание одного из них в Kaggle не было для меня чем-то новым.

Мой код был почти полностью скопирован из блокнота курса Это птица?. Я настоятельно рекомендую начать с этого проекта и просто сменить тему на то, что вас интересует. Все, что я изменил, это некоторые строки и имена переменных, чтобы они лучше соответствовали моему домену.

Конечным результатом было экспортировать обученную модель, которая могла различать корейский и вьетнамский суп. Модель находится в pkl-файле Python, который вам нужно будет загрузить и добавить в свой проект HuggingFace.

Мне неизвестно, что какая-то часть процесса, похоже, добавляет в модель форматирование пути, зависящее от платформы. Я вернусь к этой проблеме позже в этой статье, когда буду говорить о VSCode, Python и Windows.

HuggingFace Spaces & Gradio

Вот где вещи начали получать новые для меня. Раньше я загружал несколько моделей Stable Diffusion с HuggingFace, но никогда не использовал их для чего-то более сложного. Я, конечно, никогда раньше не слышал о Gradio.

HuggingFace Spaces — удобный инструмент для размещения веб-приложения машинного обучения. Это позволяет очень легко создавать демонстрации и получать отзывы от сообщества. Я выбрал Gradio в качестве библиотеки пользовательского интерфейса для реализации своего приложения.

Я создал новое пространство с помощью Gradio, и конечным результатом стало пустое приложение, которое также является репозиторием Git. Следующим шагом было локальное клонирование этого репозитория, чтобы я мог создать свое приложение.

Код Visual Studio, Python, Градио

Вот где начинается «веселье» 🙃

По правде говоря, когда я начал этот шаг, я еще понятия не имел, что вообще пытаюсь сделать. Что такое Градио? Нужно ли мне это локально? Должен ли я, чтобы мое приложение сначала переобучило все мои данные в HuggingFace? В этой статье может быть описан мой опыт линейных шагов, но за несколько вечеров было много прыжков. Пусть это будет уроком, чтобы просто продолжать настаивать, когда у вас есть сомнения.

Целью этого шага является локальная разработка нашего приложения Gradio, чтобы мы могли быстро и легко его протестировать. Как только это заработает, все, что нам нужно сделать, это отправить его в репозиторий HuggingFace Spaces и вуаля! Остальной мир тоже может играть с ним.

Первый шаг — установить VSCode и добавить плагин Python. После этого клонируйте свое приложение HuggingFace, просто используя его URL:

Создайте новый файл app.py в своей рабочей области со следующим кодом:

import gradio as gr
 
def greet(name):
    return "Hello " + name + "!!"
 
iface = gr.Interface(fn=greet, inputs="text", outputs="text")
iface.launch()

Запустите его и наблюдайте красивое сообщение об ошибке:

Это сообщение об ошибке не должно быть сюрпризом, поскольку мы не установили gradio. Но придержите своих лошадей и не запускайте свои команды «pip install» волей-неволей. Сначала мы хотим настроить среду Python для конкретного проекта.

Чтобы ваши рабочие области Python не превратились в ад зависимостей, Python поддерживает концепцию среды, которая представляет собой изолированный набор пакетов для конкретного проекта и интерпретатор Python. Инструкцию по созданию окружения в Visual Studio можно найти здесь.

К сожалению, даже после создания вашей среды Python весьма вероятно, что ваша новая среда по-прежнему не будет использоваться при фактическом запуске вашего скрипта. Это связано с некоторыми проблемами с разрешениями Windows. Мое решение состояло в том, чтобы использовать полный путь к интерпретатору Python из среды моего проекта для запуска pip install для пакета gradio. Все руководства, которые я читал, подразумевали, что открытие терминала в VSCode должно автоматически использовать вашу новую среду Python, но мне это не показалось. Итак, чтобы установить градио, мне нужно было сделать что-то вроде:

PS C:\Code\TrentTestSpace> c:/Code/TrentTestSpace/.venv/Scripts/python.exe  -m pip install gradio

Если у вас возникли проблемы с разрешениями, я использовал следующие команды (используйте папку вашего проекта вместо TrentTestSpace):

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process

& c:/Code/TrentTestSpace/.venv/Scripts/Activate.ps1

Теперь, если вы запустите файл app.py, надеюсь, вы увидите запуск сервера и URL-адрес, напечатанный на консоли. Вставьте этот URL-адрес в веб-браузер и убедитесь, что основные функции «Hello World» работают.

Еще одно: не забудьте обновить файл requirements.txt добавленными вами пакетами, чтобы сервер HuggingFace знал об их установке. Вы можете увидеть мой пример requirements.txt.

Отсюда я добавил библиотеку fastai (установите ее с помощью pip, как указано выше), чтобы загрузить файл pkl моей модели. Это оказалось последней проблемой, поскольку, по-видимому, файл содержит форматирование пути для конкретной платформы. Я добавил следующий код, чтобы обойти это:

plt = platform.system()
print(f"Platform : {plt}")
if plt == 'Windows':
   pathlib.PosixPath = pathlib.WindowsPath

Полный код моего проекта вы можете найти здесь.

После того, как мое приложение запустилось локально, я зафиксировал и отправил его в свое приложение HuggingFace. Через несколько минут ваше приложение должно быть запущено на HuggingFace:

На этом мой первый мини-проект для курса FastAI заканчивается. Надеюсь, эта статья разблокирует кого-то, кто сталкивается с подобными проблемами.