# Компонент DataBox и работа с файлами ## DataBox Компонент DataBox позволяет хранить данные, необходимые для работы модуля, в файловом хранилище S3. Рекомендуемая структура расположения данных: 1. Образ Docker: 1. Код проекта 2. Системные библиотеки и прочие программные зависимости 3. Постоянные файлы настроек 2. DataBox для данных: 1. Предобученные веса моделей машинного обучения. 2. Большие и постоянные наборы внешних данных (например, исторические погодные данные для модуля прогноза погоды). 3. DataBox для пользователей: 1. Изначально - не хранится ничего. 2. В ходе работы - загруженные пользователями входные данные и выданные модулем выходные данные работы ML-компонентов и пайплайнов. Пример манифеста компонента DataBox ```yaml apiVersion: "unified-platform.cs.hse.ru/v1" kind: DataBox metadata: name: userdata namespace: my-app spec: s3DefaultStorage: capacity: 1G ``` В данном примере `userdata` - это имя компонента DataBox, по которому в дальнейшем смогут обращаться другие компоненты и пользователи. Например, в [ML-компонентах](./mlcmp.md) это имя используется в разделе `connectedBoxes`. Поле `spec.s3DefaultStorage.capacity` определяет размер выделенного под DataBox дискового пространства. Можно не указывать `capacity`, тогда поле будет выглядеть так: ```yaml spec: s3DefaultStorage: {} ``` Если `capacity` не указано, по умолчанию выделяется 1ГБ пространства. ## Пути ### Файловое хранилище В файловом хранилище файлы хранятся со следующей структурой: ``` /my-app/userdata/users/gzhulikov/file_groups/my_file_group/file.txt ``` Здесь: - `my-app` - имя приложения. Файлы разных приложений хранятся отдельно друг от друга, между ними нет пересечения - `userdata` - имя компонента DataBox. - `users` - системная часть пути, означающая "далее идут файлы, загруженные пользователями". - `gzhulikov` - имя пользователя, который загрузил данные - `file_groups` - системная часть пути - `my_file_group` - созданная пользователем файловая группа (можно считать это "папкой" в хранилище S3) - `file.txt` - файл в хранилище S3 ### Компоненты модуля Компоненты `MLComponent` и `ExperimentPipeline` взаимодействуют с данными из хранилища S3. Это взаимодействие контролируется разделом `connectedBoxes`, а также параметром `mountFrom` в переменных пайплайнов. Структура пути в манифестах `MLComponent` и `ExperimentPipeline`: ``` users/developer/file_groups/my_file_group_file.txt ``` Здесь: - Имя приложения заранее известно, так как во всех компонентах уже указано, какому приложению они принадлежат - Имя компонента `DataBox` указывается отдельно от пути в соответствующем поле манифеста - Остальные компоненты пути повторяют структуру файлового хранилища, начиная с системной части пути - `users` Пример: ```yaml connectedBoxes: - name: model-box path: /home/myproject/data/weights/ mountS3Box: subPath: users/developer/file_groups/models_pretrained s3BoxName: model-box ``` Здесь подключается компонент DataBox с именем `model-box`: - Путь `users/developer/file_groups/models_pretrained` в DataBox (в хранилище S3) - Путь `/home/myproject/data/weights/` в локальной файловой системе контейнера - Название компонента DataBox контролируется полем `s3BoxName` - Название смонтированного компонента для упоминания внутри манифеста контролируется полем `name`. В этом примере эти два названия совпадают. ### Файловый API Доступ к файлам через API производится по ссылкам со следующей структурой ``` https://platform.stratpro.hse.ru/my-app/model-box/my_file_group/file.txt ``` Здесь: - `my-app` - имя приложения - `model-box` - имя DataBox, в который загружаются данные или из которого скачиваются данные - `my_file_group/file.txt` путь к файлу, соответствующий пути после `file_groups` в хранилище - Имя пользователя в участке пути `users/USERNAME/file_groups` определяется, исходя из того, реквизиты какого пользователя используются при выполнении запроса.