Запустите свой R-код в производство

У R большое сообщество. По оценкам, во всем мире насчитывается более двух миллионов пользователей R. Многочисленные исследователи из самых разных областей по всему миру создают фантастические модели и делятся своим кодом. Мы, специалисты в области прикладных наук, очень часто строим, сравниваем и выбираем модели в R.

Но что дальше? Что происходит, когда вы, наконец, нашли лучшую рабочую модель? Именно этот вопрос превращает исследователя в инженера-программиста. Запускаем модель в производство. Мы используем его для управления процессами и прогнозирования результатов. В этом весь смысл. Но как?

Производственные системы продвинутого уровня могут различаться по форме и названию. Если вы являетесь пользователем R и хотите запустить свой код в производство, у вас есть два варианта: Shiny и Plumber.

Shiny — это R-фреймворк для создания веб-приложений. Хотя он становится все более популярным, я не являюсь большим поклонником Shiny по разным причинам.

Второй вариант, который я считаю лучшим способом интеграции R-приложений в любую программную систему, я имею в виду буквально любую систему, — это не что иное, как Plumber. Как нетрудно догадаться, тема этой статьи — сантехник. К концу этой статьи вы создадите свой первый API в R с Plumber. Давайте начнем!

Несколько слов об использовании R в продакшене

Ведутся оживленные споры о том, подходит ли R для производственной среды. Прежде чем представить Plumber, нам нужно было кратко коснуться этой темы.

После быстрого исследования вы можете легко найти наиболее предпочтительные серверные языки в индустрии программного обеспечения. R в этом списке вообще нет. Вы можете создавать гораздо более надежные, надежные и масштабируемые серверные приложения на многих других языках. Ни одна из команд разработчиков программного обеспечения высшего класса не думает об использовании R в производственной среде. Несмотря на все это, почему я до сих пор люблю «Слесарь-водопроводчик» и почему я не потрудился написать о нем статью?

Потому что мир не является черно-белым, как и индустрия программного обеспечения. Невозможно резко разделить среды разработки и производства. И эта нераздельность гораздо более очевидна в стартапах, компаниях среднего размера, студенческих проектах и ​​научных кругах. Лишь немногие гиганты могут позволить себе такую ​​роскошь, и если вы не один из них, вам придется использовать такие языки, как R и Python, в производственной среде.

Что такое API?

Мы говорили о необходимости размещения наших моделей в производственной среде. В этом разделе мы поясним это.

Не ограничивайте себя моделями машинного обучения. Любая работающая программа может быть запущена в производство. Подумайте о программе, которую вы написали. Он может принимать или не принимать входные данные, но он что-то делает, и есть вывод. Вы хотите поделиться этой рабочей программой и помочь другим автоматизировать свои задачи. Эти другие находятся на разных машинах и должны взаимодействовать с программой, которую вы написали, чтобы использовать ее.

Это общение осуществляется с помощью мессенджера между двумя сторонами. Этот мессенджер называется «интерфейс прикладного программирования» или API. Таким образом, API работает как мост между двумя программными объектами и позволяет им взаимодействовать друг с другом.

API могут различаться по своей сложности и назначению. Поэтому они классифицируются по разным функциям, и вы можете увидеть разные типы API. Тот, который мы создадим с помощью Plumber, называется REST API или RESTful API. Это не то, о чем вам следует беспокоиться прямо сейчас. Но просто имейте в виду, что REST API используют очень простой язык, называемый HTTP-методами, для взаимодействия с разными сторонами.

Как работает сантехник?

Мы можем разделить процесс сантехника на две основные части:

1.) Сначала создаем скрипт, который намерен использовать в качестве основного сервиса API. Это скрипт, который будет запущен, когда мы запросим наш API. Подготовка сценариев довольно проста. Для каждой части скрипта мы оставляем специальные комментарии (они немного отличаются от обычных комментариев R), чтобы указать роль этой части в нашем R-скрипте. Эти комментарии, которые мы добавляем к нашему обычному рабочему R-скрипту, заставят Plumber правильно превратить скрипт в API.

2.) После установки Plumber мы можем использовать функцию pr() из пакета, чтобы преобразовать этот R-скрипт в API Plumber.

Начнем с простого скрипта

Мы начнем с простого R-скрипта, состоящего всего из нескольких строк. Вот и все. Тема: Моделирование Монте-Карло. Ваше знакомство с предметом может варьироваться в зависимости от вашего соответствующего опыта, но это очень распространенная работа для большинства ученых-прикладников. Здесь мы используем метод Монте-Карло для решения определенной задачи интегрирования.

Мы написали функцию для нахождения площади под кривой нормали с различными параметрами, заданными пользователем. Мы очень довольны своей работой и хотим поделиться ею с другими. Самый быстрый способ сделать это — создать API. Теперь мы собираемся создать его на основе R-скрипта.

Превратите этот скрипт в API

Мы добавим несколько специальных комментариев к приведенному выше небольшому коду, чтобы превратить его в API. Эти специальные комментарии называются «аннотациями». Для простоты мы будем использовать ограниченное количество аннотаций. Но можно создавать гораздо более сложные API с другими сложными аннотациями. Подробный список аннотаций можно найти в официальной документации Plumber.

https://www.rplumber.io/articles/annotations.html

Начнем с того, что дадим этому API имя и описание. Аннотации для этой цели:

@apiTitle
@apiDescription

Наш API вернет результат на основе введенных нами данных. Итак, чтобы указать эти входы, мы будем использовать следующую аннотацию:

@param

Наконец, мы будем использовать аннотацию, чтобы указать, какой тип запроса выполняет этот API. Поскольку наш API возвращает значение после выполнения кода, этот API делает запрос GET.

@get

Окончательная форма нашего кода должна выглядеть так:

Мы перенастроили исходный код и сделали все, что должны были сделать. Пакет plumber позаботится обо всем остальном.

mcInt <- pr("plumber2.R")
pr_run(mcInt)

Теперь мы проверяем, работает ли это

После того, как мы запустим наш файл API, появится новое окно, и мы сможем увидеть его основные элементы.

Давайте попробуем и посмотрим, работает ли это. Вы можете передавать параметры по своему усмотрению. Буду тестировать следующим образом:

И возвращает следующий результат.

Развертывание

На данный момент мы создали работающий API. Миссия выполнена. Можно сказать, что он находится в производстве. Мы сделали это, чтобы автоматизировать сценарий R в отношении ввода и вывода. Но, к сожалению, он доступен только с нашей машины. Последний шаг — развернуть его на платформе, чтобы другие могли его реализовать и использовать.

Процесс развертывания является отдельной темой и не рассматривается в этой статье. Тем не менее, мы можем поделиться дорожной картой для этого. Первым делом нужно создать для него контейнер, чтобы вам не приходилось управлять зависимостями и версиями. Инструмент де-факто для контейнеризации вашего приложения — Docker. Второй шаг, гораздо более простой, — это выбрать облачный сервис, на который будет помещен ваш API. Вуаля, теперь вы открыли свой рабочий R-скрипт в автоматизированной производственной среде.

Выводы

В этой статье мы обсудили, как мы можем быстро создавать API-интерфейсы с помощью Plumber в R. По мере того, как вы продвигаетесь по пути R, вы сталкиваетесь с различными препятствиями. Одним из них, вероятно, будет дизайн API. Возможно, вам не придется создавать всю производственную среду на R, но когда вы спешите и вам нужно немедленно открыть свое приложение R для использования другими, вы знаете, как это сделать!