1. Tổng quan
Trong lớp học này, bạn sẽ sử dụng Vertex AI để chạy một công việc điều chỉnh tham số siêu dữ liệu trên Vertex AI Training.
Phòng thí nghiệm này nằm trong loạt video Nguyên mẫu để phát hành công khai. Hãy nhớ hoàn tất lớp học lập trình trước trước khi dùng thử bài tập này. Bạn có thể xem loạt video đi kèm để tìm hiểu thêm:
.
Kiến thức bạn sẽ học được
Bạn sẽ tìm hiểu cách:
- Sửa đổi mã xử lý ứng dụng huấn luyện để điều chỉnh siêu tham số tự động
- Định cấu hình và chạy công việc điều chỉnh tham số siêu dữ liệu bằng SDK Python Vertex AI
Tổng chi phí để chạy lớp học này trên Google Cloud là khoảng 1 USD.
2. Giới thiệu về Vertex AI
Phòng thí nghiệm này sử dụng sản phẩm AI mới nhất có trên Google Cloud. Vertex AI tích hợp các dịch vụ học máy trên Google Cloud vào một trải nghiệm phát triển liền mạch. Trước đây, các mô hình được huấn luyện bằng AutoML và mô hình tuỳ chỉnh có thể truy cập được thông qua các dịch vụ riêng biệt. Sản phẩm mới kết hợp cả hai thành một API duy nhất, cùng với các sản phẩm mới khác. Bạn cũng có thể di chuyển các dự án hiện có sang Vertex AI.
Vertex AI bao gồm nhiều sản phẩm để hỗ trợ quy trình làm việc toàn diện về máy học. Lớp học này sẽ tập trung vào các sản phẩm được nêu dưới đây: Bài đào tạo và Workbench
3. Thiết lập môi trường
Hoàn tất các bước trong lớp học Huấn luyện mô hình tuỳ chỉnh bằng Vertex AI để thiết lập môi trường.
4. Đóng gói mã ứng dụng đào tạo
Bạn sẽ gửi công việc huấn luyện này đến Vertex AI bằng cách đặt mã ứng dụng huấn luyện vào một vùng chứa Docker và đẩy vùng chứa này vào Google Artifact Registry. Khi sử dụng phương pháp này, bạn có thể huấn luyện và điều chỉnh một mô hình được tạo bằng bất kỳ khung nào.
Để bắt đầu, hãy mở một cửa sổ dòng lệnh trong trình đơn Trình chạy của sổ tay Workbench mà bạn đã tạo trong các lớp học lập trình trước.
Bước 1: Viết mã huấn luyện
Tạo một thư mục mới có tên là flowers-hptune
rồi chuyển vào thư mục đó:
mkdir flowers-hptune
cd flowers-hptune
Chạy mã sau để tạo một thư mục cho mã huấn luyện và một tệp Python mà bạn sẽ thêm mã bên dưới.
mkdir trainer
touch trainer/task.py
Bây giờ, bạn sẽ có các nội dung sau trong thư mục flowers-hptune/
:
+ trainer/
+ task.py
Tiếp theo, hãy mở tệp task.py
bạn vừa tạo và sao chép mã dưới đây.
Bạn cần thay thế {your-gcs-bucket}
trong BUCKET_ROOT
bằng bộ chứa Cloud Storage nơi bạn đã lưu trữ tập dữ liệu hoa trong Bài tập 1.
import tensorflow as tf
import numpy as np
import os
import hypertune
import argparse
## Replace {your-gcs-bucket} !!
BUCKET_ROOT='/gcs/{your-gcs-bucket}'
# Define variables
NUM_CLASSES = 5
EPOCHS=10
BATCH_SIZE = 32
IMG_HEIGHT = 180
IMG_WIDTH = 180
DATA_DIR = f'{BUCKET_ROOT}/flower_photos'
def get_args():
'''Parses args. Must include all hyperparameters you want to tune.'''
parser = argparse.ArgumentParser()
parser.add_argument(
'--learning_rate',
required=True,
type=float,
help='learning rate')
parser.add_argument(
'--momentum',
required=True,
type=float,
help='SGD momentum value')
parser.add_argument(
'--num_units',
required=True,
type=int,
help='number of units in last hidden layer')
args = parser.parse_args()
return args
def create_datasets(data_dir, batch_size):
'''Creates train and validation datasets.'''
train_dataset = tf.keras.utils.image_dataset_from_directory(
data_dir,
validation_split=0.2,
subset="training",
seed=123,
image_size=(IMG_HEIGHT, IMG_WIDTH),
batch_size=batch_size)
validation_dataset = tf.keras.utils.image_dataset_from_directory(
data_dir,
validation_split=0.2,
subset="validation",
seed=123,
image_size=(IMG_HEIGHT, IMG_WIDTH),
batch_size=batch_size)
train_dataset = train_dataset.cache().shuffle(1000).prefetch(buffer_size=tf.data.AUTOTUNE)
validation_dataset = validation_dataset.cache().prefetch(buffer_size=tf.data.AUTOTUNE)
return train_dataset, validation_dataset
def create_model(num_units, learning_rate, momentum):
'''Creates model.'''
model = tf.keras.Sequential([
tf.keras.layers.Resizing(IMG_HEIGHT, IMG_WIDTH),
tf.keras.layers.Rescaling(1./255, input_shape=(IMG_HEIGHT, IMG_WIDTH, 3)),
tf.keras.layers.Conv2D(16, 3, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(),
tf.keras.layers.Conv2D(32, 3, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(),
tf.keras.layers.Conv2D(64, 3, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(num_units, activation='relu'),
tf.keras.layers.Dense(NUM_CLASSES, activation='softmax')
])
model.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=learning_rate, momentum=momentum),
loss=tf.keras.losses.SparseCategoricalCrossentropy(),
metrics=['accuracy'])
return model
def main():
args = get_args()
train_dataset, validation_dataset = create_datasets(DATA_DIR, BATCH_SIZE)
model = create_model(args.num_units, args.learning_rate, args.momentum)
history = model.fit(train_dataset, validation_data=validation_dataset, epochs=EPOCHS)
# DEFINE METRIC
hp_metric = history.history['val_accuracy'][-1]
hpt = hypertune.HyperTune()
hpt.report_hyperparameter_tuning_metric(
hyperparameter_metric_tag='accuracy',
metric_value=hp_metric,
global_step=EPOCHS)
if __name__ == "__main__":
main()
Trước khi tạo vùng chứa, hãy xem xét kỹ hơn mã. Có một vài thành phần dành riêng cho việc sử dụng dịch vụ điều chỉnh tham số siêu dữ liệu.
- Tập lệnh này nhập thư viện
hypertune
. - Hàm
get_args()
xác định đối số dòng lệnh cho từng tham số siêu dữ liệu mà bạn muốn điều chỉnh. Trong ví dụ này, các siêu tham số sẽ được điều chỉnh là tốc độ học, giá trị động lượng trong trình tối ưu hoá và số lượng đơn vị trong lớp ẩn cuối cùng của mô hình, nhưng vui lòng thử nghiệm với các đơn vị khác. Sau đó, giá trị được truyền trong các đối số đó sẽ được dùng để đặt tham số siêu dữ liệu tương ứng trong mã. - Ở cuối hàm
main()
, thư việnhypertune
được dùng để xác định chỉ số bạn muốn tối ưu hoá. Trong TensorFlow, phương thứcmodel.fit
của keras sẽ trả về một đối tượngHistory
. Thuộc tínhHistory.history
là một bản ghi gồm các giá trị chỉ số và giá trị tổn thất huấn luyện trong các khoảng thời gian bắt đầu liên tục liên tiếp. Nếu bạn truyền dữ liệu xác thực đếnmodel.fit
, thì thuộc tínhHistory.history
cũng sẽ bao gồm các giá trị chỉ số và tổn thất xác thực. Ví dụ: nếu bạn đã huấn luyện một mô hình cho 3 khoảng thời gian bắt đầu của hệ thống bằng dữ liệu xác thực và cung cấpaccuracy
làm chỉ số, thì thuộc tínhHistory.history
sẽ có dạng như trong từ điển sau.
{
"accuracy": [
0.7795261740684509,
0.9471358060836792,
0.9870933294296265
],
"loss": [
0.6340447664260864,
0.16712145507335663,
0.04546636343002319
],
"val_accuracy": [
0.3795261740684509,
0.4471358060836792,
0.4870933294296265
],
"val_loss": [
2.044623374938965,
4.100203514099121,
3.0728273391723633
]
Nếu muốn dịch vụ điều chỉnh tham số siêu dữ liệu khám phá các giá trị giúp tối đa hoá độ chính xác xác thực của mô hình, bạn hãy xác định chỉ số này là mục cuối cùng (hoặc NUM_EPOCS - 1
) của danh sách val_accuracy
. Sau đó, hãy truyền chỉ số này đến một thực thể của HyperTune
. Bạn có thể chọn bất kỳ chuỗi nào mình thích cho hyperparameter_metric_tag
, nhưng sẽ cần sử dụng lại chuỗi đó sau khi bắt đầu công việc điều chỉnh siêu tham số.
Bước 2: Tạo Dockerfile
Để đóng gói mã, bạn cần tạo một Dockerfile. Trong Dockerfile, bạn sẽ thêm tất cả các lệnh cần thiết để chạy hình ảnh. Công cụ này sẽ cài đặt tất cả thư viện cần thiết và thiết lập điểm truy cập cho mã huấn luyện.
Trong Terminal, hãy tạo một Dockerfile trống trong thư mục gốc của thư mục flowers-hptune
:
touch Dockerfile
Bây giờ, bạn sẽ có những nội dung sau trong thư mục flowers-hptune/
:
+ Dockerfile
+ trainer/
+ task.py
Mở Dockerfile và sao chép nội dung sau đây vào đó. Bạn sẽ nhận thấy rằng thành phần này gần giống với Dockerfile mà chúng ta đã sử dụng trong phòng thí nghiệm đầu tiên, ngoại trừ bây giờ chúng ta đang cài đặt thư viện Cloudml-hypertune.
FROM gcr.io/deeplearning-platform-release/tf2-gpu.2-8
WORKDIR /
# Installs hypertune library
RUN pip install cloudml-hypertune
# Copies the trainer code to the docker image.
COPY trainer /trainer
# Sets up the entry point to invoke the trainer.
ENTRYPOINT ["python", "-m", "trainer.task"]
Bước 3: Tạo vùng chứa
Trên Terminal, hãy chạy đoạn mã sau để xác định biến env cho dự án, nhớ thay thế your-cloud-project
bằng mã nhận dạng của dự án:
PROJECT_ID='your-cloud-project'
Xác định kho lưu trữ trong Artifact Registry. Chúng ta sẽ sử dụng kho lưu trữ đã tạo trong lớp học đầu tiên.
REPO_NAME='flower-app'
Xác định một biến bằng URI của hình ảnh vùng chứa trong Google Artifact Registry:
IMAGE_URI=us-central1-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/flower_image_hptune:latest
Định cấu hình Docker
gcloud auth configure-docker \
us-central1-docker.pkg.dev
Sau đó, hãy tạo vùng chứa bằng cách chạy lệnh sau từ thư mục gốc flower-hptune
:
docker build ./ -t $IMAGE_URI
Cuối cùng, hãy đẩy tệp này vào Artifact Registry:
docker push $IMAGE_URI
Khi vùng chứa được đẩy vào Cấu phần phần mềm, bạn đã sẵn sàng bắt đầu công việc huấn luyện.
5. Chạy công việc điều chỉnh tham số siêu dữ liệu bằng SDK
Trong phần này, bạn sẽ tìm hiểu cách định cấu hình và gửi công việc điều chỉnh siêu tham số bằng cách sử dụng Vertex Python API.
Trong Trình chạy, hãy tạo một sổ tay TensorFlow 2.
Nhập SDK Vertex AI.
from google.cloud import aiplatform
from google.cloud.aiplatform import hyperparameter_tuning as hpt
Để chạy công việc điều chỉnh tham số siêu dữ liệu, trước tiên, bạn cần xác định worker_pool_specs
. Tham số này chỉ định loại máy và hình ảnh Docker. Thông số kỹ thuật sau đây xác định một máy có hai GPU NVIDIA Tesla V100.
Bạn cần thay thế {PROJECT_ID}
trong image_uri
bằng dự án của mình.
# The spec of the worker pools including machine type and Docker image
# Be sure to replace PROJECT_ID in the `image_uri` with your project.
worker_pool_specs = [{
"machine_spec": {
"machine_type": "n1-standard-4",
"accelerator_type": "NVIDIA_TESLA_V100",
"accelerator_count": 1
},
"replica_count": 1,
"container_spec": {
"image_uri": "us-central1-docker.pkg.dev/{PROJECT_ID}/flower-app/flower_image_hptune:latest"
}
}]
Tiếp theo, hãy xác định parameter_spec
. Đây là một từ điển chỉ định các thông số mà bạn muốn tối ưu hoá. Khoá từ điển là chuỗi mà bạn chỉ định cho đối số dòng lệnh cho mỗi tham số siêu dữ liệu và giá trị từ điển là thông số kỹ thuật của tham số.
Đối với mỗi tham số siêu dữ liệu, bạn cần xác định Loại cũng như giới hạn cho các giá trị mà dịch vụ điều chỉnh sẽ thử. Tham số siêu dữ liệu có thể thuộc loại Double, Integer, Categorical hoặc Discrete. Nếu chọn loại Double hoặc Integer, bạn cần cung cấp giá trị tối thiểu và tối đa. Nếu chọn Danh mục hoặc Rời rạc, bạn cần cung cấp giá trị. Đối với các loại Số nguyên và Kép, bạn cũng cần cung cấp giá trị Tỷ lệ. Bạn có thể tìm hiểu thêm về cách chọn tỷ lệ phù hợp nhất trong video này.
# Dictionary representing parameters to optimize.
# The dictionary key is the parameter_id, which is passed into your training
# job as a command line argument,
# And the dictionary value is the parameter specification of the metric.
parameter_spec = {
"learning_rate": hpt.DoubleParameterSpec(min=0.001, max=1, scale="log"),
"momentum": hpt.DoubleParameterSpec(min=0, max=1, scale="linear"),
"num_units": hpt.DiscreteParameterSpec(values=[64, 128, 512], scale=None)
}
Thông số cuối cùng cần xác định là metric_spec
, đây là một từ điển đại diện cho chỉ số cần tối ưu hoá. Khoá từ điển là hyperparameter_metric_tag
mà bạn đặt trong mã ứng dụng huấn luyện và giá trị là mục tiêu tối ưu hoá.
# Dictionary representing metric to optimize.
# The dictionary key is the metric_id, which is reported by your training job,
# And the dictionary value is the optimization goal of the metric.
metric_spec={'accuracy':'maximize'}
Sau khi xác định thông số kỹ thuật, bạn sẽ tạo một CustomJob. Đây là thông số kỹ thuật chung sẽ được dùng để chạy công việc của bạn trên mỗi thử nghiệm điều chỉnh tham số siêu dữ liệu.
Bạn cần thay thế {YOUR_BUCKET}
bằng bộ chứa mà bạn đã tạo trước đó.
# Replace YOUR_BUCKET
my_custom_job = aiplatform.CustomJob(display_name='flowers-hptune-job',
worker_pool_specs=worker_pool_specs,
staging_bucket='gs://{YOUR_BUCKET}')
Sau đó, hãy tạo và chạy HyperparameterTuningJob
.
hp_job = aiplatform.HyperparameterTuningJob(
display_name='flowers-hptune-job',
custom_job=my_custom_job,
metric_spec=metric_spec,
parameter_spec=parameter_spec,
max_trial_count=15,
parallel_trial_count=3)
hp_job.run()
Có một vài đối số cần lưu ý:
- max_trial_count: Bạn cần đặt giới hạn trên cho số lần thử nghiệm mà dịch vụ sẽ chạy. Thông thường, càng có nhiều thử nghiệm thì kết quả càng tốt, nhưng sẽ có một điểm lợi tức giảm dần, sau đó các thử nghiệm bổ sung sẽ ít hoặc không ảnh hưởng đến chỉ số mà bạn đang cố gắng tối ưu hoá. Tốt nhất là bạn nên bắt đầu với số lượng thử nghiệm ít hơn và nắm được mức độ tác động của các tham số siêu dữ liệu mà bạn đã chọn trước khi mở rộng quy mô.
- parallel_trial_count: Nếu bạn sử dụng thử nghiệm song song, dịch vụ sẽ cung cấp nhiều cụm xử lý huấn luyện. Việc tăng số lượng thử nghiệm song song sẽ làm giảm thời gian chạy công việc điều chỉnh tham số siêu dữ liệu; tuy nhiên, điều này có thể làm giảm hiệu quả tổng thể của công việc. Điều này là do chiến lược điều chỉnh mặc định sử dụng kết quả của các thử nghiệm trước đó để thông báo việc chỉ định giá trị trong các thử nghiệm tiếp theo.
- search_algorithm: Bạn có thể đặt thuật toán tìm kiếm thành lưới, ngẫu nhiên hoặc mặc định (Không). Lựa chọn mặc định áp dụng phương pháp tối ưu hoá Bayes để tìm kiếm không gian của các giá trị siêu tham số có thể có và là thuật toán được đề xuất. Bạn có thể tìm hiểu thêm về thuật toán này tại đây.
Trong bảng điều khiển, bạn sẽ thấy tiến trình của công việc.
Khi quá trình này hoàn tất, bạn có thể xem kết quả của từng thử nghiệm và nhóm giá trị nào hoạt động hiệu quả nhất.
🎉 Xin chúc mừng! 🎉
Bạn đã tìm hiểu cách sử dụng Vertex AI để:
- Chạy công việc tự động điều chỉnh tham số siêu dữ liệu
Để tìm hiểu thêm về các phần khác nhau của Vertex, hãy xem tài liệu.
6. Dọn dẹp
Vì đã định cấu hình sổ tay hết thời gian chờ sau 60 phút ở trạng thái rảnh, nên chúng ta không cần phải lo lắng về việc tắt thực thể. Nếu bạn muốn tắt thực thể theo cách thủ công, hãy nhấp vào nút Dừng trong phần Vertex AI Workbench của bảng điều khiển. Nếu bạn muốn xoá toàn bộ sổ tay, hãy nhấp vào nút Xoá.
Để 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á: