Topik ini menjelaskan cara menggunakan OSS Connector for AI/ML untuk membuat dan melatih model data secara efisien.
Lingkungan penyebaran
Sistem operasi: Linux x86-64
glibc: >=2.17
Python: 3.8–3.12
PyTorch: >=2.0
Untuk menggunakan fitur OSS Checkpoint, kernel Linux harus mendukung userfaultfd.
CatatanSebagai contoh, pada sistem Ubuntu, Anda dapat menjalankan perintah
sudo grep CONFIG_USERFAULTFD /boot/config-$(uname -r)untuk memeriksa apakah kernel Linux mendukung userfaultfd. Jika perintah mengembalikanCONFIG_USERFAULTFD=y, berarti kernel mendukungnya. Jika perintah mengembalikanCONFIG_USERFAULTFD=n, berarti kernel tidak mendukungnya, sehingga Anda tidak dapat menggunakan fitur OSS Checkpoint.
Instalasi cepat
Contoh berikut menunjukkan cara menginstal OSS Connector for AI/ML untuk Python 3.12.
Pada sistem operasi Linux atau dalam kontainer yang dibuat dari image berbasis Linux, jalankan perintah
pip3.12 install osstorchconnectoruntuk menginstal OSS Connector for AI/ML.pip3.12 install osstorchconnector-
Jalankan perintah
pip3.12 show osstorchconnectoruntuk memverifikasi keberhasilan instalasi.pip3.12 show osstorchconnectorJika informasi versi osstorchconnector ditampilkan, instalasi telah berhasil.
Name: osstorchconnector Version: 1.0.0rc1 Summary: OSS connector for AI/ML Home-page: Author: Author-email: License: Location: /usr/local/lib/python3.12/dist-packages Requires: torch Required-by:
Konfigurasi
Buat file konfigurasi untuk kredensial akses.
mkdir -p /root/.alibabacloud && touch /root/.alibabacloud/credentialsTambahkan konfigurasi kredensial akses dan simpan file tersebut.
Ganti
<Access-key-id>dan<Access-key-secret>dalam contoh dengan ID AccessKey dan Rahasia AccessKey milik pengguna Resource Access Management (RAM). Untuk informasi lebih lanjut tentang cara membuat ID AccessKey dan Rahasia AccessKey, lihat Create an AccessKey. Untuk informasi lebih lanjut tentang item konfigurasi dan cara menggunakan kredensial akses temporary, lihat Configure access credentials.{ "AccessKeyId": "LTAI************************", "AccessKeySecret": "At32************************" }Buat file konfigurasi OSS Connector.
mkdir -p /etc/oss-connector/ && touch /etc/oss-connector/config.jsonTambahkan konfigurasi OSS Connector dan simpan file tersebut. Untuk informasi lebih lanjut tentang item konfigurasi, lihat Configure OSS Connector.
Dalam kebanyakan kasus, Anda dapat menggunakan konfigurasi default berikut.
{ "logLevel": 1, "logPath": "/var/log/oss-connector/connector.log", "auditPath": "/var/log/oss-connector/audit.log", "datasetConfig": { "prefetchConcurrency": 24, "prefetchWorker": 2 }, "checkpointConfig": { "prefetchConcurrency": 24, "prefetchWorker": 4, "uploadConcurrency": 64 } }
Contoh
Contoh berikut menunjukkan cara membuat model pengenalan tulisan tangan menggunakan PyTorch. Model ini menggunakan set data MNIST yang dibangun dengan OssMapDataset dan menyimpan serta memuat checkpoint model menggunakan OssCheckpoint.
import io
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.transforms as transforms
from PIL import Image
from torch.utils.data import DataLoader
from osstorchconnector import OssMapDataset
from osstorchconnector import OssCheckpoint
# Definisikan hiperparameter.
EPOCHS = 1
BATCH_SIZE = 64
LEARNING_RATE = 0.001
CHECKPOINT_READ_URI = "oss://you_bucketname/epoch.ckpt" # URI untuk membaca checkpoint dari OSS.
CHECKPOINT_WRITE_URI = "oss://you_bucketname/epoch.ckpt" # URI untuk menyimpan checkpoint ke OSS.
ENDPOINT = "oss-cn-hangzhou-internal.aliyuncs.com" # Titik akhir internal untuk wilayah Anda. Untuk menggunakan titik akhir ini, instans ECS dan bucket OSS Anda harus berada di wilayah yang sama.
CONFIG_PATH = "/etc/oss-connector/config.json" # Path ke file konfigurasi OSS Connector.
CRED_PATH = "/root/.alibabacloud/credentials" # Path ke file konfigurasi kredensial akses.
OSS_URI = "oss://you_bucketname/mnist/" # Path ke resource Anda di bucket OSS.
# Buat objek OssCheckpoint untuk menyimpan checkpoint ke OSS dan memuatnya selama pelatihan.
checkpoint = OssCheckpoint(endpoint=ENDPOINT, cred_path=CRED_PATH, config_path=CONFIG_PATH)
# Definisikan jaringan saraf konvolusional (CNN) sederhana.
class SimpleCNN(nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
self.conv1 = nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1)
self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1)
# Gunakan adaptive pooling untuk menyederhanakan penanganan dimensi.
self.adaptive_pool = nn.AdaptiveAvgPool2d((7, 7))
self.fc1 = nn.Linear(64 * 7 * 7, 128)
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
x = nn.ReLU()(self.conv1(x))
x = nn.MaxPool2d(2)(x)
x = nn.ReLU()(self.conv2(x))
x = nn.MaxPool2d(2)(x)
x = self.adaptive_pool(x)
x = x.view(x.size(0), -1)
x = nn.ReLU()(self.fc1(x))
x = self.fc2(x)
return x
# Definisikan pipeline pra-pemrosesan data.
trans = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.5], std=[0.5])
])
def transform(object):
try:
img = Image.open(io.BytesIO(object.read())).convert('L')
val = trans(img)
except Exception as e:
raise e
# Ekstrak label dari path objek. Contoh ini mengasumsikan format path adalah oss://bucket/mnist/label/namafile.
# Sesuaikan logika ekstraksi label berdasarkan struktur set data Anda.
try:
label = int(object.key.split('/')[-2]) # Ekstrak segmen path kedua dari belakang sebagai label.
except (ValueError, IndexError):
label = 0 # Gunakan label default. Sesuaikan ini berdasarkan struktur set data Anda.
return val, torch.tensor(label)
# Muat set data menggunakan OssMapDataset.
train_dataset = OssMapDataset.from_prefix(OSS_URI, endpoint=ENDPOINT, transform=transform, cred_path=CRED_PATH, config_path=CONFIG_PATH)
train_loader = DataLoader(train_dataset, batch_size=BATCH_SIZE, num_workers=32, prefetch_factor=2, shuffle=True)
# Inisialisasi model, fungsi loss, dan pengoptimal.
model = SimpleCNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=LEARNING_RATE)
# Mulai loop pelatihan.
for epoch in range(EPOCHS):
for i, (images, labels) in enumerate(train_loader):
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
if (i + 1) % 100 == 0:
print(f'Epoch [{epoch + 1}/{EPOCHS}], Step [{i + 1}/{len(train_loader)}], Loss: {loss.item():.4f}')
# Simpan checkpoint model menggunakan objek OssCheckpoint.
with checkpoint.writer(CHECKPOINT_WRITE_URI) as writer:
torch.save(model.state_dict(), writer)
print("-------------------------")
print("Checkpoint saved")
print(model.state_dict())
# Muat state model dari checkpoint menggunakan objek OssCheckpoint.
try:
with checkpoint.reader(CHECKPOINT_READ_URI) as reader:
state_dict = torch.load(reader)
# Buat instans model baru dan muat state-nya.
model = SimpleCNN()
model.load_state_dict(state_dict)
model.eval()
print("Checkpoint loaded successfully")
except Exception as e:
print(f"Failed to load checkpoint: {e}")
# Anda dapat melatih dari awal atau menggunakan checkpoint yang berbeda.