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