Vertex Pipelines için Basit TFX Pipeline

Bu not defteri tabanlı eğitici, basit bir TFX ardışık düzeni oluşturacak ve bunu Google Cloud Vertex Pipelines kullanarak çalıştıracaktır. Bu not defteri, Basit TFX İşlem Hattı Eğitiminde oluşturduğumuz TFX işlem hattına dayanmaktadır. TFX'e aşina değilseniz ve bu öğreticiyi henüz okumadıysanız, bu deftere geçmeden önce okumalısınız.

Google Cloud Vertex Pipelines, makine öğrenimi iş akışınızı sunucusuz bir şekilde düzenleyerek makine öğrenimi sistemlerinizi otomatikleştirmenize, izlemenize ve yönetmenize yardımcı olur. ML ardışık düzenlerinizi Python ile TFX kullanarak tanımlayabilir ve ardından ardışık düzenlerinizi Google Cloud'da yürütebilirsiniz. Vertex Pipelines hakkında daha fazla bilgi edinmek için Vertex Pipelines tanıtımına bakın.

Bu not defterinin Google Colab veya AI Platform Not Defterlerinde çalıştırılması amaçlanmıştır. Bunlardan birini kullanmıyorsanız, yukarıdaki "Google Colab'da Çalıştır" düğmesini tıklamanız yeterlidir.

Kurmak

Bu not defterini çalıştırmadan önce aşağıdakilere sahip olduğunuzdan emin olun:

GCP projenizi daha fazla yapılandırmak için lütfen Vertex belgelerine bakın.

Python paketlerini kurun

ML işlem hatlarını yazmak ve işleri Vertex Pipelines'a göndermek için TFX ve KFP dahil gerekli Python paketlerini kuracağız.

# Use the latest version of pip.
pip install --upgrade pip
pip install --upgrade "tfx[kfp]<2"

Çalışma zamanını yeniden başlattınız mı?

Google Colab kullanıyorsanız, yukarıdaki hücreyi ilk kez çalıştırdığınızda, yukarıdaki "ÇALIŞTIRMA ZAMINI YENİDEN BAŞLAT" düğmesini tıklayarak veya "Çalışma Zamanı > Çalışma zamanını yeniden başlat ..." menüsünü kullanarak çalışma zamanını yeniden başlatmanız gerekir. Bunun nedeni Colab'ın paketleri yükleme şeklidir.

Colab'de değilseniz, aşağıdaki hücre ile çalışma zamanını yeniden başlatabilirsiniz.

# docs_infra: no_execute
import sys
if not 'google.colab' in sys.modules:
  # Automatically restart kernel after installs
  import IPython
  app = IPython.Application.instance()
  app.kernel.do_shutdown(True)

Bu not defteri için Google'da oturum açın

Bu not defterini Colab üzerinde çalıştırıyorsanız, kullanıcı hesabınızla kimlik doğrulaması yapın:

import sys
if 'google.colab' in sys.modules:
  from google.colab import auth
  auth.authenticate_user()

AI Platform Notebooks kullanıyorsanız , sonraki bölümü çalıştırmadan önce Google Cloud ile kimlik doğrulaması yapın.

gcloud auth login

Terminal penceresinde (menüde Dosya > Yeni ile açabilirsiniz). Bunu her notebook örneği için yalnızca bir kez yapmanız gerekir.

Paket sürümlerini kontrol edin.

import tensorflow as tf
print('TensorFlow version: {}'.format(tf.__version__))
from tfx import v1 as tfx
print('TFX version: {}'.format(tfx.__version__))
import kfp
print('KFP version: {}'.format(kfp.__version__))
tutucu5 l10n-yer
TensorFlow version: 2.7.1
TFX version: 1.6.0
KFP version: 1.8.11

Değişkenleri ayarla

Aşağıdaki boru hatlarını özelleştirmek için kullanılan bazı değişkenleri ayarlayacağız. Aşağıdaki bilgiler gereklidir:

  • GCP Proje kimliği. Proje kimliğinizi belirleme konusuna bakın.
  • Ardışık düzenleri çalıştırmak için GCP Bölgesi. Vertex Pipelines'ın mevcut olduğu bölgeler hakkında daha fazla bilgi için Vertex AI konumları kılavuzuna bakın.
  • Ardışık düzen çıktılarını depolamak için Google Bulut Depolama Grubu.

Çalıştırmadan önce aşağıdaki hücreye gerekli değerleri girin .

GOOGLE_CLOUD_PROJECT = ''     # <--- ENTER THIS
GOOGLE_CLOUD_REGION = ''      # <--- ENTER THIS
GCS_BUCKET_NAME = ''          # <--- ENTER THIS

if not (GOOGLE_CLOUD_PROJECT and GOOGLE_CLOUD_REGION and GCS_BUCKET_NAME):
    from absl import logging
    logging.error('Please set all required parameters.')
tutucu7 l10n-yer
ERROR:absl:Please set all required parameters.

Projenizi kullanmak için gcloud ayarlayın.

gcloud config set project {GOOGLE_CLOUD_PROJECT}
ERROR: (gcloud.config.set) argument VALUE: Must be specified.
Usage: gcloud config set SECTION/PROPERTY VALUE [optional flags]
  optional flags may be  --help | --installation

For detailed information on this command and its flags, run:
  gcloud config set --help
yer tutucu10 l10n-yer
PIPELINE_NAME = 'penguin-vertex-pipelines'

# Path to various pipeline artifact.
PIPELINE_ROOT = 'gs://{}/pipeline_root/{}'.format(
    GCS_BUCKET_NAME, PIPELINE_NAME)

# Paths for users' Python module.
MODULE_ROOT = 'gs://{}/pipeline_module/{}'.format(
    GCS_BUCKET_NAME, PIPELINE_NAME)

# Paths for input data.
DATA_ROOT = 'gs://{}/data/{}'.format(GCS_BUCKET_NAME, PIPELINE_NAME)

# This is the path where your model will be pushed for serving.
SERVING_MODEL_DIR = 'gs://{}/serving_model/{}'.format(
    GCS_BUCKET_NAME, PIPELINE_NAME)

print('PIPELINE_ROOT: {}'.format(PIPELINE_ROOT))
PIPELINE_ROOT: gs:///pipeline_root/penguin-vertex-pipelines

Örnek verileri hazırlayın

Simple TFX Pipeline Tutorial ile aynı Palmer Penguins veri setini kullanacağız.

Bu veri kümesinde, [0,1] aralığına sahip olacak şekilde normalleştirilmiş dört sayısal özellik vardır. Penguen species tahmin eden bir sınıflandırma modeli oluşturacağız.

Veri setinin kendi kopyasını oluşturmamız gerekiyor. TFX ExampleGen bir dizinden girdileri okuduğundan, bir dizin oluşturmamız ve GCS'de buna veri kümesi kopyalamamız gerekir.

gsutil cp gs://download.tensorflow.org/data/palmer_penguins/penguins_processed.csv {DATA_ROOT}/
tutucu13 l10n-yer
InvalidUrlError: Cloud URL scheme should be followed by colon and two slashes: "://". Found: "gs:///data/penguin-vertex-pipelines/".

CSV dosyasına hızlı bir göz atın.

gsutil cat {DATA_ROOT}/penguins_processed.csv | head
tutucu15 l10n-yer
InvalidUrlError: Cloud URL scheme should be followed by colon and two slashes: "://". Found: "gs:///data/penguin-vertex-pipelines/penguins_processed.csv".

Bir işlem hattı oluşturun

TFX ardışık düzenleri Python API'leri kullanılarak tanımlanır. CsvExampleGen, Trainer ve Pusher olmak üzere üç bileşenden oluşan bir işlem hattı tanımlayacağız. İşlem hattı ve model tanımı, Basit TFX İşlem Hattı Eğitimi ile hemen hemen aynıdır.

Tek fark, ML Metadata veritabanını bulmak için kullanılan metadata_connection_config ayarlamamıza gerek olmamasıdır. Vertex Pipelines, yönetilen bir meta veri hizmeti kullandığından, kullanıcıların bununla ilgilenmesi gerekmez ve bizim parametreyi belirtmemiz gerekmez.

İşlem hattını gerçekten tanımlamadan önce, önce Trainer bileşeni için bir model kodu yazmamız gerekiyor.

Model kodunu yazın.

Simple TFX Pipeline Tutorial'dakiyle aynı model kodunu kullanacağız.

_trainer_module_file = 'penguin_trainer.py'
%%writefile {_trainer_module_file}

# Copied from https://www.tensorflow.org/tfx/tutorials/tfx/penguin_simple

from typing import List
from absl import logging
import tensorflow as tf
from tensorflow import keras
from tensorflow_transform.tf_metadata import schema_utils


from tfx import v1 as tfx
from tfx_bsl.public import tfxio

from tensorflow_metadata.proto.v0 import schema_pb2

_FEATURE_KEYS = [
    'culmen_length_mm', 'culmen_depth_mm', 'flipper_length_mm', 'body_mass_g'
]
_LABEL_KEY = 'species'

_TRAIN_BATCH_SIZE = 20
_EVAL_BATCH_SIZE = 10

# Since we're not generating or creating a schema, we will instead create
# a feature spec.  Since there are a fairly small number of features this is
# manageable for this dataset.
_FEATURE_SPEC = {
    **{
        feature: tf.io.FixedLenFeature(shape=[1], dtype=tf.float32)
           for feature in _FEATURE_KEYS
       },
    _LABEL_KEY: tf.io.FixedLenFeature(shape=[1], dtype=tf.int64)
}


def _input_fn(file_pattern: List[str],
              data_accessor: tfx.components.DataAccessor,
              schema: schema_pb2.Schema,
              batch_size: int) -> tf.data.Dataset:
  """Generates features and label for training.

  Args:
    file_pattern: List of paths or patterns of input tfrecord files.
    data_accessor: DataAccessor for converting input to RecordBatch.
    schema: schema of the input data.
    batch_size: representing the number of consecutive elements of returned
      dataset to combine in a single batch

  Returns:
    A dataset that contains (features, indices) tuple where features is a
      dictionary of Tensors, and indices is a single Tensor of label indices.
  """
  return data_accessor.tf_dataset_factory(
      file_pattern,
      tfxio.TensorFlowDatasetOptions(
          batch_size=batch_size, label_key=_LABEL_KEY),
      schema=schema).repeat()


def _make_keras_model() -> tf.keras.Model:
  """Creates a DNN Keras model for classifying penguin data.

  Returns:
    A Keras Model.
  """
  # The model below is built with Functional API, please refer to
  # https://www.tensorflow.org/guide/keras/overview for all API options.
  inputs = [keras.layers.Input(shape=(1,), name=f) for f in _FEATURE_KEYS]
  d = keras.layers.concatenate(inputs)
  for _ in range(2):
    d = keras.layers.Dense(8, activation='relu')(d)
  outputs = keras.layers.Dense(3)(d)

  model = keras.Model(inputs=inputs, outputs=outputs)
  model.compile(
      optimizer=keras.optimizers.Adam(1e-2),
      loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
      metrics=[keras.metrics.SparseCategoricalAccuracy()])

  model.summary(print_fn=logging.info)
  return model


# TFX Trainer will call this function.
def run_fn(fn_args: tfx.components.FnArgs):
  """Train the model based on given args.

  Args:
    fn_args: Holds args used to train the model as name/value pairs.
  """

  # This schema is usually either an output of SchemaGen or a manually-curated
  # version provided by pipeline author. A schema can also derived from TFT
  # graph if a Transform component is used. In the case when either is missing,
  # `schema_from_feature_spec` could be used to generate schema from very simple
  # feature_spec, but the schema returned would be very primitive.
  schema = schema_utils.schema_from_feature_spec(_FEATURE_SPEC)

  train_dataset = _input_fn(
      fn_args.train_files,
      fn_args.data_accessor,
      schema,
      batch_size=_TRAIN_BATCH_SIZE)
  eval_dataset = _input_fn(
      fn_args.eval_files,
      fn_args.data_accessor,
      schema,
      batch_size=_EVAL_BATCH_SIZE)

  model = _make_keras_model()
  model.fit(
      train_dataset,
      steps_per_epoch=fn_args.train_steps,
      validation_data=eval_dataset,
      validation_steps=fn_args.eval_steps)

  # The result of the training should be saved in `fn_args.serving_model_dir`
  # directory.
  model.save(fn_args.serving_model_dir, save_format='tf')
-yer tutucu18 l10n-yer
Writing penguin_trainer.py

Modül dosyasını, ardışık düzen bileşenlerinden erişilebilen GCS'ye kopyalayın. Model eğitimi GCP'de gerçekleştiği için bu model tanımını yüklememiz gerekiyor.

Aksi takdirde, modül dosyasını içeren bir kapsayıcı görüntüsü oluşturmak ve ardışık düzeni çalıştırmak için görüntüyü kullanmak isteyebilirsiniz.

gsutil cp {_trainer_module_file} {MODULE_ROOT}/
tutucu20 l10n-yer
InvalidUrlError: Cloud URL scheme should be followed by colon and two slashes: "://". Found: "gs:///pipeline_module/penguin-vertex-pipelines/".

Bir işlem hattı tanımı yazın

Bir TFX boru hattı oluşturmak için bir fonksiyon tanımlayacağız.

# Copied from https://www.tensorflow.org/tfx/tutorials/tfx/penguin_simple and
# slightly modified because we don't need `metadata_path` argument.

def _create_pipeline(pipeline_name: str, pipeline_root: str, data_root: str,
                     module_file: str, serving_model_dir: str,
                     ) -> tfx.dsl.Pipeline:
  """Creates a three component penguin pipeline with TFX."""
  # Brings data into the pipeline.
  example_gen = tfx.components.CsvExampleGen(input_base=data_root)

  # Uses user-provided Python function that trains a model.
  trainer = tfx.components.Trainer(
      module_file=module_file,
      examples=example_gen.outputs['examples'],
      train_args=tfx.proto.TrainArgs(num_steps=100),
      eval_args=tfx.proto.EvalArgs(num_steps=5))

  # Pushes the model to a filesystem destination.
  pusher = tfx.components.Pusher(
      model=trainer.outputs['model'],
      push_destination=tfx.proto.PushDestination(
          filesystem=tfx.proto.PushDestination.Filesystem(
              base_directory=serving_model_dir)))

  # Following three components will be included in the pipeline.
  components = [
      example_gen,
      trainer,
      pusher,
  ]

  return tfx.dsl.Pipeline(
      pipeline_name=pipeline_name,
      pipeline_root=pipeline_root,
      components=components)

İşlem hattını Vertex Pipelines üzerinde çalıştırın.

Simple TFX Pipeline Tutorial'da yerel ortamda çalışan LocalDagRunner kullandık. TFX, işlem hattınızı çalıştırmak için birden çok düzenleyici sağlar. Bu eğitimde, Vertex Pipelines'ı Kubeflow V2 dag runner ile birlikte kullanacağız.

İşlem hattını gerçekten çalıştırmak için bir koşucu tanımlamamız gerekiyor. TFX API'lerini kullanarak işlem hattınızı işlem hattı tanım biçimimizde derleyeceksiniz.

import os

PIPELINE_DEFINITION_FILE = PIPELINE_NAME + '_pipeline.json'

runner = tfx.orchestration.experimental.KubeflowV2DagRunner(
    config=tfx.orchestration.experimental.KubeflowV2DagRunnerConfig(),
    output_filename=PIPELINE_DEFINITION_FILE)
# Following function will write the pipeline definition to PIPELINE_DEFINITION_FILE.
_ = runner.run(
    _create_pipeline(
        pipeline_name=PIPELINE_NAME,
        pipeline_root=PIPELINE_ROOT,
        data_root=DATA_ROOT,
        module_file=os.path.join(MODULE_ROOT, _trainer_module_file),
        serving_model_dir=SERVING_MODEL_DIR))

Oluşturulan tanım dosyası kfp istemcisi kullanılarak gönderilebilir.

# docs_infra: no_execute
from google.cloud import aiplatform
from google.cloud.aiplatform import pipeline_jobs

aiplatform.init(project=GOOGLE_CLOUD_PROJECT, location=GOOGLE_CLOUD_REGION)

job = pipeline_jobs.PipelineJob(template_path=PIPELINE_DEFINITION_FILE,
                                display_name=PIPELINE_NAME)
job.run(sync=False)

Artık ilerlemeyi görmek için Google Cloud Console'da "Vertex AI > Pipelines"ı ziyaret edebilirsiniz.