Tối ưu hóa các công việc suy luận của bạn bằng cách sử dụng suy luận hàng loạt động với TorchServe trên Amazon SageMaker

Nút nguồn: 1884601

Trong học sâu, xử lý hàng loạt đề cập đến việc cung cấp nhiều đầu vào vào một mô hình. Mặc dù điều này rất cần thiết trong quá trình đào tạo, nhưng nó cũng có thể rất hữu ích để quản lý chi phí và tối ưu hóa thông lượng trong thời gian suy luận. Các bộ tăng tốc phần cứng được tối ưu hóa cho hoạt động song song và việc tạo khối giúp bão hòa năng lực tính toán và thường dẫn đến thông lượng cao hơn.

Batching có thể hữu ích trong một số tình huống trong quá trình triển khai mô hình trong sản xuất. Ở đây chúng tôi phân loại chúng thành hai trường hợp sử dụng:

  • Các ứng dụng thời gian thực trong đó một số yêu cầu suy luận được nhận từ các máy khách khác nhau và được chia động và cấp cho mô hình phục vụ. Độ trễ thường quan trọng trong các trường hợp sử dụng này.
  • Các ứng dụng ngoại tuyến trong đó một số đầu vào hoặc yêu cầu được xử lý theo lô ở phía máy khách và được gửi đến mô hình cung cấp. Thông lượng cao hơn thường là mục tiêu cho các trường hợp sử dụng này, giúp quản lý chi phí. Các trường hợp sử dụng ví dụ bao gồm phân tích video và đánh giá mô hình.

Amazon SageMaker cung cấp hai tùy chọn phổ biến cho công việc suy luận của bạn. Đối với các ứng dụng thời gian thực, Dịch vụ lưu trữ SageMaker sử dụng TorchServe làm thư viện phục vụ phụ trợ để xử lý nhóm động của các yêu cầu nhận được. Đối với các ứng dụng ngoại tuyến, bạn có thể sử dụng công việc chuyển đổi hàng loạt SageMaker. Trong bài đăng này, chúng tôi sẽ xem xét một ví dụ về từng tùy chọn để giúp bạn bắt đầu.

Bởi vì TorchServe vốn dĩ là tích hợp với SageMaker thông qua Bộ công cụ suy luận SageMaker PyTorch, bạn có thể dễ dàng triển khai mô hình PyTorch lên TorchServe bằng Dịch vụ lưu trữ SageMaker. Cũng có thể đôi khi bạn cần tùy chỉnh thêm môi trường của mình bằng cách sử dụng hình ảnh Docker tùy chỉnh. Trong bài đăng này, trước tiên chúng tôi trình bày cách triển khai điểm cuối thời gian thực bằng cách sử dụng bộ công cụ suy luận SageMaker PyTorch gốc và định cấu hình kích thước lô để tối ưu hóa thông lượng. Trong ví dụ thứ hai, chúng tôi trình bày cách sử dụng hình ảnh Docker tùy chỉnh để định cấu hình các cấu hình TorchServe nâng cao không có sẵn dưới dạng biến môi trường nhằm tối ưu hóa tác vụ suy luận hàng loạt của bạn.

Thực hành tốt nhất cho suy luận hàng loạt

Xử lý hàng loạt có thể tăng thông lượng và tối ưu hóa tài nguyên của bạn vì nó giúp hoàn thành số lượng suy luận lớn hơn trong một khoảng thời gian nhất định với chi phí là độ trễ. Để tối ưu hóa việc triển khai mô hình cho thông lượng cao hơn, nguyên tắc chung là tăng kích thước lô cho đến khi thông lượng giảm. Điều này thường phù hợp nhất với các ứng dụng ngoại tuyến, trong đó một số đầu vào được xử lý theo lô (chẳng hạn như khung video, hình ảnh hoặc văn bản) để nhận đầu ra dự đoán.

Đối với các ứng dụng thời gian thực, độ trễ thường là mối quan tâm chính. Có sự đánh đổi giữa thông lượng cao hơn với kích thước lô và độ trễ tăng lên; bạn có thể cần phải điều chỉnh khi cần thiết để đáp ứng SLA độ trễ của mình. Xét về các phương pháp hay nhất trên đám mây, chi phí cho một số lần suy luận nhất định là một hướng dẫn hữu ích trong việc đưa ra quyết định sáng suốt đáp ứng nhu cầu kinh doanh của bạn. Một yếu tố góp phần trong việc quản lý chi phí là chọn máy gia tốc phù hợp. Để biết thêm thông tin, xem Chọn bộ tăng tốc AI tốt nhất và biên dịch mô hình để suy luận thị giác máy tính với Amazon SageMaker.

TorchServe tạo lô động trên SageMaker

ngọn đuốcphục vụ là thư viện riêng của PyTorch để phục vụ các mô hình trong quá trình sản xuất trên quy mô lớn. Đó là sự phát triển chung của Facebook và AWS. TorchServe cho phép bạn theo dõi, thêm số liệu tùy chỉnh, hỗ trợ nhiều mô hình, tăng và giảm số lượng công nhân thông qua API quản lý an toàn, đồng thời cung cấp các điểm cuối suy luận và giải thích.

Để hỗ trợ xử lý hàng loạt, TorchServe cung cấp tính năng xử lý hàng loạt động. Nó tổng hợp các yêu cầu nhận được trong một khung thời gian đã chỉ định, gộp chúng lại với nhau và gửi lô để suy luận. Các yêu cầu nhận được được xử lý thông qua người xử lý trong TorchServe. TorchServe có một số trình xử lý mặc định và bạn có thể tạo một trình xử lý tùy chỉnh nếu trường hợp sử dụng của bạn không được đề cập. Khi sử dụng trình xử lý tùy chỉnh, hãy đảm bảo rằng logic suy luận lô đã được triển khai trong trình xử lý. Một ví dụ về trình xử lý tùy chỉnh có hỗ trợ suy luận hàng loạt có sẵn trên GitHub.

Bạn có thể định cấu hình chia lô động bằng hai cài đặt, batch_sizemax_batch_delay, thông qua các biến môi trường trong SageMaker hoặc thông qua config.properties tệp trong TorchServe (nếu sử dụng vùng chứa tùy chỉnh). TorchServe sử dụng bất kỳ cài đặt nào đến trước, kể cả kích thước lô tối đa (batch_size) hoặc cửa sổ thời gian đã chỉ định để chờ lô yêu cầu thông qua max_batch_delay.

Với tích hợp TorchServe với SageMaker, giờ đây bạn có thể triển khai các mô hình PyTorch nguyên bản trên SageMaker, nơi bạn có thể xác định mô hình PyTorch SageMaker. Bạn có thể thêm logic tải mô hình tùy chỉnh, suy luận cũng như tiền xử lý và hậu xử lý trong tập lệnh được chuyển dưới dạng điểm nhập vào SageMaker PyTorch (xem mã ví dụ sau). Ngoài ra, bạn có thể sử dụng vùng chứa tùy chỉnh để triển khai các mô hình của mình. Để biết thêm thông tin, xem Máy chủ mô hình SageMaker PyTorch.

Bạn có thể đặt kích thước lô cho các mô hình PyTorch trên SageMaker thông qua các biến môi trường. Nếu chọn sử dụng vùng chứa tùy chỉnh, bạn có thể gộp thiết lập in config.properties với mô hình của bạn khi đóng gói mô hình của bạn trong TorchServe. Đoạn mã sau hiển thị một ví dụ về cách đặt kích thước lô bằng các biến môi trường và cách triển khai mô hình PyTorch trên SageMaker:

from SageMaker.pytorch.model import PyTorchModel env_variables_dict = { "SAGEMAKER_TS_BATCH_SIZE": "3", "SAGEMAKER_TS_MAX_BATCH_DELAY": "100000"
} pytorch_model = PyTorchModel( model_data=model_artifact, role=role, source_dir="code", framework_version='1.9', entry_point="inference.py", env=env_variables_dict
) predictor = pytorch_model.deploy(initial_instance_count=1, instance_type="ml.c5.2xlarge", serializer=SageMaker.serializers.JSONSerializer(), deserializer=SageMaker.deserializers.BytesDeserializer())

Trong đoạn mã, model_artifact đề cập đến tất cả các tệp cần thiết để tải lại mô hình đã đào tạo, được lưu trữ trong tệp .tar và được đẩy vào một Dịch vụ lưu trữ đơn giản của Amazon (Amazon S3) xô. inference.py tương tự như trình xử lý tùy chỉnh TorchServe; nó có một số chức năng mà bạn có thể ghi đè để phù hợp với quá trình khởi tạo mô hình, tiền xử lý và hậu xử lý của các yêu cầu đã nhận và logic suy luận.

Sau đây máy tính xách tay hiển thị một ví dụ đầy đủ về việc triển khai mô hình BERT ôm mặt.

Nếu cần vùng chứa tùy chỉnh, bạn có thể tạo hình ảnh vùng chứa tùy chỉnh và đẩy nó vào Đăng ký container đàn hồi Amazon (Amazon ECR) kho lưu trữ. Phần mềm mô hình trong trường hợp này có thể là tệp TorchServe .mar bao gồm các phần mềm tạo mô hình cùng với trình xử lý. Chúng tôi chứng minh điều này trong phần tiếp theo, nơi chúng tôi sử dụng công việc chuyển đổi hàng loạt SageMaker.

Công việc chuyển đổi hàng loạt SageMaker

Đối với các trường hợp sử dụng ngoại tuyến khi các yêu cầu được xử lý theo đợt từ nguồn dữ liệu, chẳng hạn như tập dữ liệu, SageMaker cung cấp công việc chuyển đổi hàng loạt. Những công việc này cho phép bạn đọc dữ liệu từ bộ chứa S3 và ghi kết quả vào bộ chứa S3 đích. Để biết thêm thông tin, xem Sử dụng chuyển đổi hàng loạt để nhận suy luận từ bộ dữ liệu lớn. Có thể tìm thấy một ví dụ đầy đủ về suy luận hàng loạt bằng cách sử dụng các công việc chuyển đổi hàng loạt trong phần sau máy tính xách tay, nơi chúng tôi sử dụng mô hình dịch máy từ cuộc thi FLORES. Trong ví dụ này, chúng tôi trình bày cách sử dụng vùng chứa tùy chỉnh để chấm điểm mô hình của chúng tôi bằng SageMaker. Sử dụng bộ chứa suy luận tùy chỉnh cho phép bạn tùy chỉnh thêm cấu hình TorchServe của mình. Trong ví dụ này, chúng tôi muốn thay đổi và tắt giải mã JSON, điều mà chúng tôi có thể thực hiện thông qua TorchServe config.properties tập tin.

Khi sử dụng trình xử lý tùy chỉnh cho TorchServe, chúng ta cần đảm bảo rằng trình xử lý triển khai logic suy luận lô. Mỗi trình xử lý có thể có các chức năng tùy chỉnh để thực hiện tiền xử lý, suy luận và hậu xử lý. Một ví dụ về trình xử lý tùy chỉnh có hỗ trợ suy luận hàng loạt có sẵn trên GitHub.

Chúng tôi sử dụng vùng chứa tùy chỉnh của mình để gộp các thành phần tạo tác của mô hình với trình xử lý như chúng tôi làm trong TorchServe (tạo tệp .mar). Chúng tôi cũng cần một điểm vào bộ chứa Docker để khởi động TorchServe với kích thước lô và giải mã JSON được đặt trong config.properties. Chúng tôi chứng minh điều này trong ví dụ máy tính xách tay.

Công việc chuyển đổi hàng loạt SageMaker yêu cầu quyền truy cập vào các tệp đầu vào từ bộ chứa S3, nơi nó chia các tệp đầu vào thành các lô nhỏ và gửi chúng để suy luận. Hãy xem xét các điểm sau khi định cấu hình công việc chuyển đổi hàng loạt:

  • Đặt các tệp đầu vào (chẳng hạn như tập dữ liệu) vào bộ chứa S3 và đặt nó làm nguồn dữ liệu trong cài đặt công việc.
  • Chỉ định một bộ chứa S3 để lưu kết quả của tác vụ chuyển đổi hàng loạt.
  • Thiết lập Chiến lược hàng loạt đến MultiRecordSplitType đến Line nếu bạn cần công việc chuyển đổi hàng loạt để tạo các lô nhỏ từ tệp đầu vào. Nếu nó không thể tự động chia tập dữ liệu thành các lô nhỏ, thì bạn có thể chia nó thành các lô nhỏ bằng cách đặt từng lô vào một tệp đầu vào riêng biệt, được đặt trong bộ chứa S3 nguồn dữ liệu.
  • Đảm bảo rằng kích thước lô phù hợp với bộ nhớ. SageMaker thường tự động xử lý việc này; tuy nhiên, khi chia lô theo cách thủ công, điều này cần được điều chỉnh dựa trên bộ nhớ.

Mã sau đây là một ví dụ cho công việc chuyển đổi hàng loạt:

s3_bucket_name= 'SageMaker-us-west-2-XXXXXXXX'
batch_input = f"s3://{s3_bucket_name}/folder/jobename_TorchServe_SageMaker/"
batch_output = f"s3://{s3_bucket_name}/folder/jobname_TorchServe_SageMaker_output/" batch_job_name = 'job-batch' + time.strftime("%Y-%m-%d-%H-%M-%S", time.gmtime())
batch_job_name request = { "ModelClientConfig": { "InvocationsTimeoutInSeconds": 3600, "InvocationsMaxRetries": 1, }, "TransformJobName": batch_job_name, "ModelName": model_name, "MaxConcurrentTransforms":1, "BatchStrategy": "MultiRecord", "TransformOutput": {"S3OutputPath": batch_output, "AssembleWith": "Line", "Accept": "application/json"}, "TransformInput": { "DataSource": { "S3DataSource": {"S3DataType": "S3Prefix", "S3Uri": batch_input} }, "SplitType" : "Line", "ContentType": "application/json", }, "TransformResources": {"InstanceType": "ml.p2.xlarge", "InstanceCount": 1},
}

Khi chúng tôi sử dụng các cài đặt trước đó và khởi chạy công việc chuyển đổi của mình, nó sẽ đọc các tệp đầu vào từ bộ chứa S3 nguồn theo lô và gửi chúng để suy luận. Kết quả được ghi trở lại bộ chứa S3 được chỉ định cho đầu ra.

Đoạn mã sau cho biết cách tạo và khởi chạy một công việc bằng cách sử dụng các cài đặt trước đó:

sm.create_transform_job(**request) while True: response = sm.describe_transform_job(TransformJobName=batch_job_name) status = response["TransformJobStatus"] if status == "Completed": print("Transform job ended with status: " + status) break if status == "Failed": message = response["FailureReason"] print("Transform failed with the following error: {}".format(message)) raise Exception("Transform job failed") print("Transform job is still in status: " + status) time.sleep(30)

Kết luận

Trong bài đăng này, chúng tôi đã xem xét hai chế độ mà SageMaker cung cấp cho suy luận trực tuyến và ngoại tuyến. Cái trước sử dụng tính năng tạo khối động được cung cấp trong TorchServe để tạo khối các yêu cầu từ nhiều máy khách. Cái sau sử dụng công việc chuyển đổi SageMaker để xử lý hàng loạt yêu cầu từ các tệp đầu vào trong bộ chứa S3 và chạy suy luận.

Chúng tôi cũng đã trình bày cách phân phối các mô hình trên SageMaker bằng cách sử dụng hình ảnh vùng chứa bộ công cụ suy luận SageMaker PyTorch gốc và cách sử dụng vùng chứa tùy chỉnh cho các trường hợp sử dụng yêu cầu cài đặt cấu hình TorchServe nâng cao.

Khi TorchServe tiếp tục phát triển để đáp ứng nhu cầu của cộng đồng PyTorch, các tính năng mới được tích hợp vào SageMaker để cung cấp các cách thức hiệu quả cho việc phân phát các mô hình trong sản xuất. Để biết thêm thông tin, hãy xem Đại diện TorchServe GitHubVí dụ về SageMaker.


Về các tác giả

Phi Nguyễn là một kiến ​​trúc sư giải pháp tại AWS giúp khách hàng thực hiện hành trình trên đám mây của họ với trọng tâm đặc biệt là hồ dữ liệu, phân tích, công nghệ ngữ nghĩa và học máy. Khi rảnh rỗi, bạn có thể bắt gặp anh ấy đạp xe đi làm, huấn luyện đội bóng đá của con trai mình hoặc cùng gia đình đi dạo giữa thiên nhiên.

Nikhil Kulkarni là nhà phát triển phần mềm với AWS Machine Learning, tập trung vào việc làm cho khối lượng công việc máy học hoạt động hiệu quả hơn trên đám mây và là người đồng sáng tạo AWS Deep Learning Container để đào tạo và suy luận. Anh ấy đam mê Hệ thống Deep Learning phân tán. Ngoài giờ làm việc, anh ấy thích đọc sách, chơi đàn guitar và làm bánh pizza.

Hamid Shojanazeri là một Kỹ sư đối tác tại Pytorch làm việc về việc cung cấp và tối ưu hóa mô hình hiệu suất cao OSS. Hamid có bằng Tiến sĩ về Thị giác máy tính và từng là nhà nghiên cứu tại các phòng thí nghiệm đa phương tiện ở Úc, Malaysia và lãnh đạo NLP tại Opus.ai. Anh ấy thích tìm những giải pháp đơn giản hơn cho những vấn đề hóc búa và là một người đam mê nghệ thuật khi rảnh rỗi.

Geeta Chauhan lãnh đạo Bộ phận Kỹ thuật Đối tác AI tại Meta AI với chuyên môn trong việc xây dựng các nền tảng phân tán quy mô lớn, bền bỉ, chống dễ vỡ cho các công ty khởi nghiệp và Fortune 500. Nhóm của cô ấy làm việc với các đối tác chiến lược, các nhà lãnh đạo máy học trong toàn ngành và tất cả các nhà cung cấp dịch vụ đám mây lớn để xây dựng và tung ra các dịch vụ và trải nghiệm sản phẩm AI mới; và đưa các mô hình PyTorch từ nghiên cứu sang sản xuất.. Cô ấy là người chiến thắng giải Phụ nữ trong CNTT – Thung lũng Silicon – CTO của năm 2019, Diễn giả xuất sắc của ACM và là nhà lãnh đạo tư tưởng về các chủ đề từ Đạo đức trong AI, Học sâu, Chuỗi khối, IoT. Cô ấy đam mê thúc đẩy việc sử dụng AI cho những điều tốt đẹp.

Nguồn: https://aws.amazon.com/blogs/machine-learning/optimize-your-inference-jobs-using-dynamic-batch-inference-with-torchserve-on-amazon-sagemaker/

Dấu thời gian:

Thêm từ Blog Học máy AWS