Phát triển, đào tạo và điều chỉnh mô hình học sâu cho một vấn đề cụ thể, chẳng hạn như xử lý ngôn ngữ tự nhiên (NLP) hoặc nhận dạng hình ảnh, đòi hỏi thời gian và tài nguyên. Nó cũng thường liên quan đến việc sử dụng bộ xử lý mạnh mẽ để đào tạo mô hình trên các tập dữ liệu lớn. Tuy nhiên, khi mô hình hoạt động tốt, việc sử dụng nó để tạo dự đoán trên dữ liệu mới sẽ đơn giản hơn nhiều và ít tốn kém về mặt tính toán hơn. Khó khăn duy nhất là di chuyển mô hình từ môi trường phát triển của nó vào ứng dụng sản xuất.
Hướng dẫn này sẽ chỉ cho bạn cách tạo một API Flask đơn giản sử dụng máy học để nhận dạng chữ số viết tay. API sẽ sử dụng một mô hình học sâu đơn giản được đào tạo trên tập dữ liệu MNIST nổi tiếng.
Trước khi bạn bắt đầu
- Nếu bạn chưa thực hiện, hãy tạo một tài khoản Linode và Compute Instance. Xem hướng dẫn Bắt đầu với Linode và Tạo Compute Instance của chúng tôi .
- Làm theo hướng dẫn Thiết lập và Bảo mật Phiên bản Compute của chúng tôi để cập nhật hệ thống của bạn. Bạn cũng có thể muốn đặt múi giờ, cấu hình tên máy chủ, tạo tài khoản người dùng giới hạn và tăng cường quyền truy cập SSH.
Hướng dẫn này sử dụng Ubuntu 16.04 trong các ví dụ. Sửa đổi các lệnh khi cần thiết cho bản phân phối của bạn. Các tập lệnh trong hướng dẫn này được viết bằng Python 3, nhưng cũng có thể hoạt động trên Python 2.
Thiết lập môi trường ảo Python
Bạn sẽ sử dụng Python để tạo mô hình và triển khai mô hình đó vào Flask API. Tốt nhất là nên thiết lập môi trường ảo cho từng mục đích, để bất kỳ thay đổi nào bạn thực hiện đối với cấu hình Python của mình sẽ không ảnh hưởng đến phần còn lại của hệ thống.
- Tải xuống và cài đặt Miniconda, phiên bản nhẹ của Anaconda. Làm theo hướng dẫn trong terminal và cho phép Anaconda thêm vị trí PATH vào
.bashrc
:- wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh source .bashrc
- Tạo và kích hoạt môi trường ảo Python mới:
- conda create -n deeplearning python
- source activate deeplearning
- Nếu các lệnh này thành công, dấu nhắc lệnh đầu cuối của bạn sẽ được mở đầu bằng
(deeplearning)
.
- Cài đặt các phần phụ thuộc bên trong môi trường ảo:
conda install keras tensorflow h5py pillow flask numpy
Nếu bạn muốn thử nghiệm mô hình này, bạn có thể muốn sử dụng sổ ghi chép Jupyter. Xem hướng dẫn Cài đặt máy chủ sổ ghi chép Jupyter của chúng tôi để biết thêm chi tiết.
Chuẩn bị một mô hình
Việc đào tạo các mô hình phức tạp trên các tập dữ liệu lớn thường được thực hiện trên các máy chuyên dụng có GPU (Bộ xử lý đồ họa) mạnh mẽ. Để tập trung vào quá trình triển khai, hướng dẫn này sẽ nhanh chóng xây dựng một mô hình đơn giản trên một tập dữ liệu có thể quản lý được, để có thể đào tạo nhanh chóng ngay cả trên máy tính xách tay hoặc Linode cơ bản.
Cơ sở dữ liệu MNIST
Đào tạo máy tính để nhận dạng số viết tay là một nhiệm vụ quan trọng trong giai đoạn đầu của học máy. Loại phân loại này được nhiều tổ chức sử dụng, bao gồm Bưu điện Hoa Kỳ, để tự động hóa việc nhập và xử lý thông tin. Một tập dữ liệu nổi tiếng được sử dụng cho nhiệm vụ này là cơ sở dữ liệu MNIST, chứa 70.000 hình ảnh chữ số viết tay (để so sánh, cơ sở dữ liệu ImageNet, thường được sử dụng trong các ứng dụng học máy, có hơn 10 triệu hình ảnh). Mỗi hình ảnh 28×28 pixel bao gồm một chữ số duy nhất đã được xử lý trước và dán nhãn. Để biết thêm thông tin về MNIST, hãy xem trang web chính thức .
Nhiều mô hình khác nhau, từ các bộ phân loại tuyến tính đơn giản đến các mạng nơ-ron phức tạp, đã được đào tạo trên MNIST. Hiện tại, các mô hình tốt nhất có thể đạt được tỷ lệ lỗi chỉ 0,21% . Hướng dẫn này sẽ sử dụng một CNN (Mạng nơ-ron tích chập) đơn giản có thể đạt được độ chính xác khoảng 97%.
Tạo mô hình học sâu với Keras
Keras là một thư viện học sâu dành cho Python. Nó cung cấp một giao diện hướng đối tượng có thể hoạt động với nhiều khuôn khổ học sâu khác nhau, bao gồm Theano và Tensorflow.
Vì việc phát triển và đào tạo mô hình học sâu nằm ngoài phạm vi của hướng dẫn này, nên mã bên dưới được cung cấp mà không có lời giải thích. Mô hình là phiên bản đơn giản hóa của ví dụ từ hướng dẫn tuyệt vời của Elite Data Science . Nếu bạn không có kiến thức nền về học sâu và muốn tìm hiểu thêm, bạn có thể hoàn thành hướng dẫn đó rồi chuyển đến phần Flask API của hướng dẫn này.
Ghi chú : Mô hình này đủ đơn giản và tập dữ liệu đủ nhỏ để có thể chạy tập lệnh trên Linode hoặc trên máy cục bộ của bạn. Tuy nhiên, sử dụng máy tính không có GPU vẫn mất ít nhất mười phút. Nếu bạn muốn bỏ qua bước này, có thể tải xuống mô hình được đào tạo trước bằng cách chạy lệnh wget https://github.com/linode/docs-scripts/raw/master/hosted_scripts/my_model.h5
Các phiên bản cũ hơn của Keras yêu cầu xóa trọng số tối ưu hóa trong mô hình được đào tạo trước. Nếu mô hình được đào tạo trước được tải xuống từ GitHub, tập lệnh bên dưới sẽ kiểm tra và xóa trọng số tối ưu hóa.
import h5py
with h5py.File('my_model.h5', 'r+') as f:
if 'optimizer_weights' in f.keys():
del f['optimizer_weights']
f.close()
1.Tạo thư mục cho mô hình:
mkdir ~/models && cd ~/models
2.Tạo một tập lệnh Python để xây dựng và đào tạo mô hình của bạn:
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, MaxPooling2D
from keras.utils import np_utils
from keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape(X_train.shape[0],1,28,28)
X_test = X_test.reshape(X_test.shape[0],1,28,28)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255
Y_train = np_utils.to_categorical(y_train, 10)
Y_test = np_utils.to_categorical(y_test, 10)
model = Sequential()
model.add(Convolution2D(32,(3,3),activation='relu',input_shape=(1,28,28),dim_ordering='th'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
model.fit(X_train, Y_train,
batch_size=32, nb_epoch=5, verbose=1)
model.save('my_model.h5')
3. Chạy tập lệnh:
python ./mnist_model.py
Có thể có một thông báo cảnh báo như hiển thị bên dưới khi cài đặt pip hoặc conda, điều này có nghĩa là cài đặt từ nguồn có thể mang lại hiệu suất vượt trội.
The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.
Nếu tập lệnh thực thi thành công, bạn sẽ thấy my_model.h5
tệp trong models
thư mục. model.save()
Lệnh trong Keras cho phép bạn lưu cả kiến trúc mô hình và trọng số đã đào tạo.
API Flask
Sau khi mô hình đã được đào tạo, việc sử dụng nó để tạo dự đoán sẽ đơn giản hơn nhiều. Trong phần này, bạn sẽ xây dựng một API Python đơn giản với Flask. API sẽ có một điểm cuối duy nhất: nó sẽ chấp nhận các yêu cầu POST có đính kèm hình ảnh, sau đó sử dụng mô hình bạn đã lưu trong phần trước để xác định chữ số viết tay trong hình ảnh.
1.Tạo thư mục cho Flask API:
sudo mkdir -p /var/www/flaskapi/flaskapi && cd /var/www/flaskapi/flaskapi
2.Sao chép mô hình đã được đào tạo trước vào thư mục gốc của ứng dụng Flask:
sudo cp ~/models/my_model.h5 /var/www/flaskapi/flaskapi
3.Tạo /var/www/flaskapi/flaskapi/__init__.py
trong trình soạn thảo văn bản và thêm nội dung sau:
from flask import Flask, jsonify, request
import numpy as np
import PIL
from PIL import Image
from keras.models import load_model
app = Flask(__name__)
model = load_model('/var/www/flaskapi/flaskapi/my_model.h5')
@app.route('/predict', methods=["POST"])
def predict_image():
# Preprocess the image so that it matches the training input
image = request.files['file']
image = Image.open(image)
image = np.asarray(image.resize((28,28)))
image = image.reshape(1,1,28,28)
# Use the loaded model to generate a prediction.
pred = model.predict(image)
# Prepare and send the response.
digit = np.argmax(pred)
prediction = {'digit':int(digit)}
return jsonify(prediction)
if __name__ == "__main__":
app.run()
Lần này, mô-đun duy nhất bạn cần nhập từ Keras là load_model
, mô-đun này đọc my_model.h5
và tải mô hình và trọng số. Sau khi mô hình được tải, hàm predict()
sẽ tạo ra một tập hợp các xác suất cho mỗi số từ 0-9, cho biết khả năng chữ số trong hình ảnh khớp với từng số. Hàm argmax
từ thư viện Numpy trả về số có xác suất cao nhất: số mà mô hình cho là có khả năng khớp nhất.
Định dạng của các đầu vào cho mô hình phải giống hệt như hình ảnh được sử dụng trong quá trình đào tạo. Hình ảnh đào tạo là hình ảnh thang độ xám 28×28 pixel, được biểu diễn dưới dạng một mảng các số thực có hình dạng (1,28,28) (hình ảnh màu sẽ là (3,28,28)). Điều này có nghĩa là bất kỳ hình ảnh nào bạn gửi cho mô hình đều phải được thay đổi kích thước theo hình dạng chính xác này. Quá trình xử lý trước này có thể được thực hiện ở phía máy khách hoặc phía máy chủ, nhưng để đơn giản, API ví dụ ở trên sẽ xử lý quá trình xử lý.
Cài đặt mod_wsgi
Các mô-đun Apache thường được cài đặt cùng với hệ thống cài đặt Apache. Tuy nhiên, mod_wsgi
có thể được cài đặt trong Python để sử dụng môi trường ảo phù hợp.
1.Cài đặt Apache và các tiêu đề phát triển:
sudo apt install apache2-dev apache2
2.Cài đặt mod_wsgi
dưới dạng mô-đun Python cho Apache:
wget https://pypi.python.org/packages/aa/43/f851abaad631aee69206e29cebf9f8bf0ddb9c22dbd6e583f1f8f44e6d43/mod_wsgi-4.5.20.tar.gz
tar -xvf mod_wsgi-4.5.20.tar.gz
cd mod_wsgi-4.5.20
python setup.py install
3.Sử dụng mod_wsgi-express
để tìm đường dẫn cài đặt:
mod_wsgi-express module-config
Đầu ra sẽ tương tự như sau:
LoadModule wsgi_module "/home/linode/miniconda3/envs/deeplearning/lib/python3.6/site-packages/mod_wsgi-4.5.20-py3.6-linux-x86_64.egg/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so"
WSGIPythonHome "/home/linode/miniconda3/envs/deeplearning"
4.Tạo một wsgi.load
tệp trong thư mục Apache mods-available
. Sao chép LoadModule
chỉ thị ở trên và dán vào tệp:
LoadModule wsgi_module "/home/linode/miniconda3/envs/deeplearning/lib/python3.6/site-packages/mod_wsgi-4.5.20-py3.6-linux-x86_64.egg/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so"
5.Kích hoạt bản mod:
a2enmod wsgi
Thiết lập lưu trữ ảo cho Flask API
1.Tạo một flaskapi.wsgi
tệp có cài đặt cho ứng dụng của bạn:
#!/usr/bin/python
import sys
sys.path.insert(0,"/var/www/flaskapi/")
from flaskapi import app as application
2.Cấu hình máy chủ ảo cho ứng dụng của bạn. Tạo flaskapi.conf
trong thư mục Apache sites-available
và thêm nội dung sau, thay thế example.com
bằng địa chỉ IP công khai của Linode. Đối với WSGIDaemonProcess
chỉ thị, hãy đặt đường dẫn trang chủ Python thành đầu ra của mod_wsgi-express module-config
bên dưới WSGIPythonHome
:
<Directory /var/www/flaskapi/flaskapi>
Require all granted
</Directory>
<VirtualHost *:80>
ServerName example.com
ServerAdmin admin@example.com
WSGIDaemonProcess flaskapi python-home=/home/linode/miniconda3/envs/deeplearning
WSGIScriptAlias / /var/www/flaskapi/flaskapi/flaskapi.wsgi
ErrorLog /var/www/html/example.com/logs/error.log
CustomLog /var/www/html/example.com/logs/access.log combined
</VirtualHost>
3.Tạo một logs
thư mục:
sudo mkdir -p /var/www/html/example.com/logs
4.Kích hoạt trang web mới và khởi động lại Apache:
sudo a2dissite 000-default.conf
sudo a2ensite flaskapi.conf
sudo systemctl restart apache2
Kiểm tra API
Điểm cuối API của bạn hiện đã sẵn sàng để chấp nhận các yêu cầu POST có đính kèm hình ảnh. Về lý thuyết, API sẽ có thể xác định bất kỳ hình ảnh nào của một chữ số viết tay riêng biệt. Tuy nhiên, để có được các dự đoán chính xác, các bước tiền xử lý mà các nhà nghiên cứu MNIST sử dụng phải được sao chép trên mọi hình ảnh được gửi đến mô hình. Điều này bao gồm tính toán tâm mật độ điểm ảnh và sử dụng nó để căn giữa chữ số trong hình ảnh, cũng như áp dụng khử răng cưa. Để kiểm tra nhanh API, bạn có thể sử dụng curl
để gửi một hình ảnh từ bộ kiểm tra MNIST.
1.Nhấp chuột phải và tải hình ảnh bên dưới xuống máy cục bộ của bạn:

2.Từ máy cục bộ của bạn, sử dụng curl
POST hình ảnh lên API của bạn. Thay thế địa chỉ IP bằng địa chỉ IP công khai của Linode và cung cấp đường dẫn tuyệt đối đến hình ảnh đã tải xuống thay cho /path/to/7.png
:
curl -F 'file=@/path/to/7.png' 192.0.2.0/predict
Nếu thành công, bạn sẽ nhận được phản hồi JSON xác định chính xác chữ số trong hình ảnh:
{ 'digit' : 7 }
Yêu cầu đầu tiên có thể mất một khoảng thời gian vì mod_wsgi
sử dụng tính năng tải chậm của ứng dụng Flask.
Các bước tiếp theo
Hầu hết các giải pháp học máy sản xuất đều liên quan đến một đường ống dài hơn so với hướng dẫn này. Ví dụ, bạn có thể thêm một điểm cuối khác với bộ phân loại học sâu để xác định các chữ số trong một hình ảnh lớn hơn. Mỗi chữ số được phát hiện sau đó sẽ được chuyển đến /predict
điểm cuối để ứng dụng của bạn có thể diễn giải một loạt các chữ số viết tay, chẳng hạn như số điện thoại.
API được tạo ra trong hướng dẫn này cũng thiếu nhiều tính năng mà một ứng dụng thực tế cần có, bao gồm xử lý lỗi và xử lý các yêu cầu hình ảnh số lượng lớn. Để dịch vụ hữu ích hơn, nên áp dụng toàn bộ tiền xử lý được MNIST sử dụng cho từng hình ảnh.
Ngoài ra, hình ảnh được gửi đến API có thể được sử dụng làm nguồn dữ liệu để đào tạo và tinh chỉnh mô hình của bạn thêm nữa. Trong trường hợp này, bạn có thể cấu hình API để sao chép từng hình ảnh được gửi, cùng với dự đoán của mô hình, vào cơ sở dữ liệu để phân tích sau. Xem các liên kết trong Thông tin thêm nếu bạn quan tâm đến các chủ đề này.
Thông tin thêm
Bạn có thể muốn tham khảo các nguồn sau để biết thêm thông tin về chủ đề này. Mặc dù chúng tôi cung cấp với hy vọng rằng chúng sẽ hữu ích, nhưng xin lưu ý rằng chúng tôi không thể đảm bảo tính chính xác hoặc tính kịp thời của các tài liệu được lưu trữ bên ngoài.
Nguồn : https://www.linode.com/docs/guides/how-to-move-machine-learning-model-to-production/