MLCube - это набор передовых методов создания программного обеспечения машинного обучения, которое может работать по принципу plug-and-play во многих различных системах.
О MLCube
Сообщество машинного обучения (ML) за последнее десятилетие стало свидетелем бурного роста и инноваций. Новые модели появляются ежедневно, но совместное использование этих моделей остается разовым процессом. Часто, когда исследователь хочет использовать модель, созданную в другом месте, ему приходится тратить часы или дни на разочаровывающую попытку заставить модель работать. Точно так же инженеру ML может быть сложно переносить и настраивать модели между средой разработки и производственной средой, которые могут значительно отличаться друг от друга. Эта проблема усугубляется при работе с набором моделей, например при воспроизведении связанной работы, использовании набора тестов производительности, таком как MLPerf, или при разработке инфраструктур управления моделями. Воспроизводимость, прозрачность и постоянное измерение производительности - краеугольные камни хорошей науки и техники.
Отрасли нужны простые и взаимозаменяемые строительные блоки, которые можно легко использовать для экспериментов, а затем объединить в зрелые и надежные рабочие процессы. Предыдущие работы в области MLOps предоставили множество инструментов и процессов, которые упрощают путь пользователя по развертыванию и управлению ML в различных средах, включая управление моделями, наборами данных и зависимостями, отслеживание метаданных и экспериментов, развертывание и управление жизненными циклами ML. , автоматизация оценки и анализа производительности и т. д.
MLCube - это не новый фреймворк или услуга; MLCube - это согласованный интерфейс для моделей машинного обучения в контейнерах, таких как Docker. Модели, опубликованные с помощью интерфейса MLCube, можно запускать на локальных машинах, в различных крупных облаках или в кластерах Kubernetes - все с использованием одного и того же кода. MLCommons предоставляет простые бегуны с открытым исходным кодом для каждой из этих сред, которые делают обучение модели в MLCube одной командой, но MLCube также разработан, чтобы упростить создание новой инфраструктуры на основе интерфейса.
Таким образом, вы можете рассматривать MLCube как оболочку для моделей, которая описывает и стандартизирует несколько вещей, таких как зависимости, формат ввода и вывода, хостинг и так далее.
Статус MLCube
MLCube в настоящее время является предварительным альфа-проектом с активной командой разработчиков. Мы приглашаем к экспериментам и обратной связи, разработке кода и партнерству с инфраструктурой машинного обучения. Присоединяйтесь к нашему Списку рассылки и поздоровайтесь.
Примеры MLCube
Репозиторий, указанный ниже, содержит ряд примеров MLCube, которые могут работать в различных средах с использованием бегунов MLCube.
- MNIST MLCube загружает данные и обучает простую нейронную сеть. Этот MLCube может работать с Docker или Singularity локально и на удаленных хостах. В файле README есть инструкции по его запуску. Документация MLCube предоставляет дополнительную информацию.
- EMDenoise MLCube загружает данные и обучает глубокую сверточную нейронную сеть для теста электронной микроскопии. Этот MLCube может запускать только контейнер Docker. В файле README есть инструкции по его запуску.
- Матмуль Матмуль выполняет матричное умножение.
Учебное пособие: создание MLCube
Шаг 1. Настройка
Получите MLCube, примеры MLCube и шаблоны MLCube и СОЗДАЙТЕ среду Python.
# You can clone the mlcube examples and templates from GtiHub
git clone https://github.com/mlcommons/mlcube_examples
# Create a python environment
virtualenv -p python3 ./env && source ./env/bin/activate
# Install mlcube, mlcube-docker and cookiecutter
pip install mlcube mlcube-docker cookiecutter
Шаг 2. Настройте MLCube с помощью mlcube_cookiecutter
Давайте воспользуемся примером «matmult», который мы загрузили на предыдущем шаге, чтобы проиллюстрировать, как создать MLCube. Matmul - это простой пример умножения матриц, написанный на Python с помощью TensorFlow. Когда вы создаете MLCube для своей собственной модели, вы будете использовать свой собственный код, данные и файл докеров.
cd mlcube_examples
# rename matmul reference implementaion from matmul to matmul_reference
mv ./matmul ./matmul_reference
# create a mlcube directory using mlcube template(note: do not use quotes in your input to cookiecutter): name = matmul, author = MLPerf Best Practices Working Group
cookiecutter https://github.com/mlcommons/mlcube_cookiecutter.git
# copy the matmul.py,Dockerfile and requirements.txt to your mlcube_matmul/build directory
cp -R matmul_reference/build matmul
# copy input file for matmul to workspace directory
cp -R matmul_reference/workspace matmul
Отредактируйте файлы шаблона.
Начните с просмотра файла mlcube.yaml, созданного cookiecutter.
cd ./matmul
Cookiecutter изменил строки, выделенные полужирным шрифтом в файле mlcube.yaml, показанном здесь:
# This YAML file marks a directory to be an MLCube directory. When running MLCubes with runners, MLCube path is
# specified using `--mlcube` runner command line argument.
# The most important parameters that are defined here are (1) name, (2) author and (3) list of MLCube tasks.
schema_version: 1.0.0
schema_type: mlcube_root
# MLCube name (string). Replace it with your MLCube name (e.g. "matmul" as shown here).
name: matmul
# MLCube author (string). Replace it with your MLBox name (e.g. "MLPerf Best Practices Working Group").
author: MLPerf Best Practices Working Group
version: 0.1.0
mlcube_spec_version: 0.1.0
# List of MLCube tasks supported by this MLBox (list of strings). Every task:
# - Has a unique name (e.g. "download").
# - Is defined in a YAML file in the `tasks` sub-folder (e.g. "tasks/download.yaml").
# - Task name is passed to an MLBox implementation file as the first argument (e.g. "python mnist.py download ...").
# Every task is described by lists of input and output parameters. Every parameter is a file system path (directory or
# file) characterized by two fields - name and value.
# By default, if a file system path is a relative path (i.e. does not start with `/`), it is considered to be relative
# to the `workspace` sub-folder.
# Once all tasks are listed below, create a YAML file for each task in the 'tasks' sub-folder and change them
# appropriately.
# NEXT: study `tasks/task_name.yaml`, note: in the case of matmul we only need one task.
tasks:
- tasks/matmul.yaml
Теперь посмотрим на файл ./matmul/tasks/matmul.yaml.
cd ./tasks
Cookiecutter изменил строки, выделенные полужирным шрифтом в файле matmul.yaml, показанном здесь:
# This YAML file defines the task that this MLCube supports. A task is a piece of functionality that MLCube can run. Task
# examples are `download data`, `pre-process data`, `train a model`, `test a model` etc. MLCube runtime invokes MLCube
# entry point and provides (1) task name as the first argument, (2) task input/output parameters (--name=value) in no
# particular order. Inputs, outputs or both can be empty lists. For instance, when MLCube runtime runs an MLCube task:
# python my_mlcube_entry_script.py download --data_dir=DATA_DIR_PATH --log_dir=LOG_DIR_PATH
# - `download` is the task name.
# - `data_dir` is the output parameter with value equal to DATA_DIR_PATH.
# - `log_dir` is the output parameter with value equal to LOG_DIR_PATH.
# This file only defines parameters, and does not provide parameter values. This is internal MLCube file and is not
# exposed to users via command line interface.
schema_version: 1.0.0
schema_type: mlcube_task
# List of input parameters (list of dictionaries).
inputs:
- name: parameters_file
type: file
# List of output parameters (list of dictionaries). Every parameter is a dictionary with two mandatory fields - `name`
# and `type`. The `name` must have value that can be used as a command line parameter name (--data_dir, --log_dir). The
# `type` is a categorical parameter that can be either `directory` or `file`. Every intput/output parameter is always
# a file system path.
# Only parameters with their types are defined in this file. Run configurations defined in the `run` sub-folder
# associate parameter names and their values. There can be multiple run configurations for one task. One example is
# 1-GPU and 8-GPU training configuration for some `train` task.
# NEXT: study `run/task_name.yaml`.
outputs:
- name: output_file
type: file
Наш входной файл shape.yaml, который мы ранее скопировали в рабочую область mlcube, содержит входные параметры для установки размеров матрицы. Нам нужно удалить автоматически сгенерированный файл параметров.
rm ../workspace/parameters_file.yaml
Теперь отредактируем файл ./matmul/run/matmul.yaml.
cd ../run
Строки, которые необходимо отредактировать, выделены полужирным шрифтом в файле matmul.yaml, показанном здесь:
# A run configuration assigns values to task parameters. Since there can be multiple run configurations for one
# task (i.e., 1-GPU and 8-GPU training), run configuration files do not necessarily have to have the same name as their
# tasks. Three sections need to be updated in this file - `task_name`, `input_binding` and `output_binding`.
# Users use task configuration files to ask MLCube runtime run specific task using `--task` command line argument.
schema_type: mlcube_invoke
schema_version: 1.0.0
# Name of a task.
# task_name: task_name
task_name: matmul
# Dictionary of input bindings (dictionary mapping strings to strings). Parameters must correspond to those in task
# file (`inputs` section). If not parameters are provided, the binding section must be an empty dictionary.
input_binding:
parameters_file: $WORKSPACE/shapes.yaml
# Dictionary of output bindings (dictionary mapping strings to strings). Parameters must correspond to those in task
# file (`outputs` section). Every parameter is a file system path (directory or a file name). Paths can be absolute
# (starting with `/`) or relative. Relative paths are assumed to be relative to MLCube `workspace` directory.
# Alternatively, a special variable `$WORKSPACE` can be used to explicitly refer to the MLCube `workspace` directory.
# MLCube root directory (`--mlcube`) and run configuration file (`--task`) define MLCube task to run. One step left is
# to specify where MLCube runs - on a local machine, remote machine in the cloud etc. This is done by providing platform
# configuration files located in the MLCube `platforms` sub-folder.
# NEXT: study `platforms/docker.yaml`.
output_binding:
output_file: $WORKSPACE/matmul_output.txt
Теперь отредактируем файл ./matmul/platforms/docker.yaml
cd ../platforms
Измените имя образа докера в docker.yaml. Измените «image:« mlcube / matmul: 0.0.1 »на« mlcommons / matmul: v1.0 »
# Platform configuration files define where and how runners run MLCubes. This configuration file defines a Docker
# runtime for MLCubes. One field need to be updated here - `container.image`. This platform file defines local docker
# execution environment.
# MLCube Docker runner uses image name to either `pull` or `build` a docker image. The rule is the following:
# - If the following file exists (`build/Dockerfile`), Docker image will be built.
# - Else, docker runner will pull a docker image with the specified name.
# Users provide platform files using `--platform` command line argument.
schema_type: mlcube_platform
schema_version: 0.1.0
platform:
name: "docker"
version: ">=18.01"
container:
image: "mlcommons/matmul:v1.0"
Шаг 3. Создайте Dockerfile для образа контейнера модели
Для создания MLCube вам понадобится образ докера. Мы будем использовать Dockerfile для matmul, чтобы создать образ контейнера докера:
Примечание: последняя строка файла Docker должна быть
«ENTRYPOINT [« python3 »,« /workspace/your_mlcube_name.py »]», как показано ниже.
Теперь отредактируем my_mlcube / build / Dockerfile
cd ../build
# Sample Dockerfile for matmul (Matrix Multiply) FROM ubuntu:18.04 MAINTAINER MLPerf MLBox Working Group WORKDIR /workspace RUN apt-get update && \ apt-get install -y --no-install-recommends \ software-properties-common \ python3-dev \ curl && \ rm -rf /var/lib/apt/lists/* RUN curl -fSsL -O https://bootstrap.pypa.io/get-pip.py && \ python3 get-pip.py && \ rm get-pip.py COPY requirements.txt /requirements.txt RUN pip3 install --no-cache-dir -r /requirements.txt COPY matmul.py /workspace/matmul.py ENTRYPOINT ["python3", "/workspace/matmul.py"]
Шаг 4. Создайте образ контейнера Docker
cd ..
mlcube_docker configure --mlcube=. --platform=platforms/docker.yaml
Шаг 5. Протестируйте свой MLCube
mlcube_docker run --mlcube=. --platform=platforms/docker.yaml --task=run/matmul.yaml
ls ./workspace
cat ./workspace/matmul_output.txt
Заключение
MLCube - это набор общих соглашений для создания программного обеспечения машинного обучения, которое может работать по принципу plug-and-play во многих различных системах. MLCube позволяет исследователям обмениваться инновационными моделями машинного обучения, разработчикам - экспериментировать с множеством различных моделей, а компаниям-разработчикам программного обеспечения - создавать инфраструктуру для моделей. Это создает возможности, передавая ML в руки большего числа людей.