Tạo một ứng dụng iOS để dự đoán giá trị

Tạo một ứng dụng iOS để dự đoán giá trị

Thông tin về lớp học lập trình này

subjectLần cập nhật gần đây nhất: thg 4 8, 2022
account_circleTác giả: Wei Wei

1. Trước khi bắt đầu

Trong lớp học lập trình này, bạn tìm hiểu cách chạy suy luận hồi quy từ ứng dụng iOS bằng cách sử dụng TensorFlow Delivery với REST và gRPC.

Điều kiện tiên quyết

  • Kiến thức cơ bản về việc phát triển iOS thông qua Swift
  • Kiến thức cơ bản về công nghệ máy học với TensorFlow, chẳng hạn như chương trình đào tạo và triển khai
  • Kiến thức cơ bản về Colaboratory
  • Kiến thức cơ bản về các thiết bị đầu cuối, Python và Docker

Kiến thức bạn sẽ học được

  • Cách đào tạo mô hình hồi quy bằng TensorFlow.
  • Cách xây dựng ứng dụng iOS đơn giản và đưa ra dự đoán bằng mô hình đã đào tạo thông qua việc phân phát TensorFlow (REST và gRPC).
  • Cách hiển thị kết quả trong giao diện người dùng.

Bạn cần có

2. Bắt đầu thiết lập

Cách tải mã xuống cho lớp học lập trình này:

  1. Chuyển đến kho lưu trữ GitHub cho lớp học lập trình này.
  2. Nhấp vào Code > Download zip để tải tất cả mã xuống cho lớp học lập trình này.

a72f2bb4caa9a96.png

  1. Giải nén tệp zip đã tải xuống để giải nén thư mục gốc codelabs bằng tất cả tài nguyên mà bạn cần.

Đối với lớp học lập trình này, bạn chỉ cần các tệp trong thư mục con TFServing/RegressioniOS trong kho lưu trữ, nơi chứa hai thư mục:

  • Thư mục starter chứa mã dành cho người mới bắt đầu mà bạn xây dựng cho lớp học lập trình này.
  • Thư mục finished chứa mã đã hoàn tất cho ứng dụng mẫu đã hoàn thành.

3. Tải các phần phụ thuộc của dự án xuống

Tải các nhóm bắt buộc xuống

  • Trong thư mục starter/iOS, hãy chạy:
pod install

Cocoapods sẽ cài đặt tất cả thư viện cần thiết và tạo một tệp regression.xcworkspace mới.

4. Chạy ứng dụng khởi động

  • Nhấp đúp vào tệp regression.xcworkspace để mở Xcode.

Chạy và khám phá ứng dụng

  1. Thay đổi mục tiêu thiết bị thành bất kỳ iPhone nào, chẳng hạn như iPhone 13.

a57198a4f21f970.png

  1. Nhấp vào cacc15c5638260ed.png "Run\39; rồi đợi Xcode biên dịch dự án và khởi động ứng dụng khởi động trong Trình mô phỏng.

Giao diện người dùng khá đơn giản. Bạn sẽ thấy một hộp văn bản mà bạn có thể nhập một số, số này được gửi đến phần phụ trợ Phân phát TensorFlow bằng REST hoặc gRPC. Hệ thống phụ trợ này thực hiện hồi quy trên giá trị nhập và trả lại giá trị dự đoán cho ứng dụng khách, cho phép hiển thị lại kết quả trong giao diện người dùng.

d2976072474ce0b1.png

Nếu bạn nhập một số và nhấp vào Dự đoán, sẽ không có gì xảy ra vì ứng dụng chưa thể giao tiếp với chương trình phụ trợ.

5. Đào tạo mô hình hồi quy đơn giản với TensorFlow

Hồi quy là một trong những thao tác máy học phổ biến nhất. Mục tiêu của dự báo là dự đoán một số lượng liên tục dựa trên dữ liệu đầu vào. Ví dụ: dựa trên thời tiết hôm nay, dự đoán nhiệt độ cao nhất vào ngày mai.

Đào tạo mô hình hồi quy

  1. Mở đường liên kết này trong trình duyệt của bạn.

Colab tải sổ tay Python.

  1. Trong sổ tay Python, hãy nhập thư viện TensorFlowNumPy, sau đó tạo 6 cặp dữ liệu đào tạo với xs làm dữ liệu đầu vào và ys làm nhãn.

Nếu bạn vẽ các điểm dữ liệu này trên biểu đồ, thì các điểm này thực sự nằm theo đường thẳng vì được tạo từ phương trình y = 2x -1.

56d05252cfc9df9d.png

  1. Dùng API Keras để tạo một mạng nơ-ron hai lớp đơn giản để dự đoán giá trị y dựa trên giá trị nhập vào x, sau đó biên dịch và điều chỉnh mô hình.
xs = np.array([-1.0,  0.0, 1.0, 2.0, 3.0, 4.0], dtype=float)
ys
= np.array([-3.0, -1.0, 1.0, 3.0, 5.0, 7.0], dtype=float)

model
= tf.keras.Sequential([
   tf
.keras.layers.Dense(units=10, input_shape=[1]),
   tf
.keras.layers.Dense(units=1),
   
])

model
.compile(optimizer='sgd',
             loss
='mean_squared_error')

history
= model.fit(xs, ys, epochs=500, verbose=0)

print("Finished training the model")

print(model.predict([10.0]))

Mô hình sẽ mất vài giây để đào tạo và bạn có thể thấy giá trị dự đoán cho đầu vào 1018.999996. Đây là một cụm từ gợi ý khá phù hợp vì độ chính xác trên thực tế là 2 * 10 -1 = 19.

  1. Xuất mô hình:
model_dir = './regression/'
version
= 123
export_path
= os.path.join(model_dir, str(version))
model
.save(export_path, save_format="tf")
print('\nexport_path = {}'.format(export_path))
!ls -l {export_path}
  1. Nén ZipModel đã xuất vào một tệp regression.zip:
!zip -r regression.zip ./regression
  1. Nhấp vào Thời gian chạy và gt; Chạy tất cả trong trình đơn điều hướng để chạy sổ tay rồi chờ quá trình chạy kết thúc.
  2. Nhấp vào c55600d42359f901.png Tệp, rồi tải tệp regression.zip xuống.

bceda15d86571583.png

6. Triển khai mô hình hồi quy với Luồng phân phát TensorFlow

  • Để triển khai mô hình này bằng TensorFlowServe, hãy giải nén tệp regression.zip đã tải xuống bằng một công cụ giải nén, chẳng hạn như 7-zip.

Cấu trúc thư mục sẽ có dạng như sau:

7faeb4f03af39646.png

Bạn có thể tham chiếu thư mục regression dưới dạng thư mục SavedModel. 123 là số phiên bản mẫu. Nếu muốn, bạn có thể chọn một số khác.

Bắt đầu phân phát TensorFlow

  • Trên thiết bị đầu cuối, hãy bắt đầu phân phát TensorFlow bằng Docker, nhưng thay thế trình giữ chỗ PATH/TO/SAVEDMODEL bằng đường dẫn tuyệt đối của thư mục regression trên máy tính.
docker pull tensorflow/serving

docker run -it --rm -p 8500:8500 -p 8501:8501 -v "PATH/TO/SAVEDMODEL:/models/regression" -e MODEL_NAME=regression tensorflow/serving

Docker, hệ thống sẽ tự động tải hình ảnh Phân phát TensorFlow xuống trước. Quá trình này sẽ mất một phút. Sau đó, Quá trình phân phát TensorFlow sẽ bắt đầu. Nhật ký sẽ trông giống như đoạn mã này:

2022-02-25 06:01:12.513231: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:206] Restoring SavedModel bundle.
2022-02-25 06:01:12.585012: I external/org_tensorflow/tensorflow/core/platform/profile_utils/cpu_utils.cc:114] CPU Frequency: 3000000000 Hz
2022-02-25 06:01:13.395083: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:190] Running initialization op on SavedModel bundle at path: /models/ssd_mobilenet_v2_2/123
2022-02-25 06:01:13.837562: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:277] SavedModel load for tags { serve }; Status: success: OK. Took 1928700 microseconds.
2022-02-25 06:01:13.877848: I tensorflow_serving/servables/tensorflow/saved_model_warmup_util.cc:59] No warmup data file found at /models/ssd_mobilenet_v2_2/123/assets.extra/tf_serving_warmup_requests
2022-02-25 06:01:13.929844: I tensorflow_serving/core/loader_harness.cc:87] Successfully loaded servable version {name: regression version: 123}
2022-02-25 06:01:13.985848: I tensorflow_serving/model_servers/server_core.cc:486] Finished adding/updating models
2022-02-25 06:01:13.985987: I tensorflow_serving/model_servers/server.cc:367] Profiler service is enabled
2022-02-25 06:01:13.988994: I tensorflow_serving/model_servers/server.cc:393] Running gRPC ModelServer at 0.0.0.0:8500 ...
[warn] getaddrinfo: address family for nodename not supported
2022-02-25 06:01:14.033872: I tensorflow_serving/model_servers/server.cc:414] Exporting HTTP/REST API at:localhost:8501 ...
[evhttp_server.cc : 245] NET_LOG: Entering the event loop ...

7. Kết nối ứng dụng iOS với TensorFlow Delivery thông qua REST

Phần phụ trợ này hiện đã sẵn sàng, vậy nên bạn có thể gửi yêu cầu của khách hàng đến Phân phát TensorFlow để đưa ra thông tin dự đoán. Có hai cách để gửi yêu cầu đến Phục vụ TensorFlow:

  • Kiến trúc chuyển trạng thái đại diện (REST)
  • gRPC

Gửi yêu cầu và nhận phản hồi bằng REST

Có 3 bước đơn giản:

  1. Tạo yêu cầu REST.
  2. Gửi yêu cầu REST tới TensorFlowServe.
  3. Trích xuất kết quả dự đoán từ phản hồi REST và hiển thị giao diện người dùng.

Bạn thực hiện các bước này trong tệp iOS/regression/ViewController.swift.

Tạo yêu cầu REST

  1. Hiện tại, hàm doInference() không gửi yêu cầu Kiến trúc chuyển trạng thái đại diện (REST) đến phục vụ TensorFlow. Bạn cần triển khai nhánh REST này để tạo yêu cầu REST:
if (connectionMode[picker.selectedRow(inComponent: 0)] == "REST") {
   
print("Using REST")
   
// TODO: Add code to send a REST request to TensorFlow Serving.
   
}

TensorFlow phân phát yêu cầu POST chứa một giá trị duy nhất, vì vậy, bạn cần nhúng giá trị nhập vào JSON, tức là phần tải dữ liệu của yêu cầu.

  1. Thêm mã này vào nhánh REST:
//Create the REST request.
let json
: [String: Any] = ["signature_name" : "serving_default", "instances" : [[value]]]

let jsonData
= try? JSONSerialization.data(withJSONObject: json)

let url
= URL(string: "http://localhost:8501/v1/models/regression:predict")!
var request = URLRequest(url: url)
request
.httpMethod = "POST"

// Insert JSON data into the request.
request
.httpBody = jsonData

Gửi yêu cầu REST đến Phục vụ TensorFlow

  • Thêm mã này ngay sau mã trong chi nhánh REST:
// Send the REST request.
let task
= URLSession.shared.dataTask(with: request) { data, response, error in
    guard let data
= data, error == nil else {
       
print(error?.localizedDescription ?? "No data")
       
return
   
}
   
   
// TODO: Add code to process the response.
}

task
.resume()

Xử lý phản hồi REST (Phân phát) của TensorFlow

  • Thêm mã này vào đoạn mã trước ngay sau nhận xét TODO: Add code to process the response.:
// Process the REST response.
let results
: RESTResults = try! JSONDecoder().decode(RESTResults.self, from: data)
DispatchQueue.main.async{
   
self.txtOutput.text = String(results.predictions[0][0])
}

Giờ đây, hàm xử lý hậu kỳ trích xuất các giá trị dự đoán từ phản hồi và hiển thị kết quả trong giao diện người dùng.

Chạy

  1. Nhấp vào cacc15c5638260ed.png "Run\39; rồi đợi Xcode khởi chạy ứng dụng trong Trình mô phỏng.
  2. Nhập một số vào hộp văn bản rồi nhấp vào Suy luận.

Giờ đây, bạn sẽ thấy một giá trị dự đoán trong giao diện người dùng.

df9bcb9aa21bb30e.png

8. Kết nối ứng dụng iOS với TensorFlow Delivery thông qua gRPC

Ngoài REST, việc phân phát TensorFlow cũng hỗ trợ gRPC.

b6f4449c2c850b0e.png

gRPC là một khung lệnh gọi từ xa, nguồn mở hiện đại, hiệu suất cao, có thể chạy trong mọi môi trường. API này có thể kết nối các dịch vụ trong và trên các trung tâm dữ liệu một cách hiệu quả với khả năng hỗ trợ dễ dàng để cân bằng tải, theo dõi, kiểm tra tình trạng và xác thực. Theo quan sát, gRPC có hiệu suất cao hơn REST trong thực tế.

Gửi yêu cầu và nhận phản hồi bằng gRPC

Có 4 bước đơn giản:

  1. Không bắt buộc: Tạo mã mã ứng dụng gRPC.
  2. Tạo yêu cầu gRPC.
  3. Gửi yêu cầu gRPC đến TensorFlowServe.
  4. Trích xuất kết quả dự đoán từ phản hồi gRPC và hiển thị giao diện người dùng.

Bạn thực hiện các bước này trong tệp iOS/regression/ViewController.swift.

Không bắt buộc: Tạo mã mã ứng dụng gRPC

Để sử dụng gRPC với TensorFlowServe, bạn cần phải tuân theo quy trình làm việc của gRPC. Để tìm hiểu thêm về các chi tiết, hãy xem tài liệu gRPC.

a9d0e5cb543467b4.png

TensorFlow và TensorFlow xác định các tệp .proto cho bạn. Kể từ TensorFlow và TensorFlow phân phát 2.8, .proto tệp này là những tệp cần thiết:

tensorflow/core/example/example.proto
tensorflow
/core/example/feature.proto
tensorflow
/core/protobuf/struct.proto
tensorflow
/core/protobuf/saved_object_graph.proto
tensorflow
/core/protobuf/saver.proto
tensorflow
/core/protobuf/trackable_object_graph.proto
tensorflow
/core/protobuf/meta_graph.proto
tensorflow
/core/framework/node_def.proto
tensorflow
/core/framework/attr_value.proto
tensorflow
/core/framework/function.proto
tensorflow
/core/framework/types.proto
tensorflow
/core/framework/tensor_shape.proto
tensorflow
/core/framework/full_type.proto
tensorflow
/core/framework/versions.proto
tensorflow
/core/framework/op_def.proto
tensorflow
/core/framework/graph.proto
tensorflow
/core/framework/tensor.proto
tensorflow
/core/framework/resource_handle.proto
tensorflow
/core/framework/variable.proto

tensorflow_serving
/apis/inference.proto
tensorflow_serving
/apis/classification.proto
tensorflow_serving
/apis/predict.proto
tensorflow_serving
/apis/regression.proto
tensorflow_serving
/apis/get_model_metadata.proto
tensorflow_serving
/apis/input.proto
tensorflow_serving
/apis/prediction_service.proto
tensorflow_serving
/apis/model.proto

Cách tạo mã mã ứng dụng gRPC:

  1. Trong thiết bị đầu cuối, hãy chuyển đến thư mục starter/src/proto/ rồi tạo mã nguồn:
bash generate_grpc_stub_swift.sh

Một số tệp .swift được tạo trong thư mục starter/src/proto/generated/import.

  1. Nếu chúng chưa được sao chép vào dự án, hãy kéo tất cả các tệp .swift đã tạo vào dự án trong Xcode.

9e65705cf6be7aac.png

Tạo yêu cầu gRPC

Tương tự như yêu cầu REST, bạn tạo yêu cầu gRPC trong chi nhánh gRPC.

if (connectionMode[picker.selectedRow(inComponent: 0)] == "REST") {
   
}
else {
   
print("Using gRPC")
   
// TODO: add code to send a gRPC request to TF Serving
   
}
  • Để tạo yêu cầu gRPC, hãy thêm mã này vào chi nhánh gRPC:
//Create the gRPC request.
let
group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
let channel
= ClientConnection.insecure(group: group).connect(host: "localhost", port: 8500)
let stub
= Tensorflow_Serving_PredictionServiceClient(channel: channel)

var modelSpec = Tensorflow_Serving_ModelSpec()
modelSpec
.name = "regression"
modelSpec
.signatureName = "serving_default"

// Prepare the input tensor.
var batchDim = Tensorflow_TensorShapeProto.Dim()
batchDim
.size = 1
var inputDim = Tensorflow_TensorShapeProto.Dim()
inputDim
.size = 1
var inputTensorShape = Tensorflow_TensorShapeProto()
inputTensorShape
.dim = [batchDim, inputDim]
var inputTensor = Tensorflow_TensorProto()
inputTensor
.dtype = Tensorflow_DataType.dtFloat
inputTensor
.tensorShape = inputTensorShape
inputTensor
.floatVal = [Float(value)]

var request = Tensorflow_Serving_PredictRequest()
request
.modelSpec = modelSpec
request
.inputs = ["dense_input" : inputTensor]

let callOptions
= CallOptions(timeLimit: .timeout(.seconds(15)))

Gửi yêu cầu gRPC đến TensorFlowServe

  • Thêm mã này vào nhánh gRPC ngay sau mã trong đoạn mã trước:
// Send the gRPC request.
let call
= stub.predict(request, callOptions: callOptions)

Xử lý phản hồi gRPC từ TensorFlowServe

  • Thêm mã này ngay sau mã trong đoạn mã trước:
// Process the response.
call
.response.whenSuccess { response in
    let result
= response.outputs["dense_1"]?.floatVal[0]
   
DispatchQueue.main.async{
       
self.txtOutput.text = String(describing: result!)
   
}
}
call
.response.whenFailure { error in
   
print("Call failed with error\n\(error)")
}

Giờ đây, hàm xử lý hậu kỳ trích xuất các giá trị dự đoán từ phản hồi và hiển thị kết quả trong giao diện người dùng.

Chạy

  1. Nhấp vào cacc15c5638260ed.png "Run\39; trong trình đơn điều hướng rồi chờ Xcode khởi chạy ứng dụng trong Trình mô phỏng.
  2. Nhập một số vào hộp văn bản rồi nhấp vào Suy luận.

Giờ đây, bạn sẽ thấy một giá trị dự đoán trong giao diện người dùng.

9. Xin chúc mừng

Bạn đã sử dụng tính năng Phân phát TensorFlow để thêm các tính năng hồi quy cho ứng dụng của bạn!

Tìm hiểu thêm