TensorFlow Phục vụ với Docker

Một trong những cách dễ nhất để bắt đầu sử dụng TensorFlow Serve là sử dụng Docker .

# Download the TensorFlow Serving Docker image and repo
docker pull tensorflow/serving
git clone https://github.com/tensorflow/serving # Location of demo models TESTDATA="$(pwd)/serving/tensorflow_serving/servables/tensorflow/testdata" # Start TensorFlow Serving container and open the REST API port docker run -t --rm -p 8501:8501 \ -v "$TESTDATA/saved_model_half_plus_two_cpu:/models/half_plus_two" \ -e MODEL_NAME=half_plus_two \ tensorflow/serving & # Query the model using the predict API curl -d '{"instances": [1.0, 2.0, 5.0]}' \ -X POST http://localhost:8501/v1/models/half_plus_two:predict
# Returns => { "predictions": [2.5, 3.0, 4.5] }

Để biết thêm các điểm cuối phân phát, hãy xem Client REST API .

Cài đặt Docker

Hướng dẫn cài đặt chung có trên trang Docker , nhưng chúng tôi cung cấp một số liên kết nhanh tại đây:

Phục vụ với Docker

Kéo một hình ảnh phục vụ

Sau khi cài đặt Docker, bạn có thể lấy hình ảnh docker TensorFlow Serve mới nhất bằng cách chạy:

docker pull tensorflow/serving

Điều này sẽ kéo xuống một hình ảnh Docker tối thiểu đã được cài đặt Dịch vụ TensorFlow.

Xem kho lưu trữ tensorflow/phục vụ của Docker Hub để biết các phiên bản hình ảnh khác mà bạn có thể kéo.

Chạy một hình ảnh phục vụ

Hình ảnh phục vụ (cả CPU và GPU) có các thuộc tính sau:

  • Cổng 8500 được hiển thị cho gRPC
  • Cổng 8501 được hiển thị cho API REST
  • Biến môi trường tùy chọn MODEL_NAME (mặc định là model )
  • Biến môi trường tùy chọn MODEL_BASE_PATH (mặc định là /models )

Khi hình ảnh phục vụ chạy ModelServer, nó sẽ chạy như sau:

tensorflow_model_server --port=8500 --rest_api_port=8501 \
  --model_name=${MODEL_NAME} --model_base_path=${MODEL_BASE_PATH}/${MODEL_NAME}

Để phục vụ với Docker, bạn sẽ cần:

  • Một cổng mở trên máy chủ của bạn để phục vụ
  • Một SavingModel để phục vụ
  • Tên cho mô hình của bạn mà khách hàng của bạn sẽ tham khảo

Những gì bạn sẽ làm là chạy bộ chứa Docker , xuất bản các cổng của bộ chứa lên các cổng của máy chủ và gắn đường dẫn máy chủ của bạn tới SavingModel tới nơi bộ chứa mong đợi các mô hình.

Hãy xem một ví dụ:

docker run -p 8501:8501 \
  --mount type=bind,source=/path/to/my_model/,target=/models/my_model \
  -e MODEL_NAME=my_model -t tensorflow/serving

Trong trường hợp này, chúng tôi đã khởi động vùng chứa Docker, xuất bản cổng API REST 8501 lên cổng 8501 của máy chủ và lấy một mô hình mà chúng tôi đặt tên là my_model và liên kết nó với đường dẫn cơ sở mô hình mặc định ( ${MODEL_BASE_PATH}/${MODEL_NAME} = /models/my_model ). Cuối cùng, chúng tôi đã điền my_model vào biến môi trường MODEL_NAME và để MODEL_BASE_PATH về giá trị mặc định.

Điều này sẽ chạy trong container:

tensorflow_model_server --port=8500 --rest_api_port=8501 \
  --model_name=my_model --model_base_path=/models/my_model

Nếu chúng tôi muốn xuất bản cổng gRPC, chúng tôi sẽ sử dụng -p 8500:8500 . Bạn có thể mở cả hai cổng API gRPC và REST cùng lúc hoặc chọn chỉ mở một trong hai cổng này.

Truyền các đối số bổ sung

tensorflow_model_server hỗ trợ nhiều đối số bổ sung mà bạn có thể chuyển tới các vùng chứa docker phục vụ. Ví dụ: nếu chúng ta muốn truyền tệp cấu hình mô hình thay vì chỉ định tên mô hình, chúng ta có thể thực hiện như sau:

docker run -p 8500:8500 -p 8501:8501 \
  --mount type=bind,source=/path/to/my_model/,target=/models/my_model \
  --mount type=bind,source=/path/to/my/models.config,target=/models/models.config \
  -t tensorflow/serving --model_config_file=/models/models.config

Cách tiếp cận này hoạt động với bất kỳ đối số dòng lệnh nào khác mà tensorflow_model_server hỗ trợ.

Tạo hình ảnh phục vụ của riêng bạn

Nếu bạn muốn một hình ảnh phục vụ có mô hình của bạn được tích hợp vào vùng chứa, bạn có thể tạo hình ảnh của riêng mình.

Đầu tiên hãy chạy một hình ảnh phục vụ dưới dạng daemon:

docker run -d --name serving_base tensorflow/serving

Tiếp theo, sao chép SavingModel của bạn vào thư mục mô hình của vùng chứa:

docker cp models/<my model> serving_base:/models/<my model>

Cuối cùng, cam kết vùng chứa đang phục vụ mô hình của bạn bằng cách thay đổi MODEL_NAME để khớp với tên mô hình của bạn ` ':

docker commit --change "ENV MODEL_NAME <my model>" serving_base <my container>

Bây giờ bạn có thể ngừng serving_base

docker kill serving_base

Điều này sẽ để lại cho bạn một hình ảnh Docker có tên <my container> mà bạn có thể triển khai và sẽ tải mô hình của mình để phân phát khi khởi động.

Ví dụ phục vụ

Hãy xem qua một ví dụ đầy đủ trong đó chúng tôi tải SavingModel và gọi nó bằng API REST. Đầu tiên kéo hình ảnh phục vụ:

docker pull tensorflow/serving

Thao tác này sẽ lấy hình ảnh Phục vụ TensorFlow mới nhất đã cài đặt ModelServer.

Tiếp theo, chúng tôi sẽ sử dụng mô hình đồ chơi có tên Half Plus Two , tạo ra 0.5 * x + 2 cho các giá trị của x mà chúng tôi cung cấp để dự đoán.

Để có được mô hình này, trước tiên hãy sao chép repo Phục vụ TensorFlow.

mkdir -p /tmp/tfserving
cd /tmp/tfserving
git clone https://github.com/tensorflow/serving

Tiếp theo, chạy bộ chứa Dịch vụ TensorFlow trỏ nó đến mô hình này và mở cổng API REST (8501):

docker run -p 8501:8501 \
  --mount type=bind,\
source=/tmp/tfserving/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu,\
target=/models/half_plus_two \
  -e MODEL_NAME=half_plus_two -t tensorflow/serving &

Thao tác này sẽ chạy vùng chứa docker và khởi chạy Máy chủ mô hình phục vụ TensorFlow, liên kết cổng API REST 8501 và ánh xạ mô hình mong muốn của chúng ta từ máy chủ đến nơi dự kiến ​​có các mô hình trong vùng chứa. Chúng tôi cũng chuyển tên của mô hình dưới dạng biến môi trường, điều này sẽ rất quan trọng khi chúng tôi truy vấn mô hình.

Để truy vấn mô hình bằng API dự đoán, bạn có thể chạy

curl -d '{"instances": [1.0, 2.0, 5.0]}' \
  -X POST http://localhost:8501/v1/models/half_plus_two:predict

Điều này sẽ trả về một tập hợp các giá trị:

{ "predictions": [2.5, 3.0, 4.5] }

Bạn có thể tìm thêm thông tin về cách sử dụng API RESTful tại đây .

Phục vụ với Docker bằng GPU của bạn

Cài đặt nvidia-docker

Trước khi sử dụng GPU, ngoài việc cài đặt Docker , bạn sẽ cần:

Chạy hình ảnh phục vụ GPU

Chạy hình ảnh phục vụ GPU giống hệt với việc chạy hình ảnh CPU. Để biết thêm chi tiết, hãy xem chạy hình ảnh phục vụ .

Ví dụ về phân phối GPU

Hãy xem qua một ví dụ đầy đủ trong đó chúng tôi tải một mô hình với các hoạt động liên quan đến GPU và gọi nó bằng API REST.

Đầu tiên cài đặt nvidia-docker . Tiếp theo, bạn có thể lấy hình ảnh docker GPU phục vụ TensorFlow mới nhất bằng cách chạy:

docker pull tensorflow/serving:latest-gpu

Điều này sẽ kéo xuống một hình ảnh Docker tối thiểu với ModelServer được xây dựng để chạy trên GPU được cài đặt.

Tiếp theo, chúng tôi sẽ sử dụng mô hình đồ chơi có tên Half Plus Two , tạo ra 0.5 * x + 2 cho các giá trị của x mà chúng tôi cung cấp để dự đoán. Mô hình này sẽ có các hoạt động được liên kết với thiết bị GPU và sẽ không chạy trên CPU.

Để có được mô hình này, trước tiên hãy sao chép repo Phục vụ TensorFlow.

mkdir -p /tmp/tfserving
cd /tmp/tfserving
git clone https://github.com/tensorflow/serving

Tiếp theo, chạy bộ chứa Dịch vụ TensorFlow trỏ nó đến mô hình này và mở cổng API REST (8501):

docker run --gpus all -p 8501:8501 \
--mount type=bind,\
source=/tmp/tfserving/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_gpu,\
target=/models/half_plus_two \
  -e MODEL_NAME=half_plus_two -t tensorflow/serving:latest-gpu &

Thao tác này sẽ chạy vùng chứa docker, khởi chạy Máy chủ mô hình phục vụ TensorFlow, liên kết cổng API REST 8501 và ánh xạ mô hình mong muốn của chúng ta từ máy chủ đến nơi dự kiến ​​có các mô hình trong vùng chứa. Chúng tôi cũng chuyển tên của mô hình dưới dạng biến môi trường, điều này sẽ rất quan trọng khi chúng tôi truy vấn mô hình.

MẸO: Trước khi truy vấn mô hình, hãy nhớ đợi cho đến khi bạn thấy thông báo như sau, cho biết rằng máy chủ đã sẵn sàng nhận yêu cầu:

2018-07-27 00:07:20.773693: I tensorflow_serving/model_servers/main.cc:333]
Exporting HTTP/REST API at:localhost:8501 ...

Để truy vấn mô hình bằng API dự đoán, bạn có thể chạy

curl -d '{"instances": [1.0, 2.0, 5.0]}' \
  -X POST http://localhost:8501/v1/models/half_plus_two:predict

Điều này sẽ trả về một tập hợp các giá trị:

{ "predictions": [2.5, 3.0, 4.5] }

MẸO: Cố gắng chạy mô hình GPU trên máy không có GPU hoặc không có bản dựng GPU của Máy chủ mô hình TensorFlow sẽ dẫn đến lỗi như sau:

Cannot assign a device for operation 'a': Operation was explicitly assigned to /device:GPU:0

Bạn có thể tìm thêm thông tin về cách sử dụng API RESTful tại đây .

Phát triển với Docker

Để biết hướng dẫn về cách xây dựng và phát triển Tensorflow Serve, vui lòng tham khảo Hướng dẫn phát triển với Docker .