在雲端資源日益普及的趨勢下,善用雲端平臺提供的基礎設施和服務對於 AI 模型的開發和佈署至關重要。本文將詳細說明如何在 Oracle Cloud Infrastructure (OCI) 上設定必要的基礎設施,並搭配 PyTorch 框架進行 AI 模型的訓練和佈署。首先,我們會逐步引導讀者完成 OCI 環境的設定,包含 compartment、bucket、pre-authenticated request 以及使用者群組的建立和對映。接著,我們會示範如何下載預訓練模型和資料集,並在 OCI 環境中進行模型訓練和測試。同時,本文也涵蓋瞭如何使用 TensorBoard 紀錄訓練過程、將模型和相關 artifacts 上傳至 OCI 儲存桶,以及如何最佳化模型超引數以提升效能。最後,我們將提供一些實用的程式碼片段和技巧,幫助讀者更好地理解和應用 OCI 和 PyTorch 在 AI 模型訓練和佈署方面的實務操作。
設定 Oracle Cloud 基礎設施
為了建立區塊鏈與 AI 的整合,首先需要設定 Oracle Cloud 基礎設施。這包括建立一個 bucket 來儲存物件、設定存取許可權以及建立相關的群組和對映。
建立 Compartment
- 登入 Oracle Cloud 並導航到 Identity > Compartments。
- 點選 “Create Compartment” 並命名為 “BTA-staffings”。
- 在描述中新增 “resources for BTA staffings”。
- 接受其餘預設設定並點選 “Create Compartment”。
建立 Bucket
- 導航到 Storage > Object Storage & Archive Storage。
- 點選 “Buckets” 並選擇 “BTA-staffings” 作為 Compartment。
- 點選 “Create Bucket” 並命名為 “ai-engineer-staffing”。
- 保持預設的儲存型別為 “Standard”,並接受其餘預設設定。
- 向下滾動並點選 “Create”。
建立 Pre-Authenticated Request
- 開啟 “ai-engineer-staffing” Bucket 並滾動到頁面底部。
- 在左側的 “Resources” 選單中點選 “Pre-Authenticated Requests”。
- 點選 “Create Pre-Authenticated Request” 並命名為 “ai-engineer-staffing”。
- 向下滾動並點選 “Create Pre-Authenticated Request”。
建立 Oracle 群組
- 導航到 Identity > Groups。
- 點選 “Create Group” 並命名為 “ai-engineer-staffing”。
- 新增描述 “AI engineer staffing”。
- 點選 “Create” 並重複此過程為 “mlops-staffing” 和 “stakeholder-staffing” 建立群組。
建立 IDCS 群組
- 導航到 Identity and Security > Federation。
- 點選 “OracleIdentityCloudService” 並滾動到頁面底部。
- 在左側的 “Resources” 選單中點選 “Groups”。
- 點選 “Create IDCS Group” 並命名為 “ai-engineer-staffing”。
- 接受其餘預設設定並點選 “Create”,然後重複此過程為 “mlops-engineer-staffing” 和 “stakeholder-staffing” 建立 IDCS 群組。
對映 Oracle 群組
- 導航到 Identity and Security > Federation。
- 點選 “OracleIdentityCloudService” 並滾動到頁面底部。
- 在左側的 “Resources” 選單中點選 “Group Mappings”。
- 點選 “Add Mappings” 並選擇左側的 IDCS 群組和右側的 Oracle 群組。
- 點選 “Add Mappings” 並重複此過程為每個群組建立對映。
完成這些步驟後,您將成功設定 Oracle Cloud 基礎設施,包括 bucket、群組和對映,為區塊鏈與 AI 的整合奠定基礎。
建立安全政策和存取控制
為了確保雲端儲存的安全性,我們需要建立安全政策和存取控制。首先,我們需要建立一個政策,允許特定群組存取特定儲存桶。例如,我們可以建立一個政策,允許「AI 工程師」群組存取「AI 工程師儲存桶」。
# 建立政策
policy = {
"statement": [
{
"effect": "Allow",
"action": "read",
"resource": "oci:objectstorage:bucket:AI工程師儲存桶"
},
{
"effect": "Allow",
"action": "manage",
"resource": "oci:objectstorage:bucket:AI工程師儲存桶"
}
]
}
接下來,我們需要建立一個秘密金鑰,來連線到雲端儲存。這個秘密金鑰需要儲存在安全的地方,因為它只會顯示一次。
# 建立秘密金鑰
secret_key = "您的秘密金鑰"
下載模型和資料
現在,我們需要下載模型和資料。模型是一個簡單的卷積神經網路,能夠辨識交通標誌。資料包含了訓練和測試的圖片。
# 下載模型和資料
import requests
model_url = "https://example.com/model.zip"
data_url = "https://example.com/data.zip"
model_response = requests.get(model_url)
data_response = requests.get(data_url)
with open("model.zip", "wb") as f:
f.write(model_response.content)
with open("data.zip", "wb") as f:
f.write(data_response.content)
解壓縮模型和資料
接下來,我們需要解壓縮模型和資料。
# 解壓縮模型和資料
import zipfile
with zipfile.ZipFile("model.zip", "r") as zip_ref:
zip_ref.extractall()
with zipfile.ZipFile("data.zip", "r") as zip_ref:
zip_ref.extractall()
訓練模型
現在,我們可以訓練模型了。模型會使用訓練資料來學習交通標誌的特徵。
# 訓練模型
import torch
import torch.nn as nn
import torch.optim as optim
# 定義模型
class TrafficSignModel(nn.Module):
def __init__(self):
super(TrafficSignModel, self).__init__()
self.conv1 = nn.Conv2d(3, 6, 5)
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = self.pool(nn.functional.relu(self.conv1(x)))
x = self.pool(nn.functional.relu(self.conv2(x)))
x = x.view(-1, 16 * 5 * 5)
x = nn.functional.relu(self.fc1(x))
x = nn.functional.relu(self.fc2(x))
x = self.fc3(x)
return x
# 初始化模型和最佳化器
model = TrafficSignModel()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001)
# 訓練模型
for epoch in range(10):
for i, data in enumerate(trainloader):
inputs, labels = data
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
print("Epoch {}: Loss = {:.4f}".format(epoch+1, loss.item()))
測試模型
最後,我們可以測試模型了。模型會使用測試資料來評估其準確度。
# 測試模型
model.eval()
test_loss = 0
correct = 0
with torch.no_grad():
for data in testloader:
inputs, labels = data
outputs = model(inputs)
loss = criterion(outputs, labels)
test_loss += loss.item()
_, predicted = torch.max(outputs, 1)
correct += (predicted == labels).sum().item()
accuracy = correct / len(testloader.dataset)
print("Test Loss: {:.4f}, Accuracy: {:.2f}%".format(test_loss / len(testloader), accuracy * 100))
圖表翻譯:
此圖示範了模型的架構,包括卷積層、池化層和全連線層。模型的輸入為圖片,輸出為交通標誌的類別。模型使用反向傳播演算法來更新引數,從而提高準確度。
人工智慧模型建置與訓練
環境設定
為了建置和訓練人工智慧模型,需要安裝Python和PyTorch。首先,下載並安裝Anaconda,Anaconda是一個包管理器和Python分發版,包含了許多開源包。安裝完成後,啟動Anaconda Navigator,按照提示更新到最新版本。
PyTorch安裝
如果已經安裝了Python,則可以直接安裝PyTorch。存取Anaconda官網,按照特定作業系統的指示安裝PyTorch。PyTorch Lightning Trainer將被用於訓練模型。
啟動筆記本
開啟Anaconda Navigator,找到Jupyter Notebook,點選啟動。Jupyter Notebook首頁將在預設瀏覽器中開啟,顯示本地檔案列表。導航到下載的bta-aimodel程式碼資料夾,點選MNIST_project.ipynb開啟它。
Boto3組態
在筆記本中,滾動到第4節,包含了Boto3的程式碼。修改筆記本以反映秘密金鑰、存取金鑰、儲存桶名稱、版本號和專案名稱。這些組態是特定於AI工程師的儲存桶。
儲存桶資源組態
使用Boto3組態Oracle Cloud的儲存桶。區網域名稱稱和端點URL可能需要根據OCI區域進行更改。定義儲存桶的OCI ID和秘密金鑰,並將其用於Boto3組態。
import boto3
# 組態Boto3為Oracle Cloud
s3 = boto3.resource(
's3',
region_name="us-phoenix-1",
aws_secret_access_key="YOUR_OCI_SECRET_KEY",
aws_access_key_id="YOUR_BUCKET_OCI_ID",
)
# 定義專案版本號和名稱
VERSION_NO = "v1"
PROJECT_NAME = "MNIST"
模型建置和訓練
使用PyTorch Lightning Trainer訓練模型。定義模型的架構、損失函式和最佳化器。然後,使用訓練資料訓練模型,並評估模型的效能。
import torch
import torch.nn as nn
import torch.optim as optim
from pytorch_lightning import Trainer
# 定義模型架構
class MNISTModel(nn.Module):
def __init__(self):
super(MNISTModel, self).__init__()
self.fc1 = nn.Linear(784, 128)
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
# 定義損失函式和最佳化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(MNISTModel.parameters(), lr=0.001)
# 訓練模型
trainer = Trainer(max_epochs=5)
trainer.fit(MNISTModel, train_dataloader)
結果評估
使用測試資料評估模型的效能。計算模型的準確率、精確率和召回率。
# 評估模型效能
test_loss = 0
correct = 0
with torch.no_grad():
for data, target in test_dataloader:
output = MNISTModel(data)
test_loss += criterion(output, target).item()
_, predicted = torch.max(output, 1)
correct += (predicted == target).sum().item()
accuracy = correct / len(test_dataloader.dataset)
print(f'Test Accuracy: {accuracy:.2f}%')
執行 AI 模型訓練
在這個章節中,我們將介紹如何執行 AI 模型訓練。首先,我們需要定義一些重要的變數,包括 Object Storage Bucket 名稱、最大 epochs 數量、演算法名稱、批次大小等。
# 定義 Object Storage Bucket 名稱
BUCKET_NAME = "ai-engineer-staffing"
# 定義最大 epochs 數量
MAX_EPOCHS = 5
# 定義演算法名稱
ALGO_NAME = "Convolutional Neural Network"
# 定義批次大小
BATCH_SIZE = 256 if AVAIL_GPUS else 64
接下來,我們需要定義一個 logger 來儲存 tensorboard 日誌和 checkpoint。
# 定義 logger
logger = TensorBoardLogger("tb_logs", name="my_model_tensorboard")
自行撰寫 AI 模型
如果您想要自行撰寫 AI 模型,您需要確保您有 BTA AI 模型指令碼,該指令碼可以將 TensorBoard 原生日誌檔轉換為 BTA 專案所需的格式。同時,您也需要有上傳日誌和 artifact 到 Oracle bucket 結構的程式碼。
# 自行撰寫 AI 模型
class MyModel(pl.LightningModule):
def __init__(self, n_classes):
super().__init__()
self.model = torchvision.models.mobilenet_v2(pretrained=True)
self.model.classifier = nn.Sequential(
nn.Dropout(0.2),
nn.Linear(self.model.last_channel, n_classes)
)
執行 Notebook
現在,您可以執行您的 Notebook 了。請花幾分鐘時間閱讀整個 Notebook 的內容,從頭到尾。這將幫助您瞭解每個儲存格中的程式碼的意圖,並提供有用的提示。
# 執行 Notebook
if __name__ == "__main__":
# 執行訓練和測試
trainer = pl.Trainer(max_epochs=MAX_EPOCHS, logger=logger)
trainer.fit(model)
trainer.test(model)
檢查 Bucket
訓練和測試完成後,請登入 OCI,然後從選單中選擇 Storage > Buckets 來檢查 bucket 中的 artifact 和日誌檔。
# 檢查 Bucket
def check_bucket():
# 登入 OCI
oci_config = oci.config.from_file()
object_storage = oci.object_storage.ObjectStorageClient(oci_config)
# 檢查 bucket 中的 artifact 和日誌檔
bucket_name = BUCKET_NAME
namespace = object_storage.get_namespace().data
bucket = object_storage.get_bucket(namespace, bucket_name)
objects = object_storage.list_objects(namespace, bucket_name)
for obj in objects.data.objects:
print(obj.name)
最佳化超引數
超引數是機器學習實驗中由玄貓定義和設定的變數。它們不是訓練資料的一部分,也不能被訓練資料所學習。相反,它們幫助設定學習過程的環境。超引數的例子包括學習率、訓練週期數、批次大小和決策樹的分支數。在神經網路中,超引數可能是模型中的層數。每次更改超引數並執行機器學習時,版本跟蹤器都會將其儲存為新的訓練集版本。
超引數最佳化是指選擇哪些超引數來建立理想的模型架構的過程。最佳化這些變數可以增加AI模型的準確性。每個超引數的最佳值需要由玄貓或其他方法確定。不幸的是,沒有特定的方法來計算如何修改超引數以最佳化模型架構。
學習率
在最佳化演算法中,學習率是一個超引數。學習率決定了演算法在每次迭代中可以改變多少,同時保持模型的準確性損失最小。換句話說,它決定了機器「學習」的速度。它還控制了其他超引數的交叉檢查頻率。如果學習率太低,訓練過程可能會減慢太多;如果學習率太高,模型可能不能在適當的時間內最佳化。
訓練週期數
如果不知道從哪裡開始設定訓練週期數,則有一個規則,即最初可以將其計算為三倍的資料列數。最終的訓練週期數將取決於模型的複雜性。如果模型在所有週期完成後仍在改善,則嘗試執行更多週期。
批次大小
批次大小定義了在任何時候都會將多少資料樣本輸入演算法。完整的訓練資料集由一個或多個批次組成。假設我們想要使用1,000張狗的影像來訓練演算法,以識別不同的狗品種,並選擇批次大小為10。這意味著在任何時候,網路都會接收到10張狗的影像作為批次。如果每個週期由所有資料在網路上執行的一次組成,則整個週期將由100個批次組成。
隱藏層大小
在人工神經網路中,隱藏層存在於輸入層和輸出層之間,人工神經元接收加權輸入並透過啟用函式產生輸出。它是幾乎所有神經網路的典型部分,工程師在其中模擬人腦中的活動。如果網路不是很複雜,則可能只有輸入和輸出層之間的一個或兩個隱藏層。如果資料具有大維度或複雜特徵,則可能需要三到五個層才能達到最佳解。
度量指標
分類模型用於預測分類問題中目標類別的資料樣本。分類模型預測每個例項屬於某一類別或另一類別的機率。評估分類模型的效能以可靠地使用它們來解決現實世界問題至關重要。
大多數情況下,我們使用分類準確率來衡量模型的效能。然而,這還不夠用於真正評估模型的準確率。度量指標首先在訓練模型時記錄,然後使用相同的度量指標來評估模型在測試資料集上的效能。
為了確定分類模型的分類準確率,我們使用準確率、損失、精確度、召回率和F1分數。這些指標有助於全面評估模型的效能。
# 定義模型架構
class TrafficSignsDetectionModel(nn.Module):
def __init__(self):
super(TrafficSignsDetectionModel, self).__init__()
self.conv1 = nn.Conv2d(3, 6, 5)
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1, 16 * 5 * 5)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
# 初始化模型、損失函式和最佳化器
model = TrafficSignsDetectionModel()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)
# 訓練模型
for epoch in range(10):
for i, data in enumerate(trainloader, 0):
inputs, labels = data
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# 測試模型
model.eval()
test_loss = 0
correct = 0
with torch.no_grad():
for data in testloader:
inputs, labels = data
outputs = model(inputs)
loss = criterion(outputs, labels)
test_loss += loss.item()
_, predicted = torch.max(outputs, 1)
correct += (predicted == labels).sum().item()
accuracy = correct / len(testloader.dataset)
print('Test Accuracy: %f' % accuracy)
從底層實作到高階應用的全面檢視顯示,本文詳細闡述了在 Oracle Cloud 上建置、訓練及佈署 AI 模型的完整流程,涵蓋了基礎設施設定、安全策略組態、模型訓練、超引數最佳化以及效能評估等關鍵環節。透過建立 Compartment、Bucket、Pre-Authenticated Request 以及群組對映,確保了資源的有效管理和存取控制。技術堆疊的各層級協同運作中體現,PyTorch Lightning Trainer 與 TensorBoard Logger 的整合簡化了模型訓練和追蹤流程,同時 Boto3 的運用則有效橋接了 Python 程式碼與 Oracle Cloud Storage 之間的互動。然而,文章中提供的程式碼範例和說明略顯簡略,對於缺乏實務經驗的使用者而言,可能需要更多細節和步驟拆解才能順利完成操作。此外,針對不同規模的資料集和模型複雜度,超引數最佳化的策略也需要更進一步的探討和客製化建議。從技術演進角度,雲端原生 AI 開發工具和自動化機器學習平臺的興起將進一步降低模型開發和佈署的門檻。接下來的 2-3 年,將是雲端 AI 技術從實驗走向大規模應用的關鍵視窗期。玄貓認為,技術團隊應著重於提升模型的可解釋性、安全性以及效能最佳化,才能充分釋放雲端 AI 的巨大潛力。