19 мая 2016

Data Science с R в Microsoft Azure (часть 2)

Data Science с R в Microsoft Azure (часть 2)

R, один из популярнейших языков программирования среди data scientist'ов, получает все большую и большую поддержку как среди opensource-сообщества, так и среди частных компаний, которые традиционно являлись разработчиками проприетарных продуктов. Среди таких компаний – Microsoft, чья интенсивно увеличивающая поддержка языка R в своих продуктах/сервисах, привлекла к себе и мое внимание.

Одним из «локомотивов» интеграции R с продуктами Майкрософт является облачная платформа Microsoft Azure. Кроме того, появился отличный повод повнимательнее взглянуть на связку R + Azure – это проходящий в эти выходные (21-22 мая) хакатон по машинному обучению, организованный Microsoft [1].

В прошлой части я озвучил 3 тезиса:

  1. 1. Время на хакатоне крайне ценный ресурс.
  2. 2. Правильная организация командной работы дает вам большое преимущество.
  3. 3. Azure ML – не инструмент прототипирования, для прототипирования стоит использовать R/Python.

Azure Machine Learning

Azure Machine Learning (Azure ML) – облачный сервис для выполнения задач, связанных с машинным обучением. Почти наверняка Azure ML будет центральным сервисом, которым вы будете пользоваться, в случае, если захотите обучить модель, в облаке Azure.

Подробный рассказ про Azure ML не входит в цели данного поста, в тем более, что о сервисе уже достаточно написано: Azure ML для data scientist’ов [3], best practices обучения модели в Azure ML [4]. Сконцентрируемся на следующей задаче: организация командной работы с максимально безболезненным переносом R-скриптов с локального компьютера в Azure ML Studio.

1. Начальные требования

Для задуманного понадобятся следующие бесплатные программные продукты:

  • Для консерваторов: R (runtime), R Studio (IDE).
  • Для демократов: R (runtime), Microsoft R Open (runtime), Visual Studio Community 2015 (IDE), R Tools для Visual Studio (IDE extension).

Для работы в Azure понадобится активная подписка Microsoft Azure.

2. Начало работы: collaboration everything

Один workspace в Azure ML на всех

Создаем один(!) на всю команду workspace в Azure ML и расшариваем его между всеми участниками команды.

Один репозиторий кода на всех

Создаем один облачный Team Project (TFS в Azure) / репозиторий в GitHub и также расшариваем его на всю команду.

Думаю, очевидно, что теперь часть команды, работающая над одной задачей хакатона, делает коммиты в один репозиторий, коммитит фичи в бранчи, бранчи мержит в мастер – в общем идет нормальная командная работа над кодом.

Один набор начальных данных на всех

Зайдите в Azure ML Studio (web IDE), перейдите на вкладку «Datasets» и загрузите набор изначальных данных в облако. Сгенерируйте код доступа (Data Access Code) и разошлите его команде.

Так выглядит интерфейс загрузки данных в Azure ML Studio:

Листинг 1. R-скрипт для загрузки данных

library("AzureML")

ws <- workspace(
id = "<workspace_id>",
auth = "<auth_token>",
api_endpoint = "https://europewest.studioapi.azureml.net")
data.raw <- download.datasets(
    dataset = ws,
    name = "ML-Hackathon-2016-dataset")

3. Jupyter Notebook: выполнение R-скриптов в облаке и визуализация результатов

После того, как дата, код и проект в Azure ML оказались в общем для всей команды доступе, пора научиться делиться визуальными результатами исследования. Традиционно для этой задачи data science community любит использовать Jupyter Notebook – клиент-серверное веб-приложение, позволяющее разработчику объединить в рамках единого документа: код (R, Python), результаты его выполнения (в т.ч. графики) и rich-text-пояснения к нему.

Создадим в Azure ML документы Jupyter Notebook:

  1. 1. Создаем отдельный документ Jupyter Notebook на участника.
  2. 2. Заливаем единый расшаренный начальный набор данных из Azure ML (код из листинга 1). Код работает и при запуске из локальной R Studio, поэтому ничего нового для Jupyter Notebook писать не надо – просто берем и копируем код из R Studio.
  3. 3. Делимся ссылкой на документ Jupyter Notebook с командой, кидаемся ка обсуждаем, дополняем непосредственно в Jupyter Notebook.

В результате на каждую задачу хакатона должны получиться несколько Jupyter Notebook документов:

  • содержащих R-скрипты и результаты их выполнения;
  • над которыми пофантазировала-подумала вся команда;
  • с полным flow: от загрузки данных до результата применения алгоритма машинного обучения.

Вот так это выглядит у меня:

4. Prototype to Production

На этом этапе у нас есть несколько исследований, по которым получен приемлемый результат и соответствующие этим исследованиям:

  • в GitHub/Team Project: бранчи с R-скриптами;
  • в Jupyter Notebook: несколько документом с обсужденными в команде результатами того, что получилось.

Следующий шаг – создание в Azure ML Studio экспериментов (вкладка «Experiments») – далее AzureML-экспериментов.

На этом этапе необходимо придерживаться следующих best practices при переносе R-кода в AzureML-эксперимент:

Модули:

  1. 1. По возможности не используйте встроенный модуль «Execute R script» как контейнер для выполнения R кода: у него нет поддержки версионности (сделанные внутри модуля изменения кода нельзя откатить), модуль в совокупности с R кодом не может быть переиспользован в рамках другого эксперимента.
  2. 2. Используйте возможность загружать пользовательские R-пакеты (Custom R Module) в Azure ML (о процессе загрузки ниже). Custom R Module имеют уникальное имя, описание модуля, модуль можно переиспользовать в рамках различных AzureML-экспериментов.

R-скрипты:

  1. 3. Организуйте R-скрипты внутри R-модулей как набор функций с одной точкой входа.
  2. 4. Переносите в Azure ML в виде R-кода только тот функционал, который невозможно/сложно воспроизвести с помощью встроенных модулей Azure ML Studio.
  3. 5. R-код в модулях выполняется со следующими ограничениями: отсутствует доступ к persistence-хранилищу и сетевому соединению.

В соответствии с правилами выше перенесем наш R-код в AzureML-эксперимент. Для нам необходим zip-архив, состоящий из 2-ух файлов:

  1. 1. .R-файл, содержащий код, который мы собираемся перенести в облако.

    Пример с поиском/фильтрацией выбросов в данных:
    PreprocessingData <- function(dataset1, dataset2, swap = F, color = "red") {
        # do something
        # ...
    
        # detecting outliners
        range <- GetOutlinersRange(dataset1$TransAmount)
        ds <- dataset1[dataset1$TransAmount >= range[["Lower"]] &
        dataset1$TransAmount < range[["Upper"]], ]
        
        return(ds)
        }
    
    # outlines detection for normal distributed values
    GetOutlinersRange <- function(values, na.rm = F) {
        # interquartile range: IQ = Q3 - Q1
        Q1 = quantile(values, probs = c(0.25), na.rm = na.rm)
        Q3 = quantile(values, probs = c(0.75), na.rm = na.rm)
        IQ = Q3 - Q1
    
        # outliners interval: [Q1 - 1.5IQR, Q3 + 1.5IQR]
        range <- c(Q1 - 1.5*IQ, Q3 + 1.5*IQ)
        names(range) <- c("Lower", "Upper")
        
        return(range)
    }
    
  2. 2. Xml-файл, содержащий определение/метаданные нашей R-функции.

    Пример (раздел Arguments просто для «широты» примера):
    <Module name="Preprocessing dataset">
        <Owner>Dmitry Petukhov</Owner>
        <Description>Preprocessing dataset for ML Hackathon Demo.</Description>
        <!-- Specify the base language, script file and R function to use for this module. -->
        <Language name="R" entryPoint="PreprocessingData " sourceFile="PreprocessingData.R" />
        <!-- Define module input and output ports -->
        <Ports>
            <Input id="dataset1" name="Dataset 1" type="DataTable">
            <Description>Transactions Log</Description>
            </Input>
            <Input id="dataset2" name="Dataset 2" type="DataTable">
            <Description>MCC List</Description>
            </Input>
            <Output id="dataset" name="Dataset" type="DataTable">
            <Description>Processed dataset</Description>
            </Output>
            <Output id="deviceOutput" name="View Port" type="Visualization">
            <Description>View the R console graphics device output.</Description>
            </Output>
        </Ports>
        <!-- Define module parameters -->
        <Arguments>
            <Arg id="swap" name="Swap" type="bool" >
            <Description>Swap input datasets.</Description>
            </Arg>
            <Arg id="color" name="Color" type="DropDown">
            <Properties default="red">
            <Item id="red" name="Red Value"/>
            <Item id="green" name="Green Value"/>
            <Item id="blue" name="Blue Value"/>
            </Properties>
            <Description>Select a color.</Description>
            </Arg>
        </Arguments>
    </Module>
    

Загрузим полученный архив через Azure ML Studio. И выполним эксперимент, убедившись, что скрипт отработал и мы обучили модель.

Теперь можно улучшить существующий модуль, загрузить новый, устроить соревнование между ними – в общем пользоваться благами инкапсуляции и модульной структуры.

Заключение

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

Используя инструментарий Azure для R, мы довольно долго можем балансировать на грани между гибкостью R и надежностью + другими бенефитами, которые нам дает Azure ML.

P.S.

Приходите на хакатон (о нем я писал в начале) и попробуйте все это сами, пообщайтесь с экспертами и единомышленниками убейте себе выходные. Я, кстати, также буду там (в жюри).

Кроме того, для тех кому будет мало офлайн общения, приглашаю в теплый ламповый slack-чат, где участники хакатона смогут задавать вопросы, делится с друг другом опытом, а после хакатона рассказать о своем крутом решении и продолжать поддерживать профессиональные связи.

Data Science must win!

Полезные ссылки

  1. [1] Хакатон по Azure Machine Learning
  2. [2] Author custom R modules in Azure Machine Learning
  3. [3] Azure Machine Learning для Data Scientist'а
  4. [4] Azure Machine Learning: best practices для создания модели

Автор статьи

,
DS/ML Preacher, Microsoft MVP && Coffee Addicted