Thông tin về lớp học lập trình này
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ó
- Quyền truy cập vào Colab
- Phiên bản mới nhất của Xcode
- CocoaPods
- Docker
- Bash
- Trình biên dịch bộ đệm giao thức (chỉ cần thiết nếu bạn muốn tự tạo lại mã trang gRPC)
- Trình bổ trợ trình tạo mã gRPC-swift (chỉ cần thiết nếu bạn muốn tự tạo mã gRPC)
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:
- Chuyển đến kho lưu trữ GitHub cho lớp học lập trình này.
- 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.
- 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
- Thay đổi mục tiêu thiết bị thành bất kỳ iPhone nào, chẳng hạn như iPhone 13.
- Nhấp vào
"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.
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
- Mở đường liên kết này trong trình duyệt của bạn.
Colab tải sổ tay Python.
- Trong sổ tay Python, hãy nhập thư viện
TensorFlow
vàNumPy
, sau đó tạo 6 cặp dữ liệu đào tạo vớixs
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.
- 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àox
, 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 10
là 18.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.
- 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}
- Nén ZipModel đã xuất vào một tệp
regression.zip
:
!zip -r regression.zip ./regression
- 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.
- Nhấp vào
Tệp, rồi tải tệp
regression.zip
xuống.
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:
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ụcregression
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:
- Tạo yêu cầu REST.
- Gửi yêu cầu REST tới TensorFlowServe.
- 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
- 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.
- 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
- Nhấp vào
"Run\39; rồi đợi Xcode khởi chạy ứng dụng trong Trình mô phỏng.
- 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.
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.
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:
- Không bắt buộc: Tạo mã mã ứng dụng gRPC.
- Tạo yêu cầu gRPC.
- Gửi yêu cầu gRPC đến TensorFlowServe.
- 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.
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:
- 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
.
- 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.
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
- Nhấp vào
"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.
- 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!