Kubeflow Pipelines позволяет создавать, развертывать и управлять сквозными рабочими процессами машинного обучения. Чтобы использовать пользовательский код в конвейере, вам необходимо поместить его в контейнер с помощью Docker. Это гарантирует, что ваш код будет легко развертываться, масштабироваться и управляться Kubernetes, базовой инфраструктурой для Kubeflow. В этом руководстве мы проведем вас через контейнеризацию вашего кода Python с помощью Docker и его интеграцию в конвейер Kubeflow.

Предпосылки

  1. Докер установлен на вашей локальной машине (Скачать с https://www.docker.com/get-started)
  2. Знакомство с программированием на Python
  3. Установлены и настроены конвейеры Kubeflow (следуйте нашему предыдущему руководству «Настройка конвейеров Kubeflow: пошаговое руководство»)

Шаг 1. Напишите свой скрипт Python

Создайте новый скрипт Python (например, data_processing.py), содержащий следующий код:

import sys

def process_data(input_data):
    return input_data.upper()
if __name__ == "__main__":
    input_data = sys.argv[1]
    processed_data = process_data(input_data)
    print(f"Processed data: {processed_data}")

Этот сценарий принимает входную строку в качестве аргумента командной строки, преобразует ее в верхний регистр и печатает результат.

Шаг 2. Создайте Dockerfile

Создайте новый файл с именем Dockerfile в том же каталоге, что и ваш скрипт Python, и добавьте следующее содержимое:

FROM python:3.7

WORKDIR /app
COPY data_processing.py /app
ENTRYPOINT ["python", "data_processing.py"]

Этот Dockerfile указывает, что базовым образом является python:3.7, задает для рабочего каталога значение /app, копирует сценарий Python в контейнер и устанавливает точку входа для выполнения сценария при запуске контейнера.

Шаг 3. Создайте образ Docker

Откройте терминал или командную строку, перейдите в каталог, содержащий Dockerfile и скрипт Python, и выполните следующую команду, чтобы создать образ Docker:

docker build -t your_username/data_processing:latest .

Замените your_username своим именем пользователя Docker Hub или другим идентификатором. Эта команда создает образ Docker с указанным тегом и текущим каталогом в качестве контекста сборки.

Шаг 4. Протестируйте образ Docker

Протестируйте образ Docker, выполнив следующую команду:

docker run --rm your_username/data_processing:latest "hello world"

Это должно вывести:

Processed data: HELLO WORLD

Шаг 5. Отправка образа Docker в реестр контейнеров

Чтобы использовать образ Docker в конвейере Kubeflow, необходимо отправить его в реестр контейнеров, например Docker Hub, Google Container Registry или Amazon Elastic Container Registry. В этом уроке мы будем использовать Docker Hub.

Сначала войдите в Docker Hub с помощью командной строки:

docker login

При появлении запроса введите имя пользователя и пароль Docker Hub.

Затем отправьте образ Docker в Docker Hub:

docker push your_username/data_processing:latest

Шаг 6. Создайте конвейер Kubeflow с помощью образа Docker

Теперь, когда образ Docker доступен в реестре контейнеров, вы можете использовать его в конвейере Kubeflow. Создайте новый скрипт Python (например, custom_pipeline.py) и добавьте следующий код:

import kfp
from kfp import dsl

def data_processing_op(input_data: str):
    return dsl.ContainerOp(
        name="Data Processing",
        image="your_username/data_processing:latest",
        arguments=[input_data],
    )
@dsl.pipeline(
    name="Custom Pipeline",
    description="A pipeline that uses a custom Docker image for data processing."
)
def custom_pipeline(input_data: str = "hello world"):
    data_processing = data_processing_op(input_data)
if __name__ == "__main__":
    kfp.compiler.Compiler().compile(custom_pipeline, "custom_pipeline.yaml")

Этот скрипт Python определяет конвейер с одним шагом, который использует пользовательский образ Docker, который мы создали ранее. Функция data_processing_op принимает входную строку и возвращает объект ContainerOp с указанным образом Docker и входными данными.

Шаг 7. Загрузите и запустите конвейер

  1. Получите доступ к панели мониторинга Kubeflow Pipelines, перейдя по URL-адресу, указанному в процессе установки.
  2. Нажмите на вкладку «Конвейеры» на левой боковой панели.
  3. Нажмите кнопку «Загрузить конвейер» в правом верхнем углу.
  4. В диалоговом окне «Конвейер загрузки» нажмите «Обзор» и выберите файл custom_pipeline.yaml, созданный на предыдущем шаге.
  5. Нажмите «Загрузить», чтобы загрузить конвейер на платформу Kubeflow.
  6. После загрузки конвейера щелкните его имя, чтобы открыть страницу сведений о конвейере.
  7. Нажмите кнопку «Создать запуск», чтобы запустить новый запуск конвейера.
  8. На странице «Создать запуск» вы можете указать имя запуска и выбрать версию конвейера. Нажмите «Пуск», чтобы запустить конвейер.

Шаг 8. Отслеживание выполнения конвейера

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

  1. На графике конвейера отображается состояние каждого шага конвейера с разными цветами, указывающими на успех, неудачу или состояние выполнения.
  2. Чтобы просмотреть журналы для определенного шага, щелкните шаг на графике конвейера, а затем щелкните вкладку «Журналы» на правой панели.
  3. Чтобы просмотреть артефакты вывода, щелкните шаг на графике конвейера, а затем щелкните вкладку «Артефакты» на правой панели.

Поздравляем! Вы успешно контейнеризировали свой код Python с помощью Docker и интегрировали его в конвейер Kubeflow. Теперь вы можете использовать возможности контейнеризации для создания более сложных конвейеров с пользовательским кодом, гарантируя, что ваши рабочие процессы машинного обучения будут масштабируемыми, переносимыми и простыми в обслуживании.

В этом руководстве мы провели вас через процесс контейнеризации вашего кода Python с помощью Docker и его интеграции в конвейер Kubeflow. Используя контейнеры, вы можете быть уверены, что ваш пользовательский код легко развертывается, обслуживается и масштабируется в различных средах. Продолжая работать с Kubeflow Pipelines, вы сможете изучать более продвинутые функции, создавать более сложные конвейеры и оптимизировать рабочие процессы машинного обучения.