Bu codelab hakkında
1. Başlamadan önce
Bu codelab'de, REST ve gRPC ile TensorFlow Sunumu'nu kullanarak iOS uygulamasından regresyon çıkarımı nasıl çalıştıracağınızı öğreneceksiniz.
Ön koşullar
- Swift ile iOS geliştirmeyle ilgili temel bilgiler
- TensorFlow'da eğitim ve dağıtım gibi temel makine öğrenimi bilgileri
- Colaboratory hakkında temel bilgi
- Terminaller, Python ve Docker hakkında temel bilgiler
Neler öğreneceksiniz?
- TensorFlow ile regresyon modeli eğitme.
- TensorFlow Yayınlama (REST ve gRPC) ile eğitilen modelle basit bir iOS uygulaması oluşturma ve tahminde bulunma.
- Sonucu kullanıcı arayüzünde nasıl gösterebilirsiniz?
Gerekenler
- Colab'a erişim
- Xcode'un son sürümü
- CocoaPods
- Docker
- Karma
- Protokol arabelleği derleyicisi (yalnızca gRPC stub'unu kendiniz yeniden oluşturmak isterseniz gereklidir)
- gRPC-swift code-generator eklentisi (yalnızca gRPC stub'yu kendiniz oluşturmak istiyorsanız gerekir)
2. Hazırlanın
Bu codelab'in kodunu indirmek için:
- Bu codelab için GitHub veri havuzuna gidin.
- Bu codelab'e ait tüm kodu indirmek için Code > İndir ZIP'i tıklayın.
- İhtiyacınız olan tüm kaynakları içeren
codelabs
kök klasörünün paketini açmak için indirilen zip dosyasını açın.
Bu codelab için yalnızca depodaki TFServing/RegressioniOS
alt dizininde bulunan ve iki klasör içeren dosyalara ihtiyacınız vardır:
starter
klasörü, bu codelab için geliştirmekte olduğunuz başlangıç kodunu içerir.finished
klasörü, tamamlanan örnek uygulama için tamamlanmış kodu içerir.
3. Proje için bağımlılıkları indirin
Gerekli kapsülleri indirin
starter/iOS
klasöründe şu komutu çalıştırın:
pod install
Cocoapod'lar gerekli tüm kitaplıkları yükler ve yeni bir regression.xcworkspace
dosyası oluşturur.
4. Başlangıç uygulamasını çalıştırma
- Xcode'u açmak için
regression.xcworkspace
dosyasını çift tıklayın.
Uygulamayı çalıştırma ve keşfetme
- Cihaz hedefini iPhone 13 gibi bir iPhone olarak değiştirin.
"Çalıştır'"ı tıklayın ve ardından Xcode'un projeyi derleyip Simülatörde başlangıç uygulamasını başlatmasını bekleyin.
Kullanıcı arayüzü son derece basittir. Bir sayı yazabileceğiniz ve REST veya gRPC ile TensorFlow Sunum arka ucuna gönderilen bir metin kutusu bulunur. Arka uç, giriş değerinde regresyon gerçekleştirir ve tahmini değeri istemci uygulamasına döndürür. Bu işlem, sonucu kullanıcı arayüzünde tekrar gösterir.
Bir sayı girip Çıkar'ı tıklarsanız uygulama henüz arka uçla iletişim kuramadığı için hiçbir şey olmaz.
5. TensorFlow ile basit bir regresyon modeli eğitme
Regresyon, en yaygın makine öğrenimi görevlerinden biridir. Amacı, girişe göre tek bir sürekli miktarı tahmin etmektir. Örneğin, bugünün hava durumuna göre yarın en yüksek sıcaklığı tahmin edin.
Regresyon modeli eğitme
- Tarayıcınızda bu bağlantıyı açın.
Colab, Python not defterini yükler.
- Python not defterinde,
TensorFlow
veNumPy
kitaplıklarını içe aktarın, ardından giriş olarakxs
ve etiket olarakys
ile altı çift eğitim verisi oluşturun.
Bu veri noktalarını bir grafikte çizerseniz, bunların y = 2x -1 denkleminden oluşturulduğu için aslında düz bir çizgide yer alırlar.
y
değerinix
girişine göre tahmin etmek ve sonra, modeli derleyip sığdırmak için Keras API'yi kullanarak iki katmanlı basit bir nöral ağ oluşturun.
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]))
Modelin eğitilmesi birkaç saniye sürer ve 10
girişinin tahmini değeri, 18.999996
olması gerekir. Bu, kesin referans 2 * 10 -1 = 19 olduğundan oldukça iyi bir tahmindir.
- Modeli dışa aktarın:
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}
- Dışa aktarılan SaveModel'i tek bir
regression.zip
dosyasına sıkıştırın:
!zip -r regression.zip ./regression
- Not defterini çalıştırmak için gezinme menüsünde Çalışma zamanı > Tümünü çalıştır'ı tıklayın ve ardından çalıştırmanın tamamlanmasını bekleyin.
Dosyalar'ı tıklayın ve ardından
regression.zip
dosyasını indirin.
6. TensorFlow Delivery ile regresyon modeli dağıtma
- Modeli TensorFlow Sunumu ile dağıtmak için indirilen
regression.zip
dosyasının sıkıştırmasını 7-Zip gibi bir sıkıştırma aracıyla açın.
Klasör yapısı aşağıdaki gibi görünmelidir:
regression
klasörünü SavedModel
klasörü olarak adlandırabilirsiniz. 123
örnek bir sürüm numarasıdır. İsterseniz başka bir numara seçebilirsiniz.
TensorFlow Sunumunu Başlat
- Terminalinizde Docker ile TensorFlow Sunumu'nu başlatın ancak
PATH/TO/SAVEDMODEL
yer tutucusunu bilgisayarınızdakiregression
klasörünün mutlak yoluyla değiştirin.
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, önce bir dakika sürecek TensorFlow Sunumu resmini otomatik olarak indirir. Ardından, TensorFlow Sunumu başlatılmalıdır. Günlük, şu kod snippet'i gibi olmalıdır:
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. iOS uygulamasını REST üzerinden TensorFlow Sunumu ile bağlama
Arka uç artık hazırdır. Böylece, tahmin yapmak için TensorFlow Sunumuna istemci istekleri gönderebilirsiniz. TensorFlow Sunumu'na istek göndermenin iki yolu vardır:
- REST
- gRPC
İstek gönderin ve REST ile yanıt alın
Üç basit adım vardır:
- REST isteğini oluşturun.
- REST isteğini TensorFlow Sunumu'na gönderin.
- REST yanıtından tahmin edilen sonucu çıkarıp kullanıcı arayüzünü oluşturun.
Bu adımları iOS/regression/ViewController.swift
dosyasında bulabilirsiniz.
REST isteğini oluşturun
- Şu anda
doInference()
işlevi, REST isteğini TensorFlow Sunumu'na göndermez. REST isteği oluşturmak için bu REST dalını uygulamanız gerekir:
if (connectionMode[picker.selectedRow(inComponent: 0)] == "REST") {
print("Using REST")
// TODO: Add code to send a REST request to TensorFlow Serving.
}
TensorFlow Sunumu, tek bir değer içeren bir POST isteği olmasını bekler. Bu nedenle, giriş değerini isteğin yükü olan bir JSON dosyasına yerleştirmeniz gerekir.
- Bu kodu REST şubesine ekleyin:
//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
REST isteğini TensorFlow Sunumu'na gönder
- Bu kodu REST şubesindeki kodun hemen arkasına ekleyin:
// 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()
TensorFlow Delivery'den REST yanıtını işleme
- Bu kodu,
TODO: Add code to process the response.
yorumundan hemen sonra önceki kod snippet'ine ekleyin:
// 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])
}
Şimdi işlem sonrası işlevi, tahmin edilen değerleri yanıttan çıkarıp sonucu kullanıcı arayüzünde gösterir.
Çalıştır
"Çalıştır'"ı tıklayın ve ardından Xcode'un uygulamayı Simülatörde başlatmasını bekleyin.
- Metin kutusuna bir sayı girin ve Çıkar'ı tıklayın.
Şimdi kullanıcı arayüzünde tahmini bir değer göreceksiniz.
8. iOS uygulamasını gRPC üzerinden TensorFlow Sunumu ile bağlama
TensorFlow Sunumu, REST'e ek olarak gRPC'yi de destekler.
gRPC, tüm ortamlarda çalışabilen modern, açık kaynaklı, yüksek performanslı bir Uzaktan Prosedür Çağrısı (RPC) çerçevesidir. Yük dengeleme, izleme, sağlık kontrolü ve kimlik doğrulama konularında takılabilir destek sayesinde veri merkezlerinde ve veri merkezlerinde hizmetleri etkili şekilde bağlayabilir. gRPC'nin uygulamada REST'ten daha iyi performans gösterdiği gözlemlenmiştir.
gRPC ile istek gönderme ve yanıtlar alma
Dört basit adım vardır:
- İsteğe bağlı: gRPC istemci stub kodunu oluşturun.
- gRPC isteğini oluşturun.
- gRPC isteğini TensorFlow Sunumu'na gönderin.
- gRPC yanıtından öngörülen sonucu ayıklayın ve kullanıcı arayüzünü oluşturun.
Bu adımları iOS/regression/ViewController.swift
dosyasında bulabilirsiniz.
İsteğe bağlı: gRPC istemci stub kodunu oluşturun
gRPC'yi TensorFlow Sunumu ile kullanmak için gRPC iş akışını uygulamanız gerekir. Ayrıntılar hakkında bilgi edinmek için gRPC dokümanlarına bakın.
TensorFlow Sunumu ve TensorFlow, .proto
dosyalarını sizin için tanımlar. TensorFlow ve TensorFlow Sunumu 2.8 itibarıyla şu dosyalar gerekli .proto
:
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
gRPC istemci stub kodunu oluşturmak için:
- Terminalinizde
starter/src/proto/
klasörüne gidip koçanı oluşturun:
bash generate_grpc_stub_swift.sh
starter/src/proto/generated/import
klasöründe çok sayıda .swift
dosyası oluşturulur.
- Projenize henüz kopyalanmadılarsa oluşturulan
.swift
dosyalarını Xcode'daki projenize sürükleyin.
gRPC isteğini oluşturma
REST isteğine benzer şekilde gRPC isteğinde gRPC isteğini oluşturursunuz.
if (connectionMode[picker.selectedRow(inComponent: 0)] == "REST") {
}
else {
print("Using gRPC")
// TODO: add code to send a gRPC request to TF Serving
}
- gRPC isteğini oluşturmak için şu kodu gRPC dalına ekleyin:
//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)))
gRPC isteğini TensorFlow Sunumu'na gönderme
- Bu kodu, önceki kod snippet'indeki kodun hemen ardından gRPC şubesine ekleyin:
// Send the gRPC request.
let call = stub.predict(request, callOptions: callOptions)
TensorFlow Sunumundan gRPC yanıtını işleme
- Bu kodu, önceki kod snippet'indeki kodun hemen arkasına ekleyin:
// 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)")
}
Şimdi işlem sonrası işlevi, tahmin edilen değerleri yanıttan çıkarıp sonucu kullanıcı arayüzünde gösterir.
Çalıştır
- Gezinme menüsünde
"Çalıştır'"ı tıklayın ve ardından Xcode'un Simülatörde uygulamayı başlatmasını bekleyin.
- Metin kutusuna bir sayı girin ve Çıkar'ı tıklayın.
Şimdi kullanıcı arayüzünde tahmini bir değer göreceksiniz.
9. Tebrikler
Uygulamanıza regresyon özellikleri eklemek için TensorFlow Sunumunu kullandınız.