شعار زيفيرنت

قم ببناء ونشر تطبيقات استدلال تعلم الآلة من البداية باستخدام Amazon SageMaker | خدمات الويب الأمازون

التاريخ:

مع انتشار التعلم الآلي (ML) وانتشاره على نطاق أوسع، أصبحت تطبيقات الاستدلال التي تعتمد على التعلم الآلي شائعة بشكل متزايد لحل مجموعة من مشاكل الأعمال المعقدة. غالبًا ما يتطلب حل مشكلات الأعمال المعقدة هذه استخدام نماذج وخطوات متعددة لتعلم الآلة. يوضح لك هذا المنشور كيفية إنشاء تطبيق ML واستضافته باستخدام حاويات مخصصة الأمازون SageMaker.

عروض أمازون سيج ميكر خوارزميات مدمجة و SageMaker المبني مسبقًا صور عامل الإرساء لنشر النموذج. ولكن، إذا كانت هذه لا تناسب احتياجاتك، فيمكنك إحضار الحاويات الخاصة بك (BYOC) للاستضافة على Amazon SageMaker.

هناك العديد من حالات الاستخدام التي قد يحتاج فيها المستخدمون إلى BYOC للاستضافة على Amazon SageMaker.

  1. أطر عمل أو مكتبات تعلم الآلة المخصصة: إذا كنت تخطط لاستخدام إطار عمل أو مكتبات تعلم الآلة التي لا تدعمها خوارزميات Amazon SageMaker المضمنة أو الحاويات المعدة مسبقًا، فستحتاج إلى إنشاء حاوية مخصصة.
  2. النماذج المتخصصة: بالنسبة لبعض المجالات أو الصناعات، قد تحتاج إلى تصميمات نماذج محددة أو خطوات معالجة مسبقة مخصصة غير متوفرة في عروض Amazon SageMaker المضمنة.
  3. خوارزميات الملكية: إذا قمت بتطوير خوارزميات الملكية الخاصة بك داخليًا، فستحتاج إلى حاوية مخصصة لنشرها على Amazon SageMaker.
  4. خطوط أنابيب الاستدلال المعقدة: إذا كان سير عمل استدلال ML الخاص بك يتضمن منطق عمل مخصص - سلسلة من الخطوات المعقدة التي يجب تنفيذها بترتيب معين - فيمكن أن يساعدك BYOC في إدارة هذه الخطوات وتنسيقها بشكل أكثر كفاءة.

حل نظرة عامة

في هذا الحل، نعرض كيفية استضافة تطبيق استدلال تسلسلي لتعلم الآلة على Amazon SageMaker مع نقاط نهاية في الوقت الفعلي باستخدام حاويتي استدلال مخصصتين بأحدث scikit-learn و xgboost الحزم.

تستخدم الحاوية الأولى أ scikit-learn نموذج لتحويل البيانات الأولية إلى أعمدة مميزة. ينطبق مقياس قياسي للأعمدة الرقمية و OneHotEncoder إلى تلك الفئوية.

الحاوية الثانية تستضيف مدربين مسبقا XGboost النموذج (أي المتنبئ). يقبل نموذج التوقع تنبؤات المدخلات والمخرجات المميزة.

أخيرًا، نقوم بنشر ميزات و المتنبئ في مسار الاستدلال التسلسلي إلى نقطة نهاية Amazon SageMaker في الوقت الفعلي.

فيما يلي بعض الاعتبارات المختلفة حول سبب رغبتك في الحصول على حاويات منفصلة داخل تطبيق الاستدلال الخاص بك.

  • فصل - الخطوات المختلفة لخط الأنابيب لها غرض محدد بوضوح ويجب تشغيلها على حاويات منفصلة بسبب التبعيات الأساسية المعنية. يساعد هذا أيضًا في الحفاظ على تنظيم خط الأنابيب جيدًا.
  • أُطر الأعمال - تستخدم الخطوات المختلفة لخط الأنابيب إطارات عمل محددة مناسبة للغرض (مثل scikit أو Spark ML) وبالتالي يلزم تشغيلها في حاويات منفصلة.
  • عزل الموارد - الخطوات المختلفة لخط الأنابيب لها متطلبات متفاوتة لاستهلاك الموارد ، وبالتالي تحتاج إلى تشغيلها على حاويات منفصلة لمزيد من المرونة والتحكم.
  • الصيانة والتحديثات – من الناحية التشغيلية، يؤدي ذلك إلى تعزيز العزلة الوظيفية ويمكنك الاستمرار في ترقية الخطوات الفردية أو تعديلها بسهولة أكبر، دون التأثير على النماذج الأخرى.

بالإضافة إلى ذلك، يساعد البناء المحلي للحاويات الفردية في العملية التكرارية للتطوير والاختبار باستخدام الأدوات المفضلة وبيئات التطوير المتكاملة (IDEs). بمجرد أن تصبح الحاويات جاهزة، يمكنك استخدام نشرها على سحابة AWS للاستدلال باستخدام نقاط نهاية Amazon SageMaker.

التنفيذ الكامل، بما في ذلك مقتطفات التعليمات البرمجية، متاح في مستودع Github هذا هنا.

المتطلبات الأساسية المسبقة

نظرًا لأننا نختبر هذه الحاويات المخصصة محليًا أولاً، فسنحتاج إلى تثبيت docker Desktop على جهاز الكمبيوتر المحلي لديك. يجب أن تكون على دراية ببناء حاويات الإرساء.

ستحتاج أيضًا إلى حساب AWS يتمتع بإمكانية الوصول إلى Amazon SageMaker وAmazon ECR وAmazon S3 لاختبار هذا التطبيق بشكل شامل.

تأكد من حصولك على أحدث إصدار من Boto3 وتثبيت حزم Amazon SageMaker Python:

pip install --upgrade boto3 sagemaker scikit-learn

تجول الحل

إنشاء حاوية ميزات مخصصة

لبناء الحاوية الأولى، حاوية المميزات، نقوم بتدريب أ scikit-learn نموذج لمعالجة الميزات الخام في أذن البحر dataset. يستخدم البرنامج النصي للمعالجة المسبقة SimpleImputer لمعالجة القيم المفقودة، مقياس قياسي لتطبيع الأعمدة الرقمية، و OneHotEncoder لتحويل الأعمدة الفئوية. بعد تركيب المحول نقوم بحفظ النموذج فيه الوظيفة شكل. نقوم بعد ذلك بضغط وتحميل هذا النموذج المحفوظ إلى Amazon Simple Storage Service (الأمازون S3) دلو.

فيما يلي نموذج لمقتطف التعليمات البرمجية الذي يوضح ذلك. تشير إلى featurizer.ipynb للتنفيذ الكامل:

```python
numeric_features = list(feature_columns_names)
numeric_features.remove("sex")
numeric_transformer = Pipeline( steps=[ ("imputer", SimpleImputer(strategy="median")), ("scaler", StandardScaler()), ]
) categorical_features = ["sex"]
categorical_transformer = Pipeline( steps=[ ("imputer", SimpleImputer(strategy="constant", fill_value="missing")), ("onehot", OneHotEncoder(handle_unknown="ignore")), ]
) preprocess = ColumnTransformer( transformers=[ ("num", numeric_transformer, numeric_features), ("cat", categorical_transformer, categorical_features), ]
) # Call fit on ColumnTransformer to fit all transformers to X, y
preprocessor = preprocess.fit(df_train_val) # Save the processor model to disk
joblib.dump(preprocess, os.path.join(model_dir, "preprocess.joblib"))
```

بعد ذلك، لإنشاء حاوية استدلال مخصصة لنموذج المميزات، قمنا ببناء صورة Docker باستخدام حزم nginx وgunicorn وflask، بالإضافة إلى التبعيات الأخرى المطلوبة لنموذج المميزات.

سيكون تطبيق Nginx وgunicorn وتطبيق Flask بمثابة حزمة تقديم النماذج على نقاط نهاية Amazon SageMaker في الوقت الفعلي.

عند إحضار حاويات مخصصة للاستضافة على Amazon SageMaker، نحتاج إلى التأكد من أن البرنامج النصي للاستدلال يؤدي المهام التالية بعد إطلاقه داخل الحاوية:

  1. تحميل النموذج: نص الاستدلال (preprocessing.py) ينبغي الرجوع إليها /opt/ml/model الدليل لتحميل النموذج في الحاوية. سيتم تنزيل العناصر النموذجية في Amazon S3 وتثبيتها على الحاوية الموجودة في المسار /opt/ml/model.
  2. متغيرات البيئة: لتمرير متغيرات البيئة المخصصة إلى الحاوية، يجب عليك تحديدها أثناء عملية الموديل خطوة الخلق أو أثناء نقطة النهاية الخلق من وظيفة التدريب.
  3. متطلبات واجهة برمجة التطبيقات: يجب أن يقوم البرنامج النصي للاستدلال بتنفيذ كليهما /ping و /invocations طرق كتطبيق قارورة. ال /ping يتم استخدام واجهة برمجة التطبيقات (API) لإجراء فحوصات السلامة، بينما يتم استخدام /invocations تتعامل واجهة برمجة التطبيقات (API) مع طلبات الاستدلال.
  4. تسجيل: يجب كتابة سجلات الإخراج في البرنامج النصي للاستدلال إلى الإخراج القياسي (المعياري) والخطأ القياسي (ستدير) تيارات. ثم يتم تدفق هذه السجلات إلى الأمازون CloudWatch بواسطة أمازون سيج ميكر.

إليك مقتطف من preprocessing.py التي تظهر تنفيذ /ping و /invocations.

الرجوع إلى ما قبل المعالجة ضمن مجلد المميزات للتنفيذ الكامل.

```python
def load_model(): # Construct the path to the featurizer model file ft_model_path = os.path.join(MODEL_PATH, "preprocess.joblib") featurizer = None try: # Open the model file and load the featurizer using joblib with open(ft_model_path, "rb") as f: featurizer = joblib.load(f) print("Featurizer model loaded", flush=True) except FileNotFoundError: print(f"Error: Featurizer model file not found at {ft_model_path}", flush=True) except Exception as e: print(f"Error loading featurizer model: {e}", flush=True) # Return the loaded featurizer model, or None if there was an error return featurizer def transform_fn(request_body, request_content_type): """ Transform the request body into a usable numpy array for the model. This function takes the request body and content type as input, and returns a transformed numpy array that can be used as input for the prediction model. Parameters: request_body (str): The request body containing the input data. request_content_type (str): The content type of the request body. Returns: data (np.ndarray): Transformed input data as a numpy array. """ # Define the column names for the input data feature_columns_names = [ "sex", "length", "diameter", "height", "whole_weight", "shucked_weight", "viscera_weight", "shell_weight", ] label_column = "rings" # Check if the request content type is supported (text/csv) if request_content_type == "text/csv": # Load the featurizer model featurizer = load_model() # Check if the featurizer is a ColumnTransformer if isinstance( featurizer, sklearn.compose._column_transformer.ColumnTransformer ): print(f"Featurizer model loaded", flush=True) # Read the input data from the request body as a CSV file df = pd.read_csv(StringIO(request_body), header=None) # Assign column names based on the number of columns in the input data if len(df.columns) == len(feature_columns_names) + 1: # This is a labelled example, includes the ring label df.columns = feature_columns_names + [label_column] elif len(df.columns) == len(feature_columns_names): # This is an unlabelled example. df.columns = feature_columns_names # Transform the input data using the featurizer data = featurizer.transform(df) # Return the transformed data as a numpy array return data else: # Raise an error if the content type is unsupported raise ValueError("Unsupported content type: {}".format(request_content_type)) @app.route("/ping", methods=["GET"])
def ping(): # Check if the model can be loaded, set the status accordingly featurizer = load_model() status = 200 if featurizer is not None else 500 # Return the response with the determined status code return flask.Response(response="n", status=status, mimetype="application/json") @app.route("/invocations", methods=["POST"])
def invocations(): # Convert from JSON to dict print(f"Featurizer: received content type: {flask.request.content_type}") if flask.request.content_type == "text/csv": # Decode input data and transform input = flask.request.data.decode("utf-8") transformed_data = transform_fn(input, flask.request.content_type) # Format transformed_data into a csv string csv_buffer = io.StringIO() csv_writer = csv.writer(csv_buffer) for row in transformed_data: csv_writer.writerow(row) csv_buffer.seek(0) # Return the transformed data as a CSV string in the response return flask.Response(response=csv_buffer, status=200, mimetype="text/csv") else: print(f"Received: {flask.request.content_type}", flush=True) return flask.Response( response="Transformer: This predictor only supports CSV data", status=415, mimetype="text/plain", )
```

قم ببناء صورة Docker باستخدام الميزات ومكدس تقديم النموذج

لنقم الآن بإنشاء ملف Dockerfile باستخدام صورة أساسية مخصصة وتثبيت التبعيات المطلوبة.

لهذا نستخدم python:3.9-slim-buster كصورة أساسية. يمكنك تغيير هذه الصورة الأساسية الأخرى ذات الصلة بحالة الاستخدام الخاصة بك.

نقوم بعد ذلك بنسخ تكوين nginx وملف بوابة خادم الويب الخاص بـ gunicorn والنص البرمجي للاستدلال إلى الحاوية. نقوم أيضًا بإنشاء برنامج نصي بلغة بايثون يسمى "serve" الذي يطلق عمليات nginx وgunicorn في الخلفية ويعين نص الاستدلال (أي تطبيق preprocessing.py Flask) كنقطة دخول للحاوية.

فيما يلي مقتطف من ملف Dockerfile لاستضافة نموذج المميزات. للتنفيذ الكامل الرجوع إلى Dockerfile مع ميزات المجلد.

```docker
FROM python:3.9-slim-buster
… # Copy requirements.txt to /opt/program folder
COPY requirements.txt /opt/program/requirements.txt # Install packages listed in requirements.txt
RUN pip3 install --no-cache-dir -r /opt/program/requirements.txt # Copy contents of code/ dir to /opt/program
COPY code/ /opt/program/ # Set working dir to /opt/program which has the serve and inference.py scripts
WORKDIR /opt/program # Expose port 8080 for serving
EXPOSE 8080 ENTRYPOINT ["python"] # serve is a python script under code/ directory that launches nginx and gunicorn processes
CMD [ "serve" ]
```

اختبار صورة الاستدلال المخصصة باستخدام المميزات محليًا

الآن، قم ببناء واختبار حاوية الاستدلال المخصصة باستخدام الميزات محليًا باستخدام Amazon الوضع المحلي SageMaker. يعد الوضع المحلي مثاليًا لاختبار البرامج النصية للمعالجة والتدريب والاستدلال دون تشغيل أي وظائف على Amazon SageMaker. بعد التأكد من نتائج اختباراتك المحلية، يمكنك بسهولة تكييف البرامج النصية للتدريب والاستدلال للنشر على Amazon SageMaker بأقل قدر من التغييرات.

لاختبار الصورة المخصصة للمميزات محليًا، قم أولاً ببناء الصورة باستخدام ما تم تحديده مسبقًا Dockerfile. بعد ذلك، قم بتشغيل الحاوية عن طريق تثبيت الدليل الذي يحتوي على نموذج المميزات (preprocess.joblib) إلى /opt/ml/model الدليل داخل الحاوية. بالإضافة إلى ذلك، قم بتعيين المنفذ 8080 من الحاوية إلى المضيف.

بمجرد إطلاقه، يمكنك إرسال طلبات الاستدلال إلى http://localhost:8080/invocations.

لإنشاء الحاوية وتشغيلها، افتح الوحدة الطرفية وقم بتشغيل الأوامر التالية.

لاحظ أنه يجب عليك استبدال <IMAGE_NAME>، كما هو موضح في الكود التالي، مع اسم الصورة للحاوية الخاصة بك.

يفترض الأمر التالي أيضًا أن المدربين scikit-learn نموذج (preprocess.joblib) موجود ضمن دليل يسمى models.

```shell
docker build -t <IMAGE_NAME> .
``` ```shell
docker run –rm -v $(pwd)/models:/opt/ml/model -p 8080:8080 <IMAGE_NAME>
```

بعد تشغيل الحاوية، يمكننا اختبار كل من / بينغ و /الدعوات الطرق باستخدام أوامر الضفيرة.

قم بتشغيل الأوامر أدناه من المحطة

```shell
# test /ping route on local endpoint
curl http://localhost:8080/ping # send raw csv string to /invocations. Endpoint should return transformed data
curl --data-raw 'I,0.365,0.295,0.095,0.25,0.1075,0.0545,0.08,9.0' -H 'Content-Type: text/csv' -v http://localhost:8080/invocations
```

عندما يتم إرسال البيانات الأولية (غير المحولة) إلى http://localhost:8080/invocations، تستجيب نقطة النهاية بالبيانات المحولة.

يجب أن ترى ردًا مشابهًا لما يلي:

```shell
* Trying 127.0.0.1:8080...
* Connected to localhost (127.0.0.1) port 8080 (#0)
> POST /invocations HTTP/1.1
> Host: localhost: 8080
> User-Agent: curl/7.87.0
> Accept: */*
> Content -Type: text/csv
> Content -Length: 47
>
* Mark bundle as not supporting multiuse
> HTTP/1.1 200 OK
> Server: nginx/1.14.2
> Date: Sun, 09 Apr 2023 20:47:48 GMT
> Content -Type: text/csv; charset=utf-8
> Content -Length: 150
> Connection: keep -alive
-1.3317586042173168, -1.1425409076053987, -1.0579488602777858, -1.177706547272754, -1.130662184748842,
* Connection #0 to host localhost left intact
```

نقوم الآن بإنهاء الحاوية قيد التشغيل، ثم نضع علامة على الصورة المخصصة المحلية وندفعها إلى سجل Amazon Elastic Container Registry الخاص (أمازون ECR) مخزن.

راجع الأوامر التالية لتسجيل الدخول إلى Amazon ECR، الذي يقوم بوضع علامة على الصورة المحلية بمسار صورة Amazon ECR الكامل ثم دفع الصورة إلى Amazon ECR. تأكد من استبدال region و account المتغيرات لتتناسب مع البيئة الخاصة بك.

```shell
# login to ecr with your credentials
aws ecr get-login-password - -region "${region}" |
docker login - -username AWS - -password-stdin ${account}".dkr.ecr."${region}".amazonaws.com # tag and push the image to private Amazon ECR
docker tag ${image} ${fullname}
docker push $ {fullname} ```

الرجوع إلى إنشاء مستودع و ادفع الصورة إلى Amazon ECR واجهة سطر أوامر AWS (AWS CLI) أوامر لمزيد من المعلومات.

خطوة اختيارية

اختياريًا، يمكنك إجراء اختبار مباشر من خلال نشر نموذج الميزات إلى نقطة نهاية في الوقت الفعلي باستخدام صورة عامل الإرساء المخصصة في Amazon ECR. تشير إلى featurizer.ipynb دفتر ملاحظات للتنفيذ الكامل لإنشاء الصورة المخصصة واختبارها ودفعها إلى Amazon ECR.

يقوم Amazon SageMaker بتهيئة نقطة نهاية الاستدلال ونسخ عناصر النموذج إلى ملف /opt/ml/model الدليل داخل الحاوية. يرى كيف يقوم SageMaker بتحميل عناصر النموذج الخاصة بك.

قم ببناء حاوية توقع XGBoost مخصصة

لبناء حاوية الاستدلال XGBoost، نتبع خطوات مماثلة كما فعلنا أثناء بناء الصورة لحاوية المميزات:

  1. تحميل المدربين مسبقا XGBoost الموديل من أمازون S3.
  2. إنشاء inference.py البرنامج النصي الذي يقوم بتحميل ما تم تدريبه مسبقًا XGBoost نموذج، يحول بيانات الإدخال المحولة الواردة من الميزة، ويحولها إلى XGBoost.DMatrix الشكل، يعمل predict على الداعم، وإرجاع التنبؤات بتنسيق json.
  3. البرامج النصية وملفات التكوين التي تشكل مكدس خدمة النموذج (على سبيل المثال، nginx.conf, wsgi.pyو serve تبقى كما هي ولا تحتاج إلى تعديل.
  4. نستخدم Ubuntu:18.04 كصورة أساسية لملف Dockerfile. وهذا ليس شرطا مسبقا. نستخدم صورة أوبونتو الأساسية لتوضيح أنه يمكن بناء الحاويات باستخدام أي صورة أساسية.
  5. تظل خطوات إنشاء صورة عامل الإرساء للعميل واختبار الصورة محليًا ودفع الصورة التي تم اختبارها إلى Amazon ECR كما هي من قبل.

للإختصار، فالخطوات متشابهة كما هو موضح سابقاً؛ ومع ذلك، فإننا نعرض فقط الترميز الذي تم تغييره فيما يلي.

أولا، inference.py النصي. إليك مقتطف يوضح تنفيذ /ping و /invocations. تشير إلى الاستدلال.py تحت المتنبئ مجلد للتنفيذ الكامل لهذا الملف.

```python
@app.route("/ping", methods=["GET"])
def ping(): """ Check the health of the model server by verifying if the model is loaded. Returns a 200 status code if the model is loaded successfully, or a 500 status code if there is an error. Returns: flask.Response: A response object containing the status code and mimetype. """ status = 200 if model is not None else 500 return flask.Response(response="n", status=status, mimetype="application/json") @app.route("/invocations", methods=["POST"])
def invocations(): """ Handle prediction requests by preprocessing the input data, making predictions, and returning the predictions as a JSON object. This function checks if the request content type is supported (text/csv; charset=utf-8), and if so, decodes the input data, preprocesses it, makes predictions, and returns the predictions as a JSON object. If the content type is not supported, a 415 status code is returned. Returns: flask.Response: A response object containing the predictions, status code, and mimetype. """ print(f"Predictor: received content type: {flask.request.content_type}") if flask.request.content_type == "text/csv; charset=utf-8": input = flask.request.data.decode("utf-8") transformed_data = preprocess(input, flask.request.content_type) predictions = predict(transformed_data) # Return the predictions as a JSON object return json.dumps({"result": predictions}) else: print(f"Received: {flask.request.content_type}", flush=True) return flask.Response( response=f"XGBPredictor: This predictor only supports CSV data; Received: {flask.request.content_type}", status=415, mimetype="text/plain", ) ```

فيما يلي مقتطف من ملف Dockerfile لاستضافة نموذج التوقع. للتنفيذ الكامل الرجوع إلى Dockerfile ضمن مجلد التوقع.

```docker
FROM ubuntu:18.04 … # install required dependencies including flask, gunicorn, xgboost etc.,
RUN pip3 --no-cache-dir install flask gunicorn gevent numpy pandas xgboost # Copy contents of code/ dir to /opt/program
COPY code /opt/program # Set working dir to /opt/program which has the serve and inference.py scripts
WORKDIR /opt/program # Expose port 8080 for serving
EXPOSE 8080 ENTRYPOINT ["python"] # serve is a python script under code/ directory that launches nginx and gunicorn processes
CMD ["serve"]
```

نواصل بعد ذلك إنشاء صورة التوقع المخصصة هذه واختبارها ودفعها إلى مستودع خاص في Amazon ECR. تشير إلى Predictor.ipynb دفتر ملاحظات للتنفيذ الكامل لبناء الصورة المخصصة واختبارها ودفعها إلى Amazon ECR.

نشر خط أنابيب الاستدلال التسلسلي

بعد أن قمنا باختبار كل من صور الميزات والتنبؤ ودفعها إلى Amazon ECR، نقوم الآن بتحميل عناصر النموذج الخاصة بنا إلى حاوية Amazon S3.

بعد ذلك، نقوم بإنشاء كائنين نموذجيين: أحدهما لـ featurizer (أي، preprocess.joblib) وغيرها من أجل predictor (أي، xgboost-model) عن طريق تحديد عنوان uri للصورة المخصصة التي قمنا بإنشائها مسبقًا.

إليك مقتطف يوضح ذلك. تشير إلى الاستدلال التسلسلي خط الأنابيب.ipynb للتنفيذ الكامل.

```python
suffix = f"{str(uuid4())[:5]}-{datetime.now().strftime('%d%b%Y')}" # Featurizer Model (SKLearn Model)
image_name = "<FEATURIZER_IMAGE_NAME>"
sklearn_image_uri = f"{account_id}.dkr.ecr.{region}.amazonaws.com/{image_name}:latest" featurizer_model_name = f""<FEATURIZER_MODEL_NAME>-{suffix}"
print(f"Creating Featurizer model: {featurizer_model_name}")
sklearn_model = Model( image_uri=featurizer_ecr_repo_uri, name=featurizer_model_name, model_data=featurizer_model_data, role=role,
) # Full name of the ECR repository
predictor_image_name = "<PREDICTOR_IMAGE_NAME>"
predictor_ecr_repo_uri
= f"{account_id}.dkr.ecr.{region}.amazonaws.com/{predictor_image_name}:latest" # Predictor Model (XGBoost Model)
predictor_model_name = f"""<PREDICTOR_MODEL_NAME>-{suffix}"
print(f"Creating Predictor model: {predictor_model_name}")
xgboost_model = Model( image_uri=predictor_ecr_repo_uri, name=predictor_model_name, model_data=predictor_model_data, role=role,
)
```

الآن، لنشر هذه الحاويات بطريقة تسلسلية، نقوم أولاً بإنشاء ملف نموذج كائن وتمرير featurizer نموذج و predictor نموذج لكائن قائمة بايثون بنفس الترتيب.

ثم ندعو .deploy() طريقة على نموذج تحديد نوع المثيل وعدد المثيلات.

```python
from sagemaker.pipeline import PipelineModel pipeline_model_name = f"Abalone-pipeline-{suffix}" pipeline_model = PipelineModel( name=pipeline_model_name, role=role, models=[sklearn_model, xgboost_model], sagemaker_session=sm_session,
) print(f"Deploying pipeline model {pipeline_model_name}...")
predictor = pipeline_model.deploy( initial_instance_count=1, instance_type="ml.m5.xlarge",
)
```

في هذه المرحلة، ينشر Amazon SageMaker مسار الاستدلال التسلسلي إلى نقطة نهاية في الوقت الفعلي. وننتظر أن تكون نقطة النهاية InService.

يمكننا الآن اختبار نقطة النهاية عن طريق إرسال بعض طلبات الاستدلال إلى نقطة النهاية المباشرة هذه.

الرجوع إلى الاستدلال التسلسلي خط الأنابيب.ipynb للتنفيذ الكامل.

تنظيف

بعد الانتهاء من الاختبار، يرجى اتباع الإرشادات الموجودة في قسم التنظيف في دفتر الملاحظات لحذف الموارد المتوفرة في هذا المنشور لتجنب الرسوم غير الضرورية. تشير إلى الأمازون SageMaker التسعير للحصول على تفاصيل حول تكلفة مثيلات الاستدلال.

```python
# Delete endpoint, model
try: print(f"Deleting model: {pipeline_model_name}") predictor.delete_model()
except Exception as e: print(f"Error deleting model: {pipeline_model_name}n{e}") pass try: print(f"Deleting endpoint: {endpoint_name}") predictor.delete_endpoint()
except Exception as e: print(f"Error deleting EP: {endpoint_name}n{e}") pass ```

وفي الختام

في هذا المنشور، أوضحت كيف يمكننا إنشاء تطبيق استدلال ML تسلسلي ونشره باستخدام حاويات الاستدلال المخصصة لنقاط النهاية في الوقت الفعلي على Amazon SageMaker.

يوضح هذا الحل كيف يمكن للعملاء إحضار حاوياتهم المخصصة للاستضافة على Amazon SageMaker بطريقة فعالة من حيث التكلفة. باستخدام خيار BYOC، يمكن للعملاء إنشاء تطبيقات ML الخاصة بهم وتكييفها بسرعة لنشرها على Amazon SageMaker.

نحن نشجعك على تجربة هذا الحل باستخدام مجموعة بيانات ذات صلة بمؤشرات الأداء الرئيسية (KPIs) لأعمالك. يمكنك الرجوع إلى الحل بأكمله في هذا مستودع جيثب.

مراجع حسابات


عن المؤلف

برافين شامارثي هو أخصائي أول في الذكاء الاصطناعي / تعلم الآلة مع Amazon Web Services. إنه متحمس للذكاء الاصطناعي / تعلم الآلة وكل ما يتعلق بـ AWS. يساعد العملاء في جميع أنحاء الأمريكتين على توسيع نطاق أعباء عمل ML وابتكارها وتشغيلها بكفاءة على AWS. في أوقات فراغه ، يحب برافين القراءة ويستمتع بأفلام الخيال العلمي.

بقعة_صورة

أحدث المعلومات الاستخباراتية

بقعة_صورة