# Компонент 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/test_user/file_groups/my_file_group/file.txt ``` Здесь: - `my-app` - имя приложения. Файлы разных приложений хранятся изолированно отдельно друг от друга. - `userdata` - имя компонента DataBox. - `users` - системная часть пути, означающая "далее идут файлы, загруженные пользователями". - `test_user` - имя пользователя, который загрузил данные - `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` определяется, исходя из того, реквизиты какого пользователя используются при выполнении запроса.