Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Perpanjang Pre-built Wadah
Jika wadah SageMaker AI yang sudah dibuat sebelumnya tidak memenuhi semua persyaratan Anda, Anda dapat memperluas gambar yang ada untuk mengakomodasi kebutuhan Anda. Bahkan jika ada dukungan langsung untuk lingkungan atau kerangka kerja Anda, Anda mungkin ingin menambahkan fungsionalitas tambahan atau mengkonfigurasi lingkungan kontainer Anda secara berbeda. Dengan memperluas gambar yang sudah dibuat sebelumnya, Anda dapat memanfaatkan pustaka dan pengaturan pembelajaran mendalam yang disertakan tanpa harus membuat gambar dari awal. Anda dapat memperluas wadah untuk menambahkan pustaka, memodifikasi pengaturan, dan menginstal dependensi tambahan.
Tutorial berikut menunjukkan cara memperluas SageMaker gambar pra-bangun dan mempublikasikannya ke Amazon ECR.
Topik
Persyaratan untuk Memperpanjang Pre-built Kontainer
Untuk memperluas SageMaker gambar yang sudah dibuat sebelumnya, Anda perlu mengatur variabel lingkungan berikut dalam Dockerfile Anda. Untuk informasi selengkapnya tentang variabel lingkungan dengan kon SageMaker tainer AI, lihat GitHub re po
SAGEMAKER_SUBMIT_DIRECTORY: Direktori di dalam wadah tempat skrip Python untuk pelatihan berada.SAGEMAKER_PROGRAM: Skrip Python yang harus dipanggil dan digunakan sebagai titik masuk untuk pelatihan.
Anda juga dapat menginstal pustaka tambahan dengan memasukkan yang berikut ini di Dockerfile Anda:
RUN pip install<library>
Tutorial berikut menunjukkan cara menggunakan variabel lingkungan ini.
Perluas SageMaker AI Container untuk Menjalankan Skrip Python
Dalam tutorial ini, Anda belajar cara memperluas PyTorch wadah SageMaker AI dengan file Python yang menggunakan CIFAR-10 dataset. Dengan memperluas PyTorch wadah SageMaker AI, Anda memanfaatkan solusi pelatihan yang ada yang dibuat untuk bekerja dengan SageMaker AI. Tutorial ini memperluas gambar pelatihan, tetapi langkah yang sama dapat diambil untuk memperluas gambar inferensi. Untuk daftar lengkap gambar yang tersedia, lihat Gambar Wadah Pem belajaran Mendalam yang Tersedia
Untuk menjalankan model pelatihan Anda sendiri menggunakan wadah SageMaker AI, buat wadah Docker melalui instance SageMaker Notebook.
Langkah 1: Buat Instans SageMaker Notebook
-
Buka konsol SageMaker AI
. -
Di panel navigasi kiri, pilih Notebook, pilih Instans buku catatan, lalu pilih Buat instance buku catatan.
-
Pada halaman Buat instance buku catatan, berikan informasi berikut:
-
Untuk nama instance Notebook, masukkan
RunScriptNotebookInstance. -
Untuk jenis Instans Notebook, pilih
ml.t2.medium. -
Di bagian Izin dan enkripsi, lakukan hal berikut:
-
Untuk Peran IAM, pilih Buat Peran Baru.
-
Pada halaman Buat peran IAM, pilih Bucket S3 spesifik, tentukan bucket Amazon S3 bernama
sagemaker-run-script, lalu pilih Buat peran.SageMaker AI menciptakan peran IAM bernama
AmazonSageMaker-ExecutionRole-, sepertiYYYYMMDDTHHmmSSAmazonSageMaker-ExecutionRole-20190429T110788. Perhatikan bahwa konvensi penamaan peran eksekusi menggunakan tanggal dan waktu ketika peran dibuat, dipisahkan oleh aT.
-
-
Untuk Ak ses Root, pilih Aktifkan.
-
Pilih Buat instans notebook.
-
-
Pada halaman instance Notebook, Status Ter tun da. Butuh beberapa menit bagi Amazon SageMaker AI untuk meluncurkan instance komputasi pembelajaran mesin — dalam hal ini, ia meluncurkan instance notebook — dan melampirkan volume penyimpanan ML ke dalamnya. Instance notebook memiliki server notebook Jupyter yang telah dikonfigurasi sebelumnya dan satu set pustaka Anaconda. Untuk informasi lebih lanjut, lihat CreateNotebookInstance.
Di bagian Izin dan enkripsi, salin nomor ARN peran IAM, dan tempelkan ke file notepad untuk menyimpannya sementara. Anda menggunakan nomor ARN peran IAM ini nanti untuk mengonfigurasi pelatihan lokal ModelTrainer di instance notebook. Nomor ARN peran IAM terlihat seperti berikut:
'arn:aws:iam::111122223333:role/service-role/AmazonSageMaker-ExecutionRole-20190429T110788'-
Setelah status instance notebook berubah menjadi InService, pilih Buka JupyterLab.
Langkah 2: Buat dan Unggah Skrip Pelatihan Dockerfile dan Python
-
Setelah JupyterLab terbuka, buat folder baru di direktori home Anda JupyterLab. Di sudut kiri atas, pilih ikon Folder Baru, lalu masukkan nama folder.
docker_test_folder -
Buat file
Dockerfileteks didocker_test_folderdirektori.-
Pilih ikon Peluncur Baru (+) di sudut kiri atas.
-
Di panel kanan di bawah bagian Lainnya, pilih File Teks.
-
Tempelkan kode
Dockerfilecontoh berikut ke file teks Anda.# SageMaker PyTorch image FROM 763104351884.dkr.ecr.us-east-1.amazonaws.com/pytorch-training:1.5.1-cpu-py36-ubuntu16.04 ENV PATH="/opt/ml/code:${PATH}" # this environment variable is used by the SageMaker PyTorch container to determine our user code directory. ENV SAGEMAKER_SUBMIT_DIRECTORY /opt/ml/code # /opt/ml and all subdirectories are utilized by SageMaker, use the /code subdirectory to store your user code. COPY cifar10.py /opt/ml/code/cifar10.py # Defines cifar10.py as script entrypoint ENV SAGEMAKER_PROGRAM cifar10.pyScript Dockerfile melakukan tugas-tugas berikut:
-
FROM 763104351884.dkr.ecr.us-east-1.amazonaws.com/pytorch-training:1.5.1-cpu-py36-ubuntu16.04— Mengunduh gambar PyTorch dasar SageMaker AI. Anda dapat menggantinya dengan gambar dasar SageMaker AI apa pun yang ingin Anda bawa untuk membangun wadah. -
ENV SAGEMAKER_SUBMIT_DIRECTORY /opt/ml/code— Menetapkan/opt/ml/codesebagai direktori skrip pelatihan. -
COPY cifar10.py /opt/ml/code/cifar10.py— Menyalin skrip ke lokasi di dalam wadah yang diharapkan oleh SageMaker AI. Skrip harus ditempatkan di folder ini. -
ENV SAGEMAKER_PROGRAM cifar10.py— Menetapkan skripcifar10.pypelatihan Anda sebagai skrip titik masuk.
-
-
Pada panel navigasi direktori kiri, nama file teks mungkin secara otomatis diberi nama
untitled.txt. Untuk mengganti nama file, klik kanan file, pilih U bah nama, ganti nama file sebagaiDockerfiletanpa.txtekstensi, lalu tekanCtrl+satauCommand+suntuk menyimpan file.
-
-
Buat atau unggah skrip pelatihan
cifar10.pydidocker_test_folder. Anda dapat menggunakan contoh skrip berikut untuk latihan ini.import ast import argparse import logging import os import torch import torch.distributed as dist import torch.nn as nn import torch.nn.parallel import torch.optim import torch.utils.data import torch.utils.data.distributed import torchvision import torchvision.models import torchvision.transforms as transforms import torch.nn.functional as F logger=logging.getLogger(__name__) logger.setLevel(logging.DEBUG) classes=('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck') # https://github.com/pytorch/tutorials/blob/master/beginner_source/blitz/cifar10_tutorial.py#L118 class Net(nn.Module): def __init__(self): super(Net, 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 def _train(args): is_distributed=len(args.hosts) > 1 and args.dist_backend is not None logger.debug("Distributed training - {}".format(is_distributed)) if is_distributed: # Initialize the distributed environment. world_size=len(args.hosts) os.environ['WORLD_SIZE']=str(world_size) host_rank=args.hosts.index(args.current_host) dist.init_process_group(backend=args.dist_backend, rank=host_rank, world_size=world_size) logger.info( 'Initialized the distributed environment: \'{}\' backend on {} nodes. '.format( args.dist_backend, dist.get_world_size()) + 'Current host rank is {}. Using cuda: {}. Number of gpus: {}'.format( dist.get_rank(), torch.cuda.is_available(), args.num_gpus)) device='cuda' if torch.cuda.is_available() else 'cpu' logger.info("Device Type: {}".format(device)) logger.info("Loading Cifar10 dataset") transform=transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) trainset=torchvision.datasets.CIFAR10(root=args.data_dir, train=True, download=False, transform=transform) train_loader=torch.utils.data.DataLoader(trainset, batch_size=args.batch_size, shuffle=True, num_workers=args.workers) testset=torchvision.datasets.CIFAR10(root=args.data_dir, train=False, download=False, transform=transform) test_loader=torch.utils.data.DataLoader(testset, batch_size=args.batch_size, shuffle=False, num_workers=args.workers) logger.info("Model loaded") model=Net() if torch.cuda.device_count() > 1: logger.info("Gpu count: {}".format(torch.cuda.device_count())) model=nn.DataParallel(model) model=model.to(device) criterion=nn.CrossEntropyLoss().to(device) optimizer=torch.optim.SGD(model.parameters(), lr=args.lr, momentum=args.momentum) for epoch in range(0, args.epochs): running_loss=0.0 for i, data in enumerate(train_loader): # get the inputs inputs, labels=data inputs, labels=inputs.to(device), labels.to(device) # zero the parameter gradients optimizer.zero_grad() # forward + backward + optimize outputs=model(inputs) loss=criterion(outputs, labels) loss.backward() optimizer.step() # print statistics running_loss += loss.item() if i % 2000 == 1999: # print every 2000 mini-batches print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 2000)) running_loss=0.0 print('Finished Training') return _save_model(model, args.model_dir) def _save_model(model, model_dir): logger.info("Saving the model.") path=os.path.join(model_dir, 'model.pth') # recommended way from http://pytorch.org/docs/master/notes/serialization.html torch.save(model.cpu().state_dict(), path) def model_fn(model_dir): logger.info('model_fn') device="cuda" if torch.cuda.is_available() else "cpu" model=Net() if torch.cuda.device_count() > 1: logger.info("Gpu count: {}".format(torch.cuda.device_count())) model=nn.DataParallel(model) with open(os.path.join(model_dir, 'model.pth'), 'rb') as f: model.load_state_dict(torch.load(f)) return model.to(device) if __name__ == '__main__': parser=argparse.ArgumentParser() parser.add_argument('--workers', type=int, default=2, metavar='W', help='number of data loading workers (default: 2)') parser.add_argument('--epochs', type=int, default=2, metavar='E', help='number of total epochs to run (default: 2)') parser.add_argument('--batch-size', type=int, default=4, metavar='BS', help='batch size (default: 4)') parser.add_argument('--lr', type=float, default=0.001, metavar='LR', help='initial learning rate (default: 0.001)') parser.add_argument('--momentum', type=float, default=0.9, metavar='M', help='momentum (default: 0.9)') parser.add_argument('--dist-backend', type=str, default='gloo', help='distributed backend (default: gloo)') # The parameters below retrieve their default values from SageMaker environment variables, which are # instantiated by the SageMaker containers framework. # https://github.com/aws/sagemaker-containers#how-a-script-is-executed-inside-the-container parser.add_argument('--hosts', type=str, default=ast.literal_eval(os.environ['SM_HOSTS'])) parser.add_argument('--current-host', type=str, default=os.environ['SM_CURRENT_HOST']) parser.add_argument('--model-dir', type=str, default=os.environ['SM_MODEL_DIR']) parser.add_argument('--data-dir', type=str, default=os.environ['SM_CHANNEL_TRAINING']) parser.add_argument('--num-gpus', type=int, default=os.environ['SM_NUM_GPUS']) _train(parser.parse_args())
Langkah 3: Bangun Wadah
-
Di direktori JupyterLab home, buka notebook Jupyter. Untuk membuka buku catatan baru, pilih ikon Peluncuran Baru dan kemudian pilih conda_pytorch_p39 di bagian Notebook.
-
Jalankan perintah berikut di sel notebook pertama untuk mengubah ke
docker_test_folderdirektori:% cd ~/SageMaker/docker_test_folderIni mengembalikan direktori Anda saat ini sebagai berikut:
! pwdoutput: /home/ec2-user/SageMaker/docker_test_folder -
Masuk ke Docker untuk mengakses wadah dasar:
! aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 763104351884.dkr.ecr.us-east-1.amazonaws.com -
Untuk membangun wadah Docker, jalankan perintah build Docker berikut, termasuk ruang diikuti oleh titik di akhir:
! docker build -t pytorch-extended-container-test .Perintah build Docker harus dijalankan dari direktori Docker yang Anda buat, dalam hal ini.
docker_test_foldercatatan
Jika Anda mendapatkan pesan kesalahan berikut bahwa Docker tidak dapat menemukan Dockerfile, pastikan Dockerfile memiliki nama yang benar dan telah disimpan ke direktori.
unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /home/ec2-user/SageMaker/docker/Dockerfile: no such file or directoryIngat bahwa
dockermencari file yang secara khusus dipanggilDockerfiletanpa ekstensi apa pun dalam direktori saat ini. Jika Anda menamainya dengan sesuatu yang lain, Anda dapat meneruskan nama file secara manual dengan-fbendera. Misalnya, jika Anda menamai Dockerfile AndaDockerfile-text.txt, jalankan perintah berikut:! docker build -t tf-custom-container-test -f Dockerfile-text.txt .
Langkah 4: Uji Wadah
-
Untuk menguji wadah secara lokal di instance notebook, buka notebook Jupyter. Pilih Peluncur Baru dan pilih Notebook dalam
conda_pytorch_p39kerangka kerja. Sisa cuplikan kode harus dijalankan dari instance notebook Jupyter. -
Unduh CIFAR-10 dataset.
import torch import torchvision import torchvision.transforms as transforms def _get_transform(): return transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) def get_train_data_loader(data_dir='/tmp/pytorch/cifar-10-data'): transform=_get_transform() trainset=torchvision.datasets.CIFAR10(root=data_dir, train=True, download=True, transform=transform) return torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=2) def get_test_data_loader(data_dir='/tmp/pytorch/cifar-10-data'): transform=_get_transform() testset=torchvision.datasets.CIFAR10(root=data_dir, train=False, download=True, transform=transform) return torch.utils.data.DataLoader(testset, batch_size=4, shuffle=False, num_workers=2) trainloader=get_train_data_loader('/tmp/pytorch-example/cifar-10-data') testloader=get_test_data_loader('/tmp/pytorch-example/cifar-10-data') -
Setel
roleke peran yang digunakan untuk membuat buku catatan Jupyter Anda. Ini digunakan untuk mengkonfigurasi SageMaker AI Anda ModelTrainer.from sagemaker.core.helper.session_helper import get_execution_role role=get_execution_role() -
Tempelkan contoh skrip berikut ke sel kode notebook untuk mengonfigurasi SageMaker AI ModelTrainer menggunakan wadah yang diperluas.
from sagemaker.train import ModelTrainer from sagemaker.train.configs import Compute, SourceCode from sagemaker.train.configs import InputData model_trainer=ModelTrainer( training_image='pytorch-extended-container-test', compute=Compute(instance_type='local', instance_count=1), role=role, hyperparameters={'epochs': '1'} ) train_data=InputData(channel_name='training', data_source='file:///tmp/pytorch-example/cifar-10-data') model_trainer.train(input_data_config=[train_data]) -
Jalankan sel kode. Tes ini menghasilkan konfigurasi lingkungan pelatihan, nilai yang digunakan untuk variabel lingkungan, sumber data, dan kehilangan dan akurasi yang diperoleh selama pelatihan.
Langkah 5: Dorong Wadah ke Amazon Elastic Container Registry (Amazon ECR)
Setelah berhasil menjalankan pengujian mode lokal, Anda dapat mendorong wadah Docker ke Amazon ECR dan menggunakannya untuk menjalankan tugas pelatihan.
Jalankan baris perintah berikut di sel notebook.
%%sh # Specify an algorithm name algorithm_name=pytorch-extended-container-test account=$(aws sts get-caller-identity --query Account --output text) # Get the region defined in the current configuration (default to us-west-2 if none defined) region=$(aws configure get region) fullname="${account}.dkr.ecr.${region}.amazonaws.com/${algorithm_name}:latest" # If the repository doesn't exist in ECR, create it. aws ecr describe-repositories --repository-names "${algorithm_name}" > /dev/null 2>&1 if [ $? -ne 0 ] then aws ecr create-repository --repository-name "${algorithm_name}" > /dev/null fi # Log into Docker aws ecr get-login-password --region ${region}|docker login --username AWS --password-stdin ${fullname} # Build the docker image locally with the image name and then push it to ECR # with the full name. docker build -t ${algorithm_name} . docker tag ${algorithm_name} ${fullname} docker push ${fullname}-
Setelah Anda mendorong wadah, Anda dapat memanggil gambar Amazon ECR dari mana saja di lingkungan SageMaker AI. Jalankan contoh kode berikut di sel notebook berikutnya.
Jika Anda ingin menggunakan wadah pelatihan ini dengan SageMaker Studio untuk menggunakan fitur visualisasi, Anda juga dapat menjalankan kode berikut di sel notebook Studio untuk memanggil gambar Amazon ECR dari wadah pelatihan Anda.
import boto3 client=boto3.client('sts') account=client.get_caller_identity()['Account'] my_session=boto3.session.Session() region=my_session.region_name algorithm_name="pytorch-extended-container-test" ecr_image='{}.dkr.ecr.{}.amazonaws.com/{}:latest'.format(account, region, algorithm_name) ecr_image # This should return something like # 12-digits-of-your-account.dkr.ecr.us-east-2.amazonaws.com/tf-2.2-test:latest Gunakan yang
ecr_imagediambil dari langkah sebelumnya untuk mengonfigurasi ModelTrainer objek SageMaker AI. Contoh kode berikut mengonfigurasi SageMaker AI PyTorch ModelTrainer.import sagemaker from sagemaker.core.helper.session_helper import get_execution_role from sagemaker.train import ModelTrainer from sagemaker.train.configs import Compute model_trainer=ModelTrainer( training_image=ecr_image, role=get_execution_role(), base_job_name='pytorch-extended-container-test', compute=Compute(instance_count=1, instance_type='ml.p2.xlarge') ) # start training model_trainer.train()
Langkah 6: Bersihkan Sumber Daya
Untuk membersihkan sumber daya setelah selesai dengan contoh Get Started
-
Buka konsol SageMaker AI
, pilih instance notebook RunScriptNotebookInstance, pilih Ac tions, dan pilih Stop. Hal ini dapat memerlukan waktu beberapa menit sampai instans berhenti. -
Setelah Status instance berubah menjadi Dih entikan, pilih T indakan, pilih Hapus, lalu pilih H apus di kotak dialog. Diperlukan beberapa menit untuk menghapus instans. Instans buku catatan menghilang dari tabel ketika telah dihapus.
-
Buka konsol Amazon S3
dan hapus bucket yang Anda buat untuk menyimpan artefak model dan dataset pelatihan. -
Buka konsol IAM
dan hapus peran IAM. Jika Anda membuat kebijakan izin, Anda juga dapat menghapusnya. catatan
Container Docker mati secara otomatis setelah dijalankan. Anda tidak perlu menghapusnya.