Руководство. Параллельное моделирование на R с помощью пакетной службы AzureTutorial: Run a parallel R simulation with Azure Batch

Выполняйте масштабные параллельные рабочие нагрузки R с помощью doAzureParallel, упрощенного пакета R, который позволяет использовать пакетную службу Azure напрямую из сеанса R.Run your parallel R workloads at scale using doAzureParallel, a lightweight R package that allows you to use Azure Batch directly from your R session. Пакет doAzureParallel создан на основе популярного пакета R foreach.The doAzureParallel package is built on top of the popular foreach R package. doAzureParallel принимает каждую итерацию цикла foreach и передает ее в качестве задачи пакетной службы Azure.doAzureParallel takes each iteration of the foreach loop and submits it as an Azure Batch task.

В этом руководстве показано, как развернуть пул пакетной службы и выполнить параллельное задание R в пакетной службе Azure непосредственно из RStudio.This tutorial shows you how to deploy a Batch pool and run a parallel R job in Azure Batch directly within RStudio. Вы узнаете, как выполнять следующие задачи:You learn how to:

  • Установка пакета doAzureParallel и настройка доступа к учетным записям пакетной службы и другим учетным записям хранения.Install doAzureParallel and configure it to access your Batch and storage accounts
  • Создание пула пакетной службы в качестве параллельного сервера для сеанса R.Create a Batch pool as a parallel backend for your R session
  • Запуск примера параллельного моделирования в пуле.Run a sample parallel simulation on the pool

Предварительные требованияPrerequisites

  • Установленный дистрибутив R, такой как Microsoft R Open.An installed R distribution, such as Microsoft R Open. Используйте R версии 3.3.1 или более поздней.Use R version 3.3.1 or later.

  • RStudio (коммерческий выпуск или RStudio Desktop с открытым кодом).RStudio, either the commercial edition or the open-source RStudio Desktop.

  • Учетная запись пакетной службы Azure и службы хранилища Azure.An Azure Batch account and an Azure Storage account. Чтобы создать эти учетные записи, см. примеры быстрого начала работы с пакетной службой с помощью портала Azure или Azure CLI.To create these accounts, see the Batch quickstarts using the Azure portal or Azure CLI.

Вход в AzureSign in to Azure

Войдите на портал Azure по адресу https://portal.azure.com.Sign in to the Azure portal at https://portal.azure.com.

Получение учетных данных учетной записиGet account credentials

В этом примере нужно предоставить учетные данные для доступа к учетной записи службы хранилища и пакетной службы.For this example, you need to provide credentials for your Batch and Storage accounts. Проще всего получить необходимые учетные данные на портале Azure.A straightforward way to get the necessary credentials is in the Azure portal. (Можно также получить эти учетные данные с помощью API-интерфейсов Azure или средств командной строки.)(You can also get these credentials using the Azure APIs or command-line tools.)

  1. Выберите Все службы > Учетные записи пакетной службы и щелкните имя учетной записи пакетной службы.Select All services > Batch accounts, and then select the name of your Batch account.

  2. Для просмотра учетных данных пакетной службы нажмите Ключи.To see the Batch credentials, select Keys. Скопируйте значения учетной записи пакетной службы, URL-адреса, и первичного ключа доступа в текстовый редактор.Copy the values of Batch account, URL, and Primary access key to a text editor.

  3. Чтобы просмотреть имя и ключи учетной записи хранения, выберите Учетная запись хранения.To see the Storage account name and keys, select Storage account. Скопируйте значения имени учетной записи службы хранилища и Key1 в текстовый редактор.Copy the values of Storage account name and Key1 to a text editor.

Установка doAzureParallelInstall doAzureParallel

В консоли RStudio установите пакет doAzureParallel с GitHub.In the RStudio console, install the doAzureParallel GitHub package. Следующие команды скачивают и устанавливают пакет и его зависимости в рамках текущего сеанса R:The following commands download and install the package and its dependencies in your current R session:

# Install the devtools package  
install.packages("devtools") 

# Install rAzureBatch package
devtools::install_github("Azure/rAzureBatch") 

# Install the doAzureParallel package 
devtools::install_github("Azure/doAzureParallel") 
 
# Load the doAzureParallel library 
library(doAzureParallel) 

Установка может занять несколько минут.Installation can take several minutes.

Чтобы настроить doAzureParallel с ранее полученными учетными данными учетной записи, создайте в рабочем каталоге файл конфигурации credentials.json:To configure doAzureParallel with the account credentials you obtained previously, generate a configuration file called credentials.json in your working directory:

generateCredentialsConfig("credentials.json") 

Укажите в этом файле имена и ключи учетной записи хранения и учетной записи пакетной службы.Populate this file with your Batch and storage account names and keys. Не изменяйте параметр githubAuthenticationToken.Leave the githubAuthenticationToken setting unchanged.

По завершении файл учетных данных выглядит следующим образом:When complete, the credentials file looks similar to the following:

{
  "batchAccount": {
    "name": "mybatchaccount",
    "key": "xxxxxxxxxxxxxxxxE+yXrRvJAqT9BlXwwo1CwF+SwAYOxxxxxxxxxxxxxxxx43pXi/gdiATkvbpLRl3x14pcEQ==",
    "url": "https://mybatchaccount.mybatchregion.batch.azure.com"
  },
  "storageAccount": {
    "name": "mystorageaccount",
    "key": "xxxxxxxxxxxxxxxxy4/xxxxxxxxxxxxxxxxfwpbIC5aAWA8wDu+AFXZB827Mt9lybZB1nUcQbQiUrkPtilK5BQ=="
  },
  "githubAuthenticationToken": ""
}

Сохраните файл.Save the file. Выполните следующую команду, чтобы задать учетные данные для текущего сеанса R:Then, run the following command to set the credentials for your current R session:

setCredentials("credentials.json") 

Создание пула пакетной службыCreate a Batch pool

doAzureParallel содержит функцию для создания пула пакетной службы Azure (кластер), выполняющего параллельные задания R.doAzureParallel includes a function to generate an Azure Batch pool (cluster) to run parallel R jobs. На узлах запускается виртуальная машина для обработки и анализа данных Azure на базе Ubuntu.The nodes run an Ubuntu-based Azure Data Science Virtual Machine. Microsoft R Open и популярные пакеты R предварительно установлены в этом образе.Microsoft R Open and popular R packages are pre-installed on this image. Вы можете просмотреть или настроить определенные параметры кластера, например число и размер узлов.You can view or customize certain cluster settings, such as the number and size of the nodes.

Для создания файла конфигурации JSON кластера в рабочем каталоге:To generate a cluster configuration JSON file in your working directory:

generateClusterConfig("cluster.json")

Откройте файл, чтобы просмотреть конфигурацию по умолчанию с 3 выделенными узлами и 3 низкоприоритетными узлами.Open the file to view the default configuration, which includes 3 dedicated nodes and 3 low-priority nodes. Эти параметры используются в качестве примеров, с которыми можно поэкспериментировать или которые можно изменить.These settings are just examples that you can experiment with or modify. Выделенные узлы зарезервированы для пула.Dedicated nodes are reserved for your pool. Низкоприоритетные узлы предлагаются по сниженной цене с учетом избыточных ресурсов виртуальной машины в Azure.Low-priority nodes are offered at a reduced price from surplus VM capacity in Azure. Эти узлы становятся недоступны, если в Azure недостаточно ресурсов.Low-priority nodes become unavailable if Azure does not have enough capacity.

Для работы с этим руководством измените конфигурацию следующим образом:For this tutorial, change the configuration as follows:

  • Увеличьте значение maxTasksPerNode до 2, чтобы воспользоваться преимуществами обоих ядер на каждом узле.Increase the maxTasksPerNode to 2, to take advantage of both cores on each node
  • Задайте для dedicatedNodes значение 0, чтобы воспользоваться низкоприоритетными виртуальными машинами, доступными для пакетной службы.Set dedicatedNodes to 0, so you can try the low-priority VMs available for Batch. Задайте для свойства min параметра lowPriorityNodes значение 5,Set the min of lowPriorityNodes to 5. а для свойства max значение 10. При необходимости вы можете выбрать меньшие значения.and the max to 10, or choose smaller numbers if desired.

Оставьте значения по умолчанию для остальных параметров и сохраните файл.Leave defaults for the remaining settings, and save the file. Это должно выглядеть следующим образом:It should look similar to the following:

{
  "name": "myPoolName",
  "vmSize": "Standard_D2_v2",
  "maxTasksPerNode": 2,
  "poolSize": {
    "dedicatedNodes": {
      "min": 0,
      "max": 0
    },
    "lowPriorityNodes": {
      "min": 5,
      "max": 10
    },
    "autoscaleFormula": "QUEUE"
  },
  "containerImage": "rocker/tidyverse:latest",
  "rPackages": {
    "cran": [],
    "github": [],
    "bioconductor": []
  },
  "commandLine": []
}

Создайте кластер.Now create the cluster. В пакетной службе сразу же создается пул, но для выделения и запуска вычислительных узлов понадобится несколько минут.Batch creates the pool immediately, but it takes a few minutes to allocate and start the compute nodes. Как только кластер станет доступным, зарегистрируйте его как параллельный сервер для сеанса R.After the cluster is available, register it as the parallel backend for your R session.

# Create your cluster if it does not exist; this takes a few minutes
cluster <- makeCluster("cluster.json") 
  
# Register your parallel backend 
registerDoAzureParallel(cluster) 
  
# Check that the nodes are running 
getDoParWorkers() 

В выходных данных показано число рабочих процессов выполнения для doAzureParallel.Output shows the number of "execution workers" for doAzureParallel. Это количество узлов, умноженное на значение maxTasksPerNode.This number is the number of nodes multiplied by the value of maxTasksPerNode. Если вы изменили конфигурацию кластера, как описано ранее, вы получите число 10.If you modified the cluster configuration as described previously, the number is 10.

Запуск параллельного моделированияRun a parallel simulation

После создания кластера вы готовы к выполнению цикла foreach на зарегистрированном параллельном сервере (пул пакетной службы Azure).Now that your cluster is created, you are ready to run your foreach loop with your registered parallel backend (Azure Batch pool). Например, запустите финансовое моделирование методом Монте-Карло, сначала локально с использованием стандартного цикла foreach, а затем выполнив этот цикл в пакетной службе.As an example, run a Monte Carlo financial simulation, first locally using a standard foreach loop, and then running foreach with Batch. Этот пример представляет собой упрощенную версию прогнозирования курса акций путем моделирования множества различных результатов, которые можно получить в течение 5 лет.This example is a simplified version of predicting a stock price by simulating a large number of different outcomes after 5 years.

Предположим, что курс акций корпорации Contoso каждый день в среднем увеличивается в 1,001 раз по сравнению с начальным курсом, но имеет волатильность 0,01 (стандартное отклонение).Suppose that the stock of Contoso Corporation gains on average 1.001 times its opening price each day, but has a volatility (standard deviation) of 0.01. С учетом начального курса в 100 долларов определите курс акций Contoso через 5 лет, используя моделирование цен методом Монте-Карло.Given a starting price of $100, use a Monte Carlo pricing simulation to figure out Contoso's stock price after 5 years.

Параметры для моделирования методом Монте-Карло:Parameters for the Monte Carlo simulation:

mean_change = 1.001 
volatility = 0.01 
opening_price = 100 

Для моделирования курса при закрытии биржи определите следующую функцию:To simulate closing prices, define the following function:

getClosingPrice <- function() { 
  days <- 1825 # ~ 5 years 
  movement <- rnorm(days, mean=mean_change, sd=volatility) 
  path <- cumprod(c(opening_price, movement)) 
  closingPrice <- path[days] 
  return(closingPrice) 
} 

Сначала выполните 10 000 локальных симуляций, используя стандартный цикл foreach с ключевым словом %do%:First run 10,000 simulations locally using a standard foreach loop with the %do% keyword:

start_s <- Sys.time() 
# Run 10,000 simulations in series 
closingPrices_s <- foreach(i = 1:10, .combine='c') %do% { 
  replicate(1000, getClosingPrice()) 
} 
end_s <- Sys.time() 

Отобразите курс при закрытии биржи на гистограмме, чтобы показать распределение результатов:Plot the closing prices in a histogram to show the distribution of outcomes:

hist(closingPrices_s)

Результат аналогичен приведенному ниже:Output is similar to the following:

Распределение курса при закрытии биржи

Локальное моделирование завершится в течение нескольких секунд или менее:A local simulation completes in a few seconds or less:

difftime(end_s, start_s) 

Предполагаемое время получения результатов для 10 миллионов локальных симуляций локально, определенное методом линейной аппроксимации, составляет около 30 минут:Estimated runtime for 10 million outcomes locally, using a linear approximation, is around 30 minutes:

1000 * difftime(end_s, start_s, unit = "min") 

Теперь запустите код, используя цикл foreach с ключевым словом %dopar%, чтобы сравнить время, необходимое для выполнения 10 миллионов симуляций в Azure.Now run the code using foreach with the %dopar% keyword to compare how long it takes to run 10 million simulations in Azure. Для параллелизации моделирования с использованием пакетной службы выполните 100 итераций 100 000 симуляций:To parallelize the simulation with Batch, run 100 iterations of 100,000 simulations:

# Optimize runtime. Chunking allows running multiple iterations on a single R instance.
opt <- list(chunkSize = 10) 
start_p <- Sys.time()  
closingPrices_p <- foreach(i = 1:100, .combine='c', .options.azure = opt) %dopar% { 
  replicate(100000, getClosingPrice()) 
} 
end_p <- Sys.time() 

При моделировании задачи распределяются по узлам в пуле пакетной службы.The simulation distributes tasks to the nodes in the Batch pool. Действия можно увидеть на тепловой карте для пула на портале Azure.You can see the activity in the heat map for the pool in the Azure portal]. Последовательно выберите Учетные записи пакетной службы > myBatchAccount.Go to Batch accounts > myBatchAccount. Щелкните Пулы > myPoolName.Click Pools > myPoolName.

Тепловая карта пула, в котором выполняются параллельные задачи R

Через несколько минут моделирование завершается.After a few minutes, the simulation finishes. Пакет автоматически объединяет результаты и извлекает их из узлов.The package automatically merges the results and pulls them down from the nodes. После этого результаты можно использовать во время сеанса R.Then, you are ready to use the results in your R session.

hist(closingPrices_p) 

Результат аналогичен приведенному ниже:Output is similar to the following:

Распределение курса при закрытии биржи

Сколько времени выполнялось параллельное моделирование?How long did the parallel simulation take?

difftime(end_p, start_p, unit = "min")  

Вы увидите, что при моделировании в пуле пакетной службы обеспечивается значительное повышение производительности по сравнению с ожидаемым временем моделирования в локальной среде.You should see that running the simulation on the Batch pool gives you a significant increase in performance over the expected time to run the simulation locally.

Очистка ресурсовClean up resources

Задание автоматически удаляется после завершения.The job is deleted automatically after it completes. Если кластер больше не нужен, вызовите функцию stopCluster в пакете doAzureParallel для его удаления:When the cluster is longer needed, call the stopCluster function in the doAzureParallel package to delete it:

stopCluster(cluster)

Дополнительная информацияNext steps

Из этого руководства вы узнали, как выполнять такие задачи:In this tutorial, you learned about how to:

Установка пакета doAzureParallel и настройка доступа к учетным записям пакетной службы и другим учетным записям хранения.Install doAzureParallel and configure it to access your Batch and storage accounts

  • Создание пула пакетной службы в качестве параллельного сервера для сеанса R.Create a Batch pool as a parallel backend for your R session
  • Запуск примера параллельного моделирования в пуле.Run a sample parallel simulation on the pool

Дополнительные сведения о doAzureParallel см. в документации и примерах на сайте GitHub.For more information about doAzureParallel, see the documentation and samples on GitHub.