Chạy quy trình huấn luyện mô hình tuỳ chỉnh trên Vertex Pipelines

1. Tổng quan

Trong phòng thí nghiệm này, bạn sẽ tìm hiểu cách chạy một quy trình huấn luyện mô hình tuỳ chỉnh bằng Kubeflow Pipelines SDK trên Vertex Pipelines.

Kiến thức bạn sẽ học được

Bạn sẽ tìm hiểu cách:

  • Sử dụng Kubeflow Pipelines SDK để tạo các quy trình học máy có thể mở rộng
  • Tạo và chứa một quy trình huấn luyện mô hình Scikit-learn tuỳ chỉnh sử dụng các tập dữ liệu do Vertex AI quản lý và sẽ chạy trên Vertex AI Training trong một quy trình
  • Chạy một quy trình dự đoán theo lô trong Vertex Pipelines
  • Sử dụng các thành phần dựng sẵn để tương tác với các dịch vụ Vertex AI, được cung cấp thông qua thư viện google_cloud_pipeline_components

Tổng chi phí để chạy bài tập này trên Google Cloud là khoảng 5 USD.

2. Giới thiệu về Vertex AI

Phòng thí nghiệm này sử dụng Vertex AI, nền tảng học máy được quản lý toàn diện của chúng tôi trên Google Cloud. Vertex AI tích hợp các sản phẩm học máy của Google trên Google Cloud thành một trải nghiệm phát triển liền mạch. Ngoài các dịch vụ huấn luyện và triển khai mô hình, Vertex AI còn có nhiều sản phẩm MLOps, bao gồm Vertex Pipelines (trọng tâm của phòng thí nghiệm này), Model Monitoring, Feature Store và nhiều sản phẩm khác. Bạn có thể xem tất cả các sản phẩm/dịch vụ của Vertex AI trong sơ đồ bên dưới.

Tổng quan về sản phẩm Vertex

Nếu bạn có ý kiến phản hồi, vui lòng truy cập trang hỗ trợ.

Tại sao quy trình ML lại hữu ích?

Trước khi đi sâu vào vấn đề này, hãy cùng tìm hiểu lý do bạn nên sử dụng một pipeline. Hãy tưởng tượng bạn đang xây dựng một quy trình làm việc ML bao gồm xử lý dữ liệu, huấn luyện mô hình, điều chỉnh siêu tham số, đánh giá và triển khai mô hình. Mỗi bước trong số này có thể có các phần phụ thuộc khác nhau, có thể trở nên khó quản lý nếu bạn coi toàn bộ quy trình làm việc là một khối duy nhất. Khi bắt đầu mở rộng quy trình học máy, bạn có thể muốn chia sẻ quy trình học máy của mình với những người khác trong nhóm để họ có thể kích hoạt quy trình đó và đóng góp mã. Nếu không có quy trình đáng tin cậy và có thể tái tạo, việc này có thể trở nên khó khăn. Với quy trình, mỗi bước trong quy trình học máy đều là một vùng chứa riêng. Điều này cho phép bạn phát triển các bước một cách độc lập và theo dõi dữ liệu đầu vào và đầu ra của từng bước theo cách có thể tái tạo. Bạn cũng có thể lên lịch hoặc kích hoạt các lần chạy pipeline dựa trên những sự kiện khác trong môi trường đám mây của mình, chẳng hạn như bắt đầu một lần chạy pipeline khi có dữ liệu huấn luyện mới.

Tóm tắt: các quy trình giúp bạn đơn giản hoá và tái tạo quy trình làm việc về học máy.

3. Thiết lập môi trường đám mây

Bạn cần có một dự án trên Google Cloud Platform đã bật tính năng thanh toán để chạy lớp học lập trình này. Để tạo một dự án, hãy làm theo hướng dẫn tại đây.

Bước 1: Khởi động Cloud Shell

Trong phòng thí nghiệm này, bạn sẽ làm việc trong một phiên Cloud Shell. Đây là một trình thông dịch lệnh do một máy ảo chạy trong đám mây của Google lưu trữ. Bạn có thể dễ dàng chạy phần này trên máy tính của mình, nhưng việc sử dụng Cloud Shell sẽ giúp mọi người có được trải nghiệm có thể tái tạo trong một môi trường nhất quán. Sau khi hoàn thành bài thực hành, bạn có thể thử lại phần này trên máy tính của mình.

Uỷ quyền cho Cloud Shell

Kích hoạt Cloud Shell

Ở trên cùng bên phải của Cloud Console, hãy nhấp vào nút bên dưới để Kích hoạt Cloud Shell:

Kích hoạt Cloud Shell

Nếu chưa từng khởi động Cloud Shell, bạn sẽ thấy một màn hình trung gian (dưới màn hình đầu tiên) mô tả về Cloud Shell. Nếu vậy, hãy nhấp vào Tiếp tục (và bạn sẽ không bao giờ thấy màn hình này nữa). Sau đây là giao diện của màn hình xuất hiện một lần:

Thiết lập Cloud Shell

Quá trình cung cấp và kết nối với Cloud Shell chỉ mất vài giây.

Cloud Shell init

Máy ảo này được trang bị tất cả các công cụ phát triển mà bạn cần. Nền tảng này cung cấp một thư mục chính có dung lượng 5 GB và chạy trong Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Bạn có thể thực hiện hầu hết, nếu không muốn nói là tất cả, công việc trong lớp học lập trình này chỉ bằng một trình duyệt hoặc Chromebook.

Sau khi kết nối với Cloud Shell, bạn sẽ thấy rằng mình đã được xác thực và dự án đã được đặt thành mã dự án của bạn.

Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:

gcloud auth list

Bạn sẽ thấy nội dung tương tự như sau trong kết quả của lệnh:

Đầu ra của Cloud Shell

Chạy lệnh sau trong Cloud Shell để xác nhận rằng lệnh gcloud biết về dự án của bạn:

gcloud config list project

Đầu ra của lệnh

[core]
project = <PROJECT_ID>

Nếu không, bạn có thể đặt nó bằng lệnh sau:

gcloud config set project <PROJECT_ID>

Đầu ra của lệnh

Updated property [core/project].

Cloud Shell có một số biến môi trường, trong đó có GOOGLE_CLOUD_PROJECT chứa tên của dự án trên đám mây hiện tại. Chúng ta sẽ sử dụng thông tin này ở nhiều nơi trong lớp học này. Bạn có thể xem bằng cách chạy:

echo $GOOGLE_CLOUD_PROJECT

Bước 2: Bật API

Trong các bước sau, bạn sẽ thấy nơi cần đến các dịch vụ này (và lý do), nhưng hiện tại, hãy chạy lệnh này để cấp cho dự án của bạn quyền truy cập vào các dịch vụ Compute Engine, Container Registry và Vertex AI:

gcloud services enable compute.googleapis.com         \
                       containerregistry.googleapis.com  \
                       aiplatform.googleapis.com

Thao tác này sẽ tạo ra một thông báo thành công tương tự như thông báo sau:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

Bước 3: Tạo một bộ chứa trên Cloud Storage

Để chạy một quy trình huấn luyện trên Vertex AI, chúng ta cần một vùng lưu trữ để lưu trữ các thành phần mô hình đã lưu. Nhóm này cần phải theo khu vực. Chúng ta sẽ sử dụng us-central ở đây, nhưng bạn có thể sử dụng một khu vực khác (chỉ cần thay thế khu vực này trong toàn bộ phòng thí nghiệm). Nếu đã có một bộ chứa, bạn có thể bỏ qua bước này.

Chạy các lệnh sau trong thiết bị đầu cuối Cloud Shell để tạo một nhóm:

BUCKET_NAME=gs://$GOOGLE_CLOUD_PROJECT-bucket
gsutil mb -l us-central1 $BUCKET_NAME

Tiếp theo, chúng ta sẽ cấp quyền truy cập vào nhóm này cho tài khoản dịch vụ điện toán. Thao tác này sẽ đảm bảo rằng Vertex Pipelines có các quyền cần thiết để ghi tệp vào bộ chứa này. Chạy lệnh sau để thêm quyền này:

gcloud projects describe $GOOGLE_CLOUD_PROJECT > project-info.txt
PROJECT_NUM=$(cat project-info.txt | sed -nre 's:.*projectNumber\: (.*):\1:p')
SVC_ACCOUNT="${PROJECT_NUM//\'/}-compute@developer.gserviceaccount.com"
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT --member serviceAccount:$SVC_ACCOUNT --role roles/storage.objectAdmin

Bước 4: Tạo một phiên bản Vertex AI Workbench

Trong phần Vertex AI của Cloud Console, hãy nhấp vào Workbench:

Trình đơn Vertex AI

Tại đó, trong phần Notebooks do người dùng quản lý, hãy nhấp vào New Notebook (Sổ tay mới):

Tạo sổ tay mới

Sau đó, hãy chọn loại phiên bản TensorFlow Enterprise 2.3 (có LTS) không có GPU:

Phiên bản TFE

Sử dụng các lựa chọn mặc định rồi nhấp vào Tạo.

Bước 5: Mở sổ tay

Sau khi tạo phiên bản, hãy chọn Open JupyterLab (Mở JupyterLab):

Mở sổ tay

4. Thiết lập Vertex Pipelines

Bạn cần cài đặt thêm một số thư viện để sử dụng Vertex Pipelines:

  • Kubeflow Pipelines: Đây là SDK mà chúng ta sẽ dùng để tạo pipeline. Vertex Pipelines hỗ trợ chạy các quy trình được tạo bằng cả Kubeflow Pipelines hoặc TFX.
  • Thành phần trong quy trình của Google Cloud: Thư viện này cung cấp các thành phần được tạo sẵn để giúp bạn dễ dàng tương tác với các dịch vụ của Vertex AI từ các bước trong quy trình.

Bước 1: Tạo sổ tay Python và cài đặt thư viện

Trước tiên, trong trình đơn Trình chạy của phiên bản Sổ tay (bạn có thể truy cập bằng cách nhấp vào biểu tượng + ở trên cùng bên trái của sổ tay), hãy tạo một sổ tay bằng cách chọn Python 3:

Tạo sổ tay Python3

Bạn có thể truy cập vào trình đơn Trình chạy bằng cách nhấp vào dấu + ở trên cùng bên trái của phiên bản sổ tay.

Để cài đặt cả hai dịch vụ mà chúng ta sẽ sử dụng trong phòng thí nghiệm này, trước tiên, hãy đặt cờ người dùng trong một ô sổ tay:

USER_FLAG = "--user"

Sau đó, hãy chạy lệnh sau trong sổ tay của bạn:

!pip3 install {USER_FLAG} google-cloud-aiplatform==1.7.0 --upgrade
!pip3 install {USER_FLAG} kfp==1.8.9 google-cloud-pipeline-components==0.2.0

Sau khi cài đặt các gói này, bạn cần khởi động lại nhân:

import os

if not os.getenv("IS_TESTING"):
    # Automatically restart kernel after installs
    import IPython

    app = IPython.Application.instance()
    app.kernel.do_shutdown(True)

Cuối cùng, hãy kiểm tra để đảm bảo bạn đã cài đặt các gói đúng cách. Phiên bản KFP SDK phải từ 1.8 trở lên:

!python3 -c "import kfp; print('KFP SDK version: {}'.format(kfp.__version__))"
!python3 -c "import google_cloud_pipeline_components; print('google_cloud_pipeline_components version: {}'.format(google_cloud_pipeline_components.__version__))"

Bước 2: Đặt mã dự án và nhóm

Trong suốt bài thực hành này, bạn sẽ tham chiếu đến mã dự án trên đám mây và bộ chứa mà bạn đã tạo trước đó. Tiếp theo, chúng ta sẽ tạo các biến cho từng biến đó.

Nếu không biết mã dự án, bạn có thể chạy lệnh sau để lấy mã dự án:

import os
PROJECT_ID = ""

# Get your Google Cloud project ID from gcloud
if not os.getenv("IS_TESTING"):
    shell_output=!gcloud config list --format 'value(core.project)' 2>/dev/null
    PROJECT_ID = shell_output[0]
    print("Project ID: ", PROJECT_ID)

Nếu không, hãy thiết lập tại đây:

if PROJECT_ID == "" or PROJECT_ID is None:
    PROJECT_ID = "your-project-id"  # @param {type:"string"}

Sau đó, hãy tạo một biến để lưu trữ tên nhóm của bạn. Nếu bạn đã tạo nó trong lớp học này, thì những bước sau sẽ có hiệu quả. Nếu không, bạn sẽ phải đặt thông số này theo cách thủ công:

BUCKET_NAME="gs://" + PROJECT_ID + "-bucket"

Bước 3: Nhập thư viện

Thêm nội dung sau để nhập các thư viện mà chúng ta sẽ sử dụng trong suốt lớp học lập trình này:

from kfp.v2 import compiler, dsl
from kfp.v2.dsl import pipeline

from google.cloud import aiplatform
from google_cloud_pipeline_components import aiplatform as gcc_aip

Bước 4: Xác định hằng số

Việc cuối cùng chúng ta cần làm trước khi xây dựng quy trình là xác định một số biến hằng số. PIPELINE_ROOT là đường dẫn Cloud Storage nơi các cấu phần phần mềm do quy trình của chúng ta tạo ra sẽ được ghi. Chúng ta đang sử dụng us-central1 làm khu vực ở đây, nhưng nếu bạn sử dụng một khu vực khác khi tạo vùng chứa, hãy cập nhật biến REGION trong mã bên dưới:

PATH=%env PATH
%env PATH={PATH}:/home/jupyter/.local/bin
REGION="us-central1"

PIPELINE_ROOT = f"{BUCKET_NAME}/pipeline_root/"
PIPELINE_ROOT

Sau khi chạy đoạn mã ở trên, bạn sẽ thấy thư mục gốc cho quy trình được in. Đây là vị trí trong Cloud Storage nơi các cấu phần phần mềm trong quy trình của bạn sẽ được ghi. Mã này sẽ có định dạng gs://YOUR-BUCKET-NAME/pipeline_root/

5. Định cấu hình một quy trình huấn luyện mô hình tuỳ chỉnh

Trước khi thiết lập quy trình, chúng ta cần viết mã cho quy trình huấn luyện mô hình tuỳ chỉnh. Để huấn luyện mô hình, chúng ta sẽ sử dụng Tập dữ liệu về đậu khô của UCI Machine Learning, từ: KOKLU, M. và OZKAN, I.A., (2020), "Phân loại nhiều lớp các loại đậu khô bằng kỹ thuật thị giác máy tính và học máy". Trong Computers and Electronics in Agriculture, 174, 105507. DOI.

Bước đầu tiên trong quy trình sẽ tạo một tập dữ liệu được quản lý trong Vertex AI bằng cách sử dụng một bảng BigQuery chứa một phiên bản của dữ liệu về các loại đậu này. Tập dữ liệu sẽ được truyền dưới dạng dữ liệu đầu vào cho quy trình huấn luyện của chúng tôi. Trong mã huấn luyện, chúng ta sẽ có quyền truy cập vào biến môi trường để truy cập vào tập dữ liệu được quản lý này.

Sau đây là cách chúng ta thiết lập quy trình huấn luyện tuỳ chỉnh:

  • Viết mô hình Scikit-learn DecisionTreeClassifier để phân loại các loại đậu trong dữ liệu của chúng ta
  • Đóng gói mã huấn luyện trong một vùng chứa Docker và đẩy mã đó vào Container Registry

Từ đó, chúng ta có thể bắt đầu một công việc Huấn luyện Vertex AI ngay từ quy trình của mình. Hãy bắt đầu!

Bước 1: Xác định mã huấn luyện trong một vùng chứa Docker

Từ thực thể Notebooks của bạn, hãy mở Trình chạy rồi chọn Terminal:

Mở Terminal

Sau đó, hãy chạy lệnh sau để thiết lập một thư mục nơi bạn sẽ thêm mã được chứa trong vùng chứa:

mkdir traincontainer
cd traincontainer
touch Dockerfile

mkdir trainer
touch trainer/train.py

Sau khi chạy các lệnh đó, bạn sẽ thấy một thư mục có tên là traincontainer/ được tạo ở bên trái (bạn có thể cần nhấp vào biểu tượng làm mới để xem thư mục này). Bạn sẽ thấy những nội dung sau trong thư mục traincontainer/:

+ Dockerfile
+ trainer/
    + train.py

Bước đầu tiên trong việc chứa mã của chúng ta là tạo một Dockerfile. Trong Dockerfile, chúng ta sẽ thêm tất cả các lệnh cần thiết để chạy hình ảnh. Thao tác này sẽ cài đặt tất cả các thư viện mà chúng ta đang sử dụng và thiết lập điểm truy cập cho mã huấn luyện. Mở Dockerfile bạn vừa tạo và thêm nội dung sau:

FROM gcr.io/deeplearning-platform-release/sklearn-cpu.0-23
WORKDIR /

# Copies the trainer code to the docker image.
COPY trainer /trainer

RUN pip install sklearn google-cloud-bigquery joblib pandas google-cloud-storage

# Sets up the entry point to invoke the trainer.
ENTRYPOINT ["python", "-m", "trainer.train"]

Để lưu tệp trong khi chỉnh sửa tệp đó trong phiên bản sổ tay, bạn có thể dùng ctrl+s.

Tiếp theo, hãy mở tệp train.py. Đây là nơi chúng ta sẽ thêm mã huấn luyện. Sao chép nội dung sau vào train.py. Thao tác này sẽ truy xuất dữ liệu từ tập dữ liệu được quản lý của chúng tôi, đưa dữ liệu đó vào Pandas DataFrame, huấn luyện một mô hình Scikit-learn và tải mô hình đã huấn luyện lên Cloud Storage:

from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import roc_curve
from sklearn.model_selection import train_test_split
from google.cloud import bigquery
from google.cloud import storage
from joblib import dump

import os
import pandas as pd

bqclient = bigquery.Client()
storage_client = storage.Client()

def download_table(bq_table_uri: str):
    prefix = "bq://"
    if bq_table_uri.startswith(prefix):
        bq_table_uri = bq_table_uri[len(prefix):]

    table = bigquery.TableReference.from_string(bq_table_uri)
    rows = bqclient.list_rows(
        table,
    )
    return rows.to_dataframe(create_bqstorage_client=False)

# These environment variables are from Vertex AI managed datasets
training_data_uri = os.environ["AIP_TRAINING_DATA_URI"]
test_data_uri = os.environ["AIP_TEST_DATA_URI"]

# Download data into Pandas DataFrames, split into train / test
df = download_table(training_data_uri)
test_df = download_table(test_data_uri)
labels = df.pop("Class").tolist()
data = df.values.tolist()
test_labels = test_df.pop("Class").tolist()
test_data = test_df.values.tolist()

# Define and train the Scikit model
skmodel = DecisionTreeClassifier()
skmodel.fit(data, labels)
score = skmodel.score(test_data, test_labels)
print('accuracy is:',score)

# Save the model to a local file
dump(skmodel, "model.joblib")

# Upload the saved model file to GCS
bucket = storage_client.get_bucket("YOUR_GCS_BUCKET")
model_directory = os.environ["AIP_MODEL_DIR"]
storage_path = os.path.join(model_directory, "model.joblib")
blob = storage.blob.Blob.from_string(storage_path, client=storage_client)
blob.upload_from_filename("model.joblib")

Sau đó, quay lại sổ tay của bạn và chạy lệnh sau để thay thế YOUR_GCS_BUCKET trong tập lệnh ở trên bằng tên của bộ chứa Cloud Storage:

BUCKET = BUCKET_NAME[5:] # Trim the 'gs://' before adding to train script
!sed -i -r 's@YOUR_GCS_BUCKET@'"$BUCKET"'@' traincontainer/trainer/train.py

Bạn cũng có thể thực hiện việc này theo cách thủ công nếu muốn. Nếu có, hãy nhớ không thêm gs:// vào tên nhóm khi bạn cập nhật tập lệnh.

Giờ đây, mã huấn luyện của chúng ta nằm trong một vùng chứa Docker và chúng ta đã sẵn sàng chạy quy trình huấn luyện trên Đám mây.

Bước 2: Đẩy vùng chứa vào Container Registry

Sau khi hoàn tất mã huấn luyện, chúng ta đã sẵn sàng chuyển mã này sang Google Container Registry. Sau này, khi định cấu hình thành phần huấn luyện của quy trình, chúng ta sẽ hướng Vertex Pipelines đến vùng chứa này.

Quay lại Terminal và từ thư mục gốc của thư mục traincontainer/, hãy xác định một biến bằng URI cho hình ảnh vùng chứa của bạn trên Container Registry.

PROJECT_ID=$(gcloud config get-value project)
IMAGE_URI="gcr.io/$PROJECT_ID/scikit:v1"

Sau đó, hãy tạo vùng chứa bằng cách chạy lệnh sau:

docker build ./ -t $IMAGE_URI

Cuối cùng, hãy đẩy vùng chứa vào Container Registry:

docker push $IMAGE_URI

Chuyển đến phần Container Registry của bảng điều khiển Cloud để xác minh rằng vùng chứa của bạn có ở đó. Nội dung sẽ giống như thế này:

Container Registry

6. Định cấu hình một công việc dự đoán hàng loạt

Bước cuối cùng của quy trình sẽ chạy một công việc dự đoán theo lô. Để làm được việc này, chúng ta cần cung cấp một tệp CSV trong Cloud Storage chứa các ví dụ mà chúng ta muốn nhận thông tin dự đoán. Chúng ta sẽ tạo tệp CSV này trong sổ tay và sao chép tệp đó vào Cloud Storage bằng công cụ dòng lệnh gsutil.

Sao chép các ví dụ về dự đoán hàng loạt vào Cloud Storage

Tệp sau đây chứa 3 ví dụ từ mỗi lớp trong tập dữ liệu đậu của chúng tôi. Ví dụ bên dưới không có cột Class vì đó là những gì mô hình của chúng ta sẽ dự đoán. Chạy lệnh sau để tạo tệp CSV này cục bộ trong sổ tay của bạn:

%%writefile batch_examples.csv
Area,Perimeter,MajorAxisLength,MinorAxisLength,AspectRation,Eccentricity,ConvexArea,EquivDiameter,Extent,Solidity,roundness,Compactness,ShapeFactor1,ShapeFactor2,ShapeFactor3,ShapeFactor4
23288,558.113,207.567738,143.085693,1.450653336,0.7244336162,23545,172.1952453,0.8045881703,0.9890847314,0.9395021523,0.8295857874,0.008913077034,0.002604069884,0.6882125787,0.9983578734
23689,575.638,205.9678003,146.7475015,1.403552348,0.7016945718,24018,173.6714472,0.7652721693,0.9863019402,0.8983750474,0.8431970773,0.00869465998,0.002711119968,0.7109813112,0.9978994889
23727,559.503,189.7993849,159.3717704,1.190922235,0.5430731512,24021,173.8106863,0.8037601626,0.9877607094,0.952462433,0.9157600082,0.007999299741,0.003470231343,0.8386163926,0.9987269085
31158,641.105,212.0669751,187.1929601,1.132879009,0.4699241567,31474,199.1773023,0.7813134733,0.989959967,0.9526231013,0.9392188582,0.0068061806,0.003267009878,0.8821320637,0.9993488983
32514,649.012,221.4454899,187.1344232,1.183349841,0.5346736437,32843,203.4652564,0.7849831,0.9899826447,0.9700068737,0.9188051492,0.00681077351,0.002994124691,0.8442029022,0.9989873701
33078,659.456,235.5600775,178.9312328,1.316483846,0.6503915309,33333,205.2223615,0.7877214708,0.9923499235,0.9558229607,0.8712102818,0.007121351881,0.002530662194,0.7590073551,0.9992209221
33680,683.09,256.203255,167.9334938,1.525623324,0.7552213942,34019,207.081404,0.80680321,0.9900349805,0.9070392732,0.8082699962,0.007606985006,0.002002710402,0.6533003868,0.9966903078
33954,716.75,277.3684803,156.3563259,1.773951126,0.825970469,34420,207.9220419,0.7994819873,0.9864613597,0.8305492781,0.7496238998,0.008168948587,0.001591181142,0.5619359911,0.996846984
36322,719.437,272.0582306,170.8914975,1.591993952,0.7780978465,36717,215.0502424,0.7718560075,0.9892420405,0.8818487005,0.7904566678,0.007490177594,0.001803782407,0.6248217437,0.9947124371
36675,742.917,285.8908964,166.8819538,1.713132487,0.8119506999,37613,216.0927123,0.7788277766,0.9750618137,0.8350248381,0.7558572692,0.0077952528,0.001569528272,0.5713202115,0.9787472145
37454,772.679,297.6274753,162.1493177,1.835514817,0.8385619338,38113,218.3756257,0.8016695205,0.9827093118,0.7883332637,0.7337213257,0.007946480356,0.001420623993,0.5383469838,0.9881438654
37789,766.378,313.5680678,154.3409867,2.031657789,0.8704771226,38251,219.3500608,0.7805870567,0.9879218844,0.8085170916,0.6995293312,0.008297866252,0.001225659709,0.4893412853,0.9941740339
47883,873.536,327.9986493,186.5201272,1.758516115,0.822571799,48753,246.9140116,0.7584464543,0.9821549443,0.7885506623,0.7527897207,0.006850002074,0.00135695419,0.5666923636,0.9965376533
49777,861.277,300.7570338,211.6168613,1.42123379,0.7105823885,50590,251.7499649,0.8019106536,0.9839296304,0.843243269,0.8370542883,0.00604208839,0.001829706116,0.7006598815,0.9958014989
49882,891.505,357.1890036,179.8346914,1.986207449,0.8640114945,51042,252.0153467,0.7260210171,0.9772736178,0.7886896753,0.7055518063,0.007160679276,0.001094585314,0.4978033513,0.9887407248
53249,919.923,325.3866286,208.9174205,1.557489212,0.7666552108,54195,260.3818974,0.6966846347,0.9825445152,0.7907120655,0.8002231025,0.00611066177,0.001545654241,0.6403570138,0.9973491406
61129,964.969,369.3481688,210.9473449,1.750902193,0.8208567513,61796,278.9836198,0.7501135067,0.9892064211,0.8249553283,0.7553404711,0.006042110436,0.001213219664,0.5705392272,0.9989583843
61918,960.372,353.1381442,224.0962377,1.575832543,0.7728529173,62627,280.7782864,0.7539207091,0.9886790043,0.8436218213,0.7950947556,0.005703319619,0.00140599258,0.6321756704,0.9962029945
141953,1402.05,524.2311633,346.3974998,1.513380332,0.7505863011,143704,425.1354762,0.7147107987,0.9878152313,0.9074598849,0.8109694843,0.003692991084,0.0009853172185,0.6576715044,0.9953071199
145285,1440.991,524.9567463,353.0769977,1.486805285,0.7400216694,146709,430.0960442,0.7860466375,0.9902937107,0.8792413513,0.8192980608,0.003613289371,0.001004269363,0.6712493125,0.9980170255
146153,1476.383,526.1933264,356.528288,1.475881001,0.7354662103,149267,431.3789276,0.7319360978,0.9791380546,0.8425962592,0.8198107159,0.003600290972,0.001003163512,0.6720896099,0.991924286

Sau đó, hãy sao chép tệp vào nhóm Cloud Storage của bạn:

!gsutil cp batch_examples.csv $BUCKET_NAME

Chúng ta sẽ tham chiếu tệp này trong bước tiếp theo khi xác định quy trình của mình.

7. Xây dựng quy trình bằng các thành phần tạo sẵn

Giờ đây, khi mã huấn luyện của chúng ta đã có trên đám mây, chúng ta có thể gọi mã này từ quy trình. Quy trình mà chúng ta sẽ xác định sẽ sử dụng 3 thành phần được tạo sẵn từ thư viện google_cloud_pipeline_components mà chúng ta đã cài đặt trước đó. Các thành phần được xác định trước này giúp đơn giản hoá mã mà chúng ta cần viết để thiết lập quy trình và cho phép chúng ta sử dụng các dịch vụ Vertex AI như huấn luyện mô hình và dự đoán hàng loạt.

Sau đây là những việc mà quy trình gồm 3 bước của chúng ta sẽ thực hiện:

  • Tạo một tập dữ liệu được quản lý trong Vertex AI
  • Chạy một quy trình huấn luyện trên Vertx AI bằng vùng chứa tuỳ chỉnh mà chúng ta đã thiết lập
  • Chạy một quy trình dự đoán hàng loạt trên mô hình phân loại Scikit-learn đã được huấn luyện

Bước 1: Xác định quy trình của chúng ta

Vì đang sử dụng các thành phần được tạo sẵn, nên chúng ta có thể thiết lập toàn bộ quy trình trong định nghĩa quy trình. Thêm nội dung sau vào một ô sổ tay:

@pipeline(name="automl-beans-custom",
                  pipeline_root=PIPELINE_ROOT)
def pipeline(
    bq_source: str = "bq://sara-vertex-demos.beans_demo.large_dataset",
    bucket: str = BUCKET_NAME,
    project: str = PROJECT_ID,
    gcp_region: str = REGION,
    bq_dest: str = "",
    container_uri: str = "",
    batch_destination: str = ""
):
    dataset_create_op = gcc_aip.TabularDatasetCreateOp(
        display_name="tabular-beans-dataset",
        bq_source=bq_source,
        project=project,
        location=gcp_region
    )

    training_op = gcc_aip.CustomContainerTrainingJobRunOp(
        display_name="pipeline-beans-custom-train",
        container_uri=container_uri,
        project=project,
        location=gcp_region,
        dataset=dataset_create_op.outputs["dataset"],
        staging_bucket=bucket,
        training_fraction_split=0.8,
        validation_fraction_split=0.1,
        test_fraction_split=0.1,
        bigquery_destination=bq_dest,
        model_serving_container_image_uri="us-docker.pkg.dev/vertex-ai/prediction/sklearn-cpu.0-24:latest",
        model_display_name="scikit-beans-model-pipeline",
        machine_type="n1-standard-4",
    )
    batch_predict_op = gcc_aip.ModelBatchPredictOp(
        project=project,
        location=gcp_region,
        job_display_name="beans-batch-predict",
        model=training_op.outputs["model"],
        gcs_source_uris=["{0}/batch_examples.csv".format(BUCKET_NAME)],
        instances_format="csv",
        gcs_destination_output_uri_prefix=batch_destination,
        machine_type="n1-standard-4"
    )

Bước 2: Biên dịch và chạy quy trình

Sau khi xác định xong quy trình, bạn đã sẵn sàng biên dịch quy trình đó. Thao tác này sẽ tạo một tệp JSON mà bạn sẽ dùng để chạy quy trình:

compiler.Compiler().compile(
    pipeline_func=pipeline, package_path="custom_train_pipeline.json"
)

Tiếp theo, hãy tạo một biến TIMESTAMP. Chúng ta sẽ sử dụng mã này trong mã nhận dạng công việc:

from datetime import datetime

TIMESTAMP = datetime.now().strftime("%Y%m%d%H%M%S")

Sau đó, hãy xác định công việc trong quy trình của bạn, truyền vào một số thông số dành riêng cho dự án:

pipeline_job = aiplatform.PipelineJob(
    display_name="custom-train-pipeline",
    template_path="custom_train_pipeline.json",
    job_id="custom-train-pipeline-{0}".format(TIMESTAMP),
    parameter_values={
        "project": PROJECT_ID,
        "bucket": BUCKET_NAME,
        "bq_dest": "bq://{0}".format(PROJECT_ID),
        "container_uri": "gcr.io/{0}/scikit:v1".format(PROJECT_ID),
        "batch_destination": "{0}/batchpredresults".format(BUCKET_NAME)
    },
    enable_caching=True,
)

Cuối cùng, hãy chạy công việc để tạo một lần thực thi quy trình mới:

pipeline_job.submit()

Sau khi chạy ô này, bạn sẽ thấy nhật ký có đường liên kết để xem quá trình chạy quy trình trong bảng điều khiển:

Nhật ký công việc của quy trình

Truy cập vào đường liên kết đó. Bạn cũng có thể truy cập vào trang này bằng cách mở trang tổng quan về quy trình. Sau khi hoàn tất, quy trình của bạn sẽ có dạng như sau:

Đã hoàn tất quy trình giới thiệu

Quy trình này sẽ mất 5 đến 10 phút để chạy, nhưng bạn có thể tiếp tục chuyển sang bước tiếp theo trước khi quy trình này hoàn tất. Tiếp theo, bạn sẽ tìm hiểu thêm về những gì đang diễn ra trong từng bước của quy trình này.

8. Tìm hiểu về quá trình thực thi quy trình

Hãy cùng tìm hiểu kỹ hơn về từng bước trong 3 bước của quy trình.

Bước 1 trong quy trình: Tạo tập dữ liệu được quản lý

Bước đầu tiên trong quy trình của chúng tôi là tạo một tập dữ liệu được quản lý trong Vertex AI. Nếu bạn nhấp vào đường liên kết đến tập dữ liệu sau đây trong mục Pipelines (Quy trình) của bảng điều khiển:

Liên kết đến tập dữ liệu từ quy trình

Bạn sẽ thấy tập dữ liệu của mình trong Vertex AI, bao gồm cả đường liên kết đến nguồn dữ liệu trong BigQuery cùng với thông tin về các cột trong tập dữ liệu. Sau khi bạn tải một tập dữ liệu được quản lý lên Vertex AI, tập dữ liệu đó có thể được dùng để huấn luyện mô hình AutoML hoặc mô hình tuỳ chỉnh.

Đối với các công việc mô hình tuỳ chỉnh sử dụng tập dữ liệu được quản lý, Vertex AI sẽ truyền các biến môi trường đặc biệt đến các công việc huấn luyện của bạn và xử lý việc chia dữ liệu thành các tập huấn luyện và kiểm thử. Chúng ta sẽ sử dụng thông tin này trong bước tiếp theo của quy trình.

Bước 2 trong quy trình: Huấn luyện một mô hình trong Vertex AI Training

Trong khi đang chạy quy trình huấn luyện tuỳ chỉnh, bạn có thể nhấp để xem nhật ký ngay trong bảng điều khiển Vertex Pipelines:

Nhật ký tập luyện tuỳ chỉnh

Bạn cũng có thể xem thông tin chi tiết về quy trình huấn luyện tuỳ chỉnh trong Trang tổng quan về hoạt động huấn luyện của Vertex AI. Khi quá trình huấn luyện hoàn tất, một tài nguyên Mô hình sẽ được tạo trong Vertex AI. Sau đó, chúng ta có thể triển khai mô hình này đến một điểm cuối để dự đoán trực tuyến hoặc tạo một công việc dự đoán hàng loạt. Chúng ta sẽ thực hiện việc này ở bước tiếp theo trong quy trình.

Bước 3 trong quy trình: Chạy một quy trình dự đoán hàng loạt trên mô hình của chúng ta

Cuối cùng, quy trình của chúng ta sẽ nhận được các dự đoán về những ví dụ mà chúng ta đã truyền vào thông qua một tệp CSV. Khi hoàn tất quy trình dự đoán hàng loạt, Vertex AI sẽ ghi một tệp CSV vào vị trí mà chúng ta đã chỉ định trong Cloud Storage. Khi bước này trong quy trình bắt đầu chạy, bạn có thể chuyển đến phần Dự đoán hàng loạt của bảng điều khiển Vertex AI để xem công việc đã tạo.

Nhấp vào tác vụ khi tác vụ hoàn tất để xem URL Cloud Storage của các dự đoán theo lô:

Công việc dự đoán theo lô

Nhấp vào đường liên kết đó để chuyển đến thư mục Cloud Storage nơi bạn có thể tìm thấy kết quả dự đoán, sau đó nhấp để tải một trong các tệp prediction.results xuống. Trong tệp, bạn sẽ thấy các hàng có dạng như sau:

{"instance": [33954.0, 716.75, 277.3684803, 156.3563259, 1.773951126, 0.825970469, 34420.0, 207.9220419, 0.7994819873, 0.9864613597, 0.8305492781, 0.7496238998, 0.008168948587, 0.001591181142, 0.5619359911, 0.996846984], "prediction": "HOROZ"}

Điều này bao gồm các giá trị của đối tượng cho một điểm dữ liệu cụ thể, cùng với loại mà mô hình của chúng tôi dự đoán. Trong ví dụ này, mô hình của chúng tôi cho rằng đây là một hạt đậu "HOROZ".

Vậy là bạn đã hoàn thành lớp học lập trình này!

🎉 Xin chúc mừng! 🎉

Bạn đã tìm hiểu cách sử dụng Vertex AI để:

  • Sử dụng Kubeflow Pipelines SDK để tạo các quy trình từ đầu đến cuối bằng các thành phần tuỳ chỉnh
  • Chạy quy trình trên Vertex Pipelines và bắt đầu chạy quy trình bằng SDK
  • Xem và phân tích biểu đồ Vertex Pipelines trong bảng điều khiển
  • Sử dụng các thành phần quy trình được tạo sẵn để thêm các dịch vụ Vertex AI vào quy trình của bạn
  • Lên lịch cho các lệnh lặp lại của quy trình

Để tìm hiểu thêm về các phần khác nhau của Vertex, hãy xem tài liệu.

9. Dọn dẹp

Để không bị tính phí, bạn nên xoá các tài nguyên đã tạo trong suốt quá trình thực hành này.

Bước 1: Dừng hoặc xoá phiên bản Notebooks

Nếu muốn tiếp tục sử dụng sổ tay bạn đã tạo trong phòng thí nghiệm này, bạn nên tắt sổ tay khi không sử dụng. Trong giao diện người dùng Notebook trên Cloud Console, hãy chọn sổ tay rồi chọn Dừng. Nếu bạn muốn xoá hoàn toàn phiên bản này, hãy chọn Xoá:

Dừng phiên bản

Bước 2: Xoá nhóm Cloud Storage

Để xoá Thùng lưu trữ, hãy sử dụng trình đơn Điều hướng trong Cloud Console, duyệt tìm Bộ nhớ, chọn thùng của bạn rồi nhấp vào Xoá:

Xoá bộ nhớ