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 công việc huấn luyện mô hình tuỳ chỉnh bằng cách sử dụng SDK Kubeflow Pipelines 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 SDK Quy trình Kubeflow để xây dựng các quy trình học máy có thể mở rộng
  • Tạo và chứa một công việc huấn luyện mô hình tuỳ chỉnh trong Scikit-learn có sử dụng tập dữ liệu do Vertex AI quản lý, đồng thời sẽ chạy trên Vertex AI Training theo 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 phòng thí nghiệm 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 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 có nhiều sản phẩm MLOps, trong đó có Vertex Pipelines (trọng tâm của phòng thí nghiệm này), Giám sát mô hình, Feature Store và nhiều sản phẩm khác. Bạn có thể xem tất cả sản phẩm mà Vertex AI cung cấp trong biểu đồ 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 xem trang hỗ trợ.

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

Trước khi tìm hiểu kỹ hơn, trước tiên, hãy 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 công việc 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 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 và có thể trở nên khó sử dụng nếu bạn coi toàn bộ quy trình là một khối duy 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ó một quy trình đáng tin cậy và có thể tái lập, 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, đồng thời theo dõi dữ liệu đầu vào và đầu ra của mỗi bước theo cách có thể tái lập. 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 đám mây, chẳng hạn như bắt đầu một quy trình chạy khi có dữ liệu huấn luyện mới.

Tl;dr: các quy trình giúp bạn đơn giản hoá và tái tạo quy trình công việc bằng công nghệ học máy.

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 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ẽ 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. Dù 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ó thể tiếp cận trải nghiệm có thể tái tạo trong một môi trường nhất quán. Sau phòng thí nghiệm này, bạn có thể thử lại phần này trên máy tính của mình.

Cho phép Cloud shell

Kích hoạt Cloud Shell

Ở góc 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 trước đây bạn chưa từng khởi động Cloud Shell, thì 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ề ứng dụng này. Nếu trường hợp đó xảy ra, hãy nhấp vào Tiếp tục (và bạn sẽ không thấy thông báo đó nữa). Màn hình một lần đó sẽ có dạng như sau:

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.

Init Cloud Shell

Máy ảo này chứa tất cả các công cụ phát triển mà bạn cần. Dịch vụ này cung cấp thư mục gốc có dung lượng ổn định 5 GB và chạy trong Google Cloud, giúp nâng cao đáng kể hiệu suất và khả năng xác thực của mạng. Trong lớp học lập trình này, đa số mọi người đều có thể thực hiện 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.

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ự trong kết quả đầu ra của lệnh:

Dữ liệu đầ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

Kết quả lệnh

[core]
project = <PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

Kết quả 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 Cloud hiện tại của chúng tôi. Chúng tôi sẽ dùng dữ liệu này ở nhiều vị trí trong phòng thí nghiệm này. Bạn có thể xem chỉ số này 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ẽ biết những dịch vụ này cần thiết ở đâu (và vì sao). Tuy nhiên, bây giờ, 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 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 tôi đang sử dụng us-central tại đây, nhưng bạn vẫn có thể sử dụng một khu vực khác (chỉ cần thay thế khu vực đó trong toàn bộ phòng thí nghiệm 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 thiết bị đầu cuối Cloud Shell của bạn để tạo một bộ chứa:

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. Điều này giúp đả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 mục Vertex AI trên Cloud Console, hãy nhấp vào Workbench:

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ổ tay mới

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

Thực thể TFE

Sử dụng các tuỳ 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ở Sổ tay

4. Thiết lập Quy trình Vertex

Chúng tôi sẽ 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ợ các quy trình đang chạy được xây dựng 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 phòng thí nghiệm này, trước tiên hãy đặt cờ người dùng trong một ô của sổ tay:

USER_FLAG = "--user"

Sau đó, chạy lệnh sau từ 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>=1.8:

!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 phòng thí nghiệm này, bạn sẽ đề cập đến mã dự án trên Cloud của mình 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 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 cần đặt chế độ cài đặt 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 của Cloud Storage, nơi các cấu phần phần mềm do quy trình của chúng tôi tạo ra sẽ được ghi. Chúng tôi đ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 bộ chứa của mình, hãy cập nhật biến REGION trong đoạn 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í của 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 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 này, chúng tôi sẽ sử dụng tập dữ liệu Hạt khô của UCI Learning Learning, từ: KOKLU, M. và OZKAN, I.A., (2020), "Phân loại đa lớp hạt khô bằng cách sử dụng thị giác máy tính và kỹ thuật học máy." Trong Máy tính và Điện tử trong Nông nghiệp, 174, 105507. DOI (Yêu cầu quyền).

Bước đầu tiên của quy trình là 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 có chứa phiên bản của dữ liệu bean 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.

Dưới đây là cách chúng ta thiết lập công việc đào tạo tuỳ chỉnh:

  • Viết một mô hình DecisionTreeClassifier học bằng Scikit để phân loại các loại đậu trong dữ liệu của chúng tôi
  • Đó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 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 của bạn, hãy mở Trình chạy rồi chọn Cửa sổ dòng lệnh:

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

Sau đó, chạy mã sau để thiết lập thư mục mà bạn sẽ thêm mã 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 (có thể bạn phải nhấp vào biểu tượng làm mới để thấy 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ã 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 như 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 đây 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 của bạn và chạy lệnh sau để thay thế YOUR_GCS_BUCKET từ 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 bạn thực hiện việc này, hãy đảm bảo không đưa gs:// vào tên bộ chứa khi bạn cập nhật tập lệnh.

Mã huấn luyện của chúng ta hiện đã nằm trong vùng chứa Docker và đã 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 Đăng ký vùng chứa

Với mã đào tạo đã hoàn tất, chúng tôi đã sẵn sàng gửi mã này tới 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 vào vùng chứa này.

Quay lại Terminal và từ gốc của thư mục traincontainer/, xác định một biến có 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, đẩy vùng chứa vào Container Registry:

docker push $IMAGE_URI

Chuyển đến mục Sổ đăng ký vùng chứa trong Cloud Console để xác minh xem vùng chứa của bạn có ở đó hay không. 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 trong quy trình của chúng ta là chạy một công việc dự đoán theo lô. Để làm được điều này, chúng tôi cần cung cấp tệp CSV trong Cloud Storage, trong đó có chứa các ví dụ mà chúng tôi 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.

Đang sao chép các ví dụ về cụm từ gợi ý theo lô 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 bao gồm cột Class vì đó là thông tin 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 đó, sao chép tệp vào bộ chứa Cloud Storage:

!gsutil cp batch_examples.csv $BUCKET_NAME

Chúng ta sẽ tham khảo 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 dựng sẵn

Hiện tại, mã đào tạo của chúng ta đã có trên đám mây, nên 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à quy trình 3 bước của chúng tôi:

  • Tạo tập dữ liệu được quản lý trong Vertex AI
  • Chạy 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 công việc dự đoán theo lô trên mô hình phân loại Scikit-learn đã qua đào tạo của chúng tôi

Bước 1: Xác định quy trình

Vì chúng ta đang sử dụng các thành phần dựng 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 đâ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 biến TIMESTAMP. Chúng ta sẽ sử dụng thông tin này trong mã công việc:

from datetime import datetime

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

Sau đó, xác định công việc quy trình của bạn, truyền một vài tham 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ý chứa một đường liên kết để xem quy trình chạy trong bảng điều khiển của mình:

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:

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

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

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

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

Bước 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 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 phần Quy trình trên 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ó một đường liên kết đến nguồn dữ liệu trong BigQuery cùng với thông tin về nhiều cột trong tập dữ liệu của bạn. Sau khi tải 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 AutoML hoặc mô hình tuỳ chỉnh.

Đối với các công việc mô hình tuỳ chỉnh có sử dụng tập dữ liệu được quản lý, Vertex AI 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 tách dữ liệu thành các tập huấn luyện và 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.

Quy trình 2: Đào tạo mô hình trong Chương trình đào tạo về Vertex AI

Trong khi công việc huấn luyện tuỳ chỉnh của bạn đang chạy, bạn có thể nhấp để xem nhật ký ngay trong bảng điều khiển của 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ề 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. Việc này sẽ được thực hiện trong bước tiếp theo của 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 hoàn tất công việc dự đoán theo lô, 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 theo nhóm trên bảng điều khiển Vertex AI để xem công việc đã tạo.

Nhấp vào công việc khi hoàn tất để xem URL của Cloud Storage cho các dự đoán theo lô của bạn:

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 kết quả gợi ý, 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ị 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 ta cho rằng đây là "HOROZ" đậu.

Vậy là bạn đã hoàn thành phòng thí nghiệm!

🎉 Xin chúc mừng! 🎉

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

  • Sử dụng SDK Kubeflow Pipelines để xây dựng quy trình toàn diện với các thành phần tuỳ chỉnh
  • Chạy quy trình của bạn 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 tạo sẵn của quy trình để 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 công việc trong quy trình định kỳ

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

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á phiên bản 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 phiên bản, hãy chọn Xoá:

Dừng thực thể

Bước 2: Xoá bộ chứa trong 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ớ