ClearML Data Management

—

от автора

Очевидный для ML-инженера факт: если на вход модели подать мусор — на выходе тоже будет мусор. Это правило действует всегда, независимо от того, насколько у нас крутая модель. Поэтому важно понимать, как ваши данные будут храниться, использоваться, версионироваться и воспроизведутся ли при этом результаты экспериментов. Для всех перечисленных задач есть множество различных инструментов: DVC, MLflow, W&B, ClearML и другие. Git использовать недостаточно, потому что он не был спроектирован под требования ML. Но есть инструмент, который подходит для версионирования данных и не только — это ClearML. О нем я сегодня и расскажу.

Разница между Git и ClearML в контексте ML-задач

Git не подходит для версионирования данных по нескольким причинам:

  • ограничения в эффективности при работе с большими объемами данных;
  • не всё хорошо с безопасностью данных;
  • обработка бинарных файлов неоптимальна;
  • управление большими файлами сложное.

В итоге у нас получится медленная и тяжелая система, с которой неудобно работать.

ClearML представляет собой огромную MLOps-экосистему:


Модули ClearML, покрывающие весь цикл разработки ML-продукта

Некоторые из модулей ClearML:

  • ClearML Python (clearml) — служит интеграции ClearML в существующую базу кода. Это обычная питоновская библиотека. Есть CLI и SDK, о работе с ними мы поговорим далее.
  • ClearML Server (clearml-server) — предназначен для хранения данных экспериментов, моделей и рабочих процессов, а также для поддержки Web UI менеджера экспериментов. Можно развернуть у себя локально.
  • ClearML Agent (clearml-agent) — агент оркестровки MLOps. Обеспечивает воспроизводимость экспериментов и рабочих процессов, а также их масштабируемость.
  • ClearML Serving (clearml-serving) — нужен для развертывания и оркестровки моделей. Есть интеграция с Triton. Но на мой взгляд он недоработан: есть проблемы с запуском и версиями на этапе сборки.
  • ClearML Session (clearml-session) необходим для запуска удаленных экземпляров Jupyter Notebooks и VSCode. Очень интересное решение, работает хорошо, можно создавать рабочие места для ML-инженеров и выделять нужное количество мощностей для каждого из них. Все запускается через clearml-agent, для которого можно указать кастомный docker-image.
  • ClearML Data (clearml-data) предназначен для управления данными и версионирования поверх файловых систем/объектных хранилищ, таких как AWS S3.

Редко инструменты покрывают абсолютно все нужды проекта, поэтому обычно приходится использовать зоопарк из различных решений. В случае с ClearML покрыты все возможные потребности ML-проекта. В этой статье мы рассмотрим модуль ClearML Data.

Особенности ClearML по сравнению с аналогичными инструментами

В отличие от, например, DVC, в ClearML версионирование данных происходит отдельно от версионирования кода. Как утверждают сами создатели инструмента, данные не являются кодом, поэтому они не должны находиться в git-репозитории:

We believe Data is not code. It should not be stored in a git tree, because progress on datasets is not always linear. Moreover, it can be difficult and inefficient to find on a git tree the commit associated with a certain version of a dataset.

У ClearML удобный и приятный интерфейс. MLflow в этом плане не так дружелюбен.


Web UI ClearML для датасетов

Познакомиться с отдельными частями интерфейса можно по ссылкам: dataset_details и dataset_page.

Еще одна особенность ClearML заключаются в том, что все сущности являются типом task (experiments в UI). Например, датасеты, эксперименты с моделями, пайплайны — у всех одинаковый тип. Никаких лишних сущностей и понятные статусы для каждого типа. Task — это отдельный сеанс выполнения кода, который может представлять собой эксперимент, шаг или контроллер рабочего процесса, любую пользовательскую реализацию.


Возможные статусы tasks

Данными можно управлять с помощью интеграции хранилищ данных: Azure, AWS, MinIO и других [документация]. Также существуют некоторые платные фичи — гипердатасеты.

Интеграция со многими DS-библиотеками (scikit-learn, Matplotlib, PyTorch, TensorFlow и другими) позволяет подхватывать все метрики, графики обучения, гистограммы, логи, незакоммиченные части кода, версии библиотек — нужно просто создать task в начале .py файла / jupyter notebook и в результате можно будет воспроизвести любой эксперимент.

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

  1. В некоторых браузерах plots и debug изображения не будут отображаться;
  2. Мобильная версия сайта неудобна в использовании, поэтому нужно переходить в ПК-версию;
  3. Графики обучения моделей не такие красивые, как у W&B ?;
  4. Не всегда автоматически подхватываются метрики для pytorch lightning, из-за чего приходится подключать tensorboard (а метрики из tensorboard уже подхватываются в clearml).

Теперь давайте подробнее рассмотрим работу с модулем СlearML Data, который входит в библиотеку ClearML.

ClearML Data на практике

Воспользуемся платформой ClearML с ограничением в 100 GB для данных и возможностью пригласить еще двух человек в ваше рабочее пространство clearml. Подобные условия есть и у W&B. А вот развернуть W&B локально или на вашем сервере бесплатно нельзя, в отличие от ClearML.

Первый этап: регистрация и создание кредов [более подробно см. в документации]

  1. Устанавливаем у себя clearml через pip install clearml
  2. Регистрируемся по ссылке: app.clear.ml/login
  3. Заходим в Settings → Workspace → Создаем креды «Create new credentials»


Настройка рабочего пространства и создание кредов

Можно воспользоваться Local Python или Jupyter Notebook. Инструкция для них представлена ниже.

Local Python

В консоли запускаем команду clearml-init и вставляем креды:

Jupyter Notebook

В табе Jupyter Notebook копируем креды в ячейку ноутбука:

После создания кредов с помощью Local Python или Jupyter Notebook появится конфигурационный файл ~/clearml.conf для Linux. Для других ОС путь может отличаться. В этом файле возможно, например, настроить интеграцию с S3.

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

Весь код данной статьи есть тут → Ссылка на колаб. Попробуйте на практике! ?

ClearML Data поддерживает два интерфейса:

  • clearml-data — утилита CLI для создания, загрузки и управления наборами данных;
  • clearml.Dataset — интерфейс Python для создания, извлечения, управления и использования наборов данных.

Рассмотрим работу с каждым из них по отдельности.

Создание датасета с CLI

Скачаем и распакуем датасет, с которым будем работать далее:

wget -P /content/dataset_v1/ https://download.microsoft.com/download/3/E/1/3E1C3F21-ECDB-4869-8368-6DEBA77B919F/kagglecatsanddogs_5340.zip unzip /content/dataset_v1/kagglecatsanddogs_5340.zip -d /content/dataset_v1/

Есть два способа загрузки данных в ClearML: через ручной контроль каждого этапа и при помощи sync.

Первый способ: ручной контроль каждого этапа

  • сreate создает датасет. Тут мы указываем проект, название датасета, теги, версию. Если не указать версию, она поставится автоматически.

# Инициализируем датасет clearml-data create --project DeepSchool/Tutorials/cats_vs_dogs \                     --name cats_vs_dogs \                      --tags init_data

—project — аргумент, в котором можно указать иерархию. Например: Turorials/Toy_Datasets/Cifar10/Train и так до глубины 10.

После выполнения команды clearml-data create в UI мы можем посмотреть статус датасета. Сейчас у нас «Uploading», значит, есть возможность добавлять, удалять и изменять файлы этой версии.


Статус «Uploading» в ClearML UI после инициализации датасета

clearml-data работает в режиме отслеживания состояния, поэтому после создания нового набора данных для следующих команд не требуется флаг —id.

  • add добавляет локальные файлы в созданный датасет. Он позволяет рекурсивно добавить файлы в датасет через ~/data/*.jpg.

# Добавим файлы. clearml-data add --files "/content/dataset_v1"

# Перед загрузкой на ClearML можно проверить, какие файлы добавились clearml-data list --id <dataset_id>

  • close закрывает и загружает данные в clearml. Можно указать —storage — по умолчанию это хранилище ClearML.

Этап close включает в себя загрузку и финализацию датасета finalize и upload, которые также можно использовать по отдельности, например, если нужно загрузить данные и при этом иметь возможность изменить датасет.

<dataset_id> будет получен при создании датасета и виден в ClearML UI после этапа close.

# команда равна clearml-data upload и clearml-data finalize clearml-data close

После этапа finalize загруженную версию датасета изменить будет нельзя: это нужно для воспроизводимости. Теперь у нашего датасета статус «Final».

Так выглядит результат после выполненных выше команд:


Загруженный датасет в ClearML

Второй способ: c помощью sync

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

clearml-data sync --project DeepSchool/Tutorials/cats_vs_dogs \                   --name cats_vs_dogs_sync \                   --folder /content/dataset_v1


Загруженный датасет при помощи sync через CLI

Теперь в UI появилась папка «DeepSchool». В ней есть два подпроекта, которые были загружены с помощью предыдущих команд:


Загруженные датасеты в папке «DeepSchool»

Получение данных с CLI

Для получения локальной копии датасета, которую нельзя изменять (read only), нужно выполнить следующую команду при помощи get:

clearml-data get --id <created_dataset_id> 

Получить id датасета можно в UI:


Получение id датасета из ClearML UI

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

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

# Получить изменяемые локальные данные. # Если нет, то просто копируется локальная версия для изменений clearml-data get --id 717662694123428bab2b103efed87e4b \                  --copy ./cats_vs_dogs_sync/

Наши данные уже в кэше, следовательно, ClearML сможет проверить, отличается ли кэш-версия от нужной для скачивания. Если нет — он скопирует часть датасета из кэша и отличающуюся часть из ClearML.

В этом случае вы сможете изменить датасет и загрузить измененную версию.

Создание новой версии датасета с CLI

Изменим датасет, скачав новые изображения для класса Fish.

fish_images = ['http://www.michigansportsman.com/Boaters_Guide/10.18.05_Manistee_Lake_Coho_004_small.jpg',                 'http://www.aosalaska.com/gallery/silvers/silver24.jpg',                 'http://www.piscatorialpursuits.com/images/jimmy.jpg',                 'http://www.fpc.org/spawning/images/multnomahcoho11-04.jpg',                 'http://www.alaskaantlerworks.com/images/jerm_silver.jpg']  from clearml import StorageManager  for image_path in fish_images:     StorageManager.get_local_copy(remote_url=image_path,                         extract_archive=False,                         cache_context="/content/cats_vs_dogs_sync/PetImages/Fish")

Теперь, когда у нас есть измененная локальная версия датасета, мы можем загрузить ее с помощью команды sync, указав при этом аргумент —parents:

# Загрузим измененный датасет с новым классом Fish, # важно указать id родительского датасета, # иначе вместо загрузки только новых файлов загрузится весь датасет, что займет много времени !clearml-data sync --project DeepSchool/Tutorials/cats_vs_dogs \                    --name cats_vs_dogs_sync \                    --parents 717662694123428bab2b103efed87e4b \                    --folder /content/cats_vs_dogs_sync

Результат версионирования датасета представлен на рисунке ниже. Через VERSION INFO справа на скриншоте можно посмотреть статистику по количеству добавленных, удаленных и измененных изображений.


Новая версия датасета в ClearML UI. Добавлена папка с классом «Fish»

В загруженных файлах есть битая картинка, удалим ее.

Для начала выведем список фото с помощью clearml-data list:

clearml-data list --id 8f13d861488248fca90aa9522b882ea5 \                    --filter PetImages/Fish/*.jpg

clearml-data - Dataset Management & Versioning CLI List dataset content: 8f13d861488248fca90aa9522b882ea5 Listing dataset content file name                                                                                 | size       | hash                                                             ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- PetImages/Fish/24af78f36dd391046209db21577ec667.multnomahcoho11-04.jpg                    |      1,520 | 31bb5a2bdbb753adebd1a7c88b69fd7ddd405241619bbb866db4ed9c51d729e2 PetImages/Fish/4d536d76aaf42c0e5524b6f8c6918227.jimmy.jpg                                 |     19,515 | 0432f283284a5ab33c31f42040267bde9a37853b5c4557060c2bcd1527ef78b2 PetImages/Fish/70a4b2cb727768e435b3f77ba7b782b6.silver24.jpg                              |     19,715 | 803de343fd2410e1e5568fbac54f3dba9a699048e1b44d9194b03b8888b2ff90 PetImages/Fish/c18a90447be153bab0d90e175bff269f.10.18.05_Manistee_Lake_Coho_004_small.jpg |      3,548 | c654999d76c033bcb0ed04d75c6a592280c2c8dbbb60133f2c2013a54ca4229e PetImages/Fish/cdcbd1c83803abb15830e0f0c16bc353.jerm_silver.jpg                           |     67,725 | 0b5ac127c2b7e766116ecc1f8f1a8f5023a23749d255761bbc2785c77b42fc5e Total 5 files, 112023 bytes

Удалим битую фотографию из папки «Fish» в нашем датасете:

rm -f ./cats_vs_dogs_sync/PetImages/Fish/24af78f36dd391046209db21577ec667.multnomahcoho11-04.jpg

Обновим датасет c помощью sync:

clearml-data sync --project DeepSchool/Tutorials/cats_vs_dogs \                   --name cats_vs_dogs_sync \                   --parents 8f13d861488248fca90aa9522b882ea5 \                   --folder /content/cats_vs_dogs_sync

В ClearML UI можно посмотреть обновленную версию нашего датасета:


Новая версия датасета с удаленным изображением

Создание датасета с SDK

Аналогично все работает через интерфейс python. Давайте рассмотрим пример на тех же данных:

  1. Загрузка данных в ClearML и контроль каждого этапа:
     # Первый способ с возможностью выборочно добавлять файлы from clearml import Dataset

dataset_project = «DeepSchool/Tutorials/cats_vs_dogs»
dataset_name = «cats_vs_dogs_SDK»
dataset_path = «/content/cats_vs_dogs_sync»

dataset = Dataset.create(dataset_name=dataset_name,
dataset_project=dataset_project)
dataset.add_files(dataset_path) # рекурсивно добавить файлы в датасет
dataset.upload()
dataset.finalize()

2. Загрузка данных в ClearML через *sync*: ```python # Второй способ с sync from clearml import Dataset  dataset_project = "DeepSchool/Tutorials/cats_vs_dogs" dataset_name = "cats_vs_dogs_SDK_sync" dataset_path = "/content/cats_vs_dogs_sync"   dataset = Dataset.create(dataset_name=dataset_name,                           dataset_project=dataset_project) dataset.sync_folder(dataset_path) dataset.finalize(auto_upload=True)

Важно: после выполнения finalize() мы не сможем изменить слепок датасета в clearml, но сможем создать новую версию датасета с измененными файлами.


Загруженные версии через CLI и SDK

Получение данных с SDK

Скачать загруженный датасет можно тремя способами.

  1. Получить метаданные, например, имена файлов.

    # Получить данные на read only,  # в данном случае получим cats_vs_dogs_SDK_sync датасет from clearml import Dataset from pathlib import Path dataset_path = Dataset.get(dataset_name=dataset_name,                        dataset_project=dataset_project) # или dataset_path = Dataset.get(dataset_id=<dataset_id>)

  2. Для скачивания данных явно указать .get_local_copy(), при этом данные будут скачаны в кэш, и их можно будет только читать.

    # Получить данные на read only from pathlib import Path dataset_path = Dataset.get(dataset_name=dataset_name,                        dataset_project=dataset_project                        ).get_local_copy() # или dataset_path = Dataset.get(dataset_id=<dataset_id>).get_local_copy()

  3. Получить датасет локально в вашей рабочей директории для удаления, добавления, версионирования через .get_mutable_local_copy(target_folder=»where/to/save/data”).

    # Получить изменяемые локальные данные  dataset_path = Dataset.get(dataset_name=dataset_name,                        dataset_project=dataset_project                        ).get_mutable_local_copy(                                                     target_folder="./cats_vs_dogs_sdk_sync"                                                     ) # или  dataset_path = Dataset.get(                                                     dataset_id=<dataset_id>                                                 ).get_mutable_local_copy(target_folder="./cats_vs_dogs_sdk_sync")

Создание новой версии датасета с SDK

Изменим локальные данные, полученные через SDK, и зальем новую версию датасета.

В этот раз удалим папку «Cat» c помощью метода remove_files (возможны проблемы с использованием этого метода, рекомендуется использовать sync).

—parents — аргумент, в котором можно указать id родительского датасета или нескольких датасетов.

Удалим папку «Cat»:

rm -rf ./cats_vs_dogs_sync/PetImages/Cat

# Первый способ с возможностью выборочно добавлять и удалять файлы from clearml import Dataset  dataset_project = "DeepSchool/Tutorials/cats_vs_dogs" dataset_name = "cats_vs_dogs_SDK_sync" dataset_path = "/content/cats_vs_dogs_sdk_sync"  dataset = Dataset.create(dataset_name=dataset_name,              dataset_project=dataset_project,              parent_datasets=["f2999e995d924d239dcd5db8981f27d0"])                          # важно указать родительский датасет  # по умолчанию рекурсивно удаляет файлы из датасета dataset.remove_files('./PetImages/Cat')  dataset.finalize(auto_upload=True)

Таким образом, вы можете изменить датасет даже без его скачивания.

Важно: если вы измените имя датасета, он будет считаться новым и появится в новой карточке датасета в ClearML UI.

С помощью sync обновить датасет удобнее, так как в большинстве случаев он уже существует локально. Здесь проверяется разница между локальными файлами и файлами в ClearML:

 from clearml import Dataset  dataset_project = "DeepSchool/Tutorials/cats_vs_dogs" dataset_name = "cats_vs_dogs_SDK_sync" dataset_path = "/content/cats_vs_dogs_sdk_sync"  dataset = Dataset.create(dataset_name=dataset_name,                          dataset_project=dataset_project,                          parent_datasets=["f2999e995d924d239dcd5db8981f27d0"])                                                  # важно указать родительский датасет  dataset.sync_folder(     local_path=dataset_path )  dataset.finalize(auto_upload=True)


Версия с удаленной папкой класса «Cat»

Объединение датасетов с CLI и SDK

С помощью команды search выведем все датасеты, в названии которых есть подстрока «cats»:

clearml-data search --name cats  clearml-data - Dataset Management & Versioning CLI Search datasets project                           | name                             | version             | tags                | created                          --------------------------------------------------------------------------------------------------------------------------------------------------- DeepSchool/Tutorials/cats_vs_dogs | cats_vs_dogs                     | 1.0.0               | 'init_data'         | 2024-02-20 06:35:02              DeepSchool/Tutorials/cats_vs_dogs | cats_vs_dogs_sync                | 1.0.0               |                     | 2024-02-20 06:55:16              DeepSchool/Tutorials/cats_vs_dogs | cats_vs_dogs_sync                | 1.0.1               |                     | 2024-02-20 07:52:41              DeepSchool/Tutorials/cats_vs_dogs | cats_vs_dogs_sync                | 1.0.2               |                     | 2024-02-21 03:11:04              DeepSchool/Tutorials/cats_vs_dogs | cats_vs_dogs_SDK                 | 1.0.0               |                     | 2024-02-21 03:32:02              DeepSchool/Tutorials/cats_vs_dogs | cats_vs_dogs_SDK_sync            | 1.0.0               |                     | 2024-02-21 03:33:41              DeepSchool/Tutorials/cats_vs_dogs | cats_vs_dogs_SDK_sync            | 1.0.1               |                     | 2024-02-21 05:37:12

Есть небольшая проблема — id датасетов тут не пишут ? Поэтому нужно скопировать все id в UI.

Объединить два (и больше) датасета в один можно довольно просто: нужно указать id датасетов с аргументом —parents.

Давайте объединим наши датасеты c create и close, которые мы создали ранее. Для этого укажем новое имя проекта и все id созданных датасетов:

 # id возмем из UI clearml-data create --project DeepSchool/Tutorials/cats_vs_dogs \                     --name UNITED_DATASET_CLI \                     --parents 4fb7cf2830c449ca8fc7fc9d62e4fcb8 89158f088e354385a5b905716f746659 \                                b1f6537691f74d94b4bd5d6569fdd865 55322da674c6439c91a089eb36ff5e29 \                     --tags united clearml-data close

На рисунке ниже показан результат объединенного (по последним версиям) датасета, наследованный от четырёх разных родителей. Мы видим каждый датасет и все его версии.


Результат объединенного датасета, который был наследован от четырех разных родителей

Важно: удаление родительского датасета может повлечь за собой потерю данных в объединенном датасете.

Через SDK мы объединим только с двумя родителями:

# Объединение с SDK, тут возьмем поменьше датасетов  dataset = Dataset.create(   dataset_name='UNITED DATASET SDK',   dataset_project='DeepSchool/Tutorials/cats_vs_dogs',    parent_datasets=['4fb7cf2830c449ca8fc7fc9d62e4fcb8',                    '89158f088e354385a5b905716f746659'],   dataset_version="1.0", #   output_uri="gs://bucket-name/folder", # S3 или любое другое хранилище   description='cats vs dogs vs fish' )


Результат объединенного датасета, который был наследован от двух разных родителей

Объединение табличных данных

При объединении файлы не соединятся в один. Например, у нас не получится объединить два датасета построчно (CSV-файлы) в один общий файл.

  • Если CSV-файлы имеют одно и то же название, то в объединенном датасете будет только одна версия первого указанного родительского датасета.
  • Если названия файлов разные, то будет два разных файла в одной версии датасета.

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

Документация датасета

В начале статьи мы говорили, что все сущности ClearML — это task. Датасеты не исключение. К ним можно подгрузить разные метрики, гистограммы, дебаг изображения, а затем посмотреть их в task датасета.


Переход к task датасета

Информацию можно посмотреть следующим образом: task information -> debug samples


Информация, которая представлена в task созданного датасета

На рисунке выше мы видим информацию разного типа. В открытой табе DEBUG SAMPLES к датасету подгружены изображения (это примеры для просмотра). Подгрузить можно также графики (посмотреть их в PLOTS и SCALARS). А в ARTIFACTS можно подгрузить CSV-файлы, zip и т. д.

Для загрузки CSV-файлов к датасету, картинок, графиков предлагается использовать Dataset.get_logger().

Пример из документации:

# Attach a table to the dataset dataset.get_logger().report_table(     title="Raw Dataset Metadata", series="Raw Dataset Metadata", csv="path/to/csv" )  # Attach a historgram to the table dataset.get_logger().report_histogram(     title="Class distribution",     series="Class distribution",     values=histogram_data,     iteration=0,     xlabels=histogram_data.index.tolist(),     yaxis="Number of samples", )

Хранение кеша

Весь локальный кэш (модели, созданные и скаченные датасеты и др.) будет храниться в ~/clearml/cache.

Для каждого пользователя — свой кэш. Иногда это неудобно: например, если датасет весит больше 1TB, а пропускная способность маленькая. Тогда можно столкнуться с очень долгой (многочасовой) загрузкой этих данных на сервер. Если над таким датасетом работает большая команда, где у каждого своя копия датасета — это может занять приличную часть SSD или HDD на сервере. Для решения дублирования данных на сервере можно сделать общий кэш и скачать туда все датасеты ClearML. Он будет автоматически обновляться с изменением каких-либо датасетов на clearml-server. Таким образом, у всех будут актуальные версии датасетов в локальном доступе.

Заключение

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

ClearML предлагает два удобных способа взаимодействия через интерфейсы CLI и Python SDK, работу с которыми мы и рассмотрели выше.

В следующих статьях мы разберем clearml agents и clearml pipelines и узнаем, как интегрировать S3 или Minio в clearml и какие у этого есть плюсы.

Полезные ссылки:

  1. Интересное выступление про то, как строилась MLOps платформа на базе ClearML в MTS
  2. Best practices от ClearML Data (версионирование, организация датасетов, документация)
  3. Документация CLI
  4. Документация SDK
  5. Туториалы от ClearML
  6. Целый плейлист по работе с ClearML
  7. Видео по работе с clearml-data

P.S.
Первая версия статьи написана для deepschool-pro, на Хабре публикуется с изменениями и дополнениями.


ссылка на оригинал статьи https://habr.com/ru/articles/810435/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *