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.

  1. MNIST MLCube загружает данные и обучает простую нейронную сеть. Этот MLCube может работать с Docker или Singularity локально и на удаленных хостах. В файле README есть инструкции по его запуску. Документация MLCube предоставляет дополнительную информацию.
  2. EMDenoise MLCube загружает данные и обучает глубокую сверточную нейронную сеть для теста электронной микроскопии. Этот MLCube может запускать только контейнер Docker. В файле README есть инструкции по его запуску.
  3. Матмуль Матмуль выполняет матричное умножение.

Учебное пособие: создание 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 в руки большего числа людей.