Обучение моделей с помощью наборов данных Машинного обучения Azure

ОБЛАСТЬ ПРИМЕНЕНИЯ:Пакет SDK для Python для ML Azure версии 1

Из этой статьи вы узнаете, как работать с наборами данных Машинного обучения Azure для обучения моделей машинного обучения. Наборы данных можно использовать в локальном или удаленном целевом объекте вычислений, не беспокоясь о строках подключения или путях к данным.

Наборы данных Машинного обучения Azure обеспечивают простую интеграцию с функциями обучения Машинного обучения Azure, такими как ScriptRunConfig, HyperDrive и конвейеры Машинного обучения Azure.

Если вы не готовы сделать данные доступными для обучения моделей, но хотели бы загрузить их в записную книжку для исследования, см. статью Исследование данных в наборе данных.

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

Для создания наборов данных и обучения с их помощью вам потребуется следующее.

Примечание

Некоторые классы наборов данных имеют зависимости в пакете azureml-dataprep. Для пользователей Linux эти классы поддерживаются только в следующих дистрибутивах: Red Hat Enterprise Linux, Ubuntu, Fedora и CentOS.

Использование наборов данных в сценариях машинного обучения

Если у вас есть структурированные данные, которые еще не зарегистрированы в качестве набора данных, создайте табличный набор данных TabularDataset и используйте его непосредственно в сценарии обучения для локального или удаленного эксперимента.

В этом примере вы создаете незарегистрированный TabularDataset и указываете его в качестве аргумента сценария в объекте ScriptRunConfig для обучения. Если вы хотите повторно использовать этот TabularDataset с другими экспериментами в рабочей области, см. статью о регистрации наборов данных в рабочей области.

Создание TabularDataset

В следующем коде создается незарегистрированный TabularDataset на основе URL-адреса.

from azureml.core.dataset import Dataset

web_path ='https://dprepdata.blob.core.windows.net/demo/Titanic.csv'
titanic_ds = Dataset.Tabular.from_delimited_files(path=web_path)

Объекты TabularDataset обеспечивают возможность загрузки данных в TabularDataset в Pandas или Spark DataFrame, чтобы вы могли работать с привычными библиотеками подготовки и обучения данных, не выходя из записной книжки.

Доступ к набору данных в сценарии обучения

В следующем коде настраивается аргумент сценария --input-data, который будет указываться при настройке обучающего запуска (см. следующий раздел). Когда табличный набор данных передается в качестве значения аргумента, Машинное обучение Azure разрешит его в идентификатор набора данных, который затем можно использовать для доступа к набору данных в сценарии обучения (без необходимости жесткого кода имени или идентификатора набора данных в скрипте). Затем с помощью метода to_pandas_dataframe() этот набор данных загружается в кадр данных Pandas для дальнейшего изучения и подготовки перед обучением.

Примечание

Если исходный источник данных содержит не числа, пустые строки или пустые значения, то при использовании to_pandas_dataframe() эти значения заменяются значением Null.

Если необходимо загрузить подготовленные данные в новый набор данных из кадра данных Pandas в памяти, запишите данные в локальный файл, например в parquet, и создайте новый набор данных из этого файла. Дополнительные сведения см. в разделе о создании наборов данных.

%%writefile $script_folder/train_titanic.py

import argparse
from azureml.core import Dataset, Run

parser = argparse.ArgumentParser()
parser.add_argument("--input-data", type=str)
args = parser.parse_args()

run = Run.get_context()
ws = run.experiment.workspace

# get the input dataset by ID
dataset = Dataset.get_by_id(ws, id=args.input_data)

# load the TabularDataset to pandas DataFrame
df = dataset.to_pandas_dataframe()

Настройка обучающего запуска

Для настройки и отправки обучающего запуска используется объект ScriptRunConfig.

Этот код создает объект ScriptRunConfig src, который указывает следующее:

  • Каталог для ваших сценариев. Все файлы в этом каталоге передаются в узел кластера для выполнения.
  • Сценарий обучения train_titanic.py.
  • Входной набор данных для обучения titanic_ds как аргумент для сценария. Машинное обучение Azure разрешит это в соответствующий идентификатор набора данных при его передаче в скрипт.
  • Целевой объект вычислений для запуска.
  • Среда для запуска.
from azureml.core import ScriptRunConfig

src = ScriptRunConfig(source_directory=script_folder,
                      script='train_titanic.py',
                      # pass dataset as an input with friendly name 'titanic'
                      arguments=['--input-data', titanic_ds.as_named_input('titanic')],
                      compute_target=compute_target,
                      environment=myenv)
                             
# Submit the run configuration for your training run
run = experiment.submit(src)
run.wait_for_completion(show_output=True)                             

Подключение файлов к удаленным целевым объектам вычислений

Если у вас есть неструктурированные данные, создайте FileDataset и либо подключите, либо скачайте файлы данных, чтобы сделать их доступными для удаленного целевого объекта вычислений. Узнайте, когда следует использовать подключение или скачивание для удаленных обучающих экспериментов.

Следующий пример,

  • Создает для обучающих данных входной набор данных FileDataset mnist_ds.
  • Указывает, где следует записывать результаты обучения, а также где использовать эти результаты в виде FileDataset.
  • Подключает входной набор данных к целевому объекту вычислений.

Примечание

Если вы используете собственный базовый образ Docker, вам нужно будет установить fuse с помощью apt-get install -y fuse в качестве зависимости, чтобы подключение набора данных работало. Узнайте, как создать собственный образ сборки.

Пример для записной книжки см. в статье Настройка обучающего выполнения с входными и выходными данными.

Создание FileDataset

В следующем примере создается незарегистрированный набор данных FileDataset mnist_data из URL-адресов. Этот FileDataset является входными данными для обучающего выполнения.

Узнайте, как создавать наборы данных из других источников.


from azureml.core.dataset import Dataset

web_paths = [
            'http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz',
            'http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz',
            'http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz',
            'http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz'
            ]

mnist_ds = Dataset.File.from_files(path = web_paths)

Место записи выходных данных обучения

Вы можете указать расположение для записи результатов обучения с помощью объекта OutputFileDatasetConfig.

Объекты OutputFileDatasetConfig позволяют:

  • Подключить или отправить выходные данные запуска в указанное облачное хранилище.
  • Сохранить выходные данные как FileDataset для следующих поддерживаемых типов хранилища:
    • большой двоичный объект Azure;
    • Общая папка Azure
    • Azure Data Lake Storage 1-го и 2-го поколений.
  • Отслеживать происхождение данных между обучающими выполнениями.

Следующий код указывает, что результаты обучения нужно сохранить в виде FileDataset в папке outputdataset в хранилище данных BLOB-объектов по умолчанию def_blob_store.

from azureml.core import Workspace
from azureml.data import OutputFileDatasetConfig

ws = Workspace.from_config()

def_blob_store = ws.get_default_datastore()
output = OutputFileDatasetConfig(destination=(def_blob_store, 'sample/outputdataset'))

Настройка обучающего запуска

Рекомендуется передавать набор данных в качестве аргумента при подключении с помощью параметра arguments конструктора ScriptRunConfig. Это позволит получить путь к данным (точку подключения) в сценарии обучения с помощью аргументов. Таким образом, вы можете использовать один и тот же сценарий обучения для локальной отладки и удаленного обучения на любой облачной платформе.

В следующем примере создается объект ScriptRunConfig, который передается в набор данных FileDataset с помощью arguments. При запуске файлы данных, на которые ссылается набор данных mnist_ds, подключаются к целевому объекту вычислений, и результаты обучения сохраняются в указанной папке outputdataset в хранилище данных по умолчанию.

from azureml.core import ScriptRunConfig

input_data= mnist_ds.as_named_input('input').as_mount()# the dataset will be mounted on the remote compute 

src = ScriptRunConfig(source_directory=script_folder,
                      script='dummy_train.py',
                      arguments=[input_data, output],
                      compute_target=compute_target,
                      environment=myenv)

# Submit the run configuration for your training run
run = experiment.submit(src)
run.wait_for_completion(show_output=True)

Простой сценарий обучения

Сценарий ниже отправляется через ScriptRunConfig. Он считывает набор данных mnist_ds в качестве входных данных и записывает файл в папку outputdataset в хранилище данных BLOB-объектов по умолчанию def_blob_store.

%%writefile $source_directory/dummy_train.py

# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License.
import sys
import os

print("*********************************************************")
print("Hello Azure Machine Learning!")

mounted_input_path = sys.argv[1]
mounted_output_path = sys.argv[2]

print("Argument 1: %s" % mounted_input_path)
print("Argument 2: %s" % mounted_output_path)
    
with open(mounted_input_path, 'r') as f:
    content = f.read()
    with open(os.path.join(mounted_output_path, 'output.csv'), 'w') as fw:
        fw.write(content)

Подключение или загрузка

Подключение или загрузка файлов в любом формате поддерживается для наборов данных, созданных из хранилища BLOB-объектов Azure, Файлов Azure, Azure Data Lake Storage 1-го поколения, Azure Data Lake Storage 2-го поколения, Базы данных SQL Azure и Базы данных Azure для PostgreSQL.

При подключении набора данных вы прикрепляете файлы, на которые ссылается набор данных, к каталогу (точке подключения) и делаете его доступным в целевом объекте вычислений. Подключение поддерживается для вычислительной среды на основе Linux, в том числе для Вычислительной среды Машинного обучения Azure, виртуальных машин и HDInsight. Если размер данных превышает размер диска вычислений, загрузка невозможна. В этом сценарии рекомендуется подключение, так как во время обработки будут загружаться только файлы данных, используемые сценарием.

При загрузке набора данных все файлы, на которые ссылается набор данных, будут загружены в целевой объект вычислений. Загрузка поддерживается для всех типов вычислений. Если сценарий обрабатывает все файлы, на которые ссылается набор данных, а вычислительный диск может вместить полный набор данных, то рекомендуется выполнить загрузку, чтобы избежать издержек, связанных с потоковой передачей данных из служб хранилища. Сведения о скачивании с нескольких узлов см. в разделе о том, как избежать регулирования.

Примечание

В ОС Windows имя пути скачивания не должно быть длиннее 255 символов и может содержать только буквы и цифры. В ОС Linux имя пути скачивания не должно быть длиннее 4096 символов и может содержать только буквы и цифры. Кроме того, в ОС Linux имя файла (которое является последней частью пути скачивания /path/to/file/{filename}) не должно быть длиннее 255 символов.

Следующий код подключает dataset к каталогу Temp по пути mounted_path.

import tempfile
mounted_path = tempfile.mkdtemp()

# mount dataset onto the mounted_path of a Linux-based compute
mount_context = dataset.mount(mounted_path)

mount_context.start()

import os
print(os.listdir(mounted_path))
print (mounted_path)

Получение наборов данных в сценариях машинного обучения

Зарегистрированные наборы данных доступны как локально, так и удаленно в вычислительных кластерах, таких как Вычислительная среда Машинного обучения Azure. Чтобы получить доступ к зарегистрированному набору данных во время экспериментов, используйте следующий код для доступа к рабочей области и получения набора данных, который использовался в ранее отправленном запуске. По умолчанию метод get_by_name() в классе Dataset возвращает последнюю версию набора данных, зарегистрированную в рабочей области.

%%writefile $script_folder/train.py

from azureml.core import Dataset, Run

run = Run.get_context()
workspace = run.experiment.workspace

dataset_name = 'titanic_ds'

# Get a dataset by name
titanic_ds = Dataset.get_by_name(workspace=workspace, name=dataset_name)

# Load a TabularDataset into pandas DataFrame
df = titanic_ds.to_pandas_dataframe()

Доступ к исходному коду во время обучения

Хранилище BLOB-объектов Azure имеет более высокую пропускную способность, чем общая папка Azure, и может масштабироваться до большого числа параллельно запущенных заданий. По этой причине рекомендуется настроить запуски для использования хранилища BLOB-объектов для передачи файлов исходного кода.

В следующем примере кода в конфигурации запуска указывается хранилище данных BLOB-объектов, которое будет использоваться для передачи исходного кода.

# workspaceblobstore is the default blob storage
src.run_config.source_directory_data_store = "workspaceblobstore" 

Примеры записных книжек

Устранение неполадок

Ошибка инициализации набора данных: время ожидания готовности точки подключения истекло:

  • Если у вас нет правил для исходящего трафика группы безопасности сети и вы используете azureml-sdk>=1.12.0, обновите azureml-dataset-runtime и его зависимости до последнего конкретного дополнительного номера версии, или, если вы используете его при запуске, заново создайте свою среду, чтобы она получила последнее исправление.
  • Если вы используете azureml-sdk<1.12.0, выполните обновление до последней версии.
  • Если у вас есть правила для исходящего трафика NSG, убедитесь, что имеется правило для исходящего трафика, разрешающее весь трафик для тега службы AzureResourceMonitor.

Сбой инициализации набора данных: исключение StreamAccessException вызвано исключением ThrottlingException

При скачивании с нескольких узлов все узлы могут попытаться скачать все файлы в наборе данных из службы хранилища Azure, что приведет к возникновению ошибки регулирования. Чтобы избежать регулирования, изначально присвойте переменной среды AZUREML_DOWNLOAD_CONCURRENCY значение, которое получилось бы при делении 8-кратного числа ядер ЦП на число узлов. Значение этот переменной среды может потребоваться определить экспериментальным путем, но приведенная выше рекомендация дает отправную точку.

В следующем примере предполагается наличие 32 ядер и 4 узлов.

from azureml.core.environment import Environment 
myenv = Environment(name="myenv")
myenv.environment_variables = {"AZUREML_DOWNLOAD_CONCURRENCY":64}

Хранилище AzureFile

Не удалось отправить файлы проекта в рабочую папку в AzureFile, так как хранилище перегружено:

  • Если вы используете общую папку для других рабочих нагрузок, таких как передача данных, рекомендуется применять BLOB-объекты, чтобы общую папку можно было использовать для отправки запусков.

  • Другой вариант — разделить рабочую нагрузку между двумя разными рабочими областями.

ConfigException: не удалось создать подключение к AzureFileService из-за отсутствия учетных данных. Ключ учетной записи или маркер SAS необходимо связать с хранилищем больших двоичных объектов по умолчанию для рабочей области.

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

  1. Перейдите к рабочей области на портале Azure.
  2. На странице Обзор рабочей области выберите ссылку на хранилище.
  3. На странице хранилища выберите в меню слева пункт Ключи доступа.
  4. Скопируйте ключ.
  5. Перейдите в Студию машинного обучения Azure для своей рабочей области.
  6. В студии выберите файл хранилища данных, для которого необходимо предоставить учетные данные для аутентификации.
  7. Выберите Изменить способ аутентификации.
  8. Вставьте ключ из предыдущих шагов.
  9. Щелкните Сохранить.

Передача данных в качестве входных данных

TypeError: FileNotFound: No such file or directory. Эта ошибка возникает, если предоставленный вами путь файла не соответствует расположению файла. Необходимо проверить, что путь к файлу соответствует месту подключения набора данных к целевому объекту вычислений. Чтобы обеспечить детерминированное состояние, рекомендуется использовать абстрактный путь при подключении набора данных к целевому объекту вычислений. Например, в следующем коде выполняется подключение набора данных в корне файловой системы целевого объекта вычислений /tmp.

# Note the leading / in '/tmp/dataset'
script_params = {
    '--data-folder': dset.as_named_input('dogscats_train').as_mount('/tmp/dataset'),
} 

Если вы не указываете начальную косую черту ("/"), то необходимо добавить в качестве префикса рабочий каталог, например /mnt/batch/.../tmp/dataset, в целевом объекте вычислений, чтобы указать, где нужно подключить набор данных.

Дальнейшие действия