- PVSM.RU - https://www.pvsm.ru -
Стандартный план любого хакатона ↓
R, один из популярнейших языков программирования среди data scientist'ов, получает все большую и большую поддержку как среди opensource-сообщества, так и среди частных компаний, которые традиционно являлись разработчиками проприетарных продуктов. Среди таких компаний – Microsoft, чья интенсивно увеличивающая поддержка языка R в своих продуктах/сервисах, привлекла к себе и мое внимание.
Одним из «локомотивов» интеграции R с продуктами Майкрософт является облачная платформа Microsoft Azure. Кроме того, появился отличный повод повнимательнее взглянуть на связку R + Azure – это проходящий в эти выходные (21-22 мая) хакатон по машинному обучению, организованный Microsoft.
Хакатон – мероприятие, где кофе время чрезвычайно ценный ресурс. В контексте этого я ранее писал о best practices обучения моделей [1] в Azure Machine Learning. Но Azure ML – это не инструмент для прототипирования; это скорее сервис для создания продукта с SLA со всеми вытекающими отсюда затратами как на время разработки, так и на стоимость владения.
R же прекрасно подходит для создания прототипов, для копания (mining) в данных, для быстрой проверки своих гипотез – то есть
всего того, что нам нужно на такого типа соревнованиях! Ниже я расскажу, как использовать всю мощь R в Azure – от создания прототипа до публикации готовой модели в Azure Machine Learning.
Сразу определимся со списком продуктов/сервисов Microsoft, которые нам позволят работать с R:
И (о радость!) продукты 1-3 нам доступны в Azure по модели IaaS/PaaS. Рассмотрим их по очереди.
После покупки в прошлом году небезызвестной Revolution Analytics, Revolution R Open (RRO) и Revolution R Enterprise (RRE) были переименованы в Microsoft R Open (MRO) и Microsoft R Server, соответственно. Сейчас Microsoft R Server – хорошо сложенная экосистема, состоящая как из opensource-продуктов, так и проприетарных модулей Revolution Analytics.
Источник [2]
Центральное место занимает R+CRAN, гарантируется 100%-ая совместимость как с языком R, так и совместимость с существующими пакетами. Еще один центральный компонент R Server – Microsoft R Open, представляющий собой среду выполнения с улучшенными показателями скорости работы с матрицами, математическими функциями, улучшенную поддержку многопоточности.
Модуль ConnectR позволяет получать доступ к данным, хранящимся в Hadoop, Teradata Database и др.
R Server для Azure HDInsight добавляет ко всему возможность выполнять R-скрипты непосредственно на Spark-кластере в облаке Azure. Таким образом, решена проблема того, что данные не помещаются в RAM машины, локально, по отношению которой, исполняется R-скрипт. Инструкция прилагается [3].
Сам же Azure HDInsight – облачный сервис, предоставляющий Hadoop/Spark-кластер по требованию. Так как это сервис, то из задач администрирования стоит только развертывание и удаления кластера. Все! Ни секунды потраченного времени на конфигурацию кластера, установку обновлений, настройку доступов и т.п.
Для создания Spark-кластера нам на выбор нужно нажать либо 3 кнопки (изображение выше), либо выполнить следующий несложный PowerShell-скрипт [источник [4]]:
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>
Если вам вдруг захотелось: 32x CPU, 448Gb RAM, ~0.5 TB SSD с предустановленными и сконфигурированными:
Если Вы собирайтесь писать на R, Python, C# и использовать SQL. А потом еще решили, что вам не помешает xgboost, Vowpal Wabbit, CNTK (open source deep learning library от Microsoft Research). Тогда Data Science Virtual Machine то, что вам нужно — там предуставновлены и готовы к работе все перечисленные выше продукты и не только. Развертывание несложное, но и для него есть инструкция [5].
Azure Machine Learning (Azure ML) – облачный сервис для выполнения задач, связанных с машинным обучением. Почти наверняка Azure ML будет центральным сервисом, которым вы будете пользоваться, в случае, если захотите обучить модель, в облаке Azure.
Подробный рассказ про Azure ML не входит в цели данного поста, в тем более, что о сервисе уже достаточно написано: Azure ML для Data Scientist’ов [6], Best Practices обучения модели в Azure ML [1]. Сконцентрируемся на следующей задаче: организация командной работы с максимально безболезненным переносом R-скриптов с локального компьютера в Azure ML Studio.
Для задуманного понадобятся следующие бесплатные программные продукты:
Для работы в Azure понадобится активная подписка Microsoft Azure.
Создаем один(!) на всю команду 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")
После того, как дата, код и проект в Azure ML оказались в общем для всей команды доступе, пора научиться делиться визуальными результатами исследования.
Традиционно для этой задачи data science community любит использовать Jupyter Notebook – клиент-серверное веб-приложение, позволяющее разработчику объединить в рамках единого документа: код (R, Python), результаты его выполнения (в т.ч. графики) и rich-text-пояснения к нему.
Создадим в Azure ML документы Jupyter Notebook:
В результате на каждую задачу хакатона должны получиться несколько Jupyter Notebook документов:
Вот так это выглядит у меня:
На этом этапе у нас есть несколько исследований, по которым получен приемлемый результат и соответствующие этим исследованиям:
Следующий шаг – создание в Azure ML Studio экспериментов (вкладка «Experiments») – далее AzureML-экспериментов.
На этом этапе необходимо придерживаться следующих best practices при переносе R-кода в AzureML-эксперимент:
Модули:
R-скрипты:
В соответствии с правилами выше перенесем наш R-код в AzureML-эксперимент. Для нам необходим zip-архив, состоящий из 2-ух файлов:
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)
}
<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 экстремально эффективен в прототипировании, и от этого он прекрасно себя зарекомендовал на различного типа data science хакатонах. В то же время между прототипом и продуктом существует труднопреодолимая пропасть в таких вещах как масштабируемость, доступность, надежность.
Используя инструментарий Azure для R, мы довольно долго можем балансировать на грани между гибкостью R и надежностью + другими бенефитами, которые нам дает Azure ML.
Приходите на хакатон по Azure Machine Learning [7] (о нем я писал в начале) и попробуйте все это сами, пообщайтесь с экспертами и единомышленниками убейте себе выходные. Меня также там можно будет найти (в жюри).
Кроме того, для тех кому будет мало офлайн общения, приглашаю в теплый ламповый slack-чат, где участники хакатона смогут задавать вопросы, делится с друг другом опытом, а после хакатона рассказать о своем ML-решении и продолжать поддерживать профессиональные связи.
Стучитесь ко мне за инвайтом в slack через личные сообщения в Хабре или по любому из контактов, который найдете в моем блоге (ссылку ставить не буду – через профиль на Хабре найти его не составит труда).
Автор: codezombie
Источник [8]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/hakaton/121072
Ссылки в тексте:
[1] best practices обучения моделей: http://www.codeinstinct.pro/2015/11/azure-ml-hackathon.html
[2] Источник: http://www.r-bloggers.com/using-microsoft-r-server-to-address-scalability-issues-in-r
[3] прилагается: https://azure.microsoft.com/en-us/documentation/articles/hdinsight-hadoop-r-server-install-r-studio/
[4] источник: https://azure.microsoft.com/en-us/documentation/articles/hdinsight-hadoop-create-linux-clusters-azure-powershell/
[5] инструкция: https://azure.microsoft.com/en-us/documentation/articles/machine-learning-data-science-provision-vm/
[6] Azure ML для Data Scientist’ов: http://0xcode.in/azure-ml-for-data-scientist
[7] хакатон по Azure Machine Learning: https://events.techdays.ru/machine-learning/2016-05/
[8] Источник: https://habrahabr.ru/post/301176/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.