Обучение моделей с помощью наборов данных Машинного обучения Azure
ОБЛАСТЬ ПРИМЕНЕНИЯ: Пакет SDK для Python версии 1
Из этой статьи вы узнаете, как работать с наборами данных Машинного обучения Azure для обучения моделей машинного обучения. Наборы данных можно использовать в локальном или удаленном целевом объекте вычислений, не беспокоясь о строках подключения или путях к данным.
Сведения о структурированных данных см. статье Использование наборов данных в сценариях машинного обучения.
Сведения о неструктурированных данных см. разделе Подключение файлов к удаленным целевым объектам вычислений.
Наборы данных Машинного обучения Azure обеспечивают простую интеграцию с функциями обучения Машинного обучения Azure, такими как ScriptRunConfig, HyperDrive и конвейеры Машинного обучения Azure.
Если вы не готовы сделать данные доступными для обучения моделей, но хотели бы загрузить их в записную книжку для исследования, см. статью Исследование данных в наборе данных.
Необходимые компоненты
Для создания наборов данных и обучения с их помощью вам потребуется следующее.
Подписка Azure. Если у вас еще нет подписки Azure, создайте бесплатную учетную запись, прежде чем начинать работу. Опробуйте бесплатную или платную версию Машинного обучения Azure уже сегодня.
Установленный пакет SDK Машинного обучения Azure для Python (> = 1.13.0), который включает пакет
azureml-datasets
.
Примечание.
Некоторые классы наборов данных имеют зависимости в пакете azureml-dataprep. Для пользователей Linux эти классы поддерживаются только в следующих дистрибутивах: Red Hat Enterprise Linux, Ubuntu и Fedora.
Использование наборов данных в сценариях машинного обучения
Если структурированные данные еще не зарегистрированы в качестве набора данных, создайте табличный набор Данных и используйте его непосредственно в скрипте обучения для локального или удаленного эксперимента.
В этом примере вы создаете незарегистрированный 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 в следующих поддерживаемых типах хранилища:
- BLOB-объект 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, так как хранилище перегружено:
Если вы используете общую папку для других рабочих нагрузок, например передачу данных, рекомендуется использовать большие двоичные объекты, чтобы общая папка была бесплатной для отправки запусков.
Вы также можете разделить рабочую нагрузку между двумя разными рабочими областями.
ConfigException: не удалось создать подключение к AzureFileService из-за отсутствия учетных данных. Ключ учетной записи или маркер SAS необходимо связать с хранилищем больших двоичных объектов по умолчанию для рабочей области.
Чтобы убедиться, что учетные данные для доступа к хранилищу связаны с рабочей областью и связанным файловым хранилищем данных, выполните следующие действия:
- Перейдите к рабочей области на портале Azure.
- На странице Обзор рабочей области выберите ссылку на хранилище.
- На странице хранилища выберите в меню слева пункт Ключи доступа.
- Скопируйте ключ.
- Перейдите в Студию машинного обучения Azure для своей рабочей области.
- В студии выберите файл хранилища данных, для которого необходимо предоставить учетные данные для аутентификации.
- Выберите "Обновить проверку подлинности".
- Вставьте ключ из предыдущих шагов.
- Выберите Сохранить.
Передача данных в качестве входных данных
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
чтобы указать, где должен быть подключен набор данных.
Следующие шаги
Автоматическое обучение моделей машинного обучения с помощью наборов данных TabularDataset.
Обучение моделей классификации изображений с помощью наборов данных FileDataset.
Обучение с использованием наборов данных с помощью конвейеров.