אירח מספר דגמי ראיית מחשב של TensorFlow באמצעות נקודות קצה רב-מודליות של אמזון SageMaker

צומת המקור: 1853804

אמזון SageMaker מסייע למדעני נתונים ומפתחים להכין, לבנות, להכשיר ולפרוס מודלים של למידת מכונה באיכות גבוהה (ML) במהירות על ידי איחוד מערך רחב של יכולות שנבנו במיוחד עבור ML. SageMaker מאיץ את החדשנות בארגון שלך על ידי מתן כלים ייעודיים לכל שלב בפיתוח ML, כולל תיוג, הכנת נתונים, הנדסת תכונות, איתור הטיה סטטיסטית, AutoML, הדרכה, כיוונון, אירוח, הסבר, ניטור ואוטומציה של זרימת עבודה.

חברות מכשירות יותר ויותר דגמי ML המבוססים על נתוני משתמשים בודדים. לדוגמא, שירות שיתוף תמונות שנועד לאפשר גילוי מידע באינטרנט מכשיר מודלים מותאמים אישית המבוססים על תמונות המשתמשים שהועלו והיסטוריית הגלישה כדי להתאים אישית את ההמלצות עבור אותו משתמש. החברה יכולה גם להכשיר מודלים מותאמים אישית המבוססים על נושאי חיפוש להמלצה על תמונות לכל נושא. בניית דגמי ML מותאמים אישית לכל מקרה שימוש מובילה לדיוק היסק גבוה יותר, אך מעלה את עלות הפריסה והניהול של המודלים. אתגרים אלה בולטים יותר כאשר לא כל הדגמים ניגשים באותו קצב אך עדיין צריכים להיות זמינים בכל עת.

SageMaker נקודות קצה מרובות-מודלים לספק דרך ניתנת להרחבה וחסכונית לפרוס מספר גדול של דגמי ML בענן. נקודות קצה מרובות-מודלים של SageMaker מאפשרות לך לפרוס מספר דגמי ML מאחורי נקודת קצה אחת ולהגיש אותם באמצעות מיכל הגשה יחיד. היישום שלך פשוט צריך לכלול שיחת API עם מודל היעד לנקודת קצה זו כדי להגיע להסקת תפוקה גבוהה עם חביון נמוך. במקום לשלם עבור נקודת קצה נפרדת עבור כל דגם אחד, תוכלו לארח דגמים רבים במחיר נקודת קצה אחת. לקבלת מידע נוסף אודות נקודות קצה מרובות-מודלים של SageMaker, ראה חסוך בעלויות הסקה באמצעות נקודות קצה של מודל רב-מודל של אמזון.

בפוסט זה אנו מדגימים כיצד להשתמש בנקודות קצה מרובות-מודלים של SageMaker כדי לארח שני מודלים לראיית מחשב עם ארכיטקטורות ומערכי נתונים שונים לסיווג תמונות. בפועל, אתה יכול לפרוס עשרות אלפי מודלים בנקודות קצה מרובות-מודלים.

סקירה כללית של הפיתרון

נקודות קצה מרובות-מודלים של SageMaker עובדות עם מספר מסגרות, כגון TensorFlow, PyTorch, MXNet ו- sklearn, ותוכל בנה מיכל משלך באמצעות שרת רב-מודלים. נקודות קצה מרובות מודלים נתמכות באופן מקורי באלגוריתמים המובנים הבאים של SageMaker: XGBoost, לומד ליניארי, יער חתוך אקראי (RCF), ו השכנים הקרובים ביותר (KNN). אתה יכול להשתמש ישירות במיכלים המסופקים על ידי SageMaker תוך שימוש באלגוריתמים אלה מבלי שתצטרך לבנות מיכל מותאם אישית משלך.

התרשים הבא הוא המחשה פשוטה של ​​האופן בו ניתן לארח מספר דגמים (עבור הודעה זו, שישה) באמצעות נקודות קצה מרובות-מודלים של SageMaker. בפועל, נקודות קצה מרובות-מודלים יכולות להכיל מאות עד עשרות אלפי דגמי ML מאחורי נקודת קצה. בארכיטקטורה שלנו, אם אנו מארחים יותר דגמים המשתמשים בחפצי מודל המאוחסנים ב שירות אחסון פשוט של אמזון (Amazon S3), נקודות קצה מרובות-מודלים פורקות באופן דינמי כמה מהדגמים הפחות בשימוש כדי להתאים לדגמים חדשים יותר.

בפוסט זה אנו מראים כיצד לארח שני מודלים לראיית מחשב שהוכשרו באמצעות מסגרת TensorFlow מאחורי נקודת קצה אחת מרובת-מודלים של SageMaker. אנו משתמשים ב- הגשת TensorFlow מיכל מופעל לנקודות קצה מרובות-דגמים לארח דגמים אלה. עבור הדגם הראשון שלנו, אנו מכשירים גרסה קטנה יותר של אלכסנט CNN לסווג תמונות מה- CIFAR-10 מערך נתונים. עבור הדגם השני, אנו משתמשים ב- VGG16 מודל CNN שהופעל לפני כן על אימג'נט מערך נתונים וכוונון עדין על ה- מערך נתונים של ספרות בשפת הסימנים לסווג תמונות סמלי יד. אנו מספקים גם פונקציונליות מלאה מחברה כדי להדגים את כל השלבים.

דגם 1: סיווג תמונות CIFAR-10

CIFAR-10 הוא מערך אמת מידה לסיווג תמונות בראיית מחשב ו- ML. תמונות CIFAR צבעוניות (שלושה ערוצים) עם שונות דרמטית באופן הופעת האובייקטים. הוא מורכב מ 32 × 32 תמונות צבעוניות ב -10 כיתות, עם 6,000 תמונות בכיתה. הוא מכיל 50,000 תמונות אימון ו -10,000 תמונות בדיקה. התמונה הבאה מציגה דוגמה של התמונות מקובצות לפי התוויות.

כדי לבנות את מסווג התמונות, אנו משתמשים בגרסה פשוטה של ​​CNN הקלאסי של AlexNet. הרשת מורכבת מחמש שכבות סיבוב ומאגר, ושלוש שכבות מחוברות לחלוטין. הארכיטקטורה הפשוטה שלנו מערימה שלוש שכבות עוויתות ושתי שכבות מחוברות (צפופות) לחלוטין.

השלב הראשון הוא לטעון את מערך הנתונים לאוביינות הרכבת ולבדוק. מסגרת TensorFlow מספקת את מערך הנתונים CIFAR עבורנו לטעינה בשיטת load_data (). לאחר מכן אנו משנים את תמונות הקלט מחדש על ידי חלוקת ערכי הפיקסלים ב- 255: [0,255] ⇒ [0,1]. עלינו גם להכין את התוויות באמצעות קידוד חם. קידוד חם אחד הוא תהליך שבו המשתנים הקטגוריים מומרים לצורה מספרית. קטע הקוד הבא מציג את הפעולות הבאות:

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)

לאחר הכנת מערך הנתונים ומוכן להכשרה, הוא נשמר ב- Amazon S3 כדי שישמש את SageMaker. ארכיטקטורת המודל וקוד האימון של מסווג התמונה מורכבים לתסריט אימונים (cifar_train.py). כדי ליצור קבוצות של נתוני תמונה של טנסור לתהליך האימון, אנו משתמשים ב- ImageDataGenerator. זה מאפשר לנו להחיל טרנספורמציות הגדלת נתונים כמו סיבוב, רוחב ומשמרות גובה על נתוני האימון שלנו.

בשלב הבא, אנו משתמשים בסקריפט האימונים ליצירת אומדן TensorFlow באמצעות SageMaker SDK (ראה הקוד הבא). אנו משתמשים באומדן בכדי להתאים את דגם ה- CNN לתשומות CIFAR-10. לאחר סיום האימון, המודל נשמר ב- 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)

בהמשך אנו מדגימים כיצד לארח את המודל הזה באמצעות נקודת קצה רב מודלית של SageMaker לצד המודל השני שלנו (המסווג ספרות בשפת הסימנים).

דגם 2: סיווג ספרות בשפת הסימנים

עבור המודל השני שלנו, אנו משתמשים במערך הספרות של שפת הסימנים. מערך נתונים זה מבדיל את הספרות בשפת הסימנים בין 0–9. התמונה הבאה מציגה דוגמה של מערך הנתונים.

מערך הנתונים מכיל 100 x 100 תמונות בצבע RGB ויש לו 10 מחלקות (ספרות 0–9). ערכת האימונים מכילה 1,712 תמונות, מערך האימות 300 ומערכת המבחנים 50.

מערך נתונים זה קטן מאוד. הכשרת רשת מאפס על מערך נתונים קטן זה אינה משיגה תוצאות טובות. כדי להשיג דיוק גבוה יותר, אנו משתמשים להעביר למידה. למידה בהעברה היא בדרך כלל גישה לפתיחת פרויקט סיווג, במיוחד כשאין לך הרבה נתוני אימון. זה מעביר את הידע שנלמד ממערך המקור למערך היעד, כדי לחסוך זמן אימון ועלות חישובית.

כדי להכשיר מודל זה, אנו משתמשים במודל VGG16 CNN שהוכשר מראש במערך הנתונים של ImageNet וכוונן אותו לעבודה על מערך הספרות שלנו בשפות הסימנים. מודל מאומן מראש הוא רשת שהוכשרה בעבר במערך נתונים גדול, בדרך כלל במשימה של סיווג תמונות בקנה מידה גדול. בארכיטקטורת המודל VGG16 בה אנו משתמשים יש 13 שכבות סיבוביות בסך הכל. עבור מאגר הנתונים של שפת הסימנים, מכיוון שהתחום שלו שונה מתחום המקור של מערך הנתונים ImageNet, אנחנו רק מכוונים את השכבות האחרונות. כוונון עדין כאן מתייחס להקפאה של כמה משכבות הרשת המשמשות לחילוץ תכונות, והכשרה משותפת הן של השכבות הלא קפואות והן של שכבות הסיווג החדשות של המודל המאומן מראש.

תסריט ההדרכה (sign_language_train.py) מקפל את ארכיטקטורת המודל ואת לוגיקת האימונים עבור מסווג הספרות בשפת הסימנים. ראשית, נטען את המשקולות המוגדרות מראש מרשת VGG16 שהוכשרו במערך הנתונים של ImageNet. לאחר מכן, אנו מקפיאים חלק מחלק חילוץ התכונות, ולאחר מכן מוסיפים את שכבות הסיווג החדשות. לבסוף, אנו מרכיבים את הרשת ומפעילים את תהליך ההדרכה כדי לייעל את המודל עבור מערך הנתונים הקטן יותר.

לאחר מכן, אנו משתמשים בסקריפט אימונים זה כדי ליצור אומדן TensorFlow באמצעות SDK SageMaker. אומדן זה משמש להתאמת מסווג הספרות של שפת הסימנים לתשומות שסופקו. לאחר סיום האימון, המודל נשמר ב- Amazon S3 כדי להתארח על ידי נקודות קצה מרובות-מודלים של SageMaker. ראה את הקוד הבא:

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})

פרוס נקודת קצה מרובת-מודלים

נקודות קצה מרובות-מודלים של SageMaker מספקות פיתרון מדרגי וחסכוני לפריסת מספר גדול של דגמים. הוא משתמש במיכל הגשה משותף שמופעל לארח מספר דגמים. זה מפחית את עלויות האירוח על ידי שיפור ניצול נקודות הקצה בהשוואה לשימוש בנקודות קצה של מודל יחיד. זה גם מקטין את תקופת הפריסה מכיוון ש- SageMaker מנהל טעינת מודלים בזיכרון ומדרג אותם על סמך דפוסי התעבורה אליהם.

כדי ליצור את נקודת הקצה הרב-מודלית, ראשית עלינו להעתיק את המודלים המאומנים עבור האומדים הבודדים (1 ו -2) ממיקומי S3 השמורים שלהם לקידומת S3 משותפת שיכולה לשמש את נקודת הקצה הרב-מודלית:

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}

לאחר שהמודלים מועתקים למיקום המשותף המיועד על ידי הקידומת S3, אנו יוצרים מודל הגשה באמצעות המחלקה TensorFlowModel מ- SageMaker SDK. מודל ההגשה נוצר עבור אחד מהדגמים שיתארחו תחת נקודת הקצה הרב מודל. במקרה זה אנו משתמשים בדגם הראשון (מסווג התמונות CIFAR-10). לאחר מכן, אנו משתמשים במחלקה MultiDataModel מ- SageMaker SDK ליצירת מודל נתונים רב-מודלי באמצעות מודל ההגשה עבור דגם 1, אותו יצרנו בשלב הקודם:

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)

לבסוף, אנו פורסים את MultiDataModel על ידי קריאה לשיטת deploy () ומספקים את התכונות הדרושות ליצירת תשתית האחסון הנדרשת לגיבוי נקודת הקצה הרב מודל:

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

שיחת הפריסה מחזירה מופע מנבא, בו נוכל לבצע שיחות הסקה. אנו רואים זאת בחלק הבא.

בדוק את נקודת הסיום הרב מודל לגבי הימצאות בזמן אמת

נקודות קצה מרובות מודלים מאפשרות שיתוף משאבי זיכרון בין המודלים שלך. אם המודל שאליו מפנים כבר מטמון, נקודות קצה מרובות-מודלים מפעילות הסקה מיידית. מצד שני, אם המודל המבוקש הספציפי אינו מאוחסן במטמון, SageMaker צריך להוריד את המודל, מה שמגדיל את החביון לבקשה הראשונית הזו. עם זאת, זה לוקח רק חלק קטן מהזמן שייקח להשקת תשתית (מקרים) חדשים לחלוטין לארח את הדגם בנפרד ב- SageMaker. לאחר שמטמון מודל בנקודת הקצה המרובת-מודלים, בקשות עוקבות מתחילות בזמן אמת (אלא אם כן המודל מוסר). כתוצאה מכך, אתה יכול להריץ דגמים רבים ממופע אחד, ולנתק למעשה את כמות המודלים שלנו מעלות הפריסה שלנו. זה מקל על ניהול פריסות ה- ML בקנה מידה נמוך ומוזיל את עלויות הפריסה של המודל שלך באמצעות שימוש מוגבר בנקודת הקצה ובמופעי המחשוב הבסיסיים שלה. למידע נוסף והדגמה של חיסכון בעלויות של מעל 90% לדוגמא של 1,000 דגמים, ראה חסוך בעלויות ההסקות באמצעות נקודות קצה רב-מודליות של אמזון SageMaker.

נקודות קצה מרובות-מודלים פורקות גם מהמודל דגמים שאינם בשימוש כאשר המופעים המגבים את נקודת הקצה מגיעים לקיבולת זיכרון ויש צורך להעלות דגמים נוספים למיכל שלה. SageMaker מוחק חפצי מודל שאינם בשימוש מנפח האחסון של המופע כאשר הנפח מגיע לקיבולת ויש צורך להוריד דגמים חדשים. הפנייה הראשונה למודל שנוסף לאחרונה אורכת זמן רב יותר מכיוון שלנקודת הקצה לוקח זמן להוריד את הדגם מאמזון S3 לזיכרון המכולה של המקרים המגבים את נקודת הקצה הרב-מודלית. מודלים שנפרקו נשארים על נפח האחסון של המופע וניתן לטעון אותם בזיכרון המכולה מאוחר יותר מבלי להוריד אותם שוב מדלי S3.

בואו נראה כיצד להסיק ממסווג התמונות CIFAR-10 (דגם 1) המתארח מתחת לנקודת הקצה הרב-מודל. ראשית, אנו מעמיסים תמונת דוגמא מאחת הכיתות - מטוס - ומכינים אותה לשליחה לנקודת הקצה הרב-מודלית באמצעות המנבא שיצרנו בשלב הקודם.

בעזרת מנבא זה, אנו יכולים לקרוא לשיטת החיזוי () יחד עם הפרמטר initial_args, המפרט את שם מודל היעד שיש להפעיל. במקרה זה, מודל היעד הוא cifar.tar.gz. הקטע הבא מדגים את התהליך בפירוט:

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}]')

הפעלת הקוד הקודם מחזירה את פלט החיזוי כמטוס התווית, המתפרש כהלכה על ידי המודל המוגש שלנו:

Predicted Label: [airplane]

לאחר מכן, בואו נראה כיצד לטעון באופן דינמי את מסווג הספרות של שפת הסימנים (דגם -2) לנקודת קצה רב-מודל על ידי הפעלת נקודת הסיום עם שפת הסימנים.tar.gz כמודל היעד.

אנו משתמשים בתמונה לדוגמה הבאה של ספרת יד 0.

קטע הקוד הבא מראה כיצד להפעיל את נקודת הקצה מרובת הדגמים עם תמונת הדוגמה כדי להחזיר את התגובה הנכונה:

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}]')

הקוד הבא הוא התגובה שלנו, עם התווית 0:

Predicted Label: [0]

סיכום

בפוסט זה הדגמנו את התכונה SageMaker נקודות קצה מרובות-מודלים כדי לייעל את עלויות ההיסק. נקודות קצה מרובות מודלים שימושיות כאשר אתה מתמודד עם מאות עד עשרות אלפי מודלים וכאשר אינך צריך לפרוס כל דגם כנקודת קצה בודדת. מודלים נטענים ופורקים באופן דינמי, על פי השימוש וכמות הזיכרון הזמינה בנקודת הקצה.

פוסט זה דן כיצד לארח מספר דגמי ראיית מחשב שהוכשרו באמצעות מסגרת TensorFlow תחת נקודת קצה רב מודאלית אחת של SageMaker. המודלים לסיווג התמונות היו בארכיטקטורות שונות של מודלים והוכשרו על מערכי נתונים שונים. ה מחברה הכלול בפוסט מספק הוראות מפורטות לאימון ואירוח הדגמים.

נסה לנקודות קצה מרובות-מודלים של SageMaker לנסות את מקרה השימוש שלך והשאיר את המשוב שלך בתגובות.


על הכותבים

ארונפרשת שנקר הוא אדריכל פתרונות מומחים לבינה מלאכותית ולמידת מכונות (AI / ML) עם AWS, המסייע ללקוחות גלובליים לשנות את פתרונות ה- AI שלהם ביעילות וביעילות בענן. בזמנו הפנוי, ארון נהנה לצפות בסרטי מדע בדיוני ולהאזין למוזיקה קלאסית.

מארק רוי הוא אדריכל ראשי למידת מכונות עבור AWS, המסייע ללקוחות AWS לתכנן ולבנות פתרונות AI / ML. עבודתו של מארק מכסה מגוון רחב של מקרים לשימוש ב- ML, תוך התעניינות ראשונית בראייה ממוחשבת, למידה עמוקה והיקף ML ברחבי הארגון. הוא סייע לחברות בענפים רבים, כולל ביטוח, שירותים פיננסיים, מדיה ובידור, שירותי בריאות, כלי עזר ותעשייה. מארק מחזיק בשש אישורי AWS, כולל הסמכת ML. לפני שהצטרף ל- AWS, היה מארק אדריכל, מפתח ומוביל טכנולוגיה במשך 25+ שנים, כולל 19 שנים בשירותים פיננסיים.

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

בול זמן:

עוד מ בלוג למידת מכונות AWS