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

в 2:07, , рубрики: big data, Microsoft Azure, R, машинное обучение, Облачные вычисления, хакатон

Стандартный план любого хакатона
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.

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

Мотивирующий 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.

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

Центральное место занимает 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 нод
R в Microsoft Azure для победы на хакатоне. Инструкция по применению - 4

Для создания 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 <Cluster Name>

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.

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

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:

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

Листинг 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.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.

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

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

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

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

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

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

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 просто для «широты» примера)
    <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 в Microsoft Azure для победы на хакатоне. Инструкция по применению - 9

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

Заключение

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

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

И еще…

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

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

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

Автор: codezombie

Источник

Поделиться новостью

* - обязательные к заполнению поля