1. Tổng quan
Trong phòng thí nghiệm này, bạn sẽ được hướng dẫn toàn bộ quy trình đào tạo máy học trên Google Cloud bằng PyTorch để xây dựng mô hình. Từ môi trường Sổ tay trên Cloud AI Platform, bạn sẽ tìm hiểu cách hoàn thiện công việc đào tạo của mình để chạy công việc đó trong chương trình Đào tạo về nền tảng AI bằng cách điều chỉnh siêu tham số.
Kiến thức bạn sẽ học được
Bạn sẽ tìm hiểu cách:
- Tạo một thực thể Sổ tay trên nền tảng AI
- Tạo mô hình PyTorch
- Huấn luyện mô hình bằng cách điều chỉnh siêu thông số trong chương trình Đào tạo về nền tảng AI
Tổng chi phí để chạy phòng thí nghiệm này trên Google Cloud là khoảng 1 đô la.
2. Thiết lập môi trường
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: Bật API mô hình Cloud AI Platform
Chuyển đến phần Mô hình nền tảng AI trên Cloud Console rồi nhấp vào Bật nếu bạn chưa bật.
Bước 2: Bật Compute Engine API
Chuyển đến Compute Engine rồi chọn Enable (Bật) nếu bạn chưa bật tính năng này. Bạn sẽ cần có gói này để tạo thực thể sổ tay.
Bước 3: Tạo một thực thể Sổ tay trên nền tảng AI
Chuyển đến mục Sổ tay trên nền tảng AI trên Cloud Console rồi nhấp vào Phiên bản mới. Sau đó, hãy chọn loại phiên bản PyTorch mới nhất (không có GPU):
Sử dụng các tuỳ chọn mặc định hoặc đặt tên tuỳ chỉnh cho quảng cáo nếu muốn, sau đó nhấp vào Tạo. Sau khi tạo phiên bản, hãy chọn Open JupyterLab:
Tiếp theo, hãy mở một thực thể Sổ tay Python 3 qua trình chạy:
Bạn đã sẵn sàng để bắt đầu!
Bước 5: Nhập các gói Python
Trong ô đầu tiên của sổ tay, hãy thêm các lệnh nhập sau đây và chạy ô. Bạn có thể chạy trình đơn này bằng cách nhấn nút mũi tên phải trong trình đơn trên cùng hoặc nhấn Command-Enter:
import datetime
import numpy as np
import os
import pandas as pd
import time
Bạn sẽ nhận thấy rằng chúng tôi sẽ không nhập PyTorch tại đây. Lý do là chúng ta đang chạy công việc đào tạo về Đào tạo nền tảng AI, chứ không phải từ thực thể Notebook.
3. Tạo một gói cho công việc huấn luyện
Để chạy công việc đào tạo về Đào tạo về nền tảng AI, chúng ta cần có mã đào tạo được đóng gói cục bộ trong phiên bản Notebooks và một bộ chứa Cloud Storage để lưu trữ các tài sản cho công việc. Trước tiên, chúng ta sẽ tạo một bộ chứa lưu trữ. Bạn có thể bỏ qua bước này nếu đã có.
Bước 1: Tạo một bộ chứa trên Cloud Storage cho mô hình của chúng tôi
Trước tiên, hãy xác định một số biến môi trường mà chúng ta sẽ sử dụng trong suốt phần còn lại của lớp học lập trình này. Điền tên dự án của bạn trên Google Cloud và tên của bộ chứa lưu trữ trên đám mây mà bạn muốn tạo vào các giá trị bên dưới (phải là duy nhất trên toàn hệ thống):
# Update these to your own GCP project, model, and version names
GCP_PROJECT = 'your-gcp-project'
BOCKET_URL = 'gs://storage_bucket_name'
Bây giờ, chúng ta đã sẵn sàng tạo một bộ chứa lưu trữ mà chúng ta sẽ đề cập đến khi bắt đầu công việc đào tạo.
Chạy lệnh gsutil
này từ trong sổ tay của bạn để tạo một bộ chứa:
!gsutil mb $BUCKET_URL
Bước 2: Tạo các tệp ban đầu cho gói Python
Để chạy công việc huấn luyện trên Nền tảng AI, chúng ta cần định cấu hình mã của mình dưới dạng gói Python. Tệp này bao gồm một tệp setup.py
trong thư mục gốc chỉ định mọi phần phụ thuộc bên ngoài của gói, một thư mục con có tên gói của chúng ta (ở đây chúng ta gọi là trainer/
) và một tệp __init__.py
trống trong thư mục con này.
Trước tiên, hãy viết tệp setup.py. Chúng ta đang sử dụng phép thuật %%writefile của iPython để lưu tệp vào thực thể của chúng ta. Ở đây, chúng ta chỉ định 3 thư viện bên ngoài mà chúng ta sẽ sử dụng trong mã huấn luyện: PyTorch, Scikit-learn và Pandas:
%%writefile setup.py
from setuptools import find_packages
from setuptools import setup
REQUIRED_PACKAGES = ['torch>=1.5', 'scikit-learn>=0.20', 'pandas>=1.0']
setup(
name='trainer',
version='0.1',
install_requires=REQUIRED_PACKAGES,
packages=find_packages(),
include_package_data=True,
description='My training application package.'
)
Tiếp theo, hãy tạo thư mục dành cho huấn luyện viên/ thư mục của chúng ta và tệp init.py trống trong đó. Python dùng tệp này để nhận biết đây là một gói:
!mkdir trainer
!touch trainer/__init__.py
Bây giờ, chúng ta đã sẵn sàng bắt đầu tạo công việc đào tạo.
4. Xem trước tập dữ liệu
Trọng tâm của phòng thí nghiệm này là về công cụ cho các mô hình huấn luyện ở đây, nhưng hãy xem nhanh tập dữ liệu mà chúng tôi sẽ sử dụng để huấn luyện mô hình của mình hiểu rõ hơn. Chúng tôi sẽ dùng tập dữ liệu về sinh vật có trong BigQuery. Tệp này chứa dữ liệu sinh sản tại Hoa Kỳ trong nhiều thập kỷ. Chúng tôi sẽ sử dụng một vài cột trong tập dữ liệu này để dự đoán cân nặng khi sinh của em bé. Tập dữ liệu ban đầu khá lớn và chúng tôi sẽ sử dụng một nhóm nhỏ tập dữ liệu đó mà chúng tôi cung cấp cho bạn trong bộ chứa Cloud Storage.
Bước 1: Tải tập dữ liệu về bản chất của BigQuery xuống
Hãy tải phiên bản tập dữ liệu mà chúng tôi cung cấp cho bạn trong Cloud Storage xuống Pandas DataFrame và xem trước tập dữ liệu đó.
natality = pd.read_csv('https://storage.googleapis.com/ml-design-patterns/natality.csv')
natality.head()
Tập dữ liệu này chỉ có dưới 100.000 hàng. Chúng ta sẽ sử dụng 5 tính năng để dự đoán cân nặng khi sinh của một em bé: tuổi của mẹ và cha, số tuần mang thai, mức tăng cân của người mẹ tính theo pound và giới tính của em bé được biểu diễn dưới dạng boolean.
5. Xác định công việc huấn luyện bằng tính năng điều chỉnh siêu tham số
Chúng ta sẽ viết tập lệnh huấn luyện vào một tệp có tên là model.py trong thư mục con mà chúng ta đã tạo trước đó. Công việc huấn luyện của chúng tôi sẽ diễn ra trong chương trình Đào tạo về nền tảng AI, đồng thời sử dụng dịch vụ điều chỉnh siêu tham số của Nền tảng AI để tìm ra các siêu tham số tối ưu cho mô hình sử dụng tính năng tối ưu hoá Bayes.
Bước 1: Tạo tập lệnh huấn luyện
Trước tiên, hãy tạo tệp Python bằng tập lệnh huấn luyện. Sau đó, chúng ta sẽ phân tích xem điều gì đang xảy ra. Việc chạy lệnh %%writefile này sẽ ghi mã mô hình vào một tệp Python cục bộ:
%%writefile trainer/model.py
import argparse
import hypertune
import numpy as np
import pandas as pd
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.utils import shuffle
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import normalize
def get_args():
"""Argument parser.
Returns:
Dictionary of arguments.
"""
parser = argparse.ArgumentParser(description='PyTorch MNIST')
parser.add_argument('--job-dir', # handled automatically by AI Platform
help='GCS location to write checkpoints and export ' \
'models')
parser.add_argument('--lr', # Specified in the config file
type=float,
default=0.01,
help='learning rate (default: 0.01)')
parser.add_argument('--momentum', # Specified in the config file
type=float,
default=0.5,
help='SGD momentum (default: 0.5)')
parser.add_argument('--hidden-layer-size', # Specified in the config file
type=int,
default=8,
help='hidden layer size')
args = parser.parse_args()
return args
def train_model(args):
# Get the data
natality = pd.read_csv('https://storage.googleapis.com/ml-design-patterns/natality.csv')
natality = natality.dropna()
natality = shuffle(natality, random_state = 2)
natality.head()
natality_labels = natality['weight_pounds']
natality = natality.drop(columns=['weight_pounds'])
train_size = int(len(natality) * 0.8)
traindata_natality = natality[:train_size]
trainlabels_natality = natality_labels[:train_size]
testdata_natality = natality[train_size:]
testlabels_natality = natality_labels[train_size:]
# Normalize and convert to PT tensors
normalized_train = normalize(np.array(traindata_natality.values), axis=0)
normalized_test = normalize(np.array(testdata_natality.values), axis=0)
train_x = torch.Tensor(normalized_train)
train_y = torch.Tensor(np.array(trainlabels_natality))
test_x = torch.Tensor(normalized_test)
test_y = torch.Tensor(np.array(testlabels_natality))
# Define our data loaders
train_dataset = torch.utils.data.TensorDataset(train_x, train_y)
train_dataloader = torch.utils.data.DataLoader(train_dataset, batch_size=128, shuffle=True)
test_dataset = torch.utils.data.TensorDataset(test_x, test_y)
test_dataloader = torch.utils.data.DataLoader(test_dataset, batch_size=128, shuffle=False)
# Define the model, while tuning the size of our hidden layer
model = nn.Sequential(nn.Linear(len(train_x[0]), args.hidden_layer_size),
nn.ReLU(),
nn.Linear(args.hidden_layer_size, 1))
criterion = nn.MSELoss()
# Tune hyperparameters in our optimizer
optimizer = optim.SGD(model.parameters(), lr=args.lr, momentum=args.momentum)
epochs = 20
for e in range(epochs):
for batch_id, (data, label) in enumerate(train_dataloader):
optimizer.zero_grad()
y_pred = model(data)
label = label.view(-1,1)
loss = criterion(y_pred, label)
loss.backward()
optimizer.step()
val_mse = 0
num_batches = 0
# Evaluate accuracy on our test set
with torch.no_grad():
for i, (data, label) in enumerate(test_dataloader):
num_batches += 1
y_pred = model(data)
mse = criterion(y_pred, label.view(-1,1))
val_mse += mse.item()
avg_val_mse = (val_mse / num_batches)
# Report the metric we're optimizing for to AI Platform's HyperTune service
# In this example, we're mimizing error on our test set
hpt = hypertune.HyperTune()
hpt.report_hyperparameter_tuning_metric(
hyperparameter_metric_tag='val_mse',
metric_value=avg_val_mse,
global_step=epochs
)
def main():
args = get_args()
print('in main', args)
train_model(args)
if __name__ == '__main__':
main()
Công việc huấn luyện bao gồm 2 chức năng trong đó thực hiện phần lớn công việc.
get_args()
: Hàm này phân tích cú pháp các đối số dòng lệnh mà chúng ta sẽ truyền khi tạo lệnh đào tạo, cùng với các siêu tham số mà chúng ta muốn Nền tảng AI tối ưu hoá. Trong ví dụ này, danh sách các đối số của chúng ta chỉ bao gồm các siêu tham số mà chúng ta sẽ tối ưu hoá – tốc độ học, động lượng và số lượng nơron trong lớp ẩn của mô hình.train_model()
: Tại đây, chúng ta tải dữ liệu xuống Pandas DataFrame, chuẩn hoá, chuyển đổi dữ liệu này thành PyTorch Tensors, rồi xác định mô hình của chúng ta. Để xây dựng mô hình, chúng ta sử dụng API PyTorchnn.Sequential
, cho phép xác định mô hình dưới dạng một ngăn xếp các lớp:
model = nn.Sequential(nn.Linear(len(train_x[0]), args.hidden_layer_size),
nn.ReLU(),
nn.Linear(args.hidden_layer_size, 1))
Lưu ý rằng thay vì mã hoá cứng kích thước của lớp ẩn trong mô hình, chúng ta sẽ biến lớp này thành một siêu tham số mà Nền tảng AI sẽ điều chỉnh cho chúng ta. Tìm hiểu thêm về điều này trong phần tiếp theo.
Bước 2: Sử dụng dịch vụ điều chỉnh siêu thông số của Nền tảng AI
Thay vì thử các giá trị siêu thông số khác nhau theo cách thủ công và huấn luyện lại mô hình mỗi lần, chúng tôi sẽ sử dụng dịch vụ tối ưu hoá siêu thông số của Cloud AI Platform. Nếu chúng ta thiết lập công việc huấn luyện bằng các đối số siêu tham số, Nền tảng AI sẽ sử dụng quy trình tối ưu hoá Bayes để tìm ra các giá trị lý tưởng cho các siêu tham số mà chúng tôi chỉ định.
Trong quá trình điều chỉnh siêu tham số, một thử nghiệm duy nhất bao gồm một lần chạy mô hình của chúng tôi với một tổ hợp cụ thể các giá trị siêu tham số. Tuỳ thuộc vào số lượng phiên bản thử nghiệm mà chúng tôi chạy, Nền tảng AI sẽ sử dụng kết quả của các phiên bản dùng thử đã hoàn tất để tối ưu hoá các siêu tham số mà nền tảng lựa chọn cho các phiên bản trong tương lai. Để định cấu hình điều chỉnh siêu tham số, chúng ta cần chuyển tệp cấu hình khi bắt đầu công việc huấn luyện với một số dữ liệu về mỗi siêu tham số mà chúng ta đang tối ưu hoá.
Tiếp theo, hãy tạo tệp cấu hình đó trên thiết bị:
%%writefile config.yaml
trainingInput:
hyperparameters:
goal: MINIMIZE
maxTrials: 10
maxParallelTrials: 5
hyperparameterMetricTag: val_mse
enableTrialEarlyStopping: TRUE
params:
- parameterName: lr
type: DOUBLE
minValue: 0.0001
maxValue: 0.1
scaleType: UNIT_LINEAR_SCALE
- parameterName: momentum
type: DOUBLE
minValue: 0.0
maxValue: 1.0
scaleType: UNIT_LINEAR_SCALE
- parameterName: hidden-layer-size
type: INTEGER
minValue: 8
maxValue: 32
scaleType: UNIT_LINEAR_SCALE
Đối với mỗi siêu tham số, chúng tôi chỉ định loại, phạm vi giá trị mà chúng tôi muốn tìm kiếm và tỷ lệ để tăng giá trị trong các thử nghiệm khác nhau.
Khi bắt đầu công việc, chúng ta cũng chỉ định chỉ số mà chúng ta đang tối ưu hoá. Xin lưu ý rằng ở cuối hàm train_model()
ở trên, chúng ta sẽ báo cáo chỉ số này cho Nền tảng AI mỗi khi hoàn tất lượt thử nghiệm. Ở đây, chúng ta đang giảm thiểu sai số bình phương trung bình của mô hình và vì vậy, chúng ta muốn sử dụng các siêu tham số dẫn đến sai số bình phương trung bình thấp nhất cho mô hình của chúng ta. Tên của chỉ số này (val_mse
) khớp với tên mà chúng tôi sử dụng để báo cáo chỉ số khi gọi report_hyperparameter_tuning_metric()
khi kết thúc thời gian dùng thử.
6. Chạy công việc đào tạo trên Nền tảng AI
Trong phần này, chúng ta sẽ bắt đầu công việc huấn luyện mô hình bằng cách điều chỉnh siêu tham số trên Nền tảng AI.
Bước 1: Xác định một số biến môi trường
Trước tiên, hãy xác định một số biến môi trường mà chúng ta sẽ sử dụng để bắt đầu công việc đào tạo. Nếu bạn muốn chạy công việc của mình ở một khu vực khác, hãy cập nhật biến REGION bên dưới:
MAIN_TRAINER_MODULE = "trainer.model"
TRAIN_DIR = os.getcwd() + '/trainer'
JOB_DIR = BUCKET_URL + '/output'
REGION = "us-central1"
Mỗi công việc đào tạo trên Nền tảng AI phải có một tên riêng biệt. Chạy lệnh sau để xác định biến cho tên công việc bằng dấu thời gian:
timestamp = str(datetime.datetime.now().time())
JOB_NAME = 'caip_training_' + str(int(time.time()))
Bước 2: Bắt đầu công việc đào tạo
Chúng tôi sẽ dùng gcloud, Google Cloud CLI để tạo công việc đào tạo. Chúng ta có thể chạy lệnh này ngay trong sổ tay của mình, tham chiếu đến các biến chúng ta đã xác định ở trên:
!gcloud ai-platform jobs submit training $JOB_NAME \
--scale-tier basic \
--package-path $TRAIN_DIR \
--module-name $MAIN_TRAINER_MODULE \
--job-dir $JOB_DIR \
--region $REGION \
--runtime-version 2.1 \
--python-version 3.7 \
--config config.yaml
Nếu công việc của bạn được tạo chính xác, hãy chuyển đến mục Việc làm trong bảng điều khiển Nền tảng AI để giám sát nhật ký.
Bước 3: Giám sát công việc của bạn
Sau khi bạn đã ở phần Công việc của bảng điều khiển, hãy nhấp vào công việc mà bạn vừa bắt đầu xem chi tiết:
Khi vòng thử nghiệm đầu tiên của bạn bắt đầu, bạn sẽ có thể thấy các giá trị siêu tham số được chọn cho mỗi thử nghiệm:
Khi quá trình dùng thử kết thúc, giá trị thu được của chỉ số tối ưu hoá (trong trường hợp này là val_mse
) sẽ được ghi vào đây. Công việc sẽ mất từ 15 đến 20 phút để chạy và trang tổng quan sẽ có dạng như sau khi công việc hoàn tất (giá trị chính xác sẽ khác nhau):
Để gỡ lỗi các vấn đề tiềm ẩn và theo dõi công việc của bạn chi tiết hơn, hãy nhấp vào Xem nhật ký trên trang chi tiết về công việc:
Mọi câu lệnh print()
trong mã huấn luyện mô hình của bạn sẽ xuất hiện ở đây. Nếu bạn gặp sự cố, hãy thử thêm các câu lệnh in khác rồi bắt đầu một lệnh đào tạo mới.
Sau khi công việc huấn luyện của bạn hoàn tất, hãy tìm các siêu tham số mang lại val_mse thấp nhất. Bạn có thể sử dụng các dữ liệu này để huấn luyện và xuất phiên bản cuối cùng của mô hình hoặc sử dụng chúng làm hướng dẫn để bắt đầu một công việc huấn luyện khác bằng các chương trình thử nghiệm điều chỉnh siêu tham số bổ sung.
7. Dọn dẹp
Nếu muốn tiếp tục sử dụng sổ tay 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 muốn xoá tất cả tài nguyên bạn đã tạo trong phòng thí nghiệm này, bạn chỉ cần xoá phiên bản của sổ tay thay vì dừng phiên bản đó.
Bằng cách sử dụng trình đơn Điều hướng trong Cloud Console, hãy duyệt đến Bộ nhớ và xoá cả hai bộ chứa bạn đã tạo để lưu trữ các thành phần mô hình.