Değerleri tahmin etmek için bir iOS uygulaması oluşturma

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

2. Hazırlanın

Bu codelab'in kodunu indirmek için:

  1. Bu codelab için GitHub veri havuzuna gidin.
  2. Bu codelab'e ait tüm kodu indirmek için Code > İndir ZIP'i tıklayın.

a72f2bb4caa9a96.png

  1. İ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

  1. Cihaz hedefini iPhone 13 gibi bir iPhone olarak değiştirin.

a57198a4f21f970.png

  1. cacc15c5638260ed.png "Ç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.

d2976072474ce0b1.png

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

  1. Tarayıcınızda bu bağlantıyı açın.

Colab, Python not defterini yükler.

  1. Python not defterinde, TensorFlow ve NumPy kitaplıklarını içe aktarın, ardından giriş olarak xs ve etiket olarak ys 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.

56d05252cfc9df9d.png

  1. y değerini x 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.

  1. 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}
  1. Dışa aktarılan SaveModel'i tek bir regression.zip dosyasına sıkıştırın:
!zip -r regression.zip ./regression
  1. 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.
  2. c55600d42359f901.png Dosyalar'ı tıklayın ve ardından regression.zip dosyasını indirin.

bceda15d86571583.png

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:

7faeb4f03af39646.png

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ızdaki regression 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:

  1. REST isteğini oluşturun.
  2. REST isteğini TensorFlow Sunumu'na gönderin.
  3. 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

  1. Ş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.

  1. 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

  1. cacc15c5638260ed.png "Çalıştır'"ı tıklayın ve ardından Xcode'un uygulamayı Simülatörde başlatmasını bekleyin.
  2. Metin kutusuna bir sayı girin ve Çıkar'ı tıklayın.

Şimdi kullanıcı arayüzünde tahmini bir değer göreceksiniz.

df9bcb9aa21bb30e.png

8. iOS uygulamasını gRPC üzerinden TensorFlow Sunumu ile bağlama

TensorFlow Sunumu, REST'e ek olarak gRPC'yi de destekler.

b6f4449c2c850b0e.png

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:

  1. İsteğe bağlı: gRPC istemci stub kodunu oluşturun.
  2. gRPC isteğini oluşturun.
  3. gRPC isteğini TensorFlow Sunumu'na gönderin.
  4. 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.

a9d0e5cb543467b4.png

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:

  1. 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.

  1. Projenize henüz kopyalanmadılarsa oluşturulan .swift dosyalarını Xcode'daki projenize sürükleyin.

9e65705cf6be7aac.png

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

  1. Gezinme menüsünde cacc15c5638260ed.png "Çalıştır'"ı tıklayın ve ardından Xcode'un Simülatörde uygulamayı başlatmasını bekleyin.
  2. 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.

Daha fazla bilgi