Ý tưởng của bài viết này là tạo một bộ chứa Docker nhanh chóng và dễ dàng để thực hiện suy luận trực tuyến với các mô hình máy học được đào tạo bằng cách sử dụng API Python với Flask. Trước khi đọc bài viết này, đừng ngần ngại đọc Tại sao nên sử dụng Docker cho Machine Learning, Cài đặt nhanh và Sử dụng Docker lần đầu, cũng như Xây dựng và chạy Bộ chứa Docker cho Mô hình Machine Learning của bạn, trong đó chúng ta tìm hiểu cách sử dụng Docker để thực hiện đào tạo mô hình và
Suy luận hàng loạt là tuyệt vời khi bạn có thời gian để tính toán các dự đoán của mình. Hãy tưởng tượng bạn cần dự đoán thời gian thực. Trong trường hợp này, suy luận hàng loạt không phù hợp hơn và chúng tôi cần suy luận trực tuyến. Nhiều ứng dụng sẽ không hoạt động hoặc sẽ không hữu ích nếu không có dự đoán trực tuyến như xe tự hành, phát hiện gian lận, giao dịch tần suất cao, ứng dụng dựa trên dữ liệu bản địa hóa, nhận dạng và theo dõi đối tượng hoặc giao diện máy tính não. Đôi khi, dự đoán cần được cung cấp tính bằng mili giây
Để tìm hiểu khái niệm này, chúng tôi sẽ triển khai các suy luận trực tuyến (Phân tích phân biệt tuyến tính và mô hình Mạng thần kinh Perceptron nhiều lớp) với Docker và Flask-RESTful
Để bắt đầu, hãy xem xét các tệp sau. Dockerfile, đào tạo. py, api. py, yêu cầu. txt, đào tạo. csv, kiểm tra. json
Con tàu. py là một tập lệnh python nhập và chuẩn hóa dữ liệu EEG và huấn luyện hai mô hình để phân loại dữ liệu. Dockerfile sẽ được sử dụng để xây dựng Docker image của chúng ta, các yêu cầu. txt (flask, jar-restful, joblib) dành cho các phụ thuộc Python và api. py là tập lệnh sẽ được gọi để thực hiện suy luận trực tuyến bằng API REST. xe lửa. csv là dữ liệu được sử dụng để huấn luyện các mô hình của chúng tôi và kiểm tra. json là tệp chứa dữ liệu điện não đồ mới sẽ được sử dụng với các mô hình suy luận của chúng tôi
Bạn có thể tìm thấy tất cả các tệp trên GitHub
Flask-RESTful APIBước đầu tiên trong việc xây dựng API là suy nghĩ về dữ liệu chúng tôi muốn xử lý, cách chúng tôi muốn xử lý dữ liệu đó và kết quả đầu ra chúng tôi muốn với API của mình. Trong ví dụ của chúng tôi, chúng tôi sẽ sử dụng bài kiểm tra. json trong đó chúng tôi có 1300 hàng dữ liệu EEG với 160 tính năng mỗi (cột). Chúng tôi muốn các API của chúng tôi như sau
-API 1. Chúng tôi sẽ cung cấp một số hàng cho API sẽ trích xuất cho chúng tôi dữ liệu từ hàng đã chọn và in nó
-API 2. Chúng tôi sẽ cung cấp một số hàng cho API sẽ trích xuất hàng đã chọn, đưa dữ liệu mới vào các mô hình và truy xuất dự đoán phân loại (Biến chữ cái trong dữ liệu)
- API3. Chúng tôi sẽ yêu cầu API lấy tất cả dữ liệu trong bài kiểm tra. json và in ngay cho chúng tôi điểm phân loại của các mô hình
Cuối cùng, chúng tôi muốn truy cập các quy trình đó bằng cách thực hiện một yêu cầu HTTP
Chúng ta hãy xem api. tập tin py
Bước đầu tiên, sau khi nhập các phụ thuộc bao gồm Flask vi khung web nguồn mở, là đặt các biến môi trường được ghi trong Dockerfile. Chúng tôi cũng cần tải các mô hình tuần tự hóa Phân tích phân biệt tuyến tính và Mạng thần kinh Perceptron nhiều lớp. Chúng tôi tạo ứng dụng Flask của mình bằng cách viết app = Flask(__name__). Sau đó, chúng tôi tạo ba tuyến đường Flask để chúng tôi có thể phục vụ lưu lượng HTTP trên tuyến đường đó
- http. //0. 0. 0. 0. 5000/dòng/250. Lấy dữ liệu từ thử nghiệm. json và trả về hàng được yêu cầu được xác định bởi biến Line (trong ví dụ này, chúng tôi muốn trích xuất dữ liệu của hàng số 250)
- http. //0. 0. 0. 0. 5000/dự đoán/51. Trả về dự đoán phân loại từ cả mô hình được đào tạo LDA và Mạng thần kinh bằng cách đưa dữ liệu được yêu cầu (trong ví dụ này, chúng tôi muốn đưa dữ liệu của hàng số 51)
- http. //0. 0. 0. 0. 5000/điểm. Trả về điểm phân loại cho cả mô hình suy luận Mạng thần kinh và LDA trên tất cả dữ liệu có sẵn (kiểm tra. json)
The Flask routes allows us to request what we need from the API by adding the name of our procedure (/line/, /prediction/, /score) to the URL (//0.0.0.0:5000). Whatever the data we add, api.py will always return the output we request.
Mô hình học máyCon tàu. py là tập lệnh python nhập và chuẩn hóa dữ liệu EEG trong tệp csv (đào tạo. csv) và đào tạo hai mô hình để phân loại dữ liệu (sử dụng scikit-learning). Kịch bản lưu hai mô hình. Phân tích phân biệt tuyến tính (clf_lda) và mạng lưới thần kinh nhiều lớp perceptron (clf_NN)
Hình ảnh Docker cho suy luận trực tuyếnChúng tôi có tất cả để xây dựng hình ảnh Docker của mình. Để bắt đầu, chúng ta cần Dockerfile với hình ảnh jupyter/scipy-notebook làm hình ảnh cơ sở. Chúng tôi cũng cần đặt các biến môi trường và cài đặt joblib để cho phép tuần tự hóa và giải tuần tự hóa các mô hình và bình được đào tạo của chúng tôi (các yêu cầu. txt). Chúng tôi sao chép tàu. csv, kiểm tra. json, đào tạo. py và api. py vào hình ảnh. Sau đó, chúng tôi chạy tàu. py sẽ phù hợp và tuần tự hóa các mô hình máy học như một phần của quy trình xây dựng hình ảnh của chúng tôi
Đây rồi
Để xây dựng hình ảnh này, hãy chạy lệnh sau
docker build -t my-docker-api -f Dockerfile .Chúng tôi thu được đầu ra sau
Chạy suy luận trực tuyến Docker
Now the goal is to run our online inference meaning that each time a client issues a POST request to the /line/, /prediction/, /score endpoints, we will show the requested data (row), predict the class of the data we inject using our pre-trained models, and the score of our pre-trained models using all the available data. To launch the web server, we will run a Docker container and run the api.py script:
docker run -it -p 5000:5000 my-docker-api python3 api.pyCờ -p hiển thị cổng 5000 trong vùng chứa thành cổng 5000 trên máy chủ của chúng tôi, cờ -it cho phép chúng tôi xem nhật ký từ vùng chứa và chúng tôi chạy api python3. py trong hình ảnh my-api
Đầu ra như sau
Bạn có thể thấy rằng chúng tôi đang chạy trên http. //0. 0. 0. 0. 5000/ và bây giờ chúng tôi có thể sử dụng trình duyệt web của mình hoặc lệnh curl để đưa ra yêu cầu POST tới địa chỉ IP
Nếu chúng ta gõ
curl //0.0.0.0:5000/line/232Chúng tôi sẽ nhận được hàng số 232 được trích xuất từ dữ liệu của chúng tôi (thử nghiệm. json)
Kết quả tương tự khi sử dụng trình duyệt web
Nếu chúng ta gõ lệnh curl sau
curl //0.0.0.0:5000/prediction/232Chúng ta sẽ thấy đầu ra sau
Đầu ra ở trên có nghĩa là mô hình LDA đã phân loại dữ liệu được cung cấp (hàng 232) là chữ cái 21 (U) trong khi Mạng thần kinh Perceptron nhiều lớp phân loại dữ liệu là chữ cái 8 (H). Hai mô hình không đồng nhất
Nếu chúng ta gõ
curl //0.0.0.0:5000/scoreChúng tôi sẽ thấy điểm số của các mô hình của chúng tôi trên toàn bộ tập dữ liệu
Như chúng ta có thể đọc, chúng ta nên tin tưởng hơn vào Mạng lưới thần kinh Perceptron nhiều lớp với điểm chính xác là 0. 59 ngay cả khi điểm không quá cao. Một số việc cần làm để nâng cao độ chính xác
Cái gì tiếp theo?Tôi hy vọng bạn có thể thấy sự đơn giản của việc chứa các ứng dụng máy/học sâu của mình bằng cách sử dụng Docker và bình để thực hiện suy luận trực tuyến. Đây là một bước cần thiết khi chúng tôi muốn đưa các mô hình của mình vào sản xuất. Tất nhiên, đó là một cách nhìn đơn giản vì chúng ta cần tính đến nhiều khía cạnh hơn như mạng, bảo mật, giám sát, cơ sở hạ tầng, điều phối hoặc thêm cơ sở dữ liệu để lưu trữ dữ liệu thay vì sử dụng tệp json