Logo Zephyrnet

Serverless Tensorflow trên AWS Lambda - Hướng dẫn dành cho người mới bắt đầu

Ngày:

Bài báo này đã được xuất bản như một phần của Blogathon Khoa học Dữ liệu

Tốc độ của Deep learning và mạng nơ-ron ngày càng không thể thiếu đối với hàng nghìn ngành công nghiệp. Một trong những vấn đề chính mà họ phải đối mặt là triển khai phức tạp các loại ứng dụng. Tôi muốn chỉ cho bạn một cách triển khai như vậy thực tế và thuận tiện mà bạn không cần phải là một chuyên gia về các cụm và công nghệ đám mây. Đối với điều này, chúng tôi sẽ sử dụng không có máy chủ cơ sở hạ tầng. Đi thôi!

Giới thiệu

Gần đây, nhiều vấn đề trong sản phẩm đã được giải quyết bằng cách sử dụng các mô hình được tạo bởi học sâu hoặc mạng thần kinh. Thông thường đây là những vấn đề đã được giải quyết trong nhiều năm bằng các phương pháp xác định thông thường và hiện nay việc giải quyết thông qua ML dễ dàng hơn và rẻ hơn.

Với các khuôn khổ hiện đại như Keras hoặc Tensorflow và danh mục các giải pháp làm sẵn, việc tạo các mô hình mang lại độ chính xác cần thiết cho sản phẩm trở nên dễ dàng hơn.

Điều quan trọng nhất là ngày nay có thể dễ dàng tìm thấy / tải xuống / đào tạo một mô hình và tôi muốn có thể triển khai nó một cách dễ dàng.

Một lần nữa, khi làm việc trong một công ty khởi nghiệp hoặc công ty nhỏ, bạn thường cần nhanh chóng kiểm tra các giả định, không chỉ các giả định mà còn cả các giả định về thị trường. Và tương tự, bạn phải triển khai mô hình, nhanh chóng, dễ dàng và thông minh.

Để giải quyết vấn đề triển khai như vậy, tôi thích làm việc với các microservices trên đám mây.

FaaS - các chức năng như một dịch vụ tương đối rẻ, dễ triển khai (không yêu cầu Docker) và có thể chạy song song một số lượng thực thể gần như không giới hạn.

Bây giờ tôi sẽ chỉ cho bạn cách bạn có thể triển khai các mô hình TensorFlow / Keras trên AWS Lambda - FaaS của Amazon. Do đó, một API để nhận dạng nội dung trên hình ảnh có giá 1 đô la cho 20,000 lần nhận dạng. Nó có rẻ hơn không? Có lẽ. Nó có thể được dễ dàng hơn? Không có khả năng.

Chức năng như một dịch vụ

Hãy xem xét một sơ đồ về các kiểu triển khai ứng dụng khác nhau:

Chức năng như một dịch vụ | Máy chủ Tensorflow AWS LambdaHình ảnh 1

Tiếp theo, chúng ta thấy IaaS (Infrastructure-as-a-Service) - ở đây một máy chủ được đặt trong trung tâm dữ liệu và chúng ta đang làm việc với một máy ảo cụ thể. Bước tiếp theo là Platform-as-a-Service khi chúng tôi không còn quyền truy cập vào chính máy nữa, nhưng chúng tôi quản lý vùng chứa trong đó ứng dụng sẽ được thực thi. Và cuối cùng, FaaS (Function-as-a-Service), nơi mọi thứ đều được ẩn trừ mã, mà bạn cần kiểm soát. Đây là một tin tốt như chúng ta sẽ thấy ở phần sau, cung cấp cho chúng ta một số chức năng thực sự thú vị.

AWS Lambda là một triển khai FAAS trên nền tảng AWS. Sơ lược về việc thực hiện. Vùng chứa cho nó là một kho lưu trữ zip [mã + thư viện]. AWS triển khai mã này cho các vùng chứa dựa trên số lượng yêu cầu bên ngoài (trình kích hoạt). Về cơ bản không có biên giới từ phía trên - giới hạn hiện tại là 1000 vùng chứa hoạt động đồng thời, nhưng nó có thể dễ dàng tăng lên 10000 và cao hơn thông qua hỗ trợ.

Những ưu điểm chính của AWS Lambda:

  • Dễ dàng triển khai (không có docker) - chỉ có mã và thư viện

  • Mở rộng quy mô tốt - trong quá trình sản xuất, chúng tôi đã chạy hơn 40 nghìn yêu cầu cùng một lúc. Nhiều hơn là có thể.

  • Chi phí cuộc gọi thấp. Điều quan trọng đối với các đồng nghiệp của tôi từ hướng BD là microservices hỗ trợ mô hình trả tiền khi sử dụng dịch vụ. Điều này làm cho kinh tế học đơn vị của việc sử dụng mô hình rõ ràng khi mở rộng quy mô.

Tại sao lại chuyển mạng nơ-ron sang không máy chủ?

Đầu tiên, tôi sẽ sử dụng Dòng chảy cho mục đích ứng dụng. Nó là một khuôn khổ mở cho phép các nhà phát triển tạo, thử nghiệm-đào tạo và triển khai các mô hình học sâu. Cho đến nay, nó là thư viện học sâu phổ biến nhất và được các chuyên gia cũng như người mới sử dụng.

Hiện tại, phương pháp chính để triển khai mô hình học máy là một cụm. Giao diện của API REST cho học sâu giống như sau:

Máy chủ Tensorflow AWS Lambda

Hình ảnh 2

Có vẻ rườm rà? Bây giờ, hãy xem những gì bạn cần quan tâm nhất:

  • viết logic để phân phối lưu lượng đến các máy cụm

  • viết logic của việc mở rộng quy mô, cố gắng tìm ra giá trị trung bình vàng giữa thời gian ngừng hoạt động và phanh

  • quy định logic hành vi của vùng chứa - ghi nhật ký, quản lý các yêu cầu đến

Trên AWS Lambda, kiến ​​trúc sẽ trông đơn giản hơn nhiều:

Aws lambda | Máy chủ Tensorflow AWS Lambda

Hình ảnh 3

Đầu tiên, cách tiếp cận này có khả năng mở rộng cao. Nó có thể xử lý tới 10 nghìn yêu cầu đồng thời mà không cần viết thêm bất kỳ logic nào. Tính năng này làm cho kiến ​​trúc trở nên lý tưởng để xử lý tải cao nhất vì nó không yêu cầu thêm thời gian xử lý.

Thứ hai, bạn không phải trả tiền cho thời gian ngừng hoạt động của máy chủ. Trong kiến ​​trúc Serverless, đối với một yêu cầu, khoản thanh toán sẽ được thực hiện. Điều này có nghĩa là nếu bạn có 25 nghìn yêu cầu, bạn sẽ chỉ phải trả cho 25 nghìn yêu cầu, bất kể họ đến từ luồng nào. Ví dụ trên Tensorflow mà tôi sẽ trình bày sau đây, chi phí là 20-25 nghìn yêu cầu trên 1 đô la . Một cụm có chức năng giống hệt nhau có giá cao hơn đặc biệt và sẽ có lợi hơn nếu chỉ dựa trên một số lượng rất lớn các yêu cầu (> 1 triệu).

Thứ ba, cơ sở hạ tầng ngày càng lớn hơn. Bạn không cần phải làm việc với docker, hãy viết logic của việc chia tỷ lệ và cân bằng tải. Tóm lại, công ty không phải thuê thêm một người để hỗ trợ cơ sở hạ tầng, và nếu bạn là một nhà khoa học dữ liệu, bạn có thể tự mình làm mọi thứ.

Như bạn sẽ thấy bên dưới, việc triển khai toàn bộ cơ sở hạ tầng cho ứng dụng trên yêu cầu không quá 4 dòng mã.

Sẽ là không chính xác nếu không đề cập đến những thiếu sót của cơ sở hạ tầng không có máy chủ và các trường hợp khi nó sẽ không hoạt động. AWS Lambda có một khó khăn thời gian xử lý và bộ nhớ khó khăn giữ trong đầu.

Thứ nhất, Trong trường hợp bạn không có tải cao điểm và có nhiều yêu cầu, cụm sẽ có lợi hơn.

Thứ hai, AWS Lambda có thời gian bắt đầu nhỏ nhưng xác định (100-200ms). Đối với các ứng dụng của học sâu, cần thêm một chút thời gian để tải xuống. Đối với ví dụ tôi sẽ hiển thị bên dưới, khởi động nguội sẽ là 4.5 giây và khởi động ấm sẽ là 3 giây. Đối với một số ứng dụng, điều này có thể không quá quan trọng, nhưng nếu ứng dụng của bạn tập trung vào việc xử lý một yêu cầu duy nhất nhanh nhất có thể, thì một cụm là một lựa chọn tốt hơn.

Ứng dụng của Serverless Tensorflow trên AWS Lambda

Đối với ví dụ này, tôi đang sử dụng một ứng dụng khá phổ biến của mạng nơ-ron - nhận dạng hình ảnh. Ứng dụng của chúng tôi lấy một bức ảnh làm đầu vào và trả về mô tả của đối tượng trên đó. Những loại ứng dụng này được sử dụng rộng rãi để lọc hình ảnh và phân loại nhiều hình ảnh thành các nhóm. Ứng dụng của chúng tôi cũng sẽ thực hiện công việc nhận dạng hình ảnh của một con gấu trúc.

panda

Hình ảnh 4

Chúng tôi sẽ sử dụng ngăn xếp sau:

  • API Gateway để quản lý các yêu cầu

  • AWS Lambda để xử lý

  • Khung triển khai không máy chủ

Mã triển khai cho Tensorflow không máy chủ trên AWS Lambda

Đầu tiên, bạn cần cài đặt và cấu hình Serverless framework mà chúng ta sẽ sử dụng để điều phối và triển khai ứng dụng. Liên kết đến hướng dẫn.

Chỉ cần tạo một thư mục trống mới và chạy lệnh được chỉ định:

serverless install -u https://github.com/ryfeus/lambda-packs/tree/master/tensorflow/source -n tensorflow cd tensorflow serverless triển khai lệnh gọi không máy chủ -chức năng main --log Bạn sẽ nhận được phản hồi sau: /tmp/imagenet/imagenet_synset_to_human_label_map.txt /tmp/imagenet/imagenet_2012_challenge_label_map_proto.pbtxt /tmp/imagenet/classify_image_graph_def.panda.jpg , Ailuropoda melanoleuca (điểm = 0.89107) indri, Indri brevicaudatus (điểm = 0.00779) quả mãng cầu (điểm = 0.00147) sao đất (điểm = 0.00117)

Như bạn có thể thấy, đầu ra thành công của bức tranh gấu trúc (0.89) theo mô hình của chúng tôi.

Ồ! Chúng tôi đã triển khai thành công mạng nơ-ron cho mục đích nhận dạng hình ảnh trên Tensorflow trên AWS Lambda, chỉ với 4 dòng mã.

Hãy đi sâu vào mã cho Serverless Tensorflow trên AWS Lambda

Hãy bắt đầu với một tệp cấu hình. Không có gì lạ mắt - chúng tôi đang sử dụng cấu hình AWS Lambda cơ bản.

service: tensorflow frameworkVersion: "> = 1.2.0 <2.0.0" nhà cung cấp: name: aws runtime: python2.7 memorySize: 1536 timeout: 300 functions: main: handler: index.handler

Nếu chúng tôi nhìn vào chính tệp 'index.py', chúng tôi sẽ thấy rằng trước tiên, chúng tôi tải mô hình (tệp '.pb') xuống thư mục '/ tmp /' trên AWS Lambda, sau đó nhập nó theo cách chuẩn thông qua Tensorflow.

Dưới đây là các liên kết đến các đoạn mã trên Github mà bạn nên ghi nhớ nếu muốn nhúng mô hình của riêng mình:

Tải xuống mô hình từ S3

 strBucket = 'ryfeuslambda' strKey = 'tensorflow / imagenet / Class_image_graph_def.pb' strFile = '/tmp/imagenet/classify_image_graph_def.pb' downloadFromS3 (strBucket, strKey, strFile) print (strFile) 

Nhập một mô hình

def tạo_đồ thị():
với tf.gfile.FastGFile (os.path.join ('/ tmp / imagenet /', 'Class_image_graph_def.pb'), 'rb') as f: graph_def = tf.GraphDef () graph_def.ParseFromString (f.read ()) _ = tf.import_graph_def (graph_def, name = '') 

Đang tải xuống hình ảnh

 strFile = '/tmp/imagenet/inputimage.jpg'
if ('Đường kết nối tới hình ảnh' in sự kiện): urllib.urlretrieve (sự kiện ['liên kết hình ảnh'], strFile)
khác: strBucket = 'ryfeuslambda' strKey = 'tensorflow / imagenet / cropped_panda.jpg' downloadFromS3 (strBucket, strKey, strFile) print (strFile) 

Nhận dự đoán từ mô hình

 softmax_tensor = sess.graph.get_tensor_by_name ('softmax: 0') dự đoán = sess.run (softmax_tensor, {'DecodeJpeg / content: 0': image_data}) dự đoán = np.squeeze (dự đoán)

Bây giờ hãy thêm API vào lambda.

Ví dụ về API

Cách dễ nhất để thêm API là sửa đổi tệp cấu hình YAML.

service: tensorflow framework phiên bản: "> = 1.2.0 <2.0.0" nhà cung cấp: name: aws runtime: python2.7 memorySize: 1536 timeout: 300 functions: main: handler: index.handler event: - http: GET handler Now hãy triển khai lại ngăn xếp: triển khai không máy chủ Chúng ta nhận được những điều sau đây. Dịch vụ Thông tin dịch vụ: tensorflow stage: dev region: us-west-1 stack: tensorflow-dev api Key: Không có điểm cuối: GET - https://.execute-api.us-east-1.amazonaws.com/dev/handler functions: main: tensorflow-dev-main Để kiểm tra API, bạn chỉ cần mở nó dưới dạng liên kết: https: //.execute-api.us-east-1.amazonaws.com/dev/handler Hoặc sử dụng curl: curl https: //.execute-api.us-east-1.amazonaws.com/dev/handler

Chúng tôi sẽ nhận được:

{"return": "gấu trúc khổng lồ, gấu trúc, gấu panda, gấu coon, Ailuropoda melanoleuca (điểm = 0.89107)"}

Kết luận

Chúng tôi đã tạo một API cho mô hình Tensorflow dựa trên AWS Lambda bằng cách sử dụng khuôn khổ Serverless. Chúng tôi quản lý để làm mọi thứ khá đơn giản và cách tiếp cận này đã tiết kiệm cho chúng tôi rất nhiều thời gian so với cách tiếp cận truyền thống.

Bằng cách sửa đổi tệp cấu hình, bạn có thể kết nối nhiều dịch vụ AWS khác, chẳng hạn như SQS cho các tác vụ xử lý luồng hoặc tạo một chatbot bằng AWS Lex.

Tài liệu tham khảo:

  1. Image 1 – https://miro.medium.com/max/875/1*b6MXaZWwYJATdF6vw2Z8Hw.png
  2. Hình ảnh 2- https://aws.amazon.com/blogs/machine-learning/deploy-deep-learning-models-on-amazon-ecs/
  3. Hình ảnh 3- https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/tensorflow/serverless-tensorflow-architecture.png
  4. Hình ảnh 4 - https://upload.wikimedia.org/wikipedia/commons/thumb/0/0f/Grosser_Panda.JPG/330px-Grosser_Panda.JPG

Phương tiện hiển thị trong bài viết này không thuộc sở hữu của Analytics Vidhya và được sử dụng theo quyết định của Tác giả.

PlatoAi. Web3 được mô phỏng lại. Khuếch đại dữ liệu thông minh.
Nhấn vào đây để truy cập.

Nguồn: https://www.analyticsvidhya.com/blog/2021/09/serverless-tensorflow-on-aws-lambda-a-tutorial-for-beginners/

tại chỗ_img

Tin tức mới nhất

tại chỗ_img