В этой статье подробно рассказывается о том, как сохранить модель в Flux.jl (100% пакет машинного обучения Julia), а затем загрузить или получить ее из Hugging Face Hub. Для тех, кто не знает, что такое Hugging Face (HF), это как GitHub, но для моделей машинного обучения. Давайте рассмотрим, как вы можете использовать ваш любимый пакет Julia ML для работы с HF 🤗!

Если вы никогда раньше не использовали Flux.jl, вы можете найти инструкции по установке здесь: https://fluxml.ai/Flux.jl/stable/#Installation и короткое видео о том, почему вы можете захотеть его использовать ниже:

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

julia> using Flux
julia> model = Chain(Dense(10,5,relu),Dense(5,2),softmax)
Chain(Dense(10, 5, relu), Dense(5, 2), softmax)

Затем мы можем импортировать пакет BSON (таким образом мы будем сохранять наши модели, чтобы их могли использовать другие пользователи в Hugging Face)

julia> using BSON: @save

Наконец, мы действительно можем сохранить модель, выполнив:

julia> @save "mymodel.bson" model

Затем мы собираемся загрузить модель в Hugging Face Hub, а затем попробовать загрузить ее в новом сеансе. Если вы хотите узнать больше о построении моделей в Flux, посмотрите видео ниже:

Зайдите на: https://huggingface.co и создайте учетную запись. Я не буду повторять все эти шаги, поскольку это довольно просто, но если у вас возникнут какие-либо проблемы, опубликуйте их в экземпляре Hugging Face Discourse: https://discuss.huggingface.co

Теперь, когда вы настроены и работаете с HF Hub, мы собираемся выбрать значок вашего профиля в правом верхнем углу, а затем выбрать «Новая модель».

Оттуда заполните соответствующие данные, а затем создайте модель. Вы можете найти созданную мной базовую модель здесь: https://huggingface.co/LoganKilpatrick/BasicFluxjlModel

После создания карты базовой модели следующим шагом будет фактическая загрузка модели в формате BSON. Если вы вернетесь к Julia REPL, вы можете ввести ;, а затем pwd, чтобы найти, где вы сохранили свою модель локально. Моя сохранена на моем рабочем столе, чтобы ее было легко найти. На HF перейдите к Сохраненные и версии и Добавить файл справа. Теперь у вас должен быть README и модель в формате BSON, сохраненная в Hugging Face Hub! Далее, как вернуть модель на ваш компьютер или на чей-то еще?

Итак, теперь у нас есть модель, сохраненная в HF Hub, следующее, что вы, вероятно, захотите сделать, это загрузить чужую модель Flux (например, мою: https://huggingface.co/LoganKilpatrick/BasicFluxjlModel).

HF предоставляет библиотеку Python для взаимодействия с Hub. Поскольку у меня не было времени (пока) переписать весь пакет на чистой Julia, мы собираемся отказаться от надежного пакета PyCall.jl, который позволяет нам запускать код Python непосредственно в сеансе или сценарии Julia REPL.

Найдите время, чтобы следовать руководству по установке PyCall: https://github.com/JuliaPy/PyCall.jl#installation и, если что-то неясно, решайте открытые вопросы.

Хорошо, теперь, когда он у вас есть и работает, давайте использовать его!

julia> using PyCall
julia> hf = pyimport("huggingface_hub")
PyObject <module 'huggingface_hub' from '/Users/logankilpatrick/.julia/conda/3/lib/python3.8/site-packages/huggingface_hub/__init__.py'>

Обратите внимание: здесь предполагается, что у вас установлен пакет Python huggingface_hub в той же среде Python, которую мы используем через PyCall.

Так что же у нас здесь на самом деле? Мы использовали PyCall для импорта пакета Python в Julia? Да! Теперь, когда он импортирован, мы можем использовать его так же, как обычно использовали бы пакет Python:

julia> hf.snapshot_download(repo_id="LoganKilpatrick/BasicFluxjlModel", revision="main")
Downloading: 100%|██████████████████████████| 1.18k/1.18k [00:00<00:00, 345kB/s]
Downloading: 100%|██████████████████████████████| 711/711 [00:00<00:00, 130kB/s]
Downloading: 100%|█████████████████████████| 10.3k/10.3k [00:00<00:00, 2.07MB/s]
"/Users/logankilpatrick/.cache/huggingface/hub/LoganKilpatrick__BasicFluxjlModel.077a4b77d6175a09c156a20cf5bed0eac35c97ee"

Теперь у нас есть репозиторий моделей, сохраненный локально, давайте снова переключим Julia REPL в режим командной строки, набрав ;, а затем изменив каталоги на расположение файла модели.

shell> cd "/Users/logankilpatrick/.cache/huggingface/hub/LoganKilpatrick__BasicFluxjlModel.077a4b77d6175a09c156a20cf5bed0eac35c97ee"

Чтобы еще раз убедиться, что мы все сделали правильно, я собираюсь запустить команду list:

shell> ls -l
total 32
-rw - - - - 1 logankilpatrick staff 711 Oct 13 08:37 README.md
-rw - - - - 1 logankilpatrick staff 10260 Oct 13 08:37 mymodel.bson

Большой! Мы видим там модель. Давайте сейчас загрузим его обратно в Flux.

julia> using BSON: @load
julia> @load "mymodel.bson" model
julia> model
Chain(Dense(10, 5, relu), Dense(5, 2), softmax)

Бум! Мы сделали это 🎊! Мы успешно создали модель с помощью Flux, загрузили ее в Hub, а затем загрузили новую модель (или ту, которую вы создали) и загрузили обратно в Flux / Julia.

Следующим шагом будет продолжать обучение моделей и загружать / делиться ими. Хаб Hugging Face - это действительно шикарный способ сотрудничества с другими исследователями и практиками машинного обучения, так что до встречи!

P.S. Я также создал организацию Julia Language на HF, поэтому, если у вас есть впечатляющие модели, которыми вы хотите поделиться, свяжитесь со мной, и я могу добавить вас в организацию (https://huggingface.co/JuliaLanguage).

~ Логан Килпатрик (https://twitter.com/OfficialLoganK)