Tiền xử lý dữ liệu cho ML với Google Cloud,Tiền xử lý dữ liệu cho ML với Google Cloud

Hướng dẫn này chỉ cho bạn cách sử dụng TensorFlow Transform (thư viện tf.Transform ) để triển khai quá trình tiền xử lý dữ liệu cho máy học (ML). Thư viện tf.Transform dành cho TensorFlow cho phép bạn xác định cả chuyển đổi dữ liệu ở cấp phiên bản và cấp độ đầy đủ thông qua quy trình tiền xử lý dữ liệu. Các quy trình này được thực thi một cách hiệu quả bằng Apache Beam và chúng tạo ra dưới dạng sản phẩm phụ là biểu đồ TensorFlow để áp dụng các phép biến đổi tương tự trong quá trình dự đoán cũng như khi mô hình được phân phối.

Hướng dẫn này cung cấp ví dụ toàn diện về cách sử dụng Dataflow làm trình chạy cho Apache Beam. Nó giả định rằng bạn đã quen thuộc với BigQuery , Dataflow, Vertex AI và API TensorFlow Keras . Nó cũng giả định rằng bạn có một số kinh nghiệm sử dụng Notebook Jupyter, chẳng hạn như với Vertex AI Workbench .

Hướng dẫn này cũng giả định rằng bạn đã quen với các khái niệm về loại tiền xử lý, thách thức và tùy chọn trên Google Cloud, như được mô tả trong Tiền xử lý dữ liệu cho ML: tùy chọn và đề xuất .

Mục tiêu

  • Triển khai đường dẫn Apache Beam bằng thư viện tf.Transform .
  • Chạy quy trình trong Dataflow.
  • Triển khai mô hình TensorFlow bằng thư viện tf.Transform .
  • Đào tạo và sử dụng mô hình để dự đoán.

Chi phí

Hướng dẫn này sử dụng các thành phần có thể tính phí sau đây của Google Cloud:

Để ước tính chi phí chạy hướng dẫn này, giả sử bạn sử dụng mọi tài nguyên trong cả ngày, hãy sử dụng công cụ tính giá được cấu hình sẵn .

Trước khi bắt đầu

  1. Trong bảng điều khiển Google Cloud, trên trang chọn dự án, hãy chọn hoặc tạo dự án Google Cloud .

    Đi tới bộ chọn dự án

  2. Đảm bảo rằng tính năng thanh toán được bật cho dự án Đám mây của bạn. Tìm hiểu cách kiểm tra xem tính năng thanh toán có được bật trên dự án hay không .

  3. Kích hoạt API Dataflow, Vertex AI và Notebooks. Kích hoạt các API

Sổ ghi chép Jupyter cho giải pháp này

Các sổ ghi chép Jupyter sau đây hiển thị ví dụ triển khai:

Trong các phần sau, bạn sao chép các sổ ghi chép này rồi thực thi các sổ ghi chép này để tìm hiểu cách hoạt động của ví dụ triển khai.

Khởi chạy phiên bản sổ ghi chép do người dùng quản lý

  1. Trong bảng điều khiển Google Cloud, hãy truy cập trang Vertex AI Workbench .

    Đi tới Bàn làm việc

  2. Trên tab Sổ tay do người dùng quản lý , nhấp vào +Sổ tay mới .

  3. Chọn TensorFlow Enterprise 2.8 (có LTS) không có GPU cho loại phiên bản.

  4. Nhấp vào Tạo .

Sau khi bạn tạo sổ ghi chép, hãy đợi proxy tới JupyterLab hoàn tất quá trình khởi tạo. Khi sẵn sàng, Open JupyterLab sẽ hiển thị bên cạnh tên sổ ghi chép.

Sao chép sổ ghi chép

  1. Trên tab Sổ ghi chép do người dùng quản lý , bên cạnh tên sổ ghi chép, hãy nhấp vào Mở JupyterLab . Giao diện JupyterLab mở trong tab mới.

    Nếu JupyterLab hiển thị hộp thoại Đề xuất bản dựng , hãy nhấp vào Hủy để từ chối bản dựng được đề xuất.

  2. Trên tab Trình khởi chạy , nhấp vào Terminal .

  3. Trong cửa sổ terminal, sao chép sổ ghi chép:

    git clone https://github.com/GoogleCloudPlatform/training-data-analyst
    

Triển khai quy trình Apache Beam

Phần này và phần tiếp theo Chạy quy trình trong Dataflow cung cấp tổng quan và ngữ cảnh cho Notebook 1. Sổ ghi chép này cung cấp ví dụ thực tế để mô tả cách sử dụng thư viện tf.Transform để xử lý trước dữ liệu. Ví dụ này sử dụng tập dữ liệu Natality, được dùng để dự đoán cân nặng của trẻ dựa trên nhiều thông tin đầu vào khác nhau. Dữ liệu được lưu trữ trong bảng ngày sinh công khai trong BigQuery.

Chạy Notebook 1

  1. Trong giao diện JupyterLab, nhấp vào Tệp > Mở từ đường dẫn , sau đó nhập đường dẫn sau:

    training-data-analyst/blogs/babyweight_tft/babyweight_tft_keras_01.ipynb
    
  2. Nhấp vào Chỉnh sửa > Xóa tất cả kết quả đầu ra .

  3. Trong phần Cài đặt các gói cần thiết , thực thi ô đầu tiên để chạy lệnh pip install apache-beam .

    Phần cuối cùng của đầu ra là như sau:

    Successfully installed ...
    

    Bạn có thể bỏ qua các lỗi phụ thuộc ở đầu ra. Bạn chưa cần phải khởi động lại kernel.

  4. Thực thi ô thứ hai để chạy lệnh pip install tensorflow-transform . Phần cuối cùng của đầu ra là như sau:

    Successfully installed ...
    Note: you may need to restart the kernel to use updated packages.
    

    Bạn có thể bỏ qua các lỗi phụ thuộc ở đầu ra.

  5. Nhấp chuột Hạt nhân > Khởi động lại hạt nhân .

  6. Thực thi các ô trong phần Xác nhận các gói đã cài đặtTạo setup.py để cài đặt các gói vào phần vùng chứa Dataflow .

  7. Trong phần Đặt cờ chung , bên cạnh PROJECTBUCKET , thay thế your-project bằng ID dự án Đám mây của bạn, sau đó thực thi ô.

  8. Thực hiện tất cả các ô còn lại cho đến ô cuối cùng trong sổ ghi chép. Để biết thông tin về những việc cần làm trong mỗi ô, hãy xem hướng dẫn trong sổ tay.

Tổng quan về đường ống

Trong ví dụ về sổ ghi chép, Dataflow chạy quy trình tf.Transform trên quy mô lớn để chuẩn bị dữ liệu và tạo ra các tạo phẩm chuyển đổi. Các phần sau trong tài liệu này mô tả các chức năng thực hiện từng bước trong quy trình. Các bước tổng thể của đường ống như sau:

  1. Đọc dữ liệu đào tạo từ BigQuery.
  2. Phân tích và chuyển đổi dữ liệu đào tạo bằng thư viện tf.Transform .
  3. Ghi dữ liệu đào tạo đã chuyển đổi vào Cloud Storage ở định dạng TFRecord .
  4. Đọc dữ liệu đánh giá từ BigQuery.
  5. Chuyển đổi dữ liệu đánh giá bằng biểu đồ transform_fn được tạo ở bước 2.
  6. Ghi dữ liệu đào tạo đã chuyển đổi vào Cloud Storage ở định dạng TFRecord.
  7. Viết các tạo phẩm chuyển đổi vào Cloud Storage để sử dụng sau này để tạo và xuất mô hình.

Ví dụ sau đây hiển thị mã Python cho quy trình tổng thể. Các phần tiếp theo cung cấp giải thích và danh sách mã cho từng bước.

def run_transformation_pipeline(args):

    pipeline_options = beam.pipeline.PipelineOptions(flags=[], **args)

    runner = args['runner']
    data_size = args['data_size']
    transformed_data_location = args['transformed_data_location']
    transform_artefact_location = args['transform_artefact_location']
    temporary_dir = args['temporary_dir']
    debug = args['debug']

    # Instantiate the pipeline
    with beam.Pipeline(runner, options=pipeline_options) as pipeline:
        with impl.Context(temporary_dir):

            # Preprocess train data
            step = 'train'
            # Read raw train data from BigQuery
            raw_train_dataset = read_from_bq(pipeline, step, data_size)
            # Analyze and transform raw_train_dataset
            transformed_train_dataset, transform_fn = analyze_and_transform(raw_train_dataset, step)
            # Write transformed train data to sink as tfrecords
            write_tfrecords(transformed_train_dataset, transformed_data_location, step)

            # Preprocess evaluation data
            step = 'eval'
            # Read raw eval data from BigQuery
            raw_eval_dataset = read_from_bq(pipeline, step, data_size)
            # Transform eval data based on produced transform_fn
            transformed_eval_dataset = transform(raw_eval_dataset, transform_fn, step)
            # Write transformed eval data to sink as tfrecords
            write_tfrecords(transformed_eval_dataset, transformed_data_location, step)

            # Write transformation artefacts
            write_transform_artefacts(transform_fn, transform_artefact_location)

            # (Optional) for debugging, write transformed data as text
            step = 'debug'
            # Write transformed train data as text if debug enabled
            if debug == True:
                write_text(transformed_train_dataset, transformed_data_location, step)

Đọc dữ liệu đào tạo thô từ BigQuery

Bước đầu tiên là đọc dữ liệu đào tạo thô từ BigQuery bằng hàm read_from_bq . Hàm này trả về một đối tượng raw_dataset được trích xuất từ ​​BigQuery. Bạn chuyển giá trị data_size và chuyển giá trị step của train hoặc eval . Truy vấn nguồn BigQuery được xây dựng bằng hàm get_source_query , như trong ví dụ sau:

def read_from_bq(pipeline, step, data_size):

    source_query = get_source_query(step, data_size)
    raw_data = (
        pipeline
        | '{} - Read Data from BigQuery'.format(step) >> beam.io.Read(
                           beam.io.BigQuerySource(query=source_query, use_standard_sql=True))
        | '{} - Clean up Data'.format(step) >> beam.Map(prep_bq_row)
    )

    raw_metadata = create_raw_metadata()
    raw_dataset = (raw_data, raw_metadata)
    return raw_dataset

Trước khi thực hiện quá trình xử lý trước tf.Transform , bạn có thể cần thực hiện quá trình xử lý dựa trên Tia Apache điển hình, bao gồm xử lý Bản đồ, Bộ lọc, Nhóm và Cửa sổ. Trong ví dụ này, mã sẽ xóa các bản ghi được đọc từ BigQuery bằng phương thức beam.Map(prep_bq_row) , trong đó prep_bq_row là một hàm tùy chỉnh. Hàm tùy chỉnh này chuyển đổi mã số cho một tính năng phân loại thành các nhãn mà con người có thể đọc được.

Ngoài ra, để sử dụng thư viện tf.Transform nhằm phân tích và chuyển đổi đối tượng raw_data được trích xuất từ ​​BigQuery, bạn cần tạo đối tượng raw_dataset , là một bộ gồm các đối tượng raw_dataraw_metadata . Đối tượng raw_metadata được tạo bằng hàm create_raw_metadata như sau:

CATEGORICAL_FEATURE_NAMES = ['is_male', 'mother_race']
NUMERIC_FEATURE_NAMES = ['mother_age', 'plurality', 'gestation_weeks']
TARGET_FEATURE_NAME = 'weight_pounds'

def create_raw_metadata():

    feature_spec = dict(
        [(name, tf.io.FixedLenFeature([], tf.string)) for name in CATEGORICAL_FEATURE_NAMES] +
        [(name, tf.io.FixedLenFeature([], tf.float32)) for name in NUMERIC_FEATURE_NAMES] +
        [(TARGET_FEATURE_NAME, tf.io.FixedLenFeature([], tf.float32))])

    raw_metadata = dataset_metadata.DatasetMetadata(
        schema_utils.schema_from_feature_spec(feature_spec))

    return raw_metadata

Khi bạn thực thi ô trong sổ ghi chép ngay sau ô xác định phương thức này, nội dung của đối tượng raw_metadata.schema sẽ được hiển thị. Nó bao gồm các cột sau:

  • gestation_weeks (loại: FLOAT )
  • is_male (loại: BYTES )
  • mother_age (loại: FLOAT )
  • mother_race (loại: BYTES )
  • plurality (loại: FLOAT )
  • weight_pounds (loại: FLOAT )

Chuyển đổi dữ liệu đào tạo thô

Hãy tưởng tượng rằng bạn muốn áp dụng các phép biến đổi tiền xử lý điển hình cho các tính năng thô đầu vào của dữ liệu huấn luyện để chuẩn bị cho ML. Những chuyển đổi này bao gồm cả hoạt động cấp độ đầy đủ và cấp độ phiên bản, như được hiển thị trong bảng sau:

Tính năng đầu vào Chuyển đổi Số liệu thống kê cần thiết Kiểu Tính năng đầu ra
weight_pound Không có Không có NA weight_pound
mother_age Bình thường hóa nghĩa là, var Toàn bộ mother_age_normalized
mother_age Phân loại kích thước bằng nhau lượng tử Toàn bộ mother_age_bucketized
mother_age Tính nhật ký Không có Cấp độ phiên bản mother_age_log
plurality Cho biết đó là một con hay nhiều con Không có Cấp độ phiên bản is_multiple
is_multiple Chuyển đổi giá trị danh nghĩa thành chỉ số số từ ngữ Toàn bộ is_multiple_index
gestation_weeks Thang đo từ 0 đến 1 nhỏ nhất lớn nhất Toàn bộ gestation_weeks_scaled
mother_race Chuyển đổi giá trị danh nghĩa thành chỉ số số từ ngữ Toàn bộ mother_race_index
is_male Chuyển đổi giá trị danh nghĩa thành chỉ số số từ ngữ Toàn bộ is_male_index

Các phép biến đổi này được triển khai trong hàm preprocess_fn , hàm này yêu cầu một từ điển các tensor ( input_features ) và trả về một từ điển các tính năng được xử lý ( output_features ).

Đoạn mã sau đây cho thấy cách triển khai hàm preprocess_fn , sử dụng các API chuyển đổi toàn phần tf.Transform (có tiền tố là tft. ) và các thao tác cấp phiên bản TensorFlow (có tiền tố là tf. ):

def preprocess_fn(input_features):

    output_features = {}

    # target feature
    output_features['weight_pounds'] = input_features['weight_pounds']

    # normalization
    output_features['mother_age_normalized'] = tft.scale_to_z_score(input_features['mother_age'])

    # scaling
    output_features['gestation_weeks_scaled'] =  tft.scale_to_0_1(input_features['gestation_weeks'])

    # bucketization based on quantiles
    output_features['mother_age_bucketized'] = tft.bucketize(input_features['mother_age'], num_buckets=5)

    # you can compute new features based on custom formulas
    output_features['mother_age_log'] = tf.math.log(input_features['mother_age'])

    # or create flags/indicators
    is_multiple = tf.as_string(input_features['plurality'] > tf.constant(1.0))

    # convert categorical features to indexed vocab
    output_features['mother_race_index'] = tft.compute_and_apply_vocabulary(input_features['mother_race'], vocab_filename='mother_race')
    output_features['is_male_index'] = tft.compute_and_apply_vocabulary(input_features['is_male'], vocab_filename='is_male')
    output_features['is_multiple_index'] = tft.compute_and_apply_vocabulary(is_multiple, vocab_filename='is_multiple')

    return output_features

Khung tf.Transform có một số phép biến đổi khác ngoài những biến đổi trong ví dụ trước, bao gồm những biến đổi được liệt kê trong bảng sau:

Chuyển đổi Áp dụng cho Sự miêu tả
scale_by_min_max Tính năng số Chia tỷ lệ một cột số thành phạm vi [ output_min , output_max ]
scale_to_0_1 Tính năng số Trả về một cột là cột đầu vào được chia tỷ lệ để có phạm vi [ 0 , 1 ]
scale_to_z_score Tính năng số Trả về một cột được chuẩn hóa với giá trị trung bình là 0 và phương sai là 1
tfidf Tính năng văn bản Ánh xạ các số hạng trong x với tần suất số hạng của chúng * tần số tài liệu nghịch đảo
compute_and_apply_vocabulary Tính năng phân loại Tạo từ vựng cho một tính năng phân loại và ánh xạ nó tới một số nguyên với từ vựng này
ngrams Tính năng văn bản Tạo một SparseTensor của n-gram
hash_strings Tính năng phân loại Băm chuỗi vào nhóm
pca Tính năng số Tính toán PCA trên tập dữ liệu bằng cách sử dụng hiệp phương sai sai lệch
bucketize Tính năng số Trả về một cột được nhóm có kích thước bằng nhau (dựa trên lượng tử), với chỉ mục nhóm được gán cho mỗi đầu vào

Để áp dụng các phép biến đổi được triển khai trong hàm preprocess_fn cho đối tượng raw_train_dataset được tạo ở bước trước của quy trình, bạn sử dụng phương thức AnalyzeAndTransformDataset . Phương thức này yêu cầu đối tượng raw_dataset làm đầu vào, áp dụng hàm preprocess_fn và tạo ra đối tượng transformed_dataset và biểu đồ transform_fn . Đoạn mã sau minh họa quá trình xử lý này:

def analyze_and_transform(raw_dataset, step):

    transformed_dataset, transform_fn = (
        raw_dataset
        | '{} - Analyze & Transform'.format(step) >> tft_beam.AnalyzeAndTransformDataset(
            preprocess_fn, output_record_batches=True)
    )

    return transformed_dataset, transform_fn

Các phép biến đổi được áp dụng trên dữ liệu thô theo hai giai đoạn: giai đoạn phân tích và giai đoạn biến đổi. Hình 3 ở phần sau của tài liệu này cho thấy cách phân tách phương thức AnalyzeAndTransformDataset thành phương thức AnalyzeDataset và phương thức TransformDataset .

Giai đoạn phân tích

Trong giai đoạn phân tích, dữ liệu huấn luyện thô được phân tích theo quy trình toàn diện để tính toán số liệu thống kê cần thiết cho các chuyển đổi. Điều này bao gồm tính toán giá trị trung bình, phương sai, tối thiểu, tối đa, lượng tử và từ vựng. Quá trình phân tích yêu cầu một tập dữ liệu thô (dữ liệu thô cộng với siêu dữ liệu thô) và nó tạo ra hai kết quả đầu ra:

  • transform_fn : biểu đồ TensorFlow chứa số liệu thống kê được tính toán từ giai đoạn phân tích và logic chuyển đổi (sử dụng số liệu thống kê) làm hoạt động cấp phiên bản. Như đã thảo luận sau trong Lưu biểu đồ , biểu đồ transform_fn được lưu để gắn vào hàm serving_fn mô hình_fn. Điều này giúp có thể áp dụng phép biến đổi tương tự cho các điểm dữ liệu dự đoán trực tuyến.
  • transform_metadata : đối tượng mô tả lược đồ dự kiến ​​của dữ liệu sau khi chuyển đổi.

Giai đoạn phân tích được minh họa trong sơ đồ sau, hình 1:

Giai đoạn phân tích tf.Transform.
Hình 1. Giai đoạn phân tích tf.Transform .

Các máy phân tích tf.Transform bao gồm min , max , sum , size , mean , var , covariance , quantiles , vocabularypca .

Giai đoạn biến đổi

Trong giai đoạn chuyển đổi, biểu đồ transform_fn do giai đoạn phân tích tạo ra được sử dụng để chuyển đổi dữ liệu huấn luyện thô trong quy trình cấp phiên bản nhằm tạo ra dữ liệu huấn luyện đã chuyển đổi. Dữ liệu huấn luyện đã chuyển đổi được ghép nối với siêu dữ liệu đã chuyển đổi (được tạo bởi giai đoạn phân tích) để tạo ra tập dữ liệu transformed_train_dataset .

Giai đoạn biến đổi được minh họa trong sơ đồ sau, hình 2:

Giai đoạn biến đổi tf.Transform.
Hình 2. Pha biến đổi tf.Transform .

Để xử lý trước các tính năng, bạn gọi các phép biến đổi tensorflow_transform cần thiết (được nhập dưới dạng tft trong mã) khi triển khai hàm preprocess_fn . Ví dụ: khi bạn gọi các phép toán tft.scale_to_z_score , thư viện tf.Transform sẽ chuyển lệnh gọi hàm này thành bộ phân tích phương sai và giá trị trung bình, tính toán các số liệu thống kê trong giai đoạn phân tích, sau đó áp dụng các số liệu thống kê này để chuẩn hóa tính năng số trong giai đoạn biến đổi. Tất cả điều này được thực hiện tự động bằng cách gọi phương thức AnalyzeAndTransformDataset(preprocess_fn) .

Thực thể transformed_metadata.schema được tạo bởi lệnh gọi này bao gồm các cột sau:

  • gestation_weeks_scaled (loại: FLOAT )
  • is_male_index (loại: INT , is_categorical: True )
  • is_multiple_index (loại: INT , is_categorical: True )
  • mother_age_bucketized (loại: INT , is_categorical: True )
  • mother_age_log (loại: FLOAT )
  • mother_age_normalized (loại: FLOAT )
  • mother_race_index (loại: INT , is_categorical: True )
  • weight_pounds (loại: FLOAT )

Như đã giải thích trong các hoạt động Tiền xử lý ở phần đầu tiên của loạt bài này, việc chuyển đổi tính năng chuyển đổi các tính năng phân loại thành biểu diễn số. Sau khi chuyển đổi, các đặc điểm phân loại được biểu diễn bằng các giá trị nguyên. Trong thực thể transformed_metadata.schema , cờ is_categorical cho các cột loại INT cho biết cột đó đại diện cho một đối tượng phân loại hay một đối tượng số thực sự.

Viết dữ liệu đào tạo được chuyển đổi

Sau khi dữ liệu huấn luyện được xử lý trước bằng hàm preprocess_fn thông qua các giai đoạn phân tích và biến đổi, bạn có thể ghi dữ liệu vào một bồn chứa để sử dụng cho việc huấn luyện mô hình TensorFlow. Khi bạn thực thi quy trình Apache Beam bằng Dataflow, phần chính là Cloud Storage. Nếu không, bồn rửa là đĩa cục bộ. Mặc dù bạn có thể ghi dữ liệu dưới dạng tệp CSV gồm các tệp có định dạng có chiều rộng cố định, định dạng tệp được đề xuất cho bộ dữ liệu TensorFlow là định dạng TFRecord. Đây là định dạng nhị phân hướng bản ghi đơn giản bao gồm các thông báo bộ đệm giao thức tf.train.Example .

Mỗi bản ghi tf.train.Example chứa một hoặc nhiều tính năng. Chúng được chuyển đổi thành tensor khi chúng được đưa vào mô hình để huấn luyện. Đoạn mã sau ghi tập dữ liệu đã chuyển đổi vào tệp TFRecord ở vị trí đã chỉ định:

def write_tfrecords(transformed_dataset, location, step):
    from tfx_bsl.coders import example_coder

    transformed_data, transformed_metadata = transformed_dataset
    (
        transformed_data
        | '{} - Encode Transformed Data'.format(step) >> beam.FlatMapTuple(
                            lambda batch, _: example_coder.RecordBatchToExamples(batch))
        | '{} - Write Transformed Data'.format(step) >> beam.io.WriteToTFRecord(
                            file_path_prefix=os.path.join(location,'{}'.format(step)),
                            file_name_suffix='.tfrecords')
    )

Đọc, chuyển đổi và ghi dữ liệu đánh giá

Sau khi chuyển đổi dữ liệu huấn luyện và tạo biểu đồ transform_fn , bạn có thể sử dụng nó để chuyển đổi dữ liệu đánh giá. Trước tiên, bạn đọc và xóa dữ liệu đánh giá khỏi BigQuery bằng hàm read_from_bq được mô tả trước đó trong phần Đọc dữ liệu đào tạo thô từ BigQuery và chuyển giá trị eval cho tham số step . Sau đó, bạn sử dụng mã sau để chuyển đổi tập dữ liệu đánh giá thô ( raw_dataset ) sang định dạng được chuyển đổi dự kiến ​​( transformed_dataset ):

def transform(raw_dataset, transform_fn, step):

    transformed_dataset = (
        (raw_dataset, transform_fn)
        | '{} - Transform'.format(step) >> tft_beam.TransformDataset(output_record_batches=True)
    )

    return transformed_dataset

Khi bạn chuyển đổi dữ liệu đánh giá, chỉ các thao tác cấp phiên bản mới được áp dụng, sử dụng cả logic trong biểu đồ transform_fn và số liệu thống kê được tính toán từ giai đoạn phân tích trong dữ liệu huấn luyện. Nói cách khác, bạn không phân tích dữ liệu đánh giá theo kiểu toàn diện để tính toán số liệu thống kê mới, như giá trị trung bình và phương sai để chuẩn hóa điểm z của các đặc điểm số trong dữ liệu đánh giá. Thay vào đó, bạn sử dụng số liệu thống kê được tính toán từ dữ liệu huấn luyện để chuyển đổi dữ liệu đánh giá theo kiểu cấp độ phiên bản.

Do đó, bạn sử dụng phương pháp AnalyzeAndTransform trong bối cảnh dữ liệu huấn luyện để tính toán số liệu thống kê và chuyển đổi dữ liệu. Đồng thời, bạn sử dụng phương thức TransformDataset trong bối cảnh chuyển đổi dữ liệu đánh giá để chỉ chuyển đổi dữ liệu bằng cách sử dụng số liệu thống kê được tính toán trên dữ liệu huấn luyện.

Sau đó, bạn ghi dữ liệu vào ổ lưu trữ (Bộ lưu trữ đám mây hoặc đĩa cục bộ, tùy thuộc vào trình chạy) ở định dạng TFRecord để đánh giá mô hình TensorFlow trong quá trình đào tạo. Để thực hiện việc này, bạn sử dụng hàm write_tfrecords được thảo luận trong phần Ghi dữ liệu huấn luyện được chuyển đổi . Sơ đồ sau đây, hình 3, cho thấy cách sử dụng biểu đồ transform_fn được tạo trong giai đoạn phân tích của dữ liệu huấn luyện để chuyển đổi dữ liệu đánh giá.

Chuyển đổi dữ liệu đánh giá bằng biểu đồ Transform_fn.
Hình 3. Chuyển đổi dữ liệu đánh giá bằng biểu đồ transform_fn .

Lưu biểu đồ

Bước cuối cùng trong quy trình tiền xử lý tf.Transform là lưu trữ các thành phần lạ, bao gồm biểu đồ transform_fn được tạo ra bởi giai đoạn phân tích trên dữ liệu huấn luyện. Mã để lưu trữ các tạo phẩm được hiển thị trong hàm write_transform_artefacts sau:

def write_transform_artefacts(transform_fn, location):

    (
        transform_fn
        | 'Write Transform Artifacts' >> transform_fn_io.WriteTransformFn(location)
    )

Những hiện vật này sau này sẽ được sử dụng để đào tạo mô hình và xuất khẩu để phục vụ. Các hiện vật sau đây cũng được tạo ra, như được trình bày trong phần tiếp theo:

  • saved_model.pb : biểu thị biểu đồ TensorFlow bao gồm logic chuyển đổi (biểu đồ transform_fn ), được gắn vào giao diện phục vụ mô hình để chuyển đổi các điểm dữ liệu thô sang định dạng được chuyển đổi.
  • variables : bao gồm số liệu thống kê được tính toán trong giai đoạn phân tích của dữ liệu huấn luyện và được sử dụng trong logic chuyển đổi trong tạo phẩm saved_model.pb .
  • assets : bao gồm các tệp từ vựng, một tệp cho mỗi tính năng phân loại được xử lý bằng phương thức compute_and_apply_vocabulary , được sử dụng trong quá trình cung cấp để chuyển đổi giá trị danh nghĩa thô đầu vào thành chỉ mục số.
  • transformed_metadata : thư mục chứa tệp lược schema.json mô tả lược đồ của dữ liệu được chuyển đổi.

Chạy quy trình trong Dataflow

Sau khi xác định đường dẫn tf.Transform , bạn chạy đường dẫn bằng Dataflow. Sơ đồ sau đây, hình 4, hiển thị biểu đồ thực thi Dataflow của đường dẫn tf.Transform được mô tả trong ví dụ.

Biểu đồ thực thi luồng dữ liệu của đường dẫn tf.Transform.
Hình 4. Biểu đồ thực thi luồng dữ liệu của đường ống tf.Transform .

Sau khi thực thi quy trình Dataflow để xử lý trước dữ liệu đào tạo và đánh giá, bạn có thể khám phá các đối tượng được tạo trong Cloud Storage bằng cách thực thi ô cuối cùng trong sổ ghi chép. Các đoạn mã trong phần này hiển thị kết quả, trong đó YOUR_BUCKET_NAME là tên bộ chứa Cloud Storage của bạn.

Dữ liệu đánh giá và đào tạo đã chuyển đổi ở định dạng TFRecord được lưu trữ tại vị trí sau:

gs://YOUR_BUCKET_NAME/babyweight_tft/transformed

Các tạo phẩm biến đổi được tạo ra tại vị trí sau:

gs://YOUR_BUCKET_NAME/babyweight_tft/transform

Danh sách sau đây là đầu ra của quy trình, hiển thị các đối tượng và thành phần dữ liệu được tạo ra:

transformed data:
gs://YOUR_BUCKET_NAME/babyweight_tft/transformed/eval-00000-of-00001.tfrecords
gs://YOUR_BUCKET_NAME/babyweight_tft/transformed/train-00000-of-00002.tfrecords
gs://YOUR_BUCKET_NAME/babyweight_tft/transformed/train-00001-of-00002.tfrecords

transformed metadata:
gs://YOUR_BUCKET_NAME/babyweight_tft/transform/transformed_metadata/
gs://YOUR_BUCKET_NAME/babyweight_tft/transform/transformed_metadata/asset_map
gs://YOUR_BUCKET_NAME/babyweight_tft/transform/transformed_metadata/schema.pbtxt

transform artefact:
gs://YOUR_BUCKET_NAME/babyweight_tft/transform/transform_fn/
gs://YOUR_BUCKET_NAME/babyweight_tft/transform/transform_fn/saved_model.pb
gs://YOUR_BUCKET_NAME/babyweight_tft/transform/transform_fn/assets/
gs://YOUR_BUCKET_NAME/babyweight_tft/transform/transform_fn/variables/

transform assets:
gs://YOUR_BUCKET_NAME/babyweight_tft/transform/transform_fn/assets/
gs://YOUR_BUCKET_NAME/babyweight_tft/transform/transform_fn/assets/is_male
gs://YOUR_BUCKET_NAME/babyweight_tft/transform/transform_fn/assets/is_multiple
gs://YOUR_BUCKET_NAME/babyweight_tft/transform/transform_fn/assets/mother_race

Triển khai mô hình TensorFlow

Phần này và phần tiếp theo, Đào tạo và sử dụng mô hình để dự đoán , cung cấp thông tin tổng quan và bối cảnh cho Notebook 2. Sổ tay này cung cấp một mô hình ML mẫu để dự đoán cân nặng của trẻ. Trong ví dụ này, mô hình TensorFlow được triển khai bằng API Keras. Mô hình này sử dụng dữ liệu và thành phần lạ được tạo ra bởi quy trình tiền xử lý tf.Transform được giải thích trước đó.

Chạy Notebook 2

  1. Trong giao diện JupyterLab, nhấp vào Tệp > Mở từ đường dẫn , sau đó nhập đường dẫn sau:

    training-data-analyst/blogs/babyweight_tft/babyweight_tft_keras_02.ipynb
    
  2. Nhấp vào Chỉnh sửa > Xóa tất cả kết quả đầu ra .

  3. Trong phần Cài đặt các gói cần thiết , thực thi ô đầu tiên để chạy lệnh pip install tensorflow-transform .

    Phần cuối cùng của đầu ra là như sau:

    Successfully installed ...
    Note: you may need to restart the kernel to use updated packages.
    

    Bạn có thể bỏ qua các lỗi phụ thuộc ở đầu ra.

  4. Trong menu Kernel , chọn Khởi động lại Kernel .

  5. Thực thi các ô trong phần Xác nhận các gói đã cài đặtTạo setup.py để cài đặt các gói vào phần vùng chứa Dataflow .

  6. Trong phần Đặt cờ chung , bên cạnh PROJECTBUCKET , thay thế your-project bằng ID dự án Đám mây của bạn, sau đó thực thi ô.

  7. Thực hiện tất cả các ô còn lại cho đến ô cuối cùng trong sổ ghi chép. Để biết thông tin về những việc cần làm trong mỗi ô, hãy xem hướng dẫn trong sổ tay.

Tổng quan về việc tạo mô hình

Các bước tạo mô hình như sau:

  1. Tạo các cột tính năng bằng cách sử dụng thông tin lược đồ được lưu trữ trong thư mục transformed_metadata .
  2. Tạo mô hình rộng và sâu bằng API Keras bằng cách sử dụng các cột tính năng làm đầu vào cho mô hình.
  3. Tạo hàm tfrecords_input_fn để đọc và phân tích dữ liệu huấn luyện và đánh giá bằng cách sử dụng các tạo phẩm biến đổi.
  4. Huấn luyện và đánh giá mô hình.
  5. Xuất mô hình đã đào tạo bằng cách xác định hàm serving_fn có biểu đồ transform_fn được đính kèm.
  6. Kiểm tra mô hình đã xuất bằng công cụ saved_model_cli .
  7. Sử dụng mô hình đã xuất để dự đoán.

Tài liệu này không giải thích cách xây dựng mô hình nên không thảo luận chi tiết về cách xây dựng hoặc huấn luyện mô hình. Tuy nhiên, các phần sau đây cho thấy cách sử dụng thông tin được lưu trữ trong thư mục transform_metadata —được tạo bởi quy trình tf.Transform —để tạo các cột tính năng của mô hình. Tài liệu này cũng cho thấy cách biểu đồ transform_fn —cũng được tạo bởi quá trình tf.Transform —được sử dụng trong hàm serving_fn khi mô hình được xuất để phân phát.

Sử dụng các tạo phẩm biến đổi được tạo trong đào tạo mô hình

Khi huấn luyện mô hình TensorFlow, bạn sử dụng các đối train huấn luyện và eval đã được chuyển đổi được tạo ở bước xử lý dữ liệu trước đó. Các đối tượng này được lưu trữ dưới dạng tệp phân đoạn ở định dạng TFRecord. Thông tin lược đồ trong thư mục transformed_metadata được tạo ở bước trước có thể hữu ích trong việc phân tích dữ liệu ( các đối tượng tf.train.Example ) để đưa vào mô hình nhằm đào tạo và đánh giá.

Phân tích dữ liệu

Vì bạn đọc các tệp ở định dạng TFRecord để cung cấp dữ liệu huấn luyện và đánh giá cho mô hình, nên bạn cần phân tích từng đối tượng tf.train.Example trong các tệp để tạo từ điển các tính năng (tensor). Điều này đảm bảo rằng các tính năng được ánh xạ tới lớp đầu vào của mô hình bằng cách sử dụng các cột tính năng, đóng vai trò là giao diện đánh giá và đào tạo mô hình. Để phân tích dữ liệu, bạn sử dụng đối tượng TFTransformOutput được tạo từ các tạo phẩm được tạo ở bước trước:

  1. Tạo một đối tượng TFTransformOutput từ các tạo phẩm được tạo và lưu trong bước tiền xử lý trước đó, như được mô tả trong phần Lưu biểu đồ :

    tf_transform_output = tft.TFTransformOutput(TRANSFORM_ARTEFACTS_DIR)
    
  2. Trích xuất một đối tượng feature_spec từ đối tượng TFTransformOutput :

    tf_transform_output.transformed_feature_spec()
    
  3. Sử dụng đối tượng feature_spec để chỉ định các tính năng có trong đối tượng tf.train.Example như trong hàm tfrecords_input_fn :

    def tfrecords_input_fn(files_name_pattern, batch_size=512):
    
        tf_transform_output = tft.TFTransformOutput(TRANSFORM_ARTEFACTS_DIR)
        TARGET_FEATURE_NAME = 'weight_pounds'
    
        batched_dataset = tf.data.experimental.make_batched_features_dataset(
            file_pattern=files_name_pattern,
            batch_size=batch_size,
            features=tf_transform_output.transformed_feature_spec(),
            reader=tf.data.TFRecordDataset,
            label_key=TARGET_FEATURE_NAME,
            shuffle=True).prefetch(tf.data.experimental.AUTOTUNE)
    
        return batched_dataset
    

Tạo các cột tính năng

Quy trình tạo ra thông tin lược đồ trong thư mục transformed_metadata mô tả lược đồ của dữ liệu đã chuyển đổi mà mô hình mong đợi để đào tạo và đánh giá. Lược đồ chứa tên tính năng và kiểu dữ liệu, chẳng hạn như sau:

  • gestation_weeks_scaled (loại: FLOAT )
  • is_male_index (loại: INT , is_categorical: True )
  • is_multiple_index (loại: INT , is_categorical: True )
  • mother_age_bucketized (loại: INT , is_categorical: True )
  • mother_age_log (loại: FLOAT )
  • mother_age_normalized (loại: FLOAT )
  • mother_race_index (loại: INT , is_categorical: True )
  • weight_pounds (loại: FLOAT )

Để xem thông tin này, sử dụng các lệnh sau:

transformed_metadata = tft.TFTransformOutput(TRANSFORM_ARTEFACTS_DIR).transformed_metadata
transformed_metadata.schema

Đoạn mã sau cho biết cách bạn sử dụng tên tính năng để tạo các cột tính năng:

def create_wide_and_deep_feature_columns():

    deep_feature_columns = []
    wide_feature_columns = []
    inputs = {}
    categorical_columns = {}

    # Select features you've checked from the metadata
    # Categorical features are associated with the vocabulary size (starting from 0)
    numeric_features = ['mother_age_log', 'mother_age_normalized', 'gestation_weeks_scaled']
    categorical_features = [('is_male_index', 1), ('is_multiple_index', 1),
                            ('mother_age_bucketized', 4), ('mother_race_index', 10)]

    for feature in numeric_features:
        deep_feature_columns.append(tf.feature_column.numeric_column(feature))
        inputs[feature] = layers.Input(shape=(), name=feature, dtype='float32')

    for feature, vocab_size in categorical_features:
        categorical_columns[feature] = (
            tf.feature_column.categorical_column_with_identity(feature, num_buckets=vocab_size+1))
        wide_feature_columns.append(tf.feature_column.indicator_column(categorical_columns[feature]))
        inputs[feature] = layers.Input(shape=(), name=feature, dtype='int64')

    mother_race_X_mother_age_bucketized = tf.feature_column.crossed_column(
        [categorical_columns['mother_age_bucketized'],
         categorical_columns['mother_race_index']],  55)
    wide_feature_columns.append(tf.feature_column.indicator_column(mother_race_X_mother_age_bucketized))

    mother_race_X_mother_age_bucketized_embedded = tf.feature_column.embedding_column(
        mother_race_X_mother_age_bucketized, 5)
    deep_feature_columns.append(mother_race_X_mother_age_bucketized_embedded)

    return wide_feature_columns, deep_feature_columns, inputs

Mã tạo cột tf.feature_column.numeric_column cho các đối tượng số và cột tf.feature_column.categorical_column_with_identity cho các đối tượng địa lý được phân loại.

Bạn cũng có thể tạo các cột tính năng mở rộng, như được mô tả trong Tùy chọn C: TensorFlow trong phần đầu tiên của loạt bài này. Trong ví dụ được sử dụng cho loạt bài này, một tính năng mới được tạo, mother_race_X_mother_age_bucketized , bằng cách vượt qua các tính năng mother_racemother_age_bucketized bằng cách sử dụng cột tính năng tf.feature_column.crossed_column . Sự thể hiện dày đặc, có chiều thấp của đối tượng địa lý chéo này được tạo bằng cách sử dụng cột đối tượng địa lý tf.feature_column.embedding_column .

Sơ đồ sau, hình 5, hiển thị dữ liệu đã chuyển đổi và cách sử dụng siêu dữ liệu đã chuyển đổi để xác định và huấn luyện mô hình TensorFlow:

Đào tạo mô hình TensorFlow với dữ liệu được chuyển đổi.
Hình 5. Huấn luyện mô hình TensorFlow với dữ liệu được chuyển đổi.

Xuất mô hình để phục vụ dự đoán

Sau khi huấn luyện mô hình TensorFlow bằng API Keras, bạn xuất mô hình đã huấn luyện dưới dạng đối tượng SavingModel để mô hình có thể cung cấp các điểm dữ liệu mới cho hoạt động dự đoán. Khi xuất mô hình, bạn phải xác định giao diện của nó—tức là lược đồ các tính năng đầu vào được mong đợi trong quá trình cung cấp. Lược đồ tính năng đầu vào này được xác định trong hàm serving_fn , như minh họa trong đoạn mã sau:

def export_serving_model(model, output_dir):

    tf_transform_output = tft.TFTransformOutput(TRANSFORM_ARTEFACTS_DIR)
    # The layer has to be saved to the model for Keras tracking purposes.
    model.tft_layer = tf_transform_output.transform_features_layer()

    @tf.function
    def serveing_fn(uid, is_male, mother_race, mother_age, plurality, gestation_weeks):
        features = {
            'is_male': is_male,
            'mother_race': mother_race,
            'mother_age': mother_age,
            'plurality': plurality,
            'gestation_weeks': gestation_weeks
        }
        transformed_features = model.tft_layer(features)
        outputs = model(transformed_features)
        # The prediction results have multiple elements in general.
        # But we need only the first element in our case.
        outputs = tf.map_fn(lambda item: item[0], outputs)

        return {'uid': uid, 'weight': outputs}

    concrete_serving_fn = serveing_fn.get_concrete_function(
        tf.TensorSpec(shape=[None], dtype=tf.string, name='uid'),
        tf.TensorSpec(shape=[None], dtype=tf.string, name='is_male'),
        tf.TensorSpec(shape=[None], dtype=tf.string, name='mother_race'),
        tf.TensorSpec(shape=[None], dtype=tf.float32, name='mother_age'),
        tf.TensorSpec(shape=[None], dtype=tf.float32, name='plurality'),
        tf.TensorSpec(shape=[None], dtype=tf.float32, name='gestation_weeks')
    )
    signatures = {'serving_default': concrete_serving_fn}

    model.save(output_dir, save_format='tf', signatures=signatures)

Trong quá trình phân phối, mô hình mong đợi các điểm dữ liệu ở dạng thô (nghĩa là các tính năng thô trước khi chuyển đổi). Do đó, hàm serving_fn nhận các tính năng thô và lưu trữ chúng trong đối tượng features dưới dạng từ điển Python. Tuy nhiên, như đã thảo luận trước đó, mô hình được đào tạo mong đợi các điểm dữ liệu trong lược đồ được chuyển đổi. Để chuyển đổi các tính năng thô thành các đối tượng transformed_features mà giao diện mô hình mong đợi, bạn áp dụng biểu đồ transform_fn đã lưu cho đối tượng features bằng các bước sau:

  1. Tạo đối tượng TFTransformOutput từ các tạo phẩm được tạo và lưu ở bước tiền xử lý trước đó:

    tf_transform_output = tft.TFTransformOutput(TRANSFORM_ARTEFACTS_DIR)
    
  2. Tạo một đối tượng TransformFeaturesLayer từ đối tượng TFTransformOutput :

    model.tft_layer = tf_transform_output.transform_features_layer()
    
  3. Áp dụng biểu đồ transform_fn bằng đối tượng TransformFeaturesLayer :

    transformed_features = model.tft_layer(features)
    

Sơ đồ sau, hình 6, minh họa bước cuối cùng của việc xuất mô hình để phục vụ:

Xuất mô hình để phân phát có đính kèm biểu đồ Transform_fn.
Hình 6. Xuất mô hình để phân phối với biểu đồ transform_fn được đính kèm.

Đào tạo và sử dụng mô hình để dự đoán

Bạn có thể huấn luyện mô hình cục bộ bằng cách thực thi các ô của sổ ghi chép. Để biết ví dụ về cách đóng gói mã và huấn luyện mô hình của bạn trên quy mô lớn bằng Vertex AI Training, hãy xem các mẫu và hướng dẫn trong kho lưu trữ GitHub của Google Cloud cloudml-samples .

Khi bạn kiểm tra đối tượng SavingModel đã xuất bằng công cụ saved_model_cli , bạn sẽ thấy rằng các phần tử inputs của định nghĩa chữ signature_def bao gồm các tính năng thô, như trong ví dụ sau:

signature_def['serving_default']:
  The given SavedModel SignatureDef contains the following input(s):
    inputs['gestation_weeks'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1)
        name: serving_default_gestation_weeks:0
    inputs['is_male'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: serving_default_is_male:0
    inputs['mother_age'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1)
        name: serving_default_mother_age:0
    inputs['mother_race'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: serving_default_mother_race:0
    inputs['plurality'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1)
        name: serving_default_plurality:0
    inputs['uid'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: serving_default_uid:0
  The given SavedModel SignatureDef contains the following output(s):
    outputs['uid'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: StatefulPartitionedCall_6:0
    outputs['weight'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1)
        name: StatefulPartitionedCall_6:1
  Method name is: tensorflow/serving/predict

Các ô còn lại của sổ ghi chép chỉ cho bạn cách sử dụng mô hình đã xuất cho dự đoán cục bộ và cách triển khai mô hình dưới dạng vi dịch vụ bằng cách sử dụng Vertex AI Prediction. Điều quan trọng cần nhấn mạnh là điểm dữ liệu đầu vào (mẫu) đều nằm trong lược đồ thô trong cả hai trường hợp.

Dọn dẹp

Để tránh phát sinh thêm phí cho tài khoản Google Cloud của bạn đối với các tài nguyên được sử dụng trong hướng dẫn này, hãy xóa dự án chứa các tài nguyên đó.

Xóa dự án

  1. Trong bảng điều khiển Google Cloud, hãy truy cập trang Quản lý tài nguyên .

    Đi tới Quản lý tài nguyên

  2. Trong danh sách dự án, chọn dự án bạn muốn xóa rồi bấm Xóa .

  3. Trong hộp thoại, nhập ID dự án rồi bấm Tắt máy để xóa dự án.

Cái gì tiếp theo