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

1. Tổng quan

Trong lớp học này, bạn sẽ tìm hiểu cách chạy một công việc huấn luyện mô hình tuỳ chỉnh bằng cách sử dụng SDK Quy trình Kubeflow trên Quy trình đỉnh.

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

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

  • Sử dụng SDK quy trình Kubeflow để xây dựng quy trình học máy có thể mở rộng
  • Tạo và đóng gói một công việc 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 tính năng Huấn luyện Vertex AI trong một quy trình
  • Chạy công việc dự đoán theo lô trong Vertex Pipelines
  • Sử dụng các thành phần tạo 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 lớp học này trên Google Cloud là khoảng 5 USD.

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

Lớp học này sử dụng Vertex AI, nền tảng học máy toàn diện do chúng tôi quản lý trên Google Cloud. Vertex AI tích hợp các giải pháp học máy của Google trên Google Cloud vào 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 cung cấp nhiều sản phẩm MLOps, bao gồm cả Vertex Pipelines (tâm điểm của lớp học này), Model Monitoring, Feature Store, v.v. Bạn có thể xem tất cả các sản phẩm của Vertex AI trong sơ đồ dưới đây.

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

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

Tại sao quy trình học máy lại hữu ích?

Trước khi đi sâu vào tìm hiểu, hãy cùng tìm hiểu lý do bạn nên sử dụng quy trình. Hãy tưởng tượng bạn đang xây dựng một quy trình làm việc về học máy bao gồm việc xử lý dữ liệu, huấn luyện mô hình, điều chỉnh tham số siêu dữ liệu, đá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, điều này có thể trở nên khó sử dụng nếu bạn coi toàn bộ quy trình làm việc là một khối thống nhất. Khi bắt đầu mở rộng quy trình công nghệ học máy, bạn nên chia sẻ quy trình công việc với công nghệ này với những thành viên khác trong nhóm để họ có thể chạy 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 của bạn 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 quy trình dựa trên các sự kiện khác trong môi trường trên đám mây, chẳng hạn như bắt đầu chạy quy trình khi có dữ liệu huấn luyện mới.

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

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

Bạn cần một dự á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 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ẽ thực hiện phiên Cloud Shell, đây là phiên dịch lệnh được lưu trữ bởi một máy ảo chạy trên đám mây của Google. Bạn cũng có thể dễ dàng chạy phần này trên máy tính của riêng mình, nhưng việc sử dụng Cloud Shell sẽ giúp mọi người có thể truy cập vào một 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 lớp học lập trình, bạn có thể thử lại phần này trên máy tính của riêng 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). Dưới đây là giao diện một lần đó:

Thiết lập Cloud Shell

Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài phút.

Khởi động Cloud Shell

Máy ảo này được tải sẵn tất cả các công cụ phát triển mà bạn cần. Ứng dụng này cung cấp một thư mục gốc 5 GB ổn định và chạy trong Google Cloud, giúp cải thiện đáng kể hiệu suất mạng và xác thực. Bạn có thể thực hiện hầu hết (nếu không phải 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 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:

Kết quả 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

Kết quả của lệnh

[core]
project = <PROJECT_ID>

Nếu chưa, bạn có thể thiết lập chế độ này bằng lệnh sau:

gcloud config set project <PROJECT_ID>

Kết quả của lệnh

Updated property [core/project].

Cloud Shell có một vài biến môi trường, trong đó có GOOGLE_CLOUD_PROJECT chứa tên của dự án Cloud hiện tại. Chúng ta sẽ sử dụng hàm này ở nhiều nơi trong lớp học lập trình 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 những dịch vụ này cần thiết ở đâu (và lý do tại sao). Tuy nhiên, 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ư sau:

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

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

Để chạy công việc huấn luyện trên Vertex AI, chúng tôi cần có một bộ chứa lưu trữ để lưu trữ những thành phần mô hình đã lưu. Bộ chứa phải là theo khu vực. Chúng ta đang 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 đó trong suốt lớp học này). Nếu đã có bộ chứa, bạn có thể bỏ qua bước này.

Chạy các lệnh sau trong dòng lệnh 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 bộ chứa này cho tài khoản dịch vụ điện toán của mình. 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 thực thể Vertex AI Workbench

Trong phần Vertex AI của Cloud Console, hãy nhấp vào Workbench (Bảng điều khiển):

Trình đơn Vertex AI

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

Tạo sổ ghi chú mới

Sau đó, hãy chọn loại thực thể TensorFlow Enterprise 2.3 (có LTS) không có GPU:

Phiên bản TFE

Sử dụng các chế độ mặc định rồi nhấp vào Tạo.

Bước 5: Mở Sổ tay

Sau khi tạo thực thể, hãy chọn Mở JupyterLab:

Mở sổ tay

4. Thiết lập Vertex Pipelines

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

  • Quy trình Kubeflow: Đây là SDK mà chúng tôi sẽ sử dụng để xây dựng quy trình của mình. Vertex Pipelines hỗ trợ chạy các quy trình được tạo bằng cả Quy trình Kubeflow hoặc TFX.
  • Thành phần 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ụ Vertex AI trong 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, từ trình đơn Trình chạy trong 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 dấu + ở 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 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 thực thể sổ tay.

Để cài đặt cả hai dịch vụ mà chúng ta sẽ sử dụng trong lớp học lập trình này, trước tiên, hãy đặt cờ người dùng trong một ô trong sổ tay:

USER_FLAG = "--user"

Sau đó, hãy chạy mã sau trong sổ tay:

!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 đúng các gói. Phiên bản SDK KFP 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à bộ chứa

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

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

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 đặt giá trị này 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 bộ chứa. Nếu bạn đã tạo mã trong phòng thí nghiệm này, thì các bước sau sẽ có hiệu lực. Nếu không, bạn sẽ phải đặt giá trị này theo cách thủ công:

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

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

Thêm phần sau đây để 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: Định nghĩa hằng số

Điều 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 không đổi. 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. Ở đây, chúng ta đang sử dụng us-central1 làm khu vực, nhưng nếu bạn đã sử dụng một khu vực khác khi tạo bộ chứa, hãy cập nhật biến REGION trong mã dưới đây:

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 mã ở trên, bạn sẽ thấy thư mục gốc cho quy trình của mình được in ra. Đâ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. Tệp này sẽ có định dạng gs://YOUR-BUCKET-NAME/pipeline_root/

5. Định cấu hình công việc 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 công việc 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 đậu khô của UCI Machine Learning, từ: KOKLU, M. và OZKAN, I.A., (2020), "Phân loại nhiều lớp đậu khô bằng kỹ thuật máy học và thị giác máy tính". Trong Máy tính và Điện tử trong nông nghiệp, 174, 105507. DOI (Yêu cầu quyền riêng tư).

Bước đầu tiên trong quy trình của chúng ta 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 phiên bản dữ liệu về hạt đậu này. Tập dữ liệu này sẽ được chuyển làm dữ liệu đầu vào cho công việc đào tạo 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 công việc huấn luyện tuỳ chỉnh:

  • Viết mô hình DecisionTreeClassifier Scikit-learn để 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 vùng chứa Docker rồi đẩy mã đó vào Container Registry

Từ đó, chúng tôi có thể bắt đầu một công việc Đào tạo về Vertex AI ngay trong quy trình của mình. Hãy bắt đầu!

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

Trong phiên bản Notebooks, hãy mở Trình chạy rồi chọn Terminal (Dấu nhắc lệnh):

Mở cửa sổ dòng lệnh

Sau đó, hãy chạy lệnh sau để thiết lập thư mục mà bạn sẽ thêm mã được đóng gói:

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 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 nội dung sau trong thư mục traincontainer/:

+ Dockerfile
+ trainer/
    + train.py

Bước đầu tiên trong việc chứa mã là tạo 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 của chúng ta. 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 khi bạn đang chỉnh sửa trong thực thể sổ tay, bạn có thể sử 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, đặt dữ liệu đó vào Pandas DataFrame, huấn luyện 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 đó, hãy quay lại sổ tay và chạy đoạn mã sau để thay thế YOUR_GCS_BUCKET trong tập lệnh ở trên bằng tên 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 đưa gs:// vào tên bộ chứa khi cập nhật tập lệnh.

Bây giờ, mã huấn luyện của chúng ta đã nằm trong vùng chứa Docker và chúng ta đã sẵn sàng chạy quá 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ã đào tạo, chúng ta đã sẵn sàng đẩy mã này vào 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ẽ trỏ Vertex Pipelines đến vùng chứa này.

Quay lại Terminal và từ thư mục gốc traincontainer/, hãy xác định một biến bằng URI cho hình ảnh vùng chứa 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ơ sở lưu trữ vùng chứa) của Cloud Console để xác minh rằng vùng chứa của bạn có trong đó. Nội dung sẽ giống như thế này:

Container Registry

6. Định cấu hình 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 hàng loạt. Để 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 rồi 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 beans. Ví dụ bên dưới không bao gồm cột Class vì đó là nội dung mà mô hình của chúng ta sẽ dự đoán. Chạy lệnh sau để tạo tệp CSV này trên máy tính xách 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 bộ nhớ trên Cloud Storage:

!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.

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 đã sẵn sàng gọi mã đó từ quy trình của mình. Quy trình mà chúng ta sẽ xác định sẽ sử dụng 3 thành phần tạo sẵn từ thư viện google_cloud_pipeline_components mà chúng ta đã cài đặt trước đó. Những thành phần được xác định trước này giúp đơn giản hoá mã mà chúng tôi cần viết để thiết lập quy trình, đồng thời cho phép chúng tôi sử dụng các dịch vụ của Vertex AI như huấn luyện mô hình và dự đoán theo lô.

Dưới đây là những việc mà quy trình ba bước của chúng ta sẽ làm:

  • Tạo tập dữ liệu được quản lý trong Vertex AI
  • Chạy một công việc 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 công việc 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

Vì đang sử dụng các thành phần 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 phần 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

Khi đã xác định quy trình, bạn đã sẵn sàng để biên dịch. Thao tác sau 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ã 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 của quy trình, truyền vào một vài 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 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 quy trình chạy trong bảng điều khiển:

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

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

Quy trình giới thiệu đã hoàn tất

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 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 quy trình gồm 3 bước.

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

Bước đầu tiên trong quy trình của chúng ta 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 trong mục 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, trong đó 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 khác nhau trong tập dữ liệu. Sau khi tải một tập dữ liệu được quản lý lên Vertex AI, bạn có thể dùng tập dữ liệu đó để huấn luyện mô hình tuỳ chỉnh hoặc AutoML.

Đố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 và xử lý việc chia dữ liệu thành tập huấn luyện và tập kiểm thử. Chúng tôi sẽ sử dụng tính năng này trong bước tiếp theo của quy trình.

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

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

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

Bạn cũng có thể xem thông tin chi tiết về công việc 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 công việc 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.

Quy trình 3: Chạy công việc dự đoán theo lô trên mô hình của chúng ta

Cuối cùng, quy trình của chúng tôi sẽ nhận được thông tin dự đoán về các ví dụ mà chúng tôi đã chuyển thông qua tệp CSV. Khi công việc dự đoán theo lô hoàn tấ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 quy trình này 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 công việc khi công việc đó hoàn tất để xem URL của bộ nhớ trên đám mây chứa kết quả dự đoán hàng loạt:

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 (Bộ nhớ trên đám mây) 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 này, 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ị tính năng cho một phiên bản cụ thể, cùng với lớp mà mô hình của chúng ta dự đoán. Trong ví dụ này, mô hình của chúng tôi cho rằng đây là hạt "HOROZ".

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

🎉 Xin chúc mừng! 🎉

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

  • Sử dụng SDK quy trình Kubeflow để tạo quy trình toàn diện 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 đồ Quy trình Vertex trong bảng điều khiển
  • Sử dụng các thành phần quy trình tạo sẵn để thêm các dịch vụ Vertex AI vào quy trình
  • Lên lịch cho các công việc định kỳ trong 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 toàn bộ phòng thí nghiệm này.

Bước 1: Dừng hoặc xoá thực thể của Sổ tay

Nếu muốn tiếp tục sử dụng sổ tay mà 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. Trên giao diện người dùng của Sổ tay trong 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 thực thể, hãy chọn Xoá:

Dừng thực thể

Bước 2: Xoá bộ chứa trên Cloud Storage

Để xoá Bộ chứa Storage, hãy sử dụng trình đơn Điều hướng trong Cloud Console, duyệt đến Bộ nhớ, chọn bộ chứa rồi nhấp vào Xoá:

Xoá bộ nhớ