Menghosting beberapa model computer vision TensorFlow menggunakan titik akhir multi-model Amazon SageMaker

Node Sumber: 1853804

Amazon SageMaker membantu ilmuwan dan pengembang data mempersiapkan, membangun, melatih, dan menerapkan model pembelajaran mesin (ML) berkualitas tinggi dengan cepat dengan menyatukan serangkaian kemampuan yang dibuat khusus untuk ML. SageMaker mempercepat inovasi dalam organisasi Anda dengan menyediakan alat yang dibuat khusus untuk setiap langkah pengembangan ML, termasuk pelabelan, persiapan data, rekayasa fitur, deteksi bias statistik, AutoML, pelatihan, penyetelan, hosting, kemampuan menjelaskan, pemantauan, dan otomatisasi alur kerja.

Perusahaan semakin melatih model ML berdasarkan data pengguna individu. Misalnya, layanan berbagi gambar yang dirancang untuk memungkinkan penemuan informasi di internet melatih model khusus berdasarkan gambar yang diunggah setiap pengguna dan riwayat penelusuran untuk mempersonalisasi rekomendasi bagi pengguna tersebut. Perusahaan juga dapat melatih model khusus berdasarkan topik pencarian untuk merekomendasikan gambar per topik. Membangun model ML kustom untuk setiap kasus penggunaan menghasilkan akurasi inferensi yang lebih tinggi, tetapi meningkatkan biaya penerapan dan pengelolaan model. Tantangan ini menjadi lebih terasa ketika tidak semua model diakses dengan kecepatan yang sama tetapi tetap harus tersedia setiap saat.

SageMaker titik akhir multi-model menyediakan cara yang skalabel dan hemat biaya untuk menerapkan sejumlah besar model ML di cloud. Titik akhir multi-model SageMaker memungkinkan Anda menerapkan beberapa model ML di belakang titik akhir tunggal dan menyajikannya menggunakan wadah penyajian tunggal. Aplikasi Anda hanya perlu menyertakan panggilan API dengan model target ke titik akhir ini untuk mencapai inferensi latensi rendah dan throughput tinggi. Alih-alih membayar titik akhir terpisah untuk setiap model, Anda dapat menghosting banyak model dengan harga satu titik akhir. Untuk informasi lebih lanjut tentang titik akhir multi-model SageMaker, lihat Hemat biaya inferensi dengan menggunakan titik akhir multi-model Amazon SageMaker.

Dalam posting ini, kami menunjukkan cara menggunakan titik akhir multi-model SageMaker untuk meng-host dua model visi komputer dengan arsitektur model dan kumpulan data yang berbeda untuk klasifikasi gambar. Dalam praktiknya, Anda dapat menerapkan puluhan ribu model pada titik akhir multi-model.

Ikhtisar solusi

Titik akhir multi-model SageMaker bekerja dengan beberapa kerangka kerja, seperti TensorFlow, PyTorch, MXNet, dan sklearn, dan Anda dapat buat wadah Anda sendiri dengan server multi-model. Titik akhir multi-model juga didukung secara asli dalam algoritme bawaan SageMaker populer berikut: XGBoost, Pembelajar Linier, Hutan Tebang Acak (RCF), dan K-Tetangga Terdekat (KN). Anda dapat langsung menggunakan wadah yang disediakan SageMaker saat menggunakan algoritme ini tanpa harus membuat wadah khusus Anda sendiri.

Diagram berikut adalah ilustrasi sederhana tentang bagaimana Anda dapat meng-host beberapa (untuk posting ini, enam) model menggunakan titik akhir multi-model SageMaker. Dalam praktiknya, titik akhir multi-model dapat menampung ratusan hingga puluhan ribu model ML di belakang titik akhir. Dalam arsitektur kami, jika kami meng-host lebih banyak model menggunakan artefak model yang disimpan di Layanan Penyimpanan Sederhana Amazon (Amazon S3), titik akhir multi-model secara dinamis membongkar beberapa model yang paling jarang digunakan untuk mengakomodasi model yang lebih baru.

Dalam postingan ini, kami menunjukkan cara menghosting dua model visi komputer yang dilatih menggunakan kerangka kerja TensorFlow di belakang satu titik akhir multi-model SageMaker. Kami menggunakan Melayani TensorFlow wadah diaktifkan untuk titik akhir multi-model untuk meng-host model ini. Untuk model pertama kami, kami melatih versi yang lebih kecil dari AlexNet CNN untuk mengklasifikasikan gambar dari CIFAR-10 Himpunan data. Untuk model kedua, kami menggunakan VGG16 Model CNN telah dilatih sebelumnya di IMAGEnet kumpulan data dan disetel dengan baik pada Kumpulan Data Digit Bahasa Isyarat untuk mengklasifikasikan gambar simbol tangan. Kami juga menyediakan yang berfungsi penuh buku catatan untuk mendemonstrasikan semua langkah.

Model 1: Klasifikasi gambar CIFAR-10

CIFAR-10 adalah dataset benchmark untuk klasifikasi citra dalam computer vision dan ML. Gambar CIFAR diwarnai (tiga saluran) dengan variasi dramatis dalam bagaimana objek muncul. Ini terdiri dari 32 × 32 gambar berwarna dalam 10 kelas, dengan 6,000 gambar per kelas. Ini berisi 50,000 gambar pelatihan dan 10,000 gambar uji. Gambar berikut menunjukkan contoh gambar yang dikelompokkan berdasarkan label.

Untuk membangun pengklasifikasi gambar, kami menggunakan versi sederhana dari AlexNet CNN klasik. Jaringan ini terdiri dari lima lapisan convolutional dan pooling, dan tiga lapisan yang terhubung penuh. Arsitektur kami yang disederhanakan menumpuk tiga lapisan konvolusi dan dua lapisan (padat) yang terhubung penuh.

Langkah pertama adalah memuat dataset ke dalam objek latih dan uji. Framework TensorFlow menyediakan set data CIFAR untuk kita muat menggunakan metode load_data(). Selanjutnya, kami mengubah skala gambar input dengan membagi nilai piksel dengan 255: [0,255] [0,1]. Kami juga perlu menyiapkan label menggunakan pengkodean satu-panas. Satu pengkodean panas adalah proses di mana variabel kategoris diubah menjadi bentuk numerik. Cuplikan kode berikut menunjukkan langkah-langkah ini dalam tindakan:

from tensorflow.keras.datasets import cifar10 # load dataset
(X_train, y_train), (X_test, y_test) = cifar10.load_data() # rescale input images
X_train = X_train.astype('float32')/255
X_test = X_test.astype('float32')/255 # one hot encode target labels
num_classes = len(np.unique(y_train))
y_train = utils.to_categorical(y_train, num_classes)
y_test = utils.to_categorical(y_test, num_classes)

Setelah set data disiapkan dan siap untuk pelatihan, data tersebut disimpan ke Amazon S3 untuk digunakan oleh SageMaker. Arsitektur model dan kode pelatihan untuk pengklasifikasi gambar dirangkai menjadi skrip pelatihan (cifar_train.py). Untuk menghasilkan kumpulan data gambar tensor untuk proses pelatihan, kami menggunakan ImageDataGenerator. Hal ini memungkinkan kami untuk menerapkan transformasi augmentasi data seperti rotasi, lebar, dan pergeseran tinggi ke data pelatihan kami.

Pada langkah berikutnya, kami menggunakan skrip pelatihan untuk membuat penaksir TensorFlow menggunakan SageMaker SDK (lihat kode berikut). Kami menggunakan estimator agar sesuai dengan model CNN pada input CIFAR-10. Saat pelatihan selesai, model disimpan ke Amazon S3.

from sagemaker.tensorflow import TensorFlow model_name = 'cifar-10' hyperparameters = {'epochs': 50} estimator_parameters = {'entry_point':'cifar_train.py', 'instance_type': 'ml.m5.2xlarge', 'instance_count': 2, 'model_dir': f'/opt/ml/model', 'role': role, 'hyperparameters': hyperparameters, 'output_path': f's3://{BUCKET}/{PREFIX}/cifar_10/out', 'base_job_name': f'mme-cv-{model_name}', 'framework_version': TF_FRAMEWORK_VERSION, 'py_version': 'py37', 'script_mode': True} estimator_1 = TensorFlow(**estimator_parameters) estimator_1.fit(inputs)

Kemudian, kami mendemonstrasikan cara meng-host model ini menggunakan titik akhir multi-model SageMaker bersama model kedua kami (pengklasifikasi digit bahasa isyarat).

Model 2: Klasifikasi digit bahasa isyarat

Untuk model kedua kami, kami menggunakan dataset digit bahasa isyarat. Dataset ini membedakan digit bahasa isyarat dari 0–9. Gambar berikut menunjukkan contoh kumpulan data.

Dataset berisi 100 x 100 gambar dalam warna RGB dan memiliki 10 kelas (digit 0–9). Set pelatihan berisi 1,712 gambar, set validasi 300, dan set uji 50.

Dataset ini sangat kecil. Melatih jaringan dari awal pada set data kecil ini tidak mencapai hasil yang baik. Untuk mencapai akurasi yang lebih tinggi, kami menggunakan transfer pengetahuan. Pembelajaran transfer biasanya merupakan pendekatan yang tepat saat memulai proyek klasifikasi, terutama saat Anda tidak memiliki banyak data pelatihan. Ini memigrasikan pengetahuan yang dipelajari dari kumpulan data sumber ke kumpulan data target, untuk menghemat waktu pelatihan dan biaya komputasi.

Untuk melatih model ini, kami menggunakan model CNN VGG16 terlatih yang dilatih pada dataset ImageNet dan menyempurnakannya untuk bekerja pada dataset digit bahasa isyarat kami. Model pra-pelatihan adalah jaringan yang sebelumnya telah dilatih pada kumpulan data besar, biasanya pada tugas klasifikasi gambar skala besar. Arsitektur model VGG16 yang kami gunakan memiliki total 13 lapisan konvolusi. Untuk kumpulan data bahasa isyarat, karena domainnya berbeda dari domain sumber kumpulan data ImageNet, kami hanya menyempurnakan beberapa lapisan terakhir. Penyesuaian halus di sini mengacu pada pembekuan beberapa lapisan jaringan yang digunakan untuk ekstraksi fitur, dan bersama-sama melatih lapisan non-beku dan lapisan pengklasifikasi yang baru ditambahkan dari model yang telah dilatih sebelumnya.

Skrip pelatihan (sign_bahasa_train.py) merangkum arsitektur model dan logika pelatihan untuk pengklasifikasi digit bahasa isyarat. Pertama, kami memuat bobot yang telah dilatih sebelumnya dari jaringan VGG16 yang dilatih pada dataset ImageNet. Selanjutnya, kami membekukan bagian dari bagian ekstraktor fitur, diikuti dengan menambahkan lapisan pengklasifikasi baru. Terakhir, kami mengkompilasi jaringan dan menjalankan proses pelatihan untuk mengoptimalkan model untuk kumpulan data yang lebih kecil.

Selanjutnya, kami menggunakan skrip pelatihan ini untuk membuat penaksir TensorFlow menggunakan SageMaker SDK. Penaksir ini digunakan untuk menyesuaikan pengklasifikasi digit bahasa isyarat pada input yang disediakan. Saat pelatihan selesai, model disimpan ke Amazon S3 untuk dihosting oleh titik akhir multi-model SageMaker. Lihat kode berikut:

model_name = 'sign-language' hyperparameters = {'epochs': 50} estimator_parameters = {'entry_point':'sign_language_train.py', 'instance_type': 'ml.m5.2xlarge', 'instance_count': 2, 'hyperparameters': hyperparameters, 'model_dir': f'/opt/ml/model', 'role': role, 'output_path': f's3://{BUCKET}/{PREFIX}/sign_language/out', 'base_job_name': f'cv-{model_name}', 'framework_version': TF_FRAMEWORK_VERSION, 'py_version': 'py37', 'script_mode': True} estimator_2 = TensorFlow(**estimator_parameters) estimator_2.fit({'train': train_input, 'val': val_input})

Terapkan titik akhir multi-model

Titik akhir multi-model SageMaker memberikan solusi skalabel dan hemat biaya untuk menerapkan sejumlah besar model. Ini menggunakan wadah penyajian bersama yang diaktifkan untuk meng-host beberapa model. Ini mengurangi biaya hosting dengan meningkatkan pemanfaatan titik akhir dibandingkan dengan menggunakan titik akhir model tunggal. Ini juga mengurangi overhead penerapan karena SageMaker mengelola model pemuatan di memori dan menskalakannya berdasarkan pola lalu lintas ke model tersebut.

Untuk membuat titik akhir multi-model, pertama-tama kita perlu menyalin model terlatih untuk estimator individual (1 dan 2) dari lokasi S3 yang disimpan ke awalan S3 umum yang dapat digunakan oleh titik akhir multi-model:

tf_model_1 = estimator_1.model_data
output_1 = f's3://{BUCKET}/{PREFIX}/mme/cifar.tar.gz' tf_model_2 = estimator_2.model_data
output_2 = f's3://{BUCKET}/{PREFIX}/mme/sign-language.tar.gz' !aws s3 cp {tf_model_1} {output_1}
!aws s3 cp {tf_model_2} {output_2}

Setelah model disalin ke lokasi umum yang ditentukan oleh awalan S3, kami membuat model penyajian menggunakan kelas TensorFlowModel dari SageMaker SDK. Model penyajian dibuat untuk salah satu model yang akan dihosting di bawah titik akhir multi-model. Dalam hal ini, kami menggunakan model pertama (pengklasifikasi gambar CIFAR-10). Selanjutnya, kita menggunakan kelas MultiDataModel dari SageMaker SDK untuk membuat model data multi-model menggunakan model penyajian untuk model-1, yang kita buat pada langkah sebelumnya:

from sagemaker.tensorflow.serving import TensorFlowModel
from sagemaker.multidatamodel import MultiDataModel model_1 = TensorFlowModel(model_data=output_1, role=role, image_uri=IMAGE_URI) mme = MultiDataModel(name=f'mme-tensorflow-{current_time}', model_data_prefix=model_data_prefix, model=model_1, sagemaker_session=sagemaker_session)

Terakhir, kami menerapkan MultiDataModel dengan memanggil metode deploy(), menyediakan atribut yang diperlukan untuk membuat infrastruktur hosting yang diperlukan untuk mendukung titik akhir multi-model:

predictor = mme.deploy(initial_instance_count=2, instance_type='ml.m5.2xlarge', endpoint_name=f'mme-tensorflow-{current_time}')

Panggilan penyebaran mengembalikan instance prediktor, yang dapat kita gunakan untuk membuat panggilan inferensi. Kita lihat ini di bagian selanjutnya.

Uji titik akhir multi-model untuk inferensi waktu nyata

Titik akhir multi-model memungkinkan berbagi sumber daya memori di seluruh model Anda. Jika model yang direferensikan sudah di-cache, titik akhir multi-model segera menjalankan inferensi. Di sisi lain, jika model yang diminta tertentu tidak di-cache, SageMaker harus mengunduh model, yang meningkatkan latensi untuk permintaan awal tersebut. Namun, ini hanya membutuhkan sebagian kecil dari waktu yang diperlukan untuk meluncurkan infrastruktur (instance) yang sama sekali baru untuk meng-host model secara individual di SageMaker. Setelah model di-cache di titik akhir multi-model, permintaan berikutnya dimulai secara real time (kecuali model dihapus). Akibatnya, Anda dapat menjalankan banyak model dari satu instans, secara efektif memisahkan kuantitas model kami dari biaya penerapan kami. Hal ini memudahkan untuk mengelola penerapan ML dalam skala besar dan menurunkan biaya penerapan model Anda melalui peningkatan penggunaan titik akhir dan instans komputasi yang mendasarinya. Untuk informasi lebih lanjut dan demonstrasi penghematan biaya lebih dari 90% untuk 1,000 contoh model, lihat Hemat biaya inferensi menggunakan titik akhir multi-model Amazon SageMaker.

Titik akhir multi-model juga membongkar model yang tidak digunakan dari penampung saat instans yang mendukung titik akhir mencapai kapasitas memori dan lebih banyak model perlu dimuat ke dalam penampungnya. SageMaker menghapus artefak model yang tidak digunakan dari volume penyimpanan instans saat volume mencapai kapasitas dan model baru perlu diunduh. Pemanggilan pertama ke model yang baru ditambahkan membutuhkan waktu lebih lama karena titik akhir membutuhkan waktu untuk mengunduh model dari Amazon S3 ke memori container dari instans yang mendukung titik akhir multi-model. Model yang dibongkar tetap berada di volume penyimpanan instans dan dapat dimuat ke dalam memori penampung nanti tanpa diunduh lagi dari bucket S3.

Mari kita lihat bagaimana membuat inferensi dari pengklasifikasi gambar CIFAR-10 (model-1) yang dihosting di bawah titik akhir multi-model. Pertama, kita memuat gambar sampel dari salah satu kelas—pesawat—dan menyiapkannya untuk dikirim ke titik akhir multi-model menggunakan prediktor yang kita buat di langkah sebelumnya.

Dengan prediktor ini, kita dapat memanggil metode predict() bersama dengan parameter initial_args, yang menentukan nama model target yang akan dipanggil. Dalam hal ini, model targetnya adalah cifar.tar.gz. Cuplikan berikut menunjukkan proses ini secara rinci:

img = load_img('./data/cifar_10/raw_images/airplane.png', target_size=(32, 32))
data = img_to_array(img)
data = data.astype('float32')
data = data / 255.0
data = data.reshape(1, 32, 32, 3)
payload = {'instances': data}
y_pred = predictor.predict(data=payload, initial_args={'TargetModel': 'cifar.tar.gz'})
predicted_label = CIFAR10_LABELS[np.argmax(y_pred)]
print(f'Predicted Label: [{predicted_label}]')

Menjalankan kode sebelumnya akan mengembalikan output prediksi sebagai pesawat label, yang ditafsirkan dengan benar oleh model yang kami layani:

Predicted Label: [airplane]

Selanjutnya, mari kita lihat bagaimana memuat secara dinamis pengklasifikasi digit bahasa isyarat (model-2) ke dalam titik akhir multi-model dengan menggunakan titik akhir dengan bahasa isyarat.tar.gz sebagai model target.

Kami menggunakan contoh gambar berikut dari angka tanda tangan 0.

Cuplikan berikut menunjukkan cara memanggil titik akhir multi-model dengan gambar sampel untuk mendapatkan kembali respons yang benar:

test_path = './data/sign_language/test'
img = mpimg.imread(f'{test_path}/0/IMG_4159.JPG') def path_to_tensor(img_path): # loads RGB image as PIL.Image.Image type img = image.load_img(img_path, target_size=(224, 224)) # convert PIL.Image.Image type to 3D tensor with shape (224, 224, 3) x = image.img_to_array(img) # convert 3D tensor to 4D tensor with shape (1, 224, 224, 3) and return 4D tensor return np.expand_dims(x, axis=0) data = path_to_tensor(f'{test_path}/0/IMG_4159.JPG')
payload = {'instances': data}
y_pred = predictor.predict(data=payload, initial_args={'TargetModel': 'sign-language.tar.gz'})predicted_label = np.argmax(y_pred)
print(f'Predicted Label: [{predicted_label}]')

Kode berikut adalah respons kami, dengan label 0:

Predicted Label: [0]

Kesimpulan

Dalam posting ini, kami mendemonstrasikan fitur SageMaker titik akhir multi-model untuk mengoptimalkan biaya inferensi. Titik akhir multi-model berguna saat Anda berurusan dengan ratusan hingga puluhan ribu model dan di mana Anda tidak perlu menerapkan setiap model sebagai titik akhir individu. Model dimuat dan dibongkar secara dinamis, sesuai dengan penggunaan dan jumlah memori yang tersedia di titik akhir.

Postingan ini membahas cara menghosting beberapa model visi komputer yang dilatih menggunakan kerangka kerja TensorFlow di bawah satu titik akhir multi-model SageMaker. Model klasifikasi gambar dari arsitektur model yang berbeda dan dilatih pada dataset yang berbeda. Itu buku catatan disertakan dengan pos memberikan petunjuk rinci tentang pelatihan dan hosting model.

Cobalah titik akhir multi-model SageMaker untuk kasus penggunaan Anda dan tinggalkan umpan balik Anda di komentar.


Tentang Penulis

Arunprasath Shankar adalah Arsitek Solusi Spesialis Kecerdasan Buatan dan Pembelajaran Mesin (AI / ML) dengan AWS, membantu pelanggan global menskalakan solusi AI mereka secara efektif dan efisien di cloud. Di waktu senggangnya, Arun suka menonton film sci-fi dan mendengarkan musik klasik.

Tandai Roy adalah Arsitek Pembelajaran Mesin Utama untuk AWS, membantu pelanggan AWS merancang dan membangun solusi AI/ML. Pekerjaan Mark mencakup berbagai kasus penggunaan ML, dengan minat utama pada visi komputer, pembelajaran mendalam, dan penskalaan ML di seluruh perusahaan. Dia telah membantu perusahaan di banyak industri, termasuk Asuransi, Jasa Keuangan, Media dan Hiburan, Perawatan Kesehatan, Utilitas, dan Manufaktur. Mark memegang enam sertifikasi AWS, termasuk ML Specialty Certification. Sebelum bergabung dengan AWS, Mark adalah seorang arsitek, pengembang, dan pemimpin teknologi selama 25+ tahun, termasuk 19 tahun di layanan keuangan.

Sumber: https://aws.amazon.com/blogs/machine-learning/host-multiple-tensorflow-computer-vision-models-using-amazon-sagemaker-multi-model-endpoints/

Stempel Waktu:

Lebih dari Blog Pembelajaran Mesin AWS