R в Microsoft Azure для победы на хакатоне. Инструкция по применению

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

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

Хакатон — мероприятие, где кофе время чрезвычайно ценный ресурс. В контексте этого я ранее писал о best practices обучения моделей в Azure Machine Learning. Но Azure ML — это не инструмент для прототипирования; это скорее сервис для создания продукта с SLA со всеми вытекающими отсюда затратами как на время разработки, так и на стоимость владения.

R же прекрасно подходит для создания прототипов, для копания (mining) в данных, для быстрой проверки своих гипотез — то есть
всего того, что нам нужно на такого типа соревнованиях! Ниже я расскажу, как использовать всю мощь R в Azure — от создания прототипа до публикации готовой модели в Azure Machine Learning.

d6d6d58f82d9972d795ce2bd14c2919c.png

Мотивирующий off-topic

Как и в прошлый хакатон (да, это не первый ML хакатон от Microsoft), у вас будет возможность вдоволь напрограммироваться на любимом Python/R/C#, покрутить ручки в Azure Machine Learning, пообщаться с единомышленниками и экспертами, крепко не выспаться, перепить халявного кофе и переесть вкусных печенек. А самые хитрые сделают мир лучше и получат заслуженные призы!


0. Microsoft love R


Сразу определимся со списком продуктов/сервисов Microsoft, которые нам позволят работать с R:

  1. Microsoft R Server / R Server для Azure HDInsight
  2. Data Science VM
  3. Azure Machine Learning
  4. SQL Server R Services
  5. Power BI
  6. R Tools for Visual Studio


И (о радость!) продукты 1–3 нам доступны в Azure по модели IaaS/PaaS. Рассмотрим их по очереди.

1. Microsoft R Server (+ для Azure HDInsight)


После покупки в прошлом году небезызвестной Revolution Analytics, Revolution R Open (RRO) и Revolution R Enterprise (RRE) были переименованы в Microsoft R Open (MRO) и Microsoft R Server, соответственно. Сейчас Microsoft R Server — хорошо сложенная экосистема, состоящая как из opensource-продуктов, так и проприетарных модулей Revolution Analytics.

abf8c88efbeb0f72bd6ac2b1b3f557e0.png
Источник

Центральное место занимает R+CRAN, гарантируется 100%-ая совместимость как с языком R, так и совместимость с существующими пакетами. Еще один центральный компонент R Server — Microsoft R Open, представляющий собой среду выполнения с улучшенными показателями скорости работы с матрицами, математическими функциями, улучшенную поддержку многопоточности.

Модуль ConnectR позволяет получать доступ к данным, хранящимся в Hadoop, Teradata Database и др.

R Server для Azure HDInsight добавляет ко всему возможность выполнять R-скрипты непосредственно на Spark-кластере в облаке Azure. Таким образом, решена проблема того, что данные не помещаются в RAM машины, локально, по отношению которой, исполняется R-скрипт. Инструкция прилагается.

Сам же Azure HDInsight — облачный сервис, предоставляющий Hadoop/Spark-кластер по требованию. Так как это сервис, то из задач администрирования стоит только развертывание и удаления кластера. Все! Ни секунды потраченного времени на конфигурацию кластера, установку обновлений, настройку доступов и т.п.

Создание/удаление кластера Hadoop (HDI 3.3) из 8 нод
b58ad62b22134cf6c43291767ed1102d.png

Для создания Spark-кластера нам на выбор нужно нажать либо 3 кнопки (изображение выше), либо выполнить следующий несложный PowerShell-скрипт [источник]:

 Login-AzureRmAccount

# Set these variables
$clusterName = $containerName # As a best practice, have the same name for the cluster and container
$clusterNodes = 8 # The number of nodes in the HDInsight cluster
$credentials = Get-Credential -Message "Enter Cluster user credentials" -UserName "admin"
$sshCredentials = Get-Credential -Message "Enter SSH user credentials"
# The location of the HDInsight cluster. It must be in the same data center as the Storage account.
$location = Get-AzureRmStorageAccount -ResourceGroupName $resourceGroupName `
    -StorageAccountName $storageAccountName | %{$_.Location}
# Create a new HDInsight cluster
New-AzureRmHDInsightCluster -ClusterName $clusterName `
    -ResourceGroupName $resourceGroupName -HttpCredential $credentials `
    -Location $location -DefaultStorageAccountName "$storageAccountName.blob.core.windows.net" `
    -DefaultStorageAccountKey $storageAccountKey -DefaultStorageContainer $containerName  `
    -ClusterSizeInNodes $clusterNodes -ClusterType Hadoop  `
    -OSType Linux -Version "3.3" -SshCredential $sshCredentials
                    
Для удаления кластера на выбор либо нажать одну кнопку и одно подтверждение, либо выполнить следующую строчку PowerShell-скрипта:

Remove-AzureRmHDInsightCluster -ClusterName


2. Data Science VM


Если вам вдруг захотелось: 32x CPU, 448Gb RAM, ~0.5 TB SSD с предустановленными и сконфигурированными:

  • Microsoft R Server Developer Edition,
  • Anaconda Python distribution,
  • Jupyter Notebooks для Python и R,
  • Visual Studio Community Edition с Python и R Tools,
  • Power BI desktop,
  • SQL Server Express edition.


Если Вы собирайтесь писать на R, Python, C# и использовать SQL. А потом еще решили, что вам не помешает xgboost, Vowpal Wabbit, CNTK (open source deep learning library от Microsoft Research). Тогда Data Science Virtual Machine то, что вам нужно — там предуставновлены и готовы к работе все перечисленные выше продукты и не только. Развертывание несложное, но и для него есть инструкция.

3. Azure Machine Learning


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

Подробный рассказ про Azure ML не входит в цели данного поста, в тем более, что о сервисе уже достаточно написано: Azure ML для Data Scientist«ов, Best Practices обучения модели в Azure ML. Сконцентрируемся на следующей задаче: организация командной работы с максимально безболезненным переносом R-скриптов с локального компьютера в Azure ML Studio.

fd6900ccdf67dbabed30fbdd7768f647.png

3.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.

3.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:

78ef5f0512d261ec2f3ada7c480f2f56.png

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

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

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


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

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

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

    bb5d76b444a0c8922000a2b69dd3a769.png

  3. Делимся ссылкой на документ Jupyter Notebook с командой, кидаемся ка обсуждаем, дополняем непосредственно в Jupyter Notebook.


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

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


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

d96adbb680b1991aeaac17f13d717750.png

3.4. Prototype to Production


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

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


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

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

Модули:

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


R-скрипты:

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


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

  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. Xml-файл, содержащий определение/метаданные нашей R-функции.
    Пример (раздел Arguments просто для «широты» примера)

    Dmitry Petukhov
    Preprocessing dataset for ML Hackathon Demo.





    Transactions Log


    MCC List


    Processed dataset


    View the R console graphics device output.





    Swap input datasets.







    Select a color.




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

2396d77e2562d203a28c0ce5dec6abc9.png

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

Заключение


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

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

И еще…


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

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

Стучитесь ко мне за инвайтом в slack через личные сообщения в Хабре или по любому из контактов, который найдете в моем блоге (ссылку ставить не буду — через профиль на Хабре найти его не составит труда).

© Habrahabr.ru