Logo Zephyrnet

Xây dựng và triển khai các ứng dụng suy luận ML từ đầu bằng Amazon SageMaker | Dịch vụ web của Amazon

Ngày:

Khi học máy (ML) trở thành xu hướng chủ đạo và được áp dụng rộng rãi hơn, các ứng dụng suy luận do ML cung cấp ngày càng trở nên phổ biến để giải quyết một loạt các vấn đề kinh doanh phức tạp. Giải pháp cho những vấn đề kinh doanh phức tạp này thường yêu cầu sử dụng nhiều mô hình và bước ML. Bài đăng này chỉ cho bạn cách xây dựng và lưu trữ ứng dụng ML với các vùng chứa tùy chỉnh trên Amazon SageMaker.

Ưu đãi của Amazon SageMaker thuật toán tích hợpSageMaker dựng sẵn hình ảnh docker để triển khai mô hình. Tuy nhiên, nếu những thứ này không phù hợp với nhu cầu của bạn, bạn có thể mang theo bộ chứa của riêng mình (BYOC) để lưu trữ trên Amazon SageMaker.

Có một số trường hợp sử dụng trong đó người dùng có thể cần BYOC để lưu trữ trên Amazon SageMaker.

  1. Khung hoặc thư viện ML tùy chỉnh: Nếu bạn dự định sử dụng khung ML hoặc thư viện không được hỗ trợ bởi các thuật toán tích hợp sẵn của Amazon SageMaker hoặc vùng chứa dựng sẵn thì bạn sẽ cần phải tạo vùng chứa tùy chỉnh.
  2. Mô hình chuyên biệt: Đối với một số miền hoặc ngành nhất định, bạn có thể yêu cầu kiến ​​trúc mô hình cụ thể hoặc các bước tiền xử lý phù hợp không có sẵn trong các dịch vụ Amazon SageMaker tích hợp sẵn.
  3. Thuật toán độc quyền: Nếu bạn đã tự phát triển thuật toán độc quyền của riêng mình thì bạn sẽ cần một vùng chứa tùy chỉnh để triển khai chúng trên Amazon SageMaker.
  4. Quy trình suy luận phức tạp: Nếu quy trình suy luận ML của bạn liên quan đến logic nghiệp vụ tùy chỉnh — một loạt các bước phức tạp cần được thực hiện theo một thứ tự cụ thể — thì BYOC có thể giúp bạn quản lý và sắp xếp các bước này hiệu quả hơn.

Tổng quan về giải pháp

Trong giải pháp này, chúng tôi trình bày cách lưu trữ ứng dụng suy luận nối tiếp ML trên Amazon SageMaker với các điểm cuối thời gian thực bằng cách sử dụng hai vùng chứa suy luận tùy chỉnh với phiên bản mới nhất scikit-learnxgboost gói.

Thùng chứa đầu tiên sử dụng một scikit-learn mô hình để chuyển đổi dữ liệu thô thành các cột đặc trưng. Nó áp dụng Tiêu chuẩn cho các cột số và Bộ mã hóa OneHot đến những cái phân loại.

Vùng chứa thứ hai lưu trữ một dữ liệu đã được huấn luyện trước XGboost mô hình (tức là dự đoán). Mô hình dự đoán chấp nhận các dự đoán đầu vào và đầu ra đặc trưng.

Cuối cùng, chúng tôi triển khai người làm đặc trưngngười dự đoán trong quy trình suy luận nối tiếp tới điểm cuối thời gian thực của Amazon SageMaker.

Dưới đây là một số cân nhắc khác nhau về lý do tại sao bạn có thể muốn có các vùng chứa riêng biệt trong ứng dụng suy luận của mình.

  • Tách - Các bước khác nhau của đường ống có mục đích được xác định rõ ràng và cần được chạy trên các thùng chứa riêng biệt do các phụ thuộc cơ bản liên quan. Điều này cũng giúp giữ cho đường ống có cấu trúc tốt.
  • khung - Các bước khác nhau của đường ống sử dụng các khuôn khổ phù hợp với mục đích cụ thể (chẳng hạn như scikit hoặc Spark ML) và do đó cần phải chạy trên các thùng chứa riêng biệt.
  • Cô lập tài nguyên - Các bước khác nhau của đường ống có yêu cầu tiêu thụ tài nguyên khác nhau và do đó cần được chạy trên các thùng chứa riêng biệt để kiểm soát và linh hoạt hơn.
  • Bảo trì và nâng cấp – Từ quan điểm vận hành, điều này thúc đẩy sự cô lập về chức năng và bạn có thể tiếp tục nâng cấp hoặc sửa đổi các bước riêng lẻ dễ dàng hơn nhiều mà không ảnh hưởng đến các mô hình khác.

Ngoài ra, việc xây dựng cục bộ các vùng chứa riêng lẻ sẽ hỗ trợ quá trình phát triển và thử nghiệm lặp đi lặp lại với các công cụ yêu thích và Môi trường phát triển tích hợp (IDE). Sau khi các vùng chứa đã sẵn sàng, bạn có thể triển khai chúng lên đám mây AWS để suy luận bằng cách sử dụng điểm cuối Amazon SageMaker.

Triển khai đầy đủ, bao gồm các đoạn mã, có sẵn trong kho lưu trữ Github này tại đây.

Điều kiện tiên quyết

Khi chúng tôi kiểm tra cục bộ các vùng chứa tùy chỉnh này trước tiên, chúng tôi sẽ cần cài đặt máy tính để bàn docker trên máy tính cục bộ của bạn. Bạn nên làm quen với việc xây dựng các container docker.

Bạn cũng sẽ cần có tài khoản AWS có quyền truy cập vào Amazon SageMaker, Amazon ECR và Amazon S3 để kiểm tra toàn diện ứng dụng này.

Đảm bảo bạn có phiên bản mới nhất của Boto3 và các gói Python của Amazon SageMaker đã được cài đặt:

pip install --upgrade boto3 sagemaker scikit-learn

Hướng dẫn giải pháp

Xây dựng vùng chứa tính năng tùy chỉnh

Để xây dựng vùng chứa đầu tiên, vùng chứa tính năng, chúng tôi huấn luyện một scikit-learn mô hình để xử lý các tính năng thô trong bào ngư tập dữ liệu. Tập lệnh tiền xử lý sử dụng Đơn giản để xử lý các giá trị còn thiếu, Tiêu chuẩn để chuẩn hóa các cột số và Bộ mã hóa OneHot để chuyển đổi các cột phân loại. Sau khi lắp máy biến áp, chúng ta lưu mô hình vào việc làm định dạng. Sau đó, chúng tôi nén và tải tạo phẩm mô hình đã lưu này lên Dịch vụ lưu trữ đơn giản của Amazon (Amazon S3) Gầu múc.

Đây là đoạn mã mẫu chứng minh điều này. tham khảo tính năng.ipynb để thực hiện đầy đủ:

```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"))
```

Tiếp theo, để tạo vùng chứa suy luận tùy chỉnh cho mô hình tính năng, chúng tôi xây dựng hình ảnh Docker với các gói nginx, gunicorn, jar, cùng với các phần phụ thuộc cần thiết khác cho mô hình tính năng.

Nginx, gunicorn và ứng dụng Flask sẽ đóng vai trò là ngăn xếp phục vụ mô hình trên các điểm cuối thời gian thực của Amazon SageMaker.

Khi đưa vùng chứa tùy chỉnh để lưu trữ trên Amazon SageMaker, chúng ta cần đảm bảo rằng tập lệnh suy luận thực hiện các tác vụ sau sau khi được khởi chạy bên trong vùng chứa:

  1. Tải mô hình: Kịch bản suy luận (preprocessing.py) nên tham khảo /opt/ml/model thư mục để tải mô hình vào vùng chứa. Các tạo phẩm mô hình trong Amazon S3 sẽ được tải xuống và gắn vào vùng chứa tại đường dẫn /opt/ml/model.
  2. Các biến môi trường: Để chuyển các biến môi trường tùy chỉnh vào vùng chứa, bạn phải chỉ định chúng trong quá trình Mô hình bước tạo hoặc trong quá trình Điểm cuối sáng tạo từ công việc đào tạo.
  3. Yêu cầu về API: Kịch bản suy luận phải thực hiện cả hai /ping/invocations các tuyến đường dưới dạng một ứng dụng Flask. Các /ping API được sử dụng để kiểm tra tình trạng, trong khi /invocations API xử lý các yêu cầu suy luận.
  4. Ghi nhật ký: Nhật ký đầu ra trong tập lệnh suy luận phải được ghi vào đầu ra tiêu chuẩn (tiêu chuẩn) và sai số chuẩn (tiêu chuẩn) dòng suối. Những nhật ký này sau đó được truyền tới amazoncloudwatch bởi Amazon SageMaker.

Đây là một đoạn trích từ preprocessing.py điều đó cho thấy việc thực hiện /ping/invocations.

Tham khảo tiền xử lý.py trong thư mục featureizer để thực hiện đầy đủ.

```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", )
```

Xây dựng hình ảnh Docker với bộ tính năng và ngăn xếp phục vụ mô hình

Bây giờ chúng ta hãy xây dựng Dockerfile bằng hình ảnh cơ sở tùy chỉnh và cài đặt các phần phụ thuộc cần thiết.

Đối với điều này, chúng tôi sử dụng python:3.9-slim-buster làm hình ảnh cơ sở. Bạn có thể thay đổi bất kỳ hình ảnh cơ sở nào khác có liên quan đến trường hợp sử dụng của bạn.

Sau đó, chúng tôi sao chép cấu hình nginx, tệp cổng máy chủ web của gunicorn và tập lệnh suy luận vào vùng chứa. Chúng tôi cũng tạo một tập lệnh python có tên là Serve để khởi chạy các tiến trình nginx và gunicorn trong nền và đặt tập lệnh suy luận (tức là ứng dụng preprocessing.py Flask) làm điểm vào cho vùng chứa.

Đây là một đoạn Dockerfile để lưu trữ mô hình tính năng. Để thực hiện đầy đủ hãy tham khảo Dockerfile Dưới người làm đặc trưng thư mục.

```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" ]
```

Kiểm tra hình ảnh suy luận tùy chỉnh bằng tính năng cục bộ

Bây giờ, hãy xây dựng và thử nghiệm bộ chứa suy luận tùy chỉnh với bộ tính năng cục bộ bằng cách sử dụng Amazon Chế độ cục bộ SageMaker. Chế độ cục bộ hoàn hảo để kiểm tra các tập lệnh xử lý, đào tạo và suy luận của bạn mà không cần khởi chạy bất kỳ tác vụ nào trên Amazon SageMaker. Sau khi xác nhận kết quả kiểm tra cục bộ, bạn có thể dễ dàng điều chỉnh tập lệnh đào tạo và suy luận để triển khai trên Amazon SageMaker với những thay đổi tối thiểu.

Để kiểm tra cục bộ hình ảnh tùy chỉnh của công cụ tính năng, trước tiên hãy xây dựng hình ảnh bằng cách sử dụng hình ảnh đã xác định trước đó Dockerfile. Sau đó, khởi chạy một vùng chứa bằng cách gắn thư mục chứa mô hình tính năng (preprocess.joblib) đến /opt/ml/model thư mục bên trong container. Ngoài ra, ánh xạ cổng 8080 từ vùng chứa đến máy chủ.

Sau khi khởi chạy, bạn có thể gửi yêu cầu suy luận tới http://localhost:8080/invocations.

Để xây dựng và khởi chạy vùng chứa, hãy mở một thiết bị đầu cuối và chạy các lệnh sau.

Lưu ý rằng bạn nên thay thế <IMAGE_NAME>, như được hiển thị trong mã sau đây, cùng với tên hình ảnh vùng chứa của bạn.

Lệnh sau đây cũng giả định rằng người được đào tạo scikit-learn mô hình (preprocess.joblib) hiện diện trong một thư mục có tên models.

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

Sau khi vùng chứa được thiết lập và chạy, chúng tôi có thể kiểm tra cả / ping/lời gọi tuyến đường bằng cách sử dụng lệnh cuộn tròn.

Chạy các lệnh dưới đây từ thiết bị đầu cuối

```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
```

Khi dữ liệu thô (chưa được chuyển đổi) được gửi tới http://localhost:8080/invocations, điểm cuối sẽ phản hồi với dữ liệu được chuyển đổi.

Bạn sẽ thấy phản hồi tương tự như sau:

```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
```

Bây giờ, chúng tôi chấm dứt vùng chứa đang chạy, sau đó gắn thẻ và đẩy hình ảnh tùy chỉnh cục bộ vào Cơ quan đăng ký vùng chứa đàn hồi Amazon riêng tư (Amazon ECR) kho.

Xem các lệnh sau để đăng nhập vào Amazon ECR, gắn thẻ hình ảnh cục bộ với đường dẫn hình ảnh Amazon ECR đầy đủ rồi đẩy hình ảnh đó lên Amazon ECR. Đảm bảo bạn thay thế regionaccount các biến để phù hợp với môi trường của bạn.

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

Tham khảo tạo một kho lưu trữđẩy hình ảnh lên Amazon ECR Giao diện dòng lệnh AWS (AWSCLI) để biết thêm thông tin.

Bước tùy chọn

Theo tùy chọn, bạn có thể thực hiện thử nghiệm trực tiếp bằng cách triển khai mô hình công cụ tính năng đến điểm cuối thời gian thực bằng hình ảnh docker tùy chỉnh trong Amazon ECR. tham khảo tính năng.ipynb sổ ghi chép để triển khai đầy đủ quá trình xây dựng, thử nghiệm và đẩy hình ảnh tùy chỉnh lên Amazon ECR.

Amazon SageMaker khởi tạo điểm cuối suy luận và sao chép các thành phần lạ của mô hình vào /opt/ml/model thư mục bên trong container. Nhìn thấy Cách SageMaker tải các tạo phẩm Mô hình của bạn.

Xây dựng vùng chứa dự đoán XGBoost tùy chỉnh

Để xây dựng vùng chứa suy luận XGBoost, chúng tôi làm theo các bước tương tự như chúng tôi đã làm khi xây dựng hình ảnh cho vùng chứa tính năng:

  1. Tải xuống được đào tạo trước XGBoost mô hình từ Amazon S3.
  2. tạo inference.py tập lệnh tải phần đã được huấn luyện trước XGBoost mô hình, chuyển đổi dữ liệu đầu vào đã chuyển đổi nhận được từ bộ tính năng và chuyển đổi thành XGBoost.DMatrix định dạng, chạy predict trên bộ tăng cường và trả về dự đoán ở định dạng json.
  3. Các tập lệnh và tệp cấu hình tạo thành ngăn xếp phân phát mô hình (tức là nginx.conf, wsgi.pyserve vẫn giữ nguyên và không cần sửa đổi.
  4. Chúng tôi sử dụng Ubuntu:18.04 làm hình ảnh cơ sở cho Dockerfile. Đây không phải là điều kiện tiên quyết. Chúng tôi sử dụng hình ảnh cơ sở của Ubuntu để chứng minh rằng các vùng chứa có thể được tạo bằng bất kỳ hình ảnh cơ sở nào.
  5. Các bước xây dựng hình ảnh docker của khách hàng, kiểm tra hình ảnh cục bộ và đẩy hình ảnh đã kiểm tra lên Amazon ECR vẫn giống như trước.

Để cho ngắn gọn, vì các bước tương tự được trình bày trước đó; tuy nhiên, chúng tôi chỉ hiển thị mã hóa đã thay đổi sau đây.

Đầu tiên, inference.py kịch bản. Đây là đoạn trích cho thấy việc triển khai /ping/invocations. Tham khảo suy luận.py theo người dự đoán thư mục để thực hiện đầy đủ tập tin này.

```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", ) ```

Đây là một đoạn Dockerfile để lưu trữ mô hình dự đoán. Để thực hiện đầy đủ hãy tham khảo Dockerfile trong thư mục dự đoán.

```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"]
```

Sau đó, chúng tôi tiếp tục xây dựng, thử nghiệm và đẩy hình ảnh dự đoán tùy chỉnh này tới kho lưu trữ riêng trong Amazon ECR. tham khảo dự đoán.ipynb sổ ghi chép để thực hiện đầy đủ việc xây dựng, thử nghiệm và đẩy hình ảnh tùy chỉnh lên Amazon ECR.

Triển khai đường dẫn suy luận nối tiếp

Sau khi chúng tôi đã thử nghiệm cả hình ảnh bộ tính năng và bộ dự đoán cũng như đẩy chúng lên Amazon ECR, giờ đây chúng tôi tải các tạo phẩm mô hình của mình lên bộ chứa Amazon S3.

Sau đó, chúng ta tạo hai đối tượng mô hình: một cho featurizer (I E, preprocess.joblib) và khác cho predictor (I E, xgboost-model) bằng cách chỉ định uri hình ảnh tùy chỉnh mà chúng tôi đã tạo trước đó.

Đây là một đoạn cho thấy điều đó. tham khảo suy luận nối tiếp-pipeline.ipynb để thực hiện đầy đủ.

```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,
)
```

Bây giờ, để triển khai các vùng chứa này theo kiểu tuần tự, trước tiên chúng ta tạo một Mô hình đường ống phản đối và vượt qua featurizer mô hình và predictor mô hình thành đối tượng danh sách python theo cùng thứ tự.

Sau đó, chúng tôi gọi các .deploy() phương pháp trên Mô hình đường ống chỉ định loại cá thể và số lượng cá thể.

```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",
)
```

Ở giai đoạn này, Amazon SageMaker triển khai quy trình suy luận nối tiếp đến điểm cuối thời gian thực. Chúng tôi chờ đợi điểm cuối InService.

Bây giờ chúng ta có thể kiểm tra điểm cuối bằng cách gửi một số yêu cầu suy luận đến điểm cuối trực tiếp này.

Tham khảo suy luận nối tiếp-pipeline.ipynb để thực hiện đầy đủ.

Làm sạch

Sau khi kiểm tra xong, vui lòng làm theo hướng dẫn trong phần dọn dẹp của sổ ghi chép để xóa các tài nguyên được cung cấp trong bài đăng này nhằm tránh những khoản phí không cần thiết. tham khảo Amazon SageMaker Giá để biết chi tiết về chi phí của các trường hợp suy luận.

```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 ```

Kết luận

Trong bài đăng này, tôi đã trình bày cách chúng ta có thể xây dựng và triển khai ứng dụng suy luận ML nối tiếp bằng cách sử dụng vùng chứa suy luận tùy chỉnh cho các điểm cuối thời gian thực trên Amazon SageMaker.

Giải pháp này minh họa cách khách hàng có thể mang theo bộ chứa tùy chỉnh của riêng mình để lưu trữ trên Amazon SageMaker theo cách tiết kiệm chi phí. Với tùy chọn BYOC, khách hàng có thể nhanh chóng xây dựng và điều chỉnh ứng dụng ML của mình để triển khai trên Amazon SageMaker.

Chúng tôi khuyến khích bạn thử giải pháp này với tập dữ liệu có liên quan đến Chỉ số hiệu suất chính (KPI) của doanh nghiệp bạn. Bạn có thể tham khảo toàn bộ giải pháp tại đây Kho GitHub.

dự án


Lưu ý

Praveen Chamarthi là Chuyên gia cao cấp về AI/ML của Amazon Web Services. Anh ấy đam mê AI/ML và mọi thứ về AWS. Anh ấy giúp khách hàng trên khắp Châu Mỹ mở rộng quy mô, đổi mới và vận hành khối lượng công việc ML một cách hiệu quả trên AWS. Khi rảnh rỗi, Praveen thích đọc sách và xem phim khoa học viễn tưởng.

tại chỗ_img

Tin tức mới nhất

tại chỗ_img