R в Microsoft Azure для перемоги на хакатоне. Інструкція по застосуванню

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

Одним з «локомотивів» інтеграції R з продуктами Microsoft є хмарна платформа Microsoft Azure. Крім того, з'явився відмінний привід уважніше поглянути на зв'язку R + Azure – це що проходить в ці вихідні (21-22 травня) хакатон за машинного навчання, організований Microsoft.

Хакатон – захід, де кави час надзвичайно цінний ресурс. В контексті цього я раніше писав про best practices моделей навчання Azure Machine Learning. Але Azure ML – це не інструмент для прототипування; це скоріше сервіс для створення продукту з SLA зі всіма витікаючими звідси витратами як на час розробки, так і на вартість володіння.

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



Мотивуючий off-topicЯк і в минулий хакатон (так, це не перший ML хакатон від Microsoft), у вас буде можливість вдосталь напрограммироваться на улюбленому Python/R/C#, покрутити ручки в Azure Machine Learning, поспілкуватися з однодумцями та експертами, міцно не виспатися, перепити халявного кави і переїсти смачних пляцків. А найхитріші зроблять світ кращим і отримають заслужені призи!

0. Microsoft love R

Відразу визначимося зі списком продуктів/сервісів Microsoft, які нам дозволять працювати з R:
  1. Microsoft R Server / R Server для Microsoft 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+CRAN, гарантується 100%-ая сумісність як з мовою R, так і сумісність з існуючими пакетами. Ще один центральний компонент R Server – Microsoft R Open, який представляє собою середовище виконання з поліпшеними показниками швидкості роботи з матрицями, математичними функціями, поліпшену підтримку багатопоточності.

Модуль ConnectR дозволяє отримувати доступ до даних, що зберігаються в Hadoop, Teradata Database та ін

R Server для Microsoft HDInsight додає до всього можливість виконувати R-скрипти безпосередньо на Spark-кластері в хмарі Azure. Таким чином, вирішена проблема того, що дані не містяться в ПАМ'ЯТІ машини, локально, по відношенню якої, виповнюється R-скрипт. Інструкція прилагается.

Сам же Azure HDInsight – хмарний сервіс, що надає Hadoop/Spark-кластер на вимогу. Так як це сервіс, то із завдань адміністрування варто тільки розгортання і видалення кластера. Всі! Ні секунди витраченого часу на конфігурацію кластера, інсталяції, налаштування доступів і т. п.

Створення/видалення кластера Hadoop (HDI 3.3) з 8 нод

Для створення 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 cluster HDInsight
$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 -Версія "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.



3.1. Початкові вимоги

Для задуманого знадобляться наступні безкоштовні програмні продукти:
  • Для консерваторів: R (runtime), R Studio (IDE).
  • Для демократів: R (runtime), Microsoft R Open (runtime), Visual Studio Community 2015 (IDE), R Інструменти для 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) і розішліть його команді.

Так виглядає інтерфейс завантаження даних в Microsoft 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.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.



  3. Ділимося посиланням на документ Jupyter Notebook з командою, кидаємося ка обговорюємо, доповнюємо безпосередньо в Jupyter Notebook.
В результаті на кожну задачу хакатона повинні вийти кілька Jupyter Notebook документів:
  • містять R-скрипти і результати їх виконання;
  • над якими пофантазувала-подумала вся команда;
  • з повним flow: від завантаження даних до результату застосування алгоритму машинного навчання.
Ось так це виглядає у мене:



3.4. Prototype Production to

На цьому етапі у нас є кілька досліджень, за якими отримано прийнятний результат і відповідні цим дослідженням:
  • 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.5 IQR, Q3 + 1.5 IQR]
     
    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="Port View" 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 екстремально ефективний прототипировании, і від цього він прекрасно себе зарекомендував на різного типу data science хакатонах. У той же час між прототипом і продуктом існує який складно перебороти прірву в таких речах як масштабованість, доступність, надійність.

Використовуючи інструментарій Azure для R, ми досить довго можемо балансувати на грані між гнучкістю R і надійністю + іншими бенефіти, які нам дає Azure ML.

І ще…

Приходьте на хакатон за Azure Machine Learning (про нього я писав на початку) і спробуйте все це самі, поспілкуйтеся з експертами та однодумцями вбийте собі вихідні. Мене також там можна буде знайти (у журі).

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

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

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.