Визуализируйте задания и метрики экспериментов с помощью TensorBoard и Машинного обучения Azure

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

В этой статье вы узнаете, как просматривать задания и метрики экспериментов в TensorBoard с помощью пакета tensorboard в основном пакете SDK Машинного обучения Azure. Изучив задания экспериментов, вы сможете лучше настроить и переобучить модели машинного обучения.

TensorBoard — это набор веб-приложений для проверки и понимания структуры и производительности эксперимента.

Способ запуска TensorBoard с экспериментами Машинного обучения Azure зависит от типа эксперимента.

  • Если ваш эксперимент самостоятельно выводит файлы журналов, которые могут использоваться TensorBoard, например PyTorch, Chain или TensorFlow, то можно запустить TensorBoard напрямую из журнала заданий эксперимента.

  • Для экспериментов, которые не выводят файлы, которые понимает TensorBoard, например Scikit-learn или Машинное обучение Azure, используйте метод export_to_tensorboard(), чтобы экспортировать журналы заданий в виде журналов TensorBoard, и запустите TensorBoard из них.

Совет

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

Необходимые компоненты

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

Вариант 1. Просмотр журнала заданий непосредственно в TensorBoard

Этот вариант применим для экспериментов, которые изначально выводят файлы журналов в формате TensorBoard, такие как PyTorch, Chainer и TensorFlow. Если в вашем случае это не так, используйте метод export_to_tensorboard().

В следующем примере кода используется демонстрационный эксперимент MNIST из репозитория TensorFlow в удаленном целевом объекте вычислений среды Машинного обучения Azure. Далее мы настроим и запустим задание обучения модели TensorFlow, а затем запустим TensorBoard в этой экспериментальной среде TensorFlow.

Задание имени эксперимента и создание папки проекта

Здесь мы дадим эксперименту имя и создадим для него папку.

from os import path, makedirs
experiment_name = 'tensorboard-demo'

# experiment folder
exp_dir = './sample_projects/' + experiment_name

if not path.exists(exp_dir):
    makedirs(exp_dir)

Загрузка демонстрационного кода эксперимента TensorFlow

В репозитории TensorFlow есть демонстрационная версия MNIST с расширенными инструментами TensorBoard. Для работы с Машинным обучением Azure не нужно вносить никаких изменений в этот демонстрационный код. В следующем коде мы скачиваем код MNIST и сохраняем его во вновь созданную папку эксперимента.

import requests
import os

tf_code = requests.get("https://raw.githubusercontent.com/tensorflow/tensorflow/r1.8/tensorflow/examples/tutorials/mnist/mnist_with_summaries.py")
with open(os.path.join(exp_dir, "mnist_with_summaries.py"), "w") as file:
    file.write(tf_code.text)

В файле кода MNIST mnist_with_summaries.py обратите внимание на строки, в которых вызываются методы tf.summary.scalar(), tf.summary.histogram(), tf.summary.FileWriter() и т. д. Эти методы группируют, регистрируют и помечают ключевые метрики экспериментов в журнале заданий. Метод tf.summary.FileWriter() особенно важен, так как он сериализует данные из зарегистрированных вами метрик эксперимента, что позволяет TensorBoard создавать визуализации.

Настройка эксперимента

Ниже мы настроим эксперимент и укажем каталоги для журналов и данных. Эти журналы будут отправлены в журнал заданий, к которому TensorBoard получит доступ позже.

Примечание.

Для этого примера необходимо установить TensorFlow на локальном компьютере. Кроме того, модуль TensorBoard (то есть модуль, входящий в состав TensorFlow) должен быть доступен для ядра этой записной книжки, так как TensorBoard выполняется именно на локальном компьютере.

import azureml.core
from azureml.core import Workspace
from azureml.core import Experiment

ws = Workspace.from_config()

# create directories for experiment logs and dataset
logs_dir = os.path.join(os.curdir, "logs")
data_dir = os.path.abspath(os.path.join(os.curdir, "mnist_data"))

if not path.exists(data_dir):
    makedirs(data_dir)

os.environ["TEST_TMPDIR"] = data_dir

# Writing logs to ./logs results in their being uploaded to the job history,
# and thus, made accessible to our TensorBoard instance.
args = ["--log_dir", logs_dir]

# Create an experiment
exp = Experiment(ws, experiment_name)

Создание кластера для эксперимента

Для этого эксперимента мы создадим кластер AmlCompute, но эксперименты можно создавать в любой среде, и вы по-прежнему сможете запускать TensorBoard для журналов заданий экспериментов.

from azureml.core.compute import ComputeTarget, AmlCompute

cluster_name = "cpu-cluster"

cts = ws.compute_targets
found = False
if cluster_name in cts and cts[cluster_name].type == 'AmlCompute':
   found = True
   print('Found existing compute target.')
   compute_target = cts[cluster_name]
if not found:
    print('Creating a new compute target...')
    compute_config = AmlCompute.provisioning_configuration(vm_size='STANDARD_D2_V2', 
                                                           max_nodes=4)

    # create the cluster
    compute_target = ComputeTarget.create(ws, cluster_name, compute_config)

compute_target.wait_for_completion(show_output=True, min_node_count=None)

# use get_status() to get a detailed status for the current cluster. 
# print(compute_target.get_status().serialize())

Настройка и отправка задания на выполнение обучения

Настройте задание обучения, создав объект ScriptRunConfig.

from azureml.core import ScriptRunConfig
from azureml.core import Environment

# Here we will use the TensorFlow 2.2 curated environment
tf_env = Environment.get(ws, 'AzureML-TensorFlow-2.2-GPU')

src = ScriptRunConfig(source_directory=exp_dir,
                      script='mnist_with_summaries.py',
                      arguments=args,
                      compute_target=compute_target,
                      environment=tf_env)
run = exp.submit(src)

Запуск TensorBoard

Вы можете запустить TensorBoard во время выполнения или после завершения. В следующем примере создается экземпляр объекта TensorBoard tb, который принимает журнал заданий эксперимента, загруженный в job, а затем запускает TensorBoard с помощью метода start().

Конструктор TensorBoard принимает массив заданий, поэтому убедитесь, что задание передается в виде одноэлементного массива.

from azureml.tensorboard import Tensorboard

tb = Tensorboard([job])

# If successful, start() returns a string with the URI of the instance.
tb.start()

# After your job completes, be sure to stop() the streaming otherwise it will continue to run. 
tb.stop()

Примечание.

Хотя в этом примере мы использовали TensorFlow, вы можете с такой же легкостью использовать TensorBoard с PyTorch или Chainer. TensorFlow должен быть доступен на компьютере с TensorBoard, но не обязательно на компьютере, выполняющем вычисления PyTorch или Chainer.

Вариант 2. Экспорт журнала в виде журнала для просмотра в TensorBoard

Следующий код настраивает пример эксперимента, начинает процесс ведения журнала с помощью API журнала заданий Машинного обучения Azure и экспортирует журнал заданий эксперимента в формат, который можно использовать в TensorBoard для визуализации.

Настройка эксперимента

Следующий код настраивает новый эксперимент и присваивает каталогу задания имя root_run.

from azureml.core import Workspace, Experiment
import azureml.core

# set experiment name and job name
ws = Workspace.from_config()
experiment_name = 'export-to-tensorboard'
exp = Experiment(ws, experiment_name)
root_run = exp.start_logging()

Здесь мы загружаем набор данных диабетиков — встроенный небольшой набор данных, который поставляется вместе с Scikit-learn, и разбиваем его на наборы для тестов и обучения.

from sklearn.datasets import load_diabetes
from sklearn.linear_model import Ridge
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
X, y = load_diabetes(return_X_y=True)
columns = ['age', 'gender', 'bmi', 'bp', 's1', 's2', 's3', 's4', 's5', 's6']
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
data = {
    "train":{"x":x_train, "y":y_train},        
    "test":{"x":x_test, "y":y_test}
}

Запуск эксперимента и регистрация метрик

Для этого кода мы обучаем модель линейной регрессии и регистрируем в журнале выполнения ключевые метрики, альфа-коэффициент alpha и среднеквадратическую ошибку mse.

from tqdm import tqdm
alphas = [.1, .2, .3, .4, .5, .6 , .7]
# try a bunch of alpha values in a Linear Regression (aka Ridge regression) mode
for alpha in tqdm(alphas):
  # create child runs and fit lines for the resulting models
  with root_run.child_run("alpha" + str(alpha)) as run:
 
   reg = Ridge(alpha=alpha)
   reg.fit(data["train"]["x"], data["train"]["y"])    
 
   preds = reg.predict(data["test"]["x"])
   mse = mean_squared_error(preds, data["test"]["y"])
   # End train and eval

# log alpha, mean_squared_error and feature names in run history
   root_run.log("alpha", alpha)
   root_run.log("mse", mse)

Экспорт заданий в TensorBoard

С помощью метода export_to_tensorboard () пакета SDK можно экспортировать журнал заданий эксперимента Машинного обучения Azure в журналы TensorBoard, чтобы мы могли просматривать их в TensorBoard.

В следующем коде мы создаем папку logdir в текущем рабочем каталоге. В эту папку мы экспортируем журнал заданий эксперимента и журналы из root_run, а затем помечаем задание как завершенное.

from azureml.tensorboard.export import export_to_tensorboard
import os

logdir = 'exportedTBlogs'
log_path = os.path.join(os.getcwd(), logdir)
try:
    os.stat(log_path)
except os.error:
    os.mkdir(log_path)
print(logdir)

# export job history for the project
export_to_tensorboard(root_run, logdir)

root_run.complete()

Примечание.

Можно также экспортировать в TensorBoard определенный запуск, указав имя запуска: export_to_tensorboard(run_name, logdir)

Запуск и остановка TensorBoard

После экспорта журнала заданий для этого эксперимента можно запустить TensorBoard с помощью метода start().

from azureml.tensorboard import Tensorboard

# The TensorBoard constructor takes an array of jobs, so be sure and pass it in as a single-element array here
tb = Tensorboard([], local_root=logdir, port=6006)

# If successful, start() returns a string with the URI of the instance.
tb.start()

По завершении убедитесь, что вызвали метод stop() объекта TensorBoard. В противном случае TensorBoard будет продолжать работать, пока не завершится работа ядра записной книжки.

tb.stop()

Следующие шаги

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