MLflow — отличный инструмент с открытым исходным кодом, который позволяет отслеживать прогоны модели, включая параметры модели, метрики, результаты, используемые данные и ваш код. MLflow также имеет много других возможностей, таких как развертывание моделей, упаковка вашего кода для воспроизводимости и хранение ваших моделей. В этом введении мы сосредоточимся на отслеживании выполнения нашей модели с помощью MLflow.
Отслеживание прогонов модели может быть очень полезным, чтобы увидеть различия в производительности модели на основе параметров и данных, используемых для каждого прогона.
В этом руководстве мы интегрируем MLflow в наш рабочий процесс машинного обучения. Чтобы продемонстрировать это, мы сначала рассмотрим код для обучения простой модели k ближайших соседей (k-NN) без MLflow, а затем изменим код, чтобы включить MLFlow.
Если вы хотите продолжить, вы можете получить код и набор данных, которые мы будем использовать, на моем Github.
Во-первых, давайте запустим наш скрипт k-NN без MLflow. Если вы следуете из репозитория Github, этот скрипт называется starter_code.py.
Скрипт считывает набор данных о диабете. Это задача классификации, в которой нам нужно обучить нашу модель k-NN предсказывать, есть ли у пациента диабет или нет. Данные разбиты на наборы для обучения и тестирования. Данные обучения используются для обучения модели k-NN. Наконец, мы проверяем точность нашей модели, проверяя нашу модель на тестовом наборе.
Хотя это и не является предметом этого руководства, вот краткое объяснение того, как работает модель k-NN:
Для более подробного объяснения каждой строки кода для модели k-NN и процесса обработки данных над каждой строкой есть комментарий, объясняющий, что делает код.
Модели k-NN работают, беря точку данных и просматривая ближайшие помеченные точки данных «k». Затем точке данных присваивается метка большинства ближайших точек «k».
Например, если k = 5, а 3 точки — «зеленые», а 2 — «красные», то рассматриваемая точка данных будет помечена как «зеленая», поскольку «зеленые» — это большинство (как показано на графике). . В коде параметр «n_neighbors» совпадает с «k».
start_code.py
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier import sys #read in the data using pandas df = pd.read_csv('data/diabetes_data.csv') #print data shape print(f'data shape is: {df.shape}') #check data has been read in properly print(df.head()) #create a dataframe with all training data except the target column X = df.drop(columns=['diabetes']) #check that the target variable has been removed print('check that the target variable has been removed') print(X.head()) print(X.shape) #separate target values y = df['diabetes'].values #view target values print(f'first 5 target values are: {y[0:5]}') #split dataset into train and test data X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state=1, stratify=y) #knn model parameters - n_neighbors is 'k' from k-Nearest Neighbors n_neighbors = int(sys.argv[1]) if len(sys.argv) > 1 else 5 # Create KNN classifier knn = KNeighborsClassifier(n_neighbors = n_neighbors) # Fit the classifier to the data knn.fit(X_train,y_train) print(f'knn model is training - n_neigbors: {n_neighbors}') #show first 5 model predictions on the test data knn.predict(X_test)[0:5] #check accuracy of our model on the test data accuracy = knn.score(X_test, y_test) print(f'model accuracy is: {accuracy}')
Чтобы запустить этот скрипт, мы можем запустить в командной строке следующее:
python starter_code.py
Выходная точность модели должна быть около 0,70 или 70%.
Значение по умолчанию для параметра n_neighbors в нашем коде равно 5, но мы можем изменить его, добавив нужное значение в качестве аргумента в конце нашей команды.
Например, если мы хотим, чтобы n_neighbors было равно 3, мы можем запустить:
python starter_code.py 3
Теперь, когда мы поиграли с нашей моделью, давайте добавим мощь MLflow. Используя MLflow, мы сможем отслеживать все запуски нашей модели, включая используемый набор данных, используемые параметры и точность модели.
Ниже приведен тот же скрипт, что и раньше, но с добавлением MLflow. Код, выделенный жирным шрифтом, — это добавленный новый код MLflow. Далее мы разберем каждую строку кода MLflow, чтобы увидеть, как это работает.
mlflow_knn.py:
import mlflow import pandas as pd from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier import sys #tell mlflow to start logging with mlflow.start_run(): #read in the data using pandas df = pd.read_csv('data/diabetes_data.csv') ## Log data to mlflow mlflow.log_artifact('data/diabetes_data.csv') #print data shape print(f'data shape is: {df.shape}') #check data has been read in properly print(df.head()) #create a dataframe with all training data except the target column X = df.drop(columns=['diabetes']) #check that the target variable has been removed print('check that the target variable has been removed') print(X.head()) print(X.shape) #separate target values y = df['diabetes'].values #view target values print(f'first 5 target values are: {y[0:5]}') #split dataset into train and test data X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state=1, stratify=y) #knn model parameter - n_neighbors is 'k' from k-Nearest Neighbors n_neighbors = int(sys.argv[1]) if len(sys.argv) > 1 else 5 #log n_neighbors param to mlflow mlflow.log_param('n_neighbors', n_neighbors) # Create KNN classifier knn = KNeighborsClassifier(n_neighbors = n_neighbors) # Fit the classifier to the data knn.fit(X_train,y_train) print(f'knn model is training - n_neigbors: {n_neighbors}') #show first 5 model predictions on the test data knn.predict(X_test)[0:5] #check accuracy of our model on the test data accuracy = knn.score(X_test, y_test) #log model accuracy to mlflow mlflow.log_metric('accuracy', accuracy) print(f'model accuracy is: {accuracy}')
Когда мы запускаем этот сценарий, артефакты (набор данных), параметры и метрики, которые мы отслеживаем с помощью MLflow, будут сохранены как локально, так и для просмотра с помощью пользовательского интерфейса MLflow. Подробнее об этом ниже, но сначала мы рассмотрим наш новый код MLflow.
Сначала нам нужно импортировать MLflow и указать, что мы хотим, чтобы MLflow начал отслеживать.
import mlflow import pandas as pd from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier import sys #tell mlflow to start logging with mlflow.start_run(): #read in the data using pandas df = pd.read_csv('data/diabetes_data.csv')
Остальная часть нашего кода будет содержаться внутри блока «with mlflow.start_run():», который сообщит MLflow, чтобы он начал регистрировать запуск нашей модели.
Второе изменение заключается в том, что мы хотим, чтобы MLflow сохранил набор данных, который мы использовали для этого прогона. Это может быть важно, если данные изменяются между запусками. Например, если вы создадите модель для прогнозирования диабета, то в следующем месяце больница предоставит вам больше данных для обучения, это можно отследить с помощью MLflow.
#read in the data using pandas df = pd.read_csv('data/diabetes_data.csv') ## Log data to mlflow mlflow.log_artifact('data/diabetes_data.csv') #print data shape print(f'data shape is: {df.shape}')
Вы можете регистрировать данные как артефакт в MLflow с помощью функции log_artifact и указать путь к набору данных. Позже мы увидим, как просматривать данные для каждого запуска.
Затем мы хотим отслеживать значение «n_neighbors», используемое для каждого запуска.
#knn model parameter - n_neighbors is 'k' from k-Nearest Neighbors n_neighbors = int(sys.argv[1]) if len(sys.argv) > 1 else 5 #log n_neighbors param to mlflow mlflow.log_param('n_neighbors', n_neighbors) # Create KNN classifier knn = KNeighborsClassifier(n_neighbors = n_neighbors)
Мы делаем это с помощью функции log_param. Первый аргумент — это строка того, что мы хотим назвать параметром, который мы отслеживаем. Мы назовем параметр «n_neighbors». Второй аргумент — это значение параметра. В нашем коде значение n_neighbors сохраняется в переменной с именем n_neighbors, поэтому мы используем ее для второго аргумента.
Наконец, мы хотим отслеживать точность нашей модели.
#check accuracy of our model on the test data accuracy = knn.score(X_test, y_test) #log model accuracy to mlflow mlflow.log_metric('accuracy', accuracy) print(f'model accuracy is: {accuracy}')
Чтобы отслеживать точность, мы можем использовать функцию log_metric. Подобно функции log_param в MLflow, она принимает 2 аргумента. Во-первых, это название метрики, то есть «точность». Во-вторых, значение показателя. Значение точности хранится в переменной с именем точность, поэтому мы будем использовать эту переменную в качестве второго аргумента.
Теперь мы можем запустить нашу новую модель с помощью MLflow!
Мы можем использовать ту же команду для запуска полного нового сценария MLflow, как обычно.
python mlflow_knn.py
Как только вы запустите скрипт, вы увидите, что в вашем каталоге появится новая папка с именем «mlruns». В этой папке будет папка с именем «0». 0 — это идентификатор эксперимента. Вся информация о каждом запуске будет храниться в этой папке.
В папке 0 будет папка с длинным списком случайных чисел и букв. Это идентификатор запуска. Каждый раз, когда вы запускаете скрипт MLflow, будет создаваться новая папка с новым идентификатором запуска. В папке идентификатора запуска мы можем найти информацию, которую мы отслеживали (набор данных, параметр n_neighbors, показатель точности модели).
В папке идентификатора запуска у вас будут папки «артефакты», «метрики», «параметры» и «теги», а также файл «meta.yaml». Папка артефактов содержит наш набор данных о диабете, который мы зарегистрировали. Папка metrics содержит точность нашей модели, а папка params содержит значение параметра n_neighbors, используемого для запуска.
В дополнение к информации, которую мы отслеживали, есть файл meta.yaml, который содержит метаданные о нашем запуске, и папку tags, содержащую имя файла и имя пользователя.
Давайте снова запустим нашу модель, на этот раз используя другой параметр для n_neighbors.
python mlflow_knn.py 3
Запустив его во второй раз, перейдите в папку mlruns, и вы увидите папку с идентификатором второго запуска, созданную внутри папки с именем 0 (папка с идентификатором эксперимента). Просмотрите папки внутри папок с новым идентификатором запуска, чтобы просмотреть новую зарегистрированную информацию, и убедитесь, что значение параметра n_neighbors зарегистрировано как «3».
Теперь давайте взглянем на пользовательский интерфейс (UI) MLflow. Для этого мы можем ввести в командной строке следующее:
mlflow ui
В браузере перейдите на localhost:5000. Теперь вы должны увидеть пользовательский интерфейс MLflow с обоими вашими запусками с их зарегистрированными метриками и параметрами. Пользовательский интерфейс MLflow — отличный способ легко сравнить различные прогоны модели.
Чтобы увидеть подробное представление каждого запуска, вы можете щелкнуть ссылку времени начала запуска, который вы хотите просмотреть в деталях. Здесь мы можем увидеть дополнительную информацию о прогоне, включая записанный нами набор данных.
Чтобы просмотреть отслеживаемые параметры и показатели, щелкните соответствующий заголовок, и вы увидите таблицу отслеживаемых значений.
Чтобы просмотреть набор данных, нажмите «Артефакты». Затем вы увидите файл «diabetes_data.csv». Нажмите на файл, чтобы увидеть предварительный просмотр набора данных.
Теперь вы интегрировали MLflow в свой рабочий процесс машинного обучения! MLflow имеет гораздо больше возможностей, и вы можете найти документацию MLflow, чтобы узнать больше здесь.
Спасибо за прочтение! Весь код для этого туториала можно найти на моем Github.